summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakob.stendahl <jakob.stendahl@infomedia.dk>2023-02-06 21:05:38 +0100
committerJakob Stendahl <jakob.stendahl@outlook.com>2023-02-06 21:05:38 +0100
commit74d4c065cec23578b47fa88b67d19ee46d848841 (patch)
treec23349b0da7c9ba06094197576b3f46a57ed7649
parentd240de54be8665689ecba32a1c8028699b977b07 (diff)
downloadmicrobit-gamepad-gh-pages.tar.gz
microbit-gamepad-gh-pages.zip
:rocket: Deploy app v1.0.4gh-pages
-rw-r--r--index.html2
-rw-r--r--main.6a141175.js (renamed from main.fa7f93a2.js)4
-rw-r--r--main.6a141175.js.map1
-rw-r--r--main.fa7f93a2.js.map1
-rw-r--r--service-worker.js4
5 files changed, 6 insertions, 6 deletions
diff --git a/index.html b/index.html
index a913286..18b5203 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><meta name="viewport" content="viewport-fit=cover,width=device-width, initial-scale=1, shrink-to-fit=no,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta name="HandheldFriendly" content="true"><title>MICRO:BIT gamepad</title><link rel="canonical"><link rel="stylesheet" type="text/css" href="/microbit-gamepad/styles.ac699ce3.css"><link rel="manifest" href="/microbit-gamepad/manifest.webmanifest" crossorigin="use-credentials"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Kufam&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap" rel="stylesheet"></head><body> <div class="app-info"> <h1>MICRO:BIT gamepad</h1> <span class="version">1.0.3</span> </div> <button title="Show settings dialog" class="settings-button" id="btn_show_settings"> <i class="fa-cog fas" aria-hidden="true"></i> </button> <div class="settings-dialog"> <div class="header"> <h1>Settings</h1> <button title="Close settings dialog" class="close-settings" id="btn_hide_settings"> <i class="fa-times fas" aria-hidden="true"></i> </button> </div> <div class="content"> <form> <label class="form-control" for="layout"> Gamepad layout <select name="layout" id="layout"> <option value="1">DPad + Buttons</option> <option value="2">DPad + DPad</option> <option value="9">Joystick + Joystick (Needs more advanced micro:bit code)</option> </select> </label> <label class="form-cb form-control" for="show-gamepad-alt-text"> <input type="checkbox" name="show-gamepad-alt-text" id="show-gamepad-alt-text"> Show gamepad keybindings </label> <label class="form-cb form-control" for="enable-haptic"> <input type="checkbox" name="enable-haptic" id="enable-haptic"> Enable haptic feedback </label> <label class="form-cb form-control" for="show-touches"> <input type="checkbox" name="show-touches" id="show-touches"> Show touches </label> <label class="form-cb form-control" for="enable-debug"> <input type="checkbox" name="enable-debug" id="enable-debug"> Show debug data </label> </form> </div> </div> <div class="landscape-warning"> <div class="landscape-warning-content"> <i class="fa-sync-alt fas"></i> <h1>Please use landscape mode</h1> <button id="btn_ignore_landscape_warning">Ignore</button> </div> </div> <button class="button-center button-center-top" title="Search for bluetooth device" id="btn_connect">CONNECT</button> <button class="button-center button-center-top" title="Disconnect from connected bluetooth device" id="btn_disconnect">DISCONNECT</button> <pre class="gamepad-touches" style="margin-left:10px;margin-top:50px;font-size:8px;"></pre> <div class="gamepad-wrapper" style="position:absolute;top:0;left:0;"></div> <div class="button-states"><pre></pre></div> <div class="statusline"> <span class="connection statusline-item"> <i class="fa-bluetooth-b fab" aria-hidden="true"></i> </span> <span class="notification-area"></span> </div> <script type="text/javascript" src="/microbit-gamepad/main.fa7f93a2.js"></script> </body></html> \ No newline at end of file
+<!DOCTYPE html><html lang="en" dir="ltr"><head><meta charset="utf-8"><meta name="viewport" content="viewport-fit=cover,width=device-width, initial-scale=1, shrink-to-fit=no,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><meta name="HandheldFriendly" content="true"><title>MICRO:BIT gamepad</title><link rel="canonical"><link rel="stylesheet" type="text/css" href="/microbit-gamepad/styles.ac699ce3.css"><link rel="manifest" href="/microbit-gamepad/manifest.webmanifest" crossorigin="use-credentials"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Kufam&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap" rel="stylesheet"></head><body> <div class="app-info"> <h1>MICRO:BIT gamepad</h1> <span class="version">1.0.4</span> </div> <button title="Show settings dialog" class="settings-button" id="btn_show_settings"> <i class="fa-cog fas" aria-hidden="true"></i> </button> <div class="settings-dialog"> <div class="header"> <h1>Settings</h1> <button title="Close settings dialog" class="close-settings" id="btn_hide_settings"> <i class="fa-times fas" aria-hidden="true"></i> </button> </div> <div class="content"> <form> <label class="form-control" for="layout"> Gamepad layout <select name="layout" id="layout"> <option value="1">DPad + Buttons</option> <option value="2">DPad + DPad</option> <option value="9">Joystick + Joystick (Needs more advanced micro:bit code)</option> </select> </label> <label class="form-cb form-control" for="show-gamepad-alt-text"> <input type="checkbox" name="show-gamepad-alt-text" id="show-gamepad-alt-text"> Show gamepad keybindings </label> <label class="form-cb form-control" for="enable-haptic"> <input type="checkbox" name="enable-haptic" id="enable-haptic"> Enable haptic feedback </label> <label class="form-cb form-control" for="show-touches"> <input type="checkbox" name="show-touches" id="show-touches"> Show touches </label> <label class="form-cb form-control" for="enable-debug"> <input type="checkbox" name="enable-debug" id="enable-debug"> Show debug data </label> </form> </div> </div> <div class="landscape-warning"> <div class="landscape-warning-content"> <i class="fa-sync-alt fas"></i> <h1>Please use landscape mode</h1> <button id="btn_ignore_landscape_warning">Ignore</button> </div> </div> <button class="button-center button-center-top" title="Search for bluetooth device" id="btn_connect">CONNECT</button> <button class="button-center button-center-top" title="Disconnect from connected bluetooth device" id="btn_disconnect">DISCONNECT</button> <pre class="gamepad-touches" style="margin-left:10px;margin-top:50px;font-size:8px;"></pre> <div class="gamepad-wrapper" style="position:absolute;top:0;left:0;"></div> <div class="button-states"><pre></pre></div> <div class="statusline"> <span class="connection statusline-item"> <i class="fa-bluetooth-b fab" aria-hidden="true"></i> </span> <span class="notification-area"></span> </div> <script type="text/javascript" src="/microbit-gamepad/main.6a141175.js"></script> </body></html> \ No newline at end of file
diff --git a/main.fa7f93a2.js b/main.6a141175.js
index 74b04a1..c1a67fd 100644
--- a/main.fa7f93a2.js
+++ b/main.6a141175.js
@@ -5,6 +5,6 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcel
},{"./notification":"SiMs"}],"W7Xq":[function(require,module,exports) {
"use strict";function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(e)}function e(){return(e="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(t,e,n){var a=i(t,e);if(a){var s=Object.getOwnPropertyDescriptor(a,e);return s.get?s.get.call(arguments.length<3?t:n):s.value}}).apply(this,arguments)}function i(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=l(t)););return t}function n(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&a(t,e)}function a(t,e){return(a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function s(t){var e=h();return function(){var i,n=l(t);if(e){var a=l(this).constructor;i=Reflect.construct(n,arguments,a)}else i=n.apply(this,arguments);return r(this,i)}}function r(e,i){if(i&&("object"===t(i)||"function"==typeof i))return i;if(void 0!==i)throw new TypeError("Derived constructors may only return object or undefined");return o(e)}function o(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function h(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(t){return!1}}function l(t){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function u(t,e){return f(t)||g(t,e)||d(t,e)||c()}function c(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function d(t,e){if(t){if("string"==typeof t)return y(t,e);var i=Object.prototype.toString.call(t).slice(8,-1);return"Object"===i&&t.constructor&&(i=t.constructor.name),"Map"===i||"Set"===i?Array.from(t):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?y(t,e):void 0}}function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,n=new Array(e);i<e;i++)n[i]=t[i];return n}function g(t,e){var i=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=i){var n,a,s,r,o=[],h=!0,l=!1;try{if(s=(i=i.call(t)).next,0===e){if(Object(i)!==i)return;h=!1}else for(;!(h=(n=s.call(i)).done)&&(o.push(n.value),o.length!==e);h=!0);}catch(u){l=!0,a=u}finally{try{if(!h&&null!=i.return&&(r=i.return(),Object(r)!==r))return}finally{if(l)throw a}}return o}}function f(t){if(Array.isArray(t))return t}function v(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function p(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,x(n.key),n)}}function b(t,e,i){return e&&p(t.prototype,e),i&&p(t,i),Object.defineProperty(t,"prototype",{writable:!1}),t}function w(t,e,i){m(t,e),e.set(t,i)}function m(t,e){if(e.has(t))throw new TypeError("Cannot initialize the same private elements twice on an object")}function k(t,e,i){return(e=x(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function x(e){var i=T(e,"string");return"symbol"===t(i)?i:String(i)}function T(e,i){if("object"!==t(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,i||"default");if("object"!==t(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===i?String:Number)(e)}function Y(t,e){return A(t,P(t,e,"get"))}function A(t,e){return e.get?e.get.call(t):e.value}function X(t,e,i){return E(t,P(t,e,"set"),i),i}function P(t,e,i){if(!e.has(t))throw new TypeError("attempted to "+i+" private field on non-instance");return e.get(t)}function E(t,e,i){if(e.set)e.set.call(t,i);else{if(!e.writable)throw new TypeError("attempted to set read only private field");e.value=i}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Square=exports.GamepadJoystick=exports.GamepadButton=exports.Gamepad=void 0;var S=new WeakMap,O=new WeakMap,M=new WeakMap,B=new WeakMap,j=new WeakMap,I=function(){function t(e,i){var n=this;v(this,t),k(this,"canvas",void 0),w(this,S,{writable:!0,value:window.devicePixelRatio}),w(this,O,{writable:!0,value:void 0}),w(this,M,{writable:!0,value:void 0}),w(this,B,{writable:!0,value:void 0}),w(this,j,{writable:!0,value:[]}),k(this,"touches",{}),k(this,"showTouches",!1),this.canvas=document.createElement("canvas"),this.canvas.setAttribute("id",e),i.appendChild(this.canvas),addEventListener("resize",function(){return n.resize()}),this.resize(),console.debug("Created canvas",this.canvas),setInterval(function(){n.drawElements()},10)}return b(t,[{key:"resize",value:function(){X(this,B,this.canvas.getContext("2d")),X(this,M,+getComputedStyle(this.canvas).getPropertyValue("height").slice(0,-2)),X(this,O,+getComputedStyle(this.canvas).getPropertyValue("width").slice(0,-2)),this.canvas.setAttribute("height",Y(this,M)*Y(this,S)),this.canvas.setAttribute("width",Y(this,O)*Y(this,S))}},{key:"screenToCanvasX",value:function(t){return t*Y(this,S)}},{key:"screenToCanvasY",value:function(t){return t*Y(this,S)}},{key:"getTarget",value:function(t,e){t*=Y(this,S),e*=Y(this,S);for(var i=0;i<Y(this,j).length;i++)if(Y(this,j)[i]instanceof D&&Y(this,j)[i].collides(Y(this,B),t,e))return Y(this,j)[i]}},{key:"drawElements",value:function(){Y(this,B).clearRect(0,0,Y(this,O)*Y(this,S),Y(this,M)*Y(this,S));for(var t=0;t<Y(this,j).length;t++)Y(this,j)[t].draw(Y(this,B));this.showTouches&&this.drawTouches()}},{key:"drawTouches",value:function(t){for(var e=["200, 0, 0","0, 200, 0","0, 0, 200","200, 200, 0","200, 200, 200"],i=0,n=Object.entries(this.touches);i<n.length;i++){var a=u(n[i],2),s=a[0],r=a[1];Y(this,B).beginPath(),Y(this,B).arc(r.x*Y(this,S),r.y*Y(this,S),20*Y(this,S),0,2*Math.PI,!0),Y(this,B).fillStyle="rgba(".concat(e[s],", 0.2)"),Y(this,B).fill(),Y(this,B).lineWidth=2,Y(this,B).strokeStyle="rgba(".concat(e[s],", 0.8)"),Y(this,B).stroke()}}},{key:"addElement",value:function(t){Y(this,j).push(t),t.init()}},{key:"removeElementById",value:function(t){for(var e=0;e<Y(this,j).length;e++)if(t===Y(this,j)[e].id)return void Y(this,j).splice(e,1)}},{key:"removeAllElements",value:function(){Y(this,j).splice(0,Y(this,j).length)}}]),t}(),C=function(){function t(e,i){v(this,t),k(this,"gamepad",void 0),k(this,"id",void 0),k(this,"x",void 0),k(this,"y",void 0),k(this,"alignX",void 0),k(this,"alignY",void 0),k(this,"path",void 0),k(this,"isInside",void 0),k(this,"isActive",void 0),k(this,"type","Element");var n=Object.assign({id:null,x:0,y:0,alignX:null,alignY:null},e);this.id=n.id,this.x=n.x,this.y=n.y,this.alignX=n.alignX,this.alignY=n.alignY,this.gamepad=i}return b(t,[{key:"init",value:function(){}},{key:"getScaleX",value:function(t){return t.canvas.width/100}},{key:"getScaleY",value:function(t){return t.canvas.height/100}},{key:"getX",value:function(t){var e=this.x*this.getScaleY(t);return"center"===this.alignX&&(e=t.canvas.width/2+e),"right"===this.alignX&&(e=t.canvas.width-e),e}},{key:"getY",value:function(t){var e=this.y*this.getScaleY(t);return"center"===this.alignY&&(e=t.canvas.height/2+e),"bottom"===this.alignY&&(e=t.canvas.height-e),e}},{key:"draw",value:function(t){}},{key:"collides",value:function(t,e,i){return this.isInside=t.isPointInPath(this.path,e,i),this.isInside}}]),t}(),R=function(t){n(i,C);var e=s(i);function i(){return v(this,i),e.apply(this,arguments)}return b(i,[{key:"draw",value:function(t){this.path=new Path2D;var e=20*this.getScaleY(t);this.path.rect(this.getX(t)-e/2,this.getY(t)-e/2,e,e),t.fillStyle="rgba(100, 100, 100, 0.8)",t.fill(this.path)}}]),i}();exports.Square=R;var D=function(t){n(i,C);var e=s(i);function i(){var t;v(this,i);for(var n=arguments.length,a=new Array(n),s=0;s<n;s++)a[s]=arguments[s];return k(o(t=e.call.apply(e,[this].concat(a))),"type","TouchElement"),k(o(t),"touchCount",0),t}return b(i,[{key:"setActive",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];["end","cancel"].includes(t.type)&&this.touchCount--;var i="start"==t.type;i!==this.isActive&&0==this.touchCount&&(this.isActive=i,e&&this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(this.isActive?"touchstart":"touchend"))),"start"==t.type&&this.touchCount++}},{key:"createTouchEventObject",value:function(t){return{id:this.id,action:t,type:this.type}}}]),i}(),L=function(t){n(i,D);var e=s(i);function i(t){var n;v(this,i);var a=Object.assign({keyboardButton:null,altText:null,altTextAlign:"left",shape:"round"},t);return k(o(n=e.call(this,t)),"shape",void 0),k(o(n),"altText",void 0),k(o(n),"altTextAlign",void 0),k(o(n),"type","GamepadButton"),n.keyboardButton=a.keyboardButton,n.shape=a.shape,n.altText=a.altText,n.altTextAlign=a.altTextAlign,n}return b(i,[{key:"init",value:function(){null!==this.keyboardButton&&this.gamepad.registerKeybinding(this.keyboardButton,this)}},{key:"draw",value:function(t){if(this.path=new Path2D,"round"===this.shape)this.path.arc(this.getX(t),this.getY(t),10*this.getScaleY(t),0,4*Math.PI,!0);else if("square"===this.shape){var e=20*this.getScaleY(t);this.path.rect(this.getX(t)-e/2,this.getY(t)-e/2,e,e)}this.isActive?t.fillStyle="rgba(80, 80, 80, 1)":t.fillStyle="rgba(100, 100, 100, 0.8)",t.fill(this.path);var i="".concat(Math.floor((8*this.getScaleY(t)).toString()),"px 'Press Start 2P'");if(t.font=i,t.textBaseline="middle",t.textAlign="center",t.fillStyle="rgba(255, 255, 255, 1)",t.fillText(this.id,this.getX(t),this.getY(t)),null!==this.altText&&this.gamepad.showAltText){t.beginPath(),t.font="".concat(Math.floor((3*this.getScaleY(t)).toString()),"px 'Press Start 2P'"),t.textBaseline="middle",t.textAlign="center",t.fillStyle="rgba(150, 150, 150, 1)";var n=this.getX(t),a=this.getY(t);switch(this.altTextAlign){case"left":n-=13*this.getScaleY(t);break;case"right":n+=13*this.getScaleY(t);break;case"top":a-=13*this.getScaleY(t);break;case"bottom":a+=13*this.getScaleY(t)}t.fillText(this.altText,n,a)}}}]),i}();exports.GamepadButton=L;var K=new WeakMap,q=new WeakMap,W=new WeakMap,G=function(t){n(a,D);var i=s(a);function a(t){var e;v(this,a);var n=Object.assign({lockX:!1,lockY:!1,autoCenter:!0,bindUp:null,bindLeft:null,bindRight:null,bindDown:null},t);return k(o(e=i.call(this,t)),"type","GamepadJoystick"),k(o(e),"mouseX",0),k(o(e),"mouseY",0),k(o(e),"cR",0),k(o(e),"cX",0),k(o(e),"cY",0),w(o(e),K,{writable:!0,value:void 0}),w(o(e),q,{writable:!0,value:void 0}),w(o(e),W,{writable:!0,value:{}}),X(o(e),K,n.lockX),X(o(e),q,n.lockY),e.bindUp=n.bindUp,e.bindLeft=n.bindLeft,e.bindRight=n.bindRight,e.bindDown=n.bindDown,e}return b(a,[{key:"init",value:function(){null!==this.bindUp&&this.gamepad.registerKeybinding(this.bindUp,this),null!==this.bindLeft&&this.gamepad.registerKeybinding(this.bindLeft,this),null!==this.bindRight&&this.gamepad.registerKeybinding(this.bindRight,this),null!==this.bindDown&&this.gamepad.registerKeybinding(this.bindDown,this)}},{key:"isKeyPressed",value:function(t){return null!==t&&Y(this,W).hasOwnProperty(t)&&Y(this,W)[t]>0}},{key:"createTouchEventObject",value:function(t){return{id:this.id,action:t,type:this.type,x:Math.round(this.mouseX/this.cR*100),y:Math.round(this.mouseY/this.cR*100)}}},{key:"setActive",value:function(t){e(l(a.prototype),"setActive",this).call(this,t,!1),t.hasOwnProperty("key")&&(Y(this,W).hasOwnProperty(t.key)||(Y(this,W)[t.key]=0),["start"].includes(t.type)&&Y(this,W)[t.key]++,["end","cancel"].includes(t.type)&&Y(this,W)[t.key]--);var i=this.cR;Y(this,K)||(t.hasOwnProperty("x")&&(this.mouseX=this.cX-this.gamepad.stage.screenToCanvasX(t.x),this.mouseX=Math.min(Math.abs(this.mouseX),i)*Math.sign(this.mouseX),this.mouseX*=-1),this.isKeyPressed(this.bindLeft)&&(this.mouseX=-i),this.isKeyPressed(this.bindRight)&&(this.mouseX=i),this.isKeyPressed(this.bindLeft)&&this.isKeyPressed(this.bindRight)&&(this.mouseX=0),this.isActive||(this.mouseX=0)),Y(this,q)||(t.hasOwnProperty("y")&&(this.mouseY=this.cY-this.gamepad.stage.screenToCanvasY(t.y),this.mouseY=Math.min(Math.abs(this.mouseY),i)*Math.sign(this.mouseY)),this.isKeyPressed(this.bindUp)&&(this.mouseY=i),this.isKeyPressed(this.bindDown)&&(this.mouseY=-i),this.isKeyPressed(this.bindUp)&&this.isKeyPressed(this.bindDown)&&(this.mouseY=0),this.isActive||(this.mouseY=0));var n="touchmove";this.isActive&&1==this.touchCount&&"start"===t.type&&(n="touchstart"),this.isActive||(n="touchend"),this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(n))}},{key:"draw",value:function(t){this.cX=this.getX(t),this.cY=this.getY(t),this.cR=25*this.getScaleY(t),this.path=new Path2D,this.path.arc(this.cX,this.cY,this.cR,0,4*Math.PI,!0),this.isActive?t.fillStyle="rgba(85, 85, 85, 0.8)":t.fillStyle="rgba(100, 100, 100, 0.8)",t.fill(this.path),t.beginPath(),t.arc(this.cX+this.mouseX,this.cY-this.mouseY,15*this.getScaleY(t),0,4*Math.PI,!0),t.fillStyle="rgba(130, 130, 130, 1)",t.fill()}}]),a}();exports.GamepadJoystick=G;var U=new WeakMap,_=new WeakMap,z=new WeakMap,V=new WeakMap,J=new WeakMap,H=new WeakMap,N=function(){function t(){v(this,t),k(this,"stage",void 0),w(this,U,{writable:!0,value:void 0}),w(this,_,{writable:!0,value:void 0}),w(this,z,{writable:!0,value:{}}),w(this,V,{writable:!0,value:{}}),w(this,J,{writable:!0,value:{}}),w(this,H,{writable:!0,value:[]}),k(this,"showDebug",!1),k(this,"showAltText",!0),k(this,"enableVibration",!0),this.stage=new I("GamePad",document.querySelector(".gamepad-wrapper")),this.addEventListeners()}return b(t,[{key:"addEventListeners",value:function(){var t=this,e=["keydown","keyup"];for(var i in e)document.addEventListener(e[i],function(e){return t.handleKeyEvent(e)},!1);for(var i in e=["touchstart","touchend","touchcancel","touchmove"])this.stage.canvas.addEventListener(e[i],function(e){return t.handleTouchEvent(e)},!1);for(var i in e=["mousedown","mouseup","mousemove"])this.stage.canvas.addEventListener(e[i],function(e){return t.handleMouseEvent(e)},!1)}},{key:"registerKeybinding",value:function(t,e){Y(this,V)[t]=e}},{key:"handleKeyEvent",value:function(t){if(Y(this,J).hasOwnProperty(t.keyCode)||(Y(this,J)[t.keyCode]={pressed:!1}),Y(this,V).hasOwnProperty(t.key)){var e="Key ".concat(t.key),i=Y(this,V)[t.key],n={touchId:e,key:t.key,type:{keydown:"start",keyup:"end"}[t.type]};switch(t.type){case"keydown":if(Y(this,J)[t.keyCode].pressed)return;Y(this,J)[t.keyCode].pressed=!0,Y(this,z)[e]={},Y(this,z)[e].target=i,Y(this,z)[e].hasOwnProperty("target")&&null!=Y(this,z)[e].target&&Y(this,z)[e].target.setActive(n);break;case"keyup":if(!Y(this,J)[t.keyCode].pressed)return;Y(this,J)[t.keyCode].pressed=!1,Y(this,z)[e].hasOwnProperty("target")&&null!=Y(this,z)[e].target&&Y(this,z)[e].target.setActive(n),delete Y(this,z)[e]}}this.stage.touches=Y(this,z),this.debugTouches()}},{key:"handleMouseEvent",value:function(t){this.processGamepadTouchEvent({x:t.clientX,y:t.clientY,touchId:"mouse",type:{mousedown:"start",mouseup:"end",mousemove:"move"}[t.type]})}},{key:"handleTouchEvent",value:function(t){t.preventDefault();for(var e={touchstart:"start",touchend:"end",touchcancel:"end",touchmove:"move"},i=0;i<t.changedTouches.length;i++){var n=t.changedTouches[i];this.processGamepadTouchEvent({x:n.clientX,y:n.clientY,touchId:n.identifier,type:e[t.type]})}}},{key:"processGamepadTouchEvent",value:function(t){var e=this.stage.getTarget(t.x,t.y);switch(t.type){case"start":Y(this,z)[t.touchId]={},Y(this,z)[t.touchId].target=e;case"move":Y(this,z).hasOwnProperty(t.touchId)&&(Y(this,z)[t.touchId].x=t.x,Y(this,z)[t.touchId].y=t.y,Y(this,z)[t.touchId].hasOwnProperty("target")&&null!=Y(this,z)[t.touchId].target&&Y(this,z)[t.touchId].target.setActive(t));break;case"end":case"cancel":Y(this,z)[t.touchId].hasOwnProperty("target")&&null!=Y(this,z)[t.touchId].target&&Y(this,z)[t.touchId].target.setActive(t),delete Y(this,z)[t.touchId];break;default:console.log("Unknown touch event",t.type)}this.stage.touches=Y(this,z),this.debugTouches()}},{key:"debugTouches",value:function(){var t="";if(this.showDebug)for(var e=0,i=Object.entries(Y(this,z));e<i.length;e++){var n=u(i[e],2),a=n[0],s=n[1];t+="[".concat(a,"] "),s.hasOwnProperty("x")&&(t+="x: ".concat(Math.round(s.x,2),", y: ").concat(Math.round(s.y),",")),t+="target: ".concat(s.target?s.target.id:null,"\n")}document.querySelector(".gamepad-touches").innerHTML=t}},{key:"handleTouchEventCallbacks",value:function(t){if(this.enableVibration&&["touchstart","touchend"].includes(t.action))try{window.navigator.vibrate(5)}catch(t){console.error(t)}for(var e=0;e<Y(this,H).length;e++)Y(this,H)[e](t)}},{key:"onTouchEvent",value:function(t){Y(this,H).push(t)}},{key:"addElements",value:function(t){for(var e=0;e<t.length;e++)t[e].gamepad=this,this.stage.addElement(t[e])}},{key:"removeElementsById",value:function(t){for(var e=0;e<t.length;e++)this.stage.removeElementById(t[e])}},{key:"removeAllElements",value:function(){this.stage.removeAllElements()}},{key:"setGamepadLayout",value:function(t){switch(console.debug("Setting the gamepad layout to ".concat(t,", deleting all current elements.")),this.removeAllElements(),t){case"1":this.addElements([new R({id:"filler1",x:40,y:0,alignX:"left",alignY:"center"}),new L({id:"C",x:20,y:0,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowLeft",altText:"◀",altTextAlign:"right"}),new L({id:"D",x:60,y:0,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowRight",altText:"▶",altTextAlign:"left"}),new L({id:"A",x:40,y:-20,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowUp",altText:"▲",altTextAlign:"bottom"}),new L({id:"B",x:40,y:20,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowDown",altText:"▼",altTextAlign:"top"}),new L({id:"3",x:20,y:0,alignX:"right",alignY:"center",shape:"round",keyboardButton:"3",altText:"3",altTextAlign:"left"}),new L({id:"4",x:60,y:0,alignX:"right",alignY:"center",shape:"round",keyboardButton:"4",altText:"4",altTextAlign:"right"}),new L({id:"1",x:40,y:-20,alignX:"right",alignY:"center",shape:"round",keyboardButton:"1",altText:"1",altTextAlign:"bottom"}),new L({id:"2",x:40,y:20,alignX:"right",alignY:"center",shape:"round",keyboardButton:"2",altText:"2",altTextAlign:"top"})]);break;case"2":this.addElements([new R({id:"filler2",x:40,y:0,alignX:"right",alignY:"center"}),new R({id:"filler1",x:40,y:0,alignX:"left",alignY:"center"}),new L({id:"C",x:20,y:0,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowLeft",altText:"◀",altTextAlign:"right"}),new L({id:"D",x:60,y:0,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowRight",altText:"▶",altTextAlign:"left"}),new L({id:"A",x:40,y:-20,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowUp",altText:"▲",altTextAlign:"bottom"}),new L({id:"B",x:40,y:20,alignX:"left",alignY:"center",shape:"square",keyboardButton:"ArrowDown",altText:"▼",altTextAlign:"top"}),new L({id:"3",x:20,y:0,alignX:"right",alignY:"center",shape:"square",keyboardButton:"3"}),new L({id:"4",x:60,y:0,alignX:"right",alignY:"center",shape:"square",keyboardButton:"4"}),new L({id:"1",x:40,y:-20,alignX:"right",alignY:"center",shape:"square",keyboardButton:"1"}),new L({id:"2",x:40,y:20,alignX:"right",alignY:"center",shape:"square",keyboardButton:"2"})]);break;case"9":this.addElements([new G({id:"left",x:40,y:0,alignX:"left",alignY:"center",lockX:!0,bindUp:"ArrowUp",bindDown:"ArrowDown"}),new G({id:"right",x:40,y:0,alignX:"right",alignY:"center",lockY:!0,bindLeft:"ArrowLeft",bindRight:"ArrowRight"})])}}}]),t}();exports.Gamepad=N;
},{}],"d6sW":[function(require,module,exports) {
-"use strict";var t=require("./uBit"),e=require("./notification"),r=require("./gamepad");function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){return l(t)||u(t,e)||i(t,e)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function i(t,e){if(t){if("string"==typeof t)return c(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function u(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,c=[],u=!0,l=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(c.push(n.value),c.length!==e);u=!0);}catch(s){l=!0,o=s}finally{try{if(!u&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw o}}return c}}function l(t){if(Array.isArray(t))return t}function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function d(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?s(Object(r),!0).forEach(function(e){h(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function h(t,e,r){return(e=f(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function f(t){var e=g(t,"string");return"symbol"===n(e)?e:String(e)}function g(t,e){if("object"!==n(t)||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!==n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function v(){v=function(){return t};var t={},e=Object.prototype,r=e.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},a="function"==typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",c=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function l(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(M){l=function(t,e,r){return t[e]=r}}function s(t,e,r,n){var a=e&&e.prototype instanceof f?e:f,i=Object.create(a.prototype),c=new T(n||[]);return o(i,"_invoke",{value:E(t,r,c)}),i}function d(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(M){return{type:"throw",arg:M}}}t.wrap=s;var h={};function f(){}function g(){}function y(){}var p={};l(p,i,function(){return this});var m=Object.getPrototypeOf,b=m&&m(m(P([])));b&&b!==e&&r.call(b,i)&&(p=b);var w=y.prototype=f.prototype=Object.create(p);function S(t){["next","throw","return"].forEach(function(e){l(t,e,function(t){return this._invoke(e,t)})})}function _(t,e){var a;o(this,"_invoke",{value:function(o,i){function c(){return new e(function(a,c){!function o(a,i,c,u){var l=d(t[a],t,i);if("throw"!==l.type){var s=l.arg,h=s.value;return h&&"object"==n(h)&&r.call(h,"__await")?e.resolve(h.__await).then(function(t){o("next",t,c,u)},function(t){o("throw",t,c,u)}):e.resolve(h).then(function(t){s.value=t,c(s)},function(t){return o("throw",t,c,u)})}u(l.arg)}(o,i,a,c)})}return a=a?a.then(c,c):c()}})}function E(t,e,r){var n="suspendedStart";return function(o,a){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===o)throw a;return x()}for(r.method=o,r.arg=a;;){var i=r.delegate;if(i){var c=O(i,r);if(c){if(c===h)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=d(t,e,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}function O(t,e){var r=e.method,n=t.iterator[r];if(void 0===n)return e.delegate=null,"throw"===r&&t.iterator.return&&(e.method="return",e.arg=void 0,O(t,e),"throw"===e.method)||"return"!==r&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+r+"' method")),h;var o=d(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,h;var a=o.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,h):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,h)}function D(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function L(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(D,this),this.reset(!0)}function P(t){if(t){var e=t[i];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,o=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return o.next=o}}return{next:x}}function x(){return{value:void 0,done:!0}}return g.prototype=y,o(w,"constructor",{value:y,configurable:!0}),o(y,"constructor",{value:g,configurable:!0}),g.displayName=l(y,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,y):(t.__proto__=y,l(t,u,"GeneratorFunction")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},S(_.prototype),l(_.prototype,c,function(){return this}),t.AsyncIterator=_,t.async=function(e,r,n,o,a){void 0===a&&(a=Promise);var i=new _(s(e,r,n,o),a);return t.isGeneratorFunction(r)?i:i.next().then(function(t){return t.done?t.value:i.next()})},S(w),l(w,u,"Generator"),l(w,i,function(){return this}),l(w,"toString",function(){return"[object Generator]"}),t.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},t.values=P,T.prototype={constructor:T,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(L),!t)for(var e in this)"t"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return i.type="throw",i.arg=t,e.next=r,n&&(e.method="next",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],i=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var c=r.call(a,"catchLoc"),u=r.call(a,"finallyLoc");if(c&&u){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(c){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var a=o;break}}a&&("break"===t||"continue"===t)&&a.tryLoc<=e&&e<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=t,i.arg=e,a?(this.method="next",this.next=a.finallyLoc,h):this.complete(i)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),h},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),L(r),h}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:P(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},t}function y(t,e,r,n,o,a,i){try{var c=t[a](i),u=c.value}catch(l){return void r(l)}c.done?e(u):Promise.resolve(u).then(n,o)}function p(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){y(a,n,o,i,c,"next",t)}function c(t){y(a,n,o,i,c,"throw",t)}i(void 0)})}}var m="service-worker.js";navigator.serviceWorker&&navigator.serviceWorker.register(m,{scope:"/microbit-gamepad/"}).then(function(t){t.onupdatefound=function(){var r=t.installing;null!=r&&(r.onstatechange=function(){"installed"===r.state&&(navigator.serviceWorker.controller?(0,e.notif_info)("New content is available, relaunch the app to install it."):(0,e.notif_success)("Content is cached for offline use."))})},t.update()}).catch(function(t){(0,e.notif_warn)("Could not install service worker..."),console.error("Error during service worker registration:",t)}),document.getElementById("btn_ignore_landscape_warning").addEventListener("click",function(){document.body.classList.add("ignore-landscape-warning")}),navigator.bluetooth||(console.error("You do not have a bluetooth enabled browser, you need to have a bluetooth enabled browser..."),(0,e.notif_alert)("Your browser does not seem to support bluetooth, try using Google Chrome or Microsoft Edge."));var b=new r.Gamepad;window.gamepad=b;var w=new t.uBitBLE;window.ubit=w,document.querySelector(".settings-dialog #layout").addEventListener("change",function(t){b.setGamepadLayout(t.target.value),localStorage.setItem("gamepadLayout",t.target.value),document.querySelector(".button-states pre").innerHTML="No buttons pressed yet"}),null===localStorage.getItem("gamepadLayout")&&localStorage.setItem("gamepadLayout","1"),b.setGamepadLayout(localStorage.getItem("gamepadLayout")),document.querySelector(".button-states pre").innerHTML="No buttons pressed yet",document.querySelector(".settings-dialog #layout").value=localStorage.getItem("gamepadLayout"),document.querySelector(".settings-dialog #show-touches").addEventListener("change",function(t){b.stage.showTouches=t.target.checked,localStorage.setItem("showTouches",t.target.checked)}),null===localStorage.getItem("showTouches")&&localStorage.setItem("showTouches",!1),b.stage.showTouches="true"==localStorage.getItem("showTouches"),document.querySelector(".settings-dialog #show-touches").checked="true"==localStorage.getItem("showTouches"),document.querySelector(".settings-dialog #show-gamepad-alt-text").addEventListener("change",function(t){b.showAltText=t.target.checked,localStorage.setItem("showAltText",t.target.checked)}),null===localStorage.getItem("showAltText")&&localStorage.setItem("showAltText",!1),b.showAltText="true"==localStorage.getItem("showAltText"),document.querySelector(".settings-dialog #show-gamepad-alt-text").checked="true"==localStorage.getItem("showAltText"),document.querySelector(".settings-dialog #enable-haptic").addEventListener("change",function(t){b.enableVibration=t.target.checked,localStorage.setItem("enableHaptic",t.target.checked)}),null===localStorage.getItem("enableHaptic")&&localStorage.setItem("enableHaptic",!0),b.enableVibration="true"==localStorage.getItem("enableHaptic"),document.querySelector(".settings-dialog #enable-haptic").checked="true"==localStorage.getItem("enableHaptic"),document.querySelector(".settings-dialog #enable-debug").addEventListener("change",function(t){b.showDebug=t.target.checked,t.target.checked?document.body.classList.add("debug"):document.body.classList.remove("debug"),localStorage.setItem("enableDebug",t.target.checked)}),null===localStorage.getItem("enableDebug")&&localStorage.setItem("enableDebug",!1),b.showDebug="true"==localStorage.getItem("enableDebug"),"true"===localStorage.getItem("enableDebug")?document.body.classList.add("debug"):document.body.classList.remove("debug"),document.querySelector(".settings-dialog #enable-debug").checked="true"==localStorage.getItem("enableDebug"),document.querySelector("#btn_show_settings").addEventListener("click",function(){document.querySelector(".settings-dialog").classList.add("shown")}),document.querySelector("#btn_hide_settings").addEventListener("click",function(){document.querySelector(".settings-dialog").classList.remove("shown")}),document.querySelector("#btn_disconnect").addEventListener("click",function(){w.disconnect()}),document.getElementById("btn_connect").addEventListener("click",p(v().mark(function t(){return v().wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return navigator.bluetooth||(0,e.notif_alert)("You need a bluetooth enabled browser for this app to work, try chrome."),t.prev=1,t.next=4,w.searchDevice();case 4:t.next=9;break;case 6:t.prev=6,t.t0=t.catch(1),(0,e.notif_alert)("Could not connect to device: ".concat(t.t0,"."));case 9:case"end":return t.stop()}},t,null,[[1,6]])})));var S={};b.onTouchEvent(function(t){["touchstart","touchmove"].includes(t.action)&&(S[t.id]=d({state:!0},t)),["touchend"].includes(t.action)&&(S[t.id]=d({state:!1},t));for(var e="",r=0,n=Object.entries(S);r<n.length;r++){var a=o(n[r],2),i=a[0],c=a[1];e+="".concat(i,": ").concat(c.state?"Pressed":"Not pressed"),c.hasOwnProperty("x")&&(e+=" (x: ".concat(c.x,", y: ").concat(c.y,")")),e+="\n"}document.querySelector(".button-states pre").innerHTML=e}),b.onTouchEvent(function(e){var r=t.MESEvents.MES_DPAD_CONTROLLER_ID,n=null;"touchstart"==e.action?"A"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_A_DOWN:"B"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_B_DOWN:"C"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_C_DOWN:"D"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_D_DOWN:"1"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_1_DOWN:"2"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_2_DOWN:"3"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_3_DOWN:"4"==e.id&&(n=t.MESEvents.MES_DPAD_BUTTON_4_DOWN):"touchend"==e.action&&("A"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_A_UP:"B"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_B_UP:"C"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_C_UP:"D"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_D_UP:"1"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_1_UP:"2"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_2_UP:"3"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_3_UP:"4"==e.id&&(n=t.MESEvents.MES_DPAD_BUTTON_4_UP)),w.isConnected()&&null!=n&&w.sendEvent(r,n),"right"==e.id&&e.hasOwnProperty("x")&&w.sendUart("x:".concat(e.x,"\n")),"left"==e.id&&e.hasOwnProperty("y")&&w.sendUart("y:".concat(e.y,"\n"))}),w.onConnect(function(){document.body.classList.add("connected")}),w.onDisconnect(function(){document.body.classList.remove("connected")});
+"use strict";var t=require("./uBit"),e=require("./notification"),r=require("./gamepad");function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(t,e){return l(t)||u(t,e)||i(t,e)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function i(t,e){if(t){if("string"==typeof t)return c(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?c(t,e):void 0}}function c(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function u(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,a,i,c=[],u=!0,l=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(c.push(n.value),c.length!==e);u=!0);}catch(s){l=!0,o=s}finally{try{if(!u&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(l)throw o}}return c}}function l(t){if(Array.isArray(t))return t}function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function d(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?s(Object(r),!0).forEach(function(e){h(t,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}function h(t,e,r){return(e=f(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function f(t){var e=g(t,"string");return"symbol"===n(e)?e:String(e)}function g(t,e){if("object"!==n(t)||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!==n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}function v(){v=function(){return t};var t={},e=Object.prototype,r=e.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},a="function"==typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",c=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function l(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{l({},"")}catch(M){l=function(t,e,r){return t[e]=r}}function s(t,e,r,n){var a=e&&e.prototype instanceof f?e:f,i=Object.create(a.prototype),c=new T(n||[]);return o(i,"_invoke",{value:E(t,r,c)}),i}function d(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(M){return{type:"throw",arg:M}}}t.wrap=s;var h={};function f(){}function g(){}function y(){}var p={};l(p,i,function(){return this});var m=Object.getPrototypeOf,b=m&&m(m(P([])));b&&b!==e&&r.call(b,i)&&(p=b);var w=y.prototype=f.prototype=Object.create(p);function S(t){["next","throw","return"].forEach(function(e){l(t,e,function(t){return this._invoke(e,t)})})}function _(t,e){var a;o(this,"_invoke",{value:function(o,i){function c(){return new e(function(a,c){!function o(a,i,c,u){var l=d(t[a],t,i);if("throw"!==l.type){var s=l.arg,h=s.value;return h&&"object"==n(h)&&r.call(h,"__await")?e.resolve(h.__await).then(function(t){o("next",t,c,u)},function(t){o("throw",t,c,u)}):e.resolve(h).then(function(t){s.value=t,c(s)},function(t){return o("throw",t,c,u)})}u(l.arg)}(o,i,a,c)})}return a=a?a.then(c,c):c()}})}function E(t,e,r){var n="suspendedStart";return function(o,a){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===o)throw a;return x()}for(r.method=o,r.arg=a;;){var i=r.delegate;if(i){var c=O(i,r);if(c){if(c===h)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=d(t,e,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}function O(t,e){var r=e.method,n=t.iterator[r];if(void 0===n)return e.delegate=null,"throw"===r&&t.iterator.return&&(e.method="return",e.arg=void 0,O(t,e),"throw"===e.method)||"return"!==r&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+r+"' method")),h;var o=d(n,t.iterator,e.arg);if("throw"===o.type)return e.method="throw",e.arg=o.arg,e.delegate=null,h;var a=o.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,h):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,h)}function D(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function L(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(D,this),this.reset(!0)}function P(t){if(t){var e=t[i];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,o=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return o.next=o}}return{next:x}}function x(){return{value:void 0,done:!0}}return g.prototype=y,o(w,"constructor",{value:y,configurable:!0}),o(y,"constructor",{value:g,configurable:!0}),g.displayName=l(y,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,y):(t.__proto__=y,l(t,u,"GeneratorFunction")),t.prototype=Object.create(w),t},t.awrap=function(t){return{__await:t}},S(_.prototype),l(_.prototype,c,function(){return this}),t.AsyncIterator=_,t.async=function(e,r,n,o,a){void 0===a&&(a=Promise);var i=new _(s(e,r,n,o),a);return t.isGeneratorFunction(r)?i:i.next().then(function(t){return t.done?t.value:i.next()})},S(w),l(w,u,"Generator"),l(w,i,function(){return this}),l(w,"toString",function(){return"[object Generator]"}),t.keys=function(t){var e=Object(t),r=[];for(var n in e)r.push(n);return r.reverse(),function t(){for(;r.length;){var n=r.pop();if(n in e)return t.value=n,t.done=!1,t}return t.done=!0,t}},t.values=P,T.prototype={constructor:T,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(L),!t)for(var e in this)"t"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return i.type="throw",i.arg=t,e.next=r,n&&(e.method="next",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],i=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var c=r.call(a,"catchLoc"),u=r.call(a,"finallyLoc");if(c&&u){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(c){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var a=o;break}}a&&("break"===t||"continue"===t)&&a.tryLoc<=e&&e<=a.finallyLoc&&(a=null);var i=a?a.completion:{};return i.type=t,i.arg=e,a?(this.method="next",this.next=a.finallyLoc,h):this.complete(i)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),h},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),L(r),h}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:P(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=void 0),h}},t}function y(t,e,r,n,o,a,i){try{var c=t[a](i),u=c.value}catch(l){return void r(l)}c.done?e(u):Promise.resolve(u).then(n,o)}function p(t){return function(){var e=this,r=arguments;return new Promise(function(n,o){var a=t.apply(e,r);function i(t){y(a,n,o,i,c,"next",t)}function c(t){y(a,n,o,i,c,"throw",t)}i(void 0)})}}var m="service-worker.js";navigator.serviceWorker&&navigator.serviceWorker.register(m,{scope:"/microbit-gamepad/"}).then(function(t){t.onupdatefound=function(){var r=t.installing;null!=r&&(r.onstatechange=function(){"installed"===r.state&&(navigator.serviceWorker.controller?(0,e.notif_info)("New content is available, relaunch the app to install it."):(0,e.notif_success)("Content is cached for offline use."))})},t.update()}).catch(function(t){(0,e.notif_warn)("Could not install service worker..."),console.error("Error during service worker registration:",t)}),document.getElementById("btn_ignore_landscape_warning").addEventListener("click",function(){document.body.classList.add("ignore-landscape-warning")}),navigator.bluetooth||(console.error("You do not have a bluetooth enabled browser, you need to have a bluetooth enabled browser..."),(0,e.notif_alert)("Your browser does not seem to support bluetooth, try using Google Chrome or Microsoft Edge."));var b=new r.Gamepad;window.gamepad=b;var w=new t.uBitBLE;window.ubit=w,document.querySelector(".settings-dialog #layout").addEventListener("change",function(t){b.setGamepadLayout(t.target.value),localStorage.setItem("gamepadLayout",t.target.value),document.querySelector(".button-states pre").innerHTML="No buttons pressed yet"}),null===localStorage.getItem("gamepadLayout")&&localStorage.setItem("gamepadLayout","1"),b.setGamepadLayout(localStorage.getItem("gamepadLayout")),document.querySelector(".button-states pre").innerHTML="No buttons pressed yet",document.querySelector(".settings-dialog #layout").value=localStorage.getItem("gamepadLayout"),document.querySelector(".settings-dialog #show-touches").addEventListener("change",function(t){b.stage.showTouches=t.target.checked,localStorage.setItem("showTouches",t.target.checked)}),null===localStorage.getItem("showTouches")&&localStorage.setItem("showTouches",!1),b.stage.showTouches="true"==localStorage.getItem("showTouches"),document.querySelector(".settings-dialog #show-touches").checked="true"==localStorage.getItem("showTouches"),document.querySelector(".settings-dialog #show-gamepad-alt-text").addEventListener("change",function(t){b.showAltText=t.target.checked,localStorage.setItem("showAltText",t.target.checked)}),null===localStorage.getItem("showAltText")&&localStorage.setItem("showAltText",!1),b.showAltText="true"==localStorage.getItem("showAltText"),document.querySelector(".settings-dialog #show-gamepad-alt-text").checked="true"==localStorage.getItem("showAltText"),document.querySelector(".settings-dialog #enable-haptic").addEventListener("change",function(t){b.enableVibration=t.target.checked,localStorage.setItem("enableHaptic",t.target.checked)}),null===localStorage.getItem("enableHaptic")&&localStorage.setItem("enableHaptic",!0),b.enableVibration="true"==localStorage.getItem("enableHaptic"),document.querySelector(".settings-dialog #enable-haptic").checked="true"==localStorage.getItem("enableHaptic"),document.querySelector(".settings-dialog #enable-debug").addEventListener("change",function(t){b.showDebug=t.target.checked,t.target.checked?document.body.classList.add("debug"):document.body.classList.remove("debug"),localStorage.setItem("enableDebug",t.target.checked)}),null===localStorage.getItem("enableDebug")&&localStorage.setItem("enableDebug",!1),b.showDebug="true"==localStorage.getItem("enableDebug"),"true"===localStorage.getItem("enableDebug")?document.body.classList.add("debug"):document.body.classList.remove("debug"),document.querySelector(".settings-dialog #enable-debug").checked="true"==localStorage.getItem("enableDebug"),document.querySelector("#btn_show_settings").addEventListener("click",function(){document.querySelector(".settings-dialog").classList.add("shown")}),document.querySelector("#btn_hide_settings").addEventListener("click",function(){document.querySelector(".settings-dialog").classList.remove("shown")}),document.querySelector("#btn_disconnect").addEventListener("click",function(){w.disconnect()}),document.getElementById("btn_connect").addEventListener("click",p(v().mark(function t(){return v().wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return navigator.bluetooth||(0,e.notif_alert)("You need a bluetooth enabled browser for this app to work, try chrome."),t.prev=1,t.next=4,w.searchDevice();case 4:t.next=9;break;case 6:t.prev=6,t.t0=t.catch(1),(0,e.notif_alert)("Could not connect to device: ".concat(t.t0,"."));case 9:case"end":return t.stop()}},t,null,[[1,6]])})));var S={};b.onTouchEvent(function(t){["touchstart","touchmove"].includes(t.action)&&(S[t.id]=d({state:!0},t)),["touchend"].includes(t.action)&&(S[t.id]=d({state:!1},t));for(var e="",r=0,n=Object.entries(S);r<n.length;r++){var a=o(n[r],2),i=a[0],c=a[1];e+="".concat(i,": ").concat(c.state?"Pressed":"Not pressed"),c.hasOwnProperty("x")&&(e+=" (x: ".concat(c.x,", y: ").concat(c.y,")")),e+="\n"}document.querySelector(".button-states pre").innerHTML=e});var _={};b.onTouchEvent(function(e){var r=t.MESEvents.MES_DPAD_CONTROLLER_ID,n=null;"touchstart"==e.action?"A"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_A_DOWN:"B"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_B_DOWN:"C"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_C_DOWN:"D"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_D_DOWN:"1"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_1_DOWN:"2"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_2_DOWN:"3"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_3_DOWN:"4"==e.id&&(n=t.MESEvents.MES_DPAD_BUTTON_4_DOWN):"touchend"==e.action&&("A"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_A_UP:"B"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_B_UP:"C"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_C_UP:"D"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_D_UP:"1"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_1_UP:"2"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_2_UP:"3"==e.id?n=t.MESEvents.MES_DPAD_BUTTON_3_UP:"4"==e.id&&(n=t.MESEvents.MES_DPAD_BUTTON_4_UP)),w.isConnected()&&null!=n&&w.sendEvent(r,n),"right"==e.id&&(_.x=e.x),"left"==e.id&&(_.y=e.y)}),w.onConnect(function(){document.body.classList.add("connected")}),w.onDisconnect(function(){document.body.classList.remove("connected")});var E=0;setInterval(function(){0==E&&_.hasOwnProperty("x")&&w.sendUart("x:".concat(_.x,"\n")),1==E&&_.hasOwnProperty("y")&&w.sendUart("y:".concat(_.y,"\n")),++E>1&&(E=0)},20);
},{"./uBit":"COPm","./notification":"SiMs","./gamepad":"W7Xq"}]},{},["d6sW"], null)
-//# sourceMappingURL=/microbit-gamepad/main.fa7f93a2.js.map \ No newline at end of file
+//# sourceMappingURL=/microbit-gamepad/main.6a141175.js.map \ No newline at end of file
diff --git a/main.6a141175.js.map b/main.6a141175.js.map
new file mode 100644
index 0000000..0b9972b
--- /dev/null
+++ b/main.6a141175.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["js/notification.js","js/uBit.js","js/gamepad.js","js/main.js"],"names":["waiting_timer","undefined","notif_queue","notif","notif_c","notification_area","document","querySelector","screen","availHeight","availWidth","body","classList","contains","setInterval","clearInterval","pop","push","notif_elem","createElement","className","appendChild","add","setTimeout","remove","style","opacity","removeChild","length","notif_alert","alert_str","div","text","innerHTML","icon","notif_warn","notif_info","info_str","notif_success","success_str","UART_SERVICE_UUID","UART_TX_CHARACTERISTIC_UUID","UART_RX_CHARACTERISTIC_UUID","EVENT_SERVICE_UUID","UBIT_REQUIREMENT_CHARACTERISTIC_UUID","CLIENTREQUIREMENTS_CHARACTERISTIC_UUID","UBITEVENT_CHARACTERISTIC_UUID","CLIENTEVENT_CHARACTERISTIC_UUID","MESEvents","MES_DPAD_CONTROLLER_ID","MES_DPAD_BUTTON_A_DOWN","MES_DPAD_BUTTON_A_UP","MES_DPAD_BUTTON_B_DOWN","MES_DPAD_BUTTON_B_UP","MES_DPAD_BUTTON_C_DOWN","MES_DPAD_BUTTON_C_UP","MES_DPAD_BUTTON_D_DOWN","MES_DPAD_BUTTON_D_UP","MES_DPAD_BUTTON_1_DOWN","MES_DPAD_BUTTON_1_UP","MES_DPAD_BUTTON_2_DOWN","MES_DPAD_BUTTON_2_UP","MES_DPAD_BUTTON_3_DOWN","MES_DPAD_BUTTON_3_UP","MES_DPAD_BUTTON_4_DOWN","MES_DPAD_BUTTON_4_UP","BluetoothService","gattEventQueue","EventService","service","ubitEvent","console","debug","event_type","event_value","writeValue","Uint16Array","gattServer","getPrimaryService","SERVICE_UUID","getCharacteristic","ubitEventCharacteristic","UartService","uartTx","uartRx","str","isVolatile","encoder","TextEncoder","encode","error","callback","handlers","uartTxCharacteristic","startNotifications","addEventListener","e","uartRxCharacteristic","i","uBitBLE","onConnectCallback","onDisconnectCallback","pushInterval","doGattEvent","callbackFunction","device","gatt","connected","isConnected","disconnect","navigator","bluetooth","requestDevice","filters","namePrefix","optionalServices","log","name","id","connect","server","getService","eventService","eventServiceAvailable","uartService","uartTxHandlers","onUartTx","uartServiceAvailable","sendEvent","sendUart","getSupportedProperties","characteristic","supportedProperties","p","properties","toUpperCase","join","eventByteArrayToString","event","receivedData","target","value","byteLength","getUint8","String","fromCharCode","apply","CanvasStage","node","window","devicePixelRatio","canvas","setAttribute","resize","drawElements","getContext","getComputedStyle","getPropertyValue","slice","x","y","TouchElement","collides","clearRect","draw","showTouches","drawTouches","colors","Object","entries","touches","identifier","touch","beginPath","arc","Math","PI","fillStyle","fill","lineWidth","strokeStyle","stroke","element","init","splice","Element","opts","gamepad","_opts","assign","alignX","alignY","ctx","width","height","getScaleY","isInside","isPointInPath","path","Square","Path2D","w","rect","getX","getY","doCallbacks","includes","type","touchCount","eState","isActive","handleTouchEventCallbacks","createTouchEventObject","action","GamepadButton","keyboardButton","altText","altTextAlign","shape","registerKeybinding","s","floor","toString","font","textBaseline","textAlign","fillText","showAltText","ax","ay","GamepadJoystick","lockX","lockY","autoCenter","bindUp","bindLeft","bindRight","bindDown","key","hasOwnProperty","round","mouseX","cR","mouseY","max","cX","stage","screenToCanvasX","min","abs","sign","isKeyPressed","cY","screenToCanvasY","Gamepad","addEventListeners","ev","handleKeyEvent","handleTouchEvent","handleMouseEvent","binding","keyCode","pressed","gtEvent","touchId","setActive","debugTouches","processGamepadTouchEvent","clientX","clientY","preventDefault","typedict","changedTouches","getTarget","showDebug","t","enableVibration","vibrate","elements","addElement","elementIds","removeElementById","removeAllElements","variant","addElements","sw","serviceWorker","register","scope","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","update","catch","getElementById","ubit","v","setGamepadLayout","localStorage","setItem","getItem","checked","searchDevice","gamepadState","onTouchEvent","debugString","gamepadJoysickState","onConnect","onDisconnect"],"mappings":";AAqGA,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,YAAA,EAAA,QAAA,WAAA,EAAA,QAAA,cAAA,EAAA,QAAA,WAAA,EArGA,IAAIA,OAAgBC,EAChBC,EAAc,GAElB,SAASC,EAAMC,GACX,IAAIC,EAAoBC,SAASC,cAAc,kCAE/C,GAA0D,OAArDF,EAAkBE,cAAc,uBAAiDN,IAAlBD,EAA8B,CAE9F,GAAKQ,OAAOC,YAAcD,OAAOE,aAAiBJ,SAASK,KAAKC,UAAUC,SAAS,4BAS/E,OARAb,EAAgBc,YAAY,YACnBN,OAAOC,YAAcD,OAAOE,YAAgBJ,SAASK,KAAKC,UAAUC,SAAS,+BAC9EE,cAAcf,GACdA,OAAgBC,EAChBE,EAAMD,EAAYc,SAEvB,UACHd,EAAYe,KAAKb,GAIrB,IAAIc,EAAaZ,SAASa,cAAc,OACxCD,EAAWE,UAAY,eACvBF,EAAWG,YAAYjB,EAAQ,IAC/Bc,EAAWG,YAAYjB,EAAQ,IAE/BC,EAAkBgB,YAAYH,GAE9Bb,EAAkBO,UAAUU,IAAI,QAChCC,WAAW,WACPlB,EAAkBO,UAAUY,OAAO,QACnCN,EAAWX,cAAc,KAAKkB,MAAMC,QAAU,IAC9CH,WAAW,WACPlB,EAAkBsB,YAAYT,GAC1BhB,EAAY0B,OAAS,GACrBzB,EAAMD,EAAYc,QAEvB,MACJ,UAEHd,EAAYe,KAAKb,GAIlB,SAASyB,EAAYC,GACxB,IAAIC,EAAMzB,SAASa,cAAc,OACjCY,EAAIX,UAAY,uBAEhB,IAAIY,EAAO1B,SAASa,cAAc,KAClCa,EAAKC,UAAYH,EACjBC,EAAIV,YAAYW,GAEhB,IAAIE,EAAO5B,SAASa,cAAc,KAClCe,EAAKd,UAAY,oCACjBW,EAAIV,YAAYa,GAEhB/B,EAAM,CAAC+B,EAAMH,IAGV,SAASI,EAAWL,GACvB,IAAIC,EAAMzB,SAASa,cAAc,OACjCY,EAAIX,UAAY,uBAEhB,IAAIY,EAAO1B,SAASa,cAAc,KAClCa,EAAKC,UAAYH,EACjBC,EAAIV,YAAYW,GAEhB,IAAIE,EAAO5B,SAASa,cAAc,KAClCe,EAAKd,UAAY,sCACjBW,EAAIV,YAAYa,GAEhB/B,EAAM,CAAC+B,EAAMH,IAGV,SAASK,EAAWC,GACvB,IAAIN,EAAMzB,SAASa,cAAc,OACjCY,EAAIX,UAAY,uBAEhB,IAAIY,EAAO1B,SAASa,cAAc,KAClCa,EAAKC,UAAYI,EACjBN,EAAIV,YAAYW,GAEhB,IAAIE,EAAO5B,SAASa,cAAc,KAClCe,EAAKd,UAAY,0BACjBW,EAAIV,YAAYa,GAEhB/B,EAAM,CAAC+B,EAAMH,IAGV,SAASO,EAAcC,GAC1B,IAAIR,EAAMzB,SAASa,cAAc,OACjCY,EAAIX,UAAY,uBAEhB,IAAIY,EAAO1B,SAASa,cAAc,KAClCa,EAAKC,UAAYM,EACjBR,EAAIV,YAAYW,GAEhB,IAAIE,EAAO5B,SAASa,cAAc,KAClCe,EAAKd,UAAY,8BACjBW,EAAIV,YAAYa,GAEhB/B,EAAM,CAAC+B,EAAMH;;AC0KjB,aAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,QAAA,QAAA,eAAA,EA9QA,IAAA,EAAA,QAAA,kBAAoF,SAAA,EAAA,GAAA,OAAA,EAAA,mBAAA,QAAA,iBAAA,OAAA,SAAA,SAAA,GAAA,cAAA,GAAA,SAAA,GAAA,OAAA,GAAA,mBAAA,QAAA,EAAA,cAAA,QAAA,IAAA,OAAA,UAAA,gBAAA,IAAA,GAAA,SAAA,EAAA,EAAA,GAAA,EAAA,EAAA,GAAA,EAAA,IAAA,GAAA,SAAA,EAAA,EAAA,GAAA,GAAA,EAAA,IAAA,GAAA,MAAA,IAAA,UAAA,kEAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,IAAA,GAAA,MAAA,IAAA,UAAA,kDAAA,OAAA,EAAA,SACpF,IAAA,EAAA,WAAA,OAAA,GAAA,IAAA,EAAA,GAAA,EAAA,OAAA,UAAA,EAAA,EAAA,eAAA,EAAA,OAAA,gBAAA,SAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAAA,OAAA,EAAA,mBAAA,OAAA,OAAA,GAAA,EAAA,EAAA,UAAA,aAAA,EAAA,EAAA,eAAA,kBAAA,EAAA,EAAA,aAAA,gBAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,IAAA,EAAA,GAAA,IAAA,MAAA,GAAA,EAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,GAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,GAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,IAAA,OAAA,EAAA,EAAA,UAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,MAAA,CAAA,KAAA,SAAA,IAAA,EAAA,KAAA,EAAA,IAAA,MAAA,GAAA,MAAA,CAAA,KAAA,QAAA,IAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAAA,SAAA,KAAA,SAAA,KAAA,SAAA,KAAA,IAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAAA,OAAA,OAAA,IAAA,EAAA,OAAA,eAAA,EAAA,GAAA,EAAA,EAAA,EAAA,MAAA,GAAA,IAAA,GAAA,EAAA,KAAA,EAAA,KAAA,EAAA,GAAA,IAAA,EAAA,EAAA,UAAA,EAAA,UAAA,OAAA,OAAA,GAAA,SAAA,EAAA,GAAA,CAAA,OAAA,QAAA,UAAA,QAAA,SAAA,GAAA,EAAA,EAAA,EAAA,SAAA,GAAA,OAAA,KAAA,QAAA,EAAA,OAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,KAAA,UAAA,CAAA,MAAA,SAAA,EAAA,GAAA,SAAA,IAAA,OAAA,IAAA,EAAA,SAAA,EAAA,IAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAAA,GAAA,UAAA,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,MAAA,OAAA,GAAA,UAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,SAAA,KAAA,SAAA,GAAA,EAAA,OAAA,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,QAAA,GAAA,KAAA,SAAA,GAAA,EAAA,MAAA,EAAA,EAAA,IAAA,SAAA,GAAA,OAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,KAAA,OAAA,EAAA,EAAA,EAAA,KAAA,EAAA,GAAA,OAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,iBAAA,OAAA,SAAA,EAAA,GAAA,GAAA,cAAA,EAAA,MAAA,IAAA,MAAA,gCAAA,GAAA,cAAA,EAAA,CAAA,GAAA,UAAA,EAAA,MAAA,EAAA,OAAA,IAAA,IAAA,EAAA,OAAA,EAAA,EAAA,IAAA,IAAA,CAAA,IAAA,EAAA,EAAA,SAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,GAAA,IAAA,EAAA,SAAA,OAAA,GAAA,GAAA,SAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,SAAA,GAAA,UAAA,EAAA,OAAA,CAAA,GAAA,mBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,SAAA,WAAA,EAAA,QAAA,EAAA,OAAA,SAAA,EAAA,KAAA,EAAA,YAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,WAAA,EAAA,KAAA,CAAA,GAAA,EAAA,EAAA,KAAA,YAAA,iBAAA,EAAA,MAAA,EAAA,SAAA,MAAA,CAAA,MAAA,EAAA,IAAA,KAAA,EAAA,MAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,QAAA,EAAA,IAAA,EAAA,OAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,GAAA,QAAA,IAAA,EAAA,OAAA,EAAA,SAAA,KAAA,UAAA,GAAA,EAAA,SAAA,SAAA,EAAA,OAAA,SAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,UAAA,EAAA,SAAA,WAAA,IAAA,EAAA,OAAA,QAAA,EAAA,IAAA,IAAA,UAAA,oCAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,SAAA,EAAA,KAAA,GAAA,UAAA,EAAA,KAAA,OAAA,EAAA,OAAA,QAAA,EAAA,IAAA,EAAA,IAAA,EAAA,SAAA,KAAA,EAAA,IAAA,EAAA,EAAA,IAAA,OAAA,EAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,QAAA,WAAA,EAAA,SAAA,EAAA,OAAA,OAAA,EAAA,SAAA,GAAA,EAAA,SAAA,KAAA,GAAA,GAAA,EAAA,OAAA,QAAA,EAAA,IAAA,IAAA,UAAA,oCAAA,EAAA,SAAA,KAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,CAAA,OAAA,EAAA,IAAA,KAAA,IAAA,EAAA,SAAA,EAAA,IAAA,KAAA,IAAA,EAAA,WAAA,EAAA,GAAA,EAAA,SAAA,EAAA,IAAA,KAAA,WAAA,KAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,YAAA,GAAA,EAAA,KAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,SAAA,EAAA,GAAA,KAAA,WAAA,CAAA,CAAA,OAAA,SAAA,EAAA,QAAA,EAAA,MAAA,KAAA,OAAA,GAAA,SAAA,EAAA,GAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,GAAA,GAAA,EAAA,OAAA,EAAA,KAAA,GAAA,GAAA,mBAAA,EAAA,KAAA,OAAA,EAAA,IAAA,MAAA,EAAA,QAAA,CAAA,IAAA,GAAA,EAAA,EAAA,SAAA,IAAA,OAAA,EAAA,EAAA,QAAA,GAAA,EAAA,KAAA,EAAA,GAAA,OAAA,EAAA,MAAA,EAAA,GAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,KAAA,GAAA,MAAA,CAAA,KAAA,GAAA,SAAA,IAAA,MAAA,CAAA,WAAA,EAAA,MAAA,GAAA,OAAA,EAAA,UAAA,EAAA,EAAA,EAAA,cAAA,CAAA,MAAA,EAAA,cAAA,IAAA,EAAA,EAAA,cAAA,CAAA,MAAA,EAAA,cAAA,IAAA,EAAA,YAAA,EAAA,EAAA,EAAA,qBAAA,EAAA,oBAAA,SAAA,GAAA,IAAA,EAAA,mBAAA,GAAA,EAAA,YAAA,QAAA,IAAA,IAAA,GAAA,uBAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,SAAA,GAAA,OAAA,OAAA,eAAA,OAAA,eAAA,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,EAAA,sBAAA,EAAA,UAAA,OAAA,OAAA,GAAA,GAAA,EAAA,MAAA,SAAA,GAAA,MAAA,CAAA,QAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,UAAA,EAAA,WAAA,OAAA,OAAA,EAAA,cAAA,EAAA,EAAA,MAAA,SAAA,EAAA,EAAA,EAAA,EAAA,QAAA,IAAA,IAAA,EAAA,SAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,OAAA,EAAA,oBAAA,GAAA,EAAA,EAAA,OAAA,KAAA,SAAA,GAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,EAAA,WAAA,OAAA,OAAA,EAAA,EAAA,WAAA,WAAA,MAAA,uBAAA,EAAA,KAAA,SAAA,GAAA,IAAA,EAAA,OAAA,GAAA,EAAA,GAAA,IAAA,IAAA,KAAA,EAAA,EAAA,KAAA,GAAA,OAAA,EAAA,UAAA,SAAA,IAAA,KAAA,EAAA,QAAA,CAAA,IAAA,EAAA,EAAA,MAAA,GAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,UAAA,CAAA,YAAA,EAAA,MAAA,SAAA,GAAA,GAAA,KAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KAAA,KAAA,KAAA,WAAA,EAAA,KAAA,MAAA,EAAA,KAAA,SAAA,KAAA,KAAA,OAAA,OAAA,KAAA,SAAA,EAAA,KAAA,WAAA,QAAA,IAAA,EAAA,IAAA,IAAA,KAAA,KAAA,MAAA,EAAA,OAAA,IAAA,EAAA,KAAA,KAAA,KAAA,OAAA,EAAA,MAAA,MAAA,KAAA,QAAA,IAAA,KAAA,WAAA,KAAA,MAAA,EAAA,IAAA,EAAA,KAAA,WAAA,GAAA,WAAA,GAAA,UAAA,EAAA,KAAA,MAAA,EAAA,IAAA,OAAA,KAAA,MAAA,kBAAA,SAAA,GAAA,GAAA,KAAA,KAAA,MAAA,EAAA,IAAA,EAAA,KAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,KAAA,QAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,OAAA,OAAA,EAAA,SAAA,KAAA,EAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,EAAA,EAAA,WAAA,GAAA,SAAA,EAAA,OAAA,OAAA,EAAA,OAAA,GAAA,EAAA,QAAA,KAAA,KAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,YAAA,EAAA,EAAA,KAAA,EAAA,cAAA,GAAA,GAAA,EAAA,CAAA,GAAA,KAAA,KAAA,EAAA,SAAA,OAAA,EAAA,EAAA,UAAA,GAAA,GAAA,KAAA,KAAA,EAAA,WAAA,OAAA,EAAA,EAAA,iBAAA,GAAA,GAAA,GAAA,KAAA,KAAA,EAAA,SAAA,OAAA,EAAA,EAAA,UAAA,OAAA,CAAA,IAAA,EAAA,MAAA,IAAA,MAAA,0CAAA,GAAA,KAAA,KAAA,EAAA,WAAA,OAAA,EAAA,EAAA,gBAAA,OAAA,SAAA,EAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,QAAA,KAAA,MAAA,EAAA,KAAA,EAAA,eAAA,KAAA,KAAA,EAAA,WAAA,CAAA,IAAA,EAAA,EAAA,OAAA,IAAA,UAAA,GAAA,aAAA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,aAAA,EAAA,MAAA,IAAA,EAAA,EAAA,EAAA,WAAA,GAAA,OAAA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,GAAA,KAAA,OAAA,OAAA,KAAA,KAAA,EAAA,WAAA,GAAA,KAAA,SAAA,IAAA,SAAA,SAAA,EAAA,GAAA,GAAA,UAAA,EAAA,KAAA,MAAA,EAAA,IAAA,MAAA,UAAA,EAAA,MAAA,aAAA,EAAA,KAAA,KAAA,KAAA,EAAA,IAAA,WAAA,EAAA,MAAA,KAAA,KAAA,KAAA,IAAA,EAAA,IAAA,KAAA,OAAA,SAAA,KAAA,KAAA,OAAA,WAAA,EAAA,MAAA,IAAA,KAAA,KAAA,GAAA,GAAA,OAAA,SAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,aAAA,EAAA,OAAA,KAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,GAAA,IAAA,MAAA,SAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,SAAA,EAAA,CAAA,IAAA,EAAA,EAAA,WAAA,GAAA,UAAA,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GAAA,MAAA,IAAA,MAAA,0BAAA,cAAA,SAAA,EAAA,EAAA,GAAA,OAAA,KAAA,SAAA,CAAA,SAAA,EAAA,GAAA,WAAA,EAAA,QAAA,GAAA,SAAA,KAAA,SAAA,KAAA,SAAA,GAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,GAAA,GAAA,EAAA,EAAA,MAAA,MAAA,GAAA,YAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,QAAA,QAAA,GAAA,KAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,WAAA,IAAA,EAAA,KAAA,EAAA,UAAA,OAAA,IAAA,QAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,SAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,SAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,GAAA,OAAA,MAAA,SAAA,EAAA,EAAA,GAAA,GAAA,mBAAA,GAAA,OAAA,EAAA,MAAA,IAAA,UAAA,sDAAA,EAAA,UAAA,OAAA,OAAA,GAAA,EAAA,UAAA,CAAA,YAAA,CAAA,MAAA,EAAA,UAAA,EAAA,cAAA,KAAA,OAAA,eAAA,EAAA,YAAA,CAAA,UAAA,IAAA,GAAA,EAAA,EAAA,GAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,OAAA,eAAA,OAAA,eAAA,OAAA,SAAA,EAAA,GAAA,OAAA,EAAA,UAAA,EAAA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,IAAA,OAAA,WAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,MAAA,YAAA,EAAA,QAAA,UAAA,EAAA,UAAA,QAAA,EAAA,EAAA,MAAA,KAAA,WAAA,OAAA,EAAA,KAAA,IAAA,SAAA,EAAA,EAAA,GAAA,GAAA,IAAA,WAAA,EAAA,IAAA,mBAAA,GAAA,OAAA,EAAA,QAAA,IAAA,EAAA,MAAA,IAAA,UAAA,4DAAA,OAAA,EAAA,GAAA,SAAA,EAAA,GAAA,QAAA,IAAA,EAAA,MAAA,IAAA,eAAA,6DAAA,OAAA,EAAA,SAAA,IAAA,GAAA,oBAAA,UAAA,QAAA,UAAA,OAAA,EAAA,GAAA,QAAA,UAAA,KAAA,OAAA,EAAA,GAAA,mBAAA,MAAA,OAAA,EAAA,IAAA,OAAA,QAAA,UAAA,QAAA,KAAA,QAAA,UAAA,QAAA,GAAA,gBAAA,EAAA,MAAA,GAAA,OAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EAAA,OAAA,eAAA,OAAA,eAAA,OAAA,SAAA,GAAA,OAAA,EAAA,WAAA,OAAA,eAAA,KAAA,GAAA,SAAA,EAAA,EAAA,GAAA,KAAA,aAAA,GAAA,MAAA,IAAA,UAAA,qCAAA,SAAA,EAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,UAAA,GAAA,OAAA,eAAA,EAAA,EAAA,EAAA,KAAA,IAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,GAAA,EAAA,EAAA,UAAA,GAAA,GAAA,EAAA,EAAA,GAAA,OAAA,eAAA,EAAA,YAAA,CAAA,UAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,MAAA,EAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,UAAA,MAAA,WAAA,EAAA,GAAA,EAAA,OAAA,GAAA,SAAA,EAAA,EAAA,GAAA,GAAA,WAAA,EAAA,IAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,OAAA,aAAA,QAAA,IAAA,EAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,GAAA,WAAA,GAAA,WAAA,EAAA,GAAA,OAAA,EAAA,MAAA,IAAA,UAAA,gDAAA,OAAA,WAAA,EAAA,OAAA,QAAA,GAMA,IAAMS,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAEzCC,EAAyC,uCAIlCC,EAAY,CACrBC,uBAAwB,KACxBC,uBAAwB,EACxBC,qBAAwB,EACxBC,uBAAwB,EACxBC,qBAAwB,EACxBC,uBAAwB,EACxBC,qBAAwB,EACxBC,uBAAwB,EACxBC,qBAAwB,EACxBC,uBAAwB,EACxBC,qBAAwB,GACxBC,uBAAwB,GACxBC,qBAAwB,GACxBC,uBAAwB,GACxBC,qBAAwB,GACxBC,uBAAwB,GACxBC,qBAAwB,IAC3B,QAAA,UAAA,EAAA,IAEKC,EAAgB,WAAA,SAAA,IAAA,EAAA,KAAA,GAAA,EAEH,KAAA,eAAA,MAKd,OALkB,EAAA,EAAA,KAAA,CAAA,CAAA,IAAA,cAAA,MAEnB,WACQA,EAAiBC,gBAAkB,GACvCD,EAAiBC,eAAenD,KAAhCkD,OACH,EAPiB,GAOjB,EAPCA,EACsB,iBAAA,IAAE,IASxBE,EAAY,SAAA,GAAA,EAAA,EAASF,GAAT,IAAA,EAAA,EAAA,GAKd,SAAYG,EAAAA,EAASC,GAAW,IAAA,EAIe,OAJf,EAAA,KAAA,GACpB,EAAA,EAAR,EAAA,EAAA,KAAA,OAAQ,eAAA,GACR,EAAKD,QAAUA,EACf,EAAKC,UAAYA,EACjBC,QAAQC,MAAM,6BAA6B,EAiB9C,OAhBA,EAAA,EAAA,CAAA,CAAA,IAAA,YAAA,MAED,SAAUC,EAAYC,GAAa,IAAA,EAAA,KAC/BR,EAAiBC,eAAelD,KAAK,WACjC,EAAKqD,UAAUK,WACX,IAAIC,YAAY,CAACH,EAAYC,UAGxC,CAAA,CAAA,IAAA,aAAA,MAAA,WAAA,IAED,EAAA,EAAA,IAAA,KAAA,SAAwBG,EAAAA,GAAU,IAAA,EAAA,EAAA,OAAA,IAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACQ,OAAtCN,QAAQC,MAAM,wBAAwB,EAAA,KAAA,EAClBK,EAAWC,kBAAkBV,EAAaW,cAAa,KAAA,EACvB,OADhDV,EAAO,EAAA,KACXE,QAAQC,MAAM,sCAAsC,EAAA,KAAA,EAChBH,EAAQW,kBAAkBjC,GAAgC,KAAA,EAAnE,OAAvBkC,EAAuB,EAAA,KACpB,EAAA,OAAA,SAAA,IAAIb,EAAaC,EAASY,IAAwB,KAAA,EAAA,IAAA,MAAA,OAAA,EAAA,SAAA,MAC5D,OAAA,SAAA,GAAA,OAAA,EAAA,MAAA,KAAA,YARA,MAQA,EA1Ba,GAAyB,EAArCb,EAEoBzB,eAAAA,GAAkB,IAAA,EAAA,IAAA,QA2BtCuC,EAAW,SAAA,GAAA,EAAA,EAAShB,GAAT,IAAA,EAAA,EAAA,GAKb,SAAYG,EAAAA,EAASc,EAAQC,GAAQ,IAAA,EAKS,OALT,EAAA,KAAA,GACzB,EAAA,EAAR,EAAA,EAAA,KAAA,OAAQ,GAAA,EAHD,EAAA,GAAA,WAAA,IAIP,EAAKf,QAAUA,EACf,EAAKc,OAASA,EACd,EAAKC,OAASA,EACdb,QAAQC,MAAM,4BAA4B,EAyC7C,OAxCA,EAAA,EAAA,CAAA,CAAA,IAAA,WAAA,MAAA,WAAA,IAED,EAAA,EAAA,IAAA,KAAA,SAAea,EAAAA,GAAG,IAAA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACiB,OADfC,IAAW,EAAA,OAAA,QAAA,IAAA,EAAA,KAAA,EAAA,GACvBC,EAAU,IAAIC,YAAa,EAAA,KAAA,EAAA,EAAA,KAAA,EAErB,KAAKJ,OAAOT,WACdY,EAAQE,OAAOJ,IAClB,KAAA,EAAA,EAAA,KAAA,GAAA,MAAA,KAAA,EAAA,EAAA,KAAA,EAAA,EAAA,GAAA,EAAA,MAAA,GAEIC,GACDf,QAAQmB,MAAQ,EAAA,IACnB,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,EAAA,QAER,OAAA,SAAA,GAAA,OAAA,EAAA,MAAA,KAAA,YAbA,IAaA,CAAA,IAAA,WAAA,MAQD,SAASC,GACL,KAAKC,SAAS3E,KAAK0E,MACtB,CAAA,CAAA,IAAA,aAAA,MAAA,WAAA,IAED,EAAA,EAAA,IAAA,KAAA,SAAwBd,EAAAA,GAAU,IAAA,EAAA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EACO,OAArCN,QAAQC,MAAM,uBAAuB,EAAA,KAAA,EACjBK,EAAWC,kBAAkBI,EAAYH,cAAa,KAAA,EAE5B,OAF1CV,EAAO,EAAA,KAEXE,QAAQC,MAAM,gCAAgC,EAAA,KAAA,EAEbH,EAAQW,kBAAkBvC,GAA4B,KAAA,EAA/D,OAApBoD,EAAoB,EAAA,KAAA,EAAA,KAAA,GAClBA,EAAqBC,qBAAoB,KAAA,GAAA,OAAA,EAAA,KAAA,GACzCD,EAAqBE,iBAAiB,6BAA8B,SAACC,GACvE,EAAI,EAAJ,EAAA,GAAA,KAAA,EAAeA,KACjB,KAAA,GAAA,OAAA,EAAA,KAAA,GAE+B3B,EAAQW,kBAAkBtC,GAA4B,KAAA,GAA/D,OAApBuD,EAAoB,EAAA,KAEjB,EAAA,OAAA,SAAA,IAAIf,EAAYb,EAASwB,EAAsBI,IAAqB,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,MAC9E,OAAA,SAAA,GAAA,OAAA,EAAA,MAAA,KAAA,YAjBA,MAiBA,EAnDY,GAAyB,SA0B5BD,EAAAA,GACN,IAAK,IAAIE,EAAI,EAAGA,EAAI,KAAKN,SAAShE,OAAQsE,IACtC,KAAKN,SAASM,KAErB,EA9BChB,EAEoB1C,eAAAA,GAAiB,IAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAsD9B2D,EAAO,WAQhB,SAAc,IAAA,EAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA,oBAAA,GAAA,EANU,KAAA,yBAAA,GAAK,EAAA,KAAA,mBAAA,GAAA,EAEN,KAAA,wBAAA,GAAK,EACX,KAAA,iBAAA,IAAE,EAAA,KAAA,cAAA,GAIf,KAAKC,kBAAoB,GACzB,KAAKC,qBAAuB,GAC5B,KAAKC,aAAexF,YAAYoD,EAAiBqC,YAAa,IAmGjE,OAlGA,EAAA,EAAA,CAAA,CAAA,IAAA,YAAA,MAgBD,SAAUC,GACN,KAAKJ,kBAAkBnF,KAAKuF,KAC/B,CAAA,IAAA,eAAA,MAED,SAAaA,GACT,KAAKH,qBAAqBpF,KAAKuF,KAClC,CAAA,IAAA,cAAA,MAED,WACI,QAAI,KAAKC,QACE,KAAKA,OAAOC,KAAKC,YAI/B,CAAA,IAAA,aAAA,MAED,WACQ,KAAKC,eACL,KAAKH,OAAOC,KAAKG,eAExB,CAAA,IAAA,eAAA,MAAA,WAAA,IAED,EAAA,EAAA,IAAA,KAAA,SAAA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EACwBC,UAAUC,UAAUC,cAAc,CAClDC,QAAS,CAAC,CAACC,WAAY,kBACvBC,iBAAkB,CAACxE,EAAoBH,KACzC,KAAA,EAI4C,OAP9C,KAAKiE,OAAM,EAAA,KAIX,KAAKA,OAAOV,iBAAiB,yBAA0B,SAACC,GAAC,OAAK,EAAA,EAAA,EAAA,GAAA,KAAA,EAAmBA,KACjFzB,QAAQ6C,IAAI,0BAA2B,KAAKX,OAAOY,KAAM,KAAKZ,OAAOa,IAErE/C,QAAQC,MAAM,gCAAgC,EAAA,KAAA,EACzB,KAAKiC,OAAOC,KAAKa,UAAS,KAAA,EAIV,OAJ/BC,EAAM,EAAA,KAEZ,EAAI,KAAJ,EAAA,GAAA,KAAA,MAEAjD,QAAQC,MAAM,uBAAuB,EAAA,KAAA,GAAA,EAAA,KAAA,GAGNJ,EAAaqD,WAAWD,GAAO,KAAA,GAApDE,EAAY,EAAA,KAClB,KAAKA,aAAeA,EACpB,KAAKC,uBAAwB,EAAK,EAAA,KAAA,GAAA,MAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GAAA,EAAA,MAAA,IAElC,KAAKA,uBAAwB,EAC7BpD,QAAQC,MAAM,+BACd,EAAArC,EAAU,YAAC,+FAA+F,KAAA,GAAA,OAAA,EAAA,KAAA,GAAA,EAAA,KAAA,GAIhF+C,EAAYuC,WAAWD,GAAO,KAAA,GAExD,IAFMI,EAAW,EAAA,KACjB,KAAKA,YAAcA,EACV1B,EAAI,EAAGA,EAAI,KAAK2B,eAAejG,OAAQsE,IAC5C,KAAK0B,YAAYE,SAAS,KAAKD,eAAe3B,IAElD,KAAK6B,sBAAuB,EAAK,EAAA,KAAA,GAAA,MAAA,KAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GAAA,EAAA,MAAA,IAEjC,KAAKA,sBAAuB,EAC5BxD,QAAQC,MAAM,4BAA+B,EAAA,KAC7C,EAAApC,EAAU,YAAC,6FAA6F,KAAA,GAAA,IAAA,MAAA,OAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,GAAA,IAAA,CAAA,GAAA,SAE/G,OAAA,WAAA,OAAA,EAAA,MAAA,KAAA,YAvCA,IAuCA,CAAA,IAAA,YAAA,MAED,SAAUqC,EAAYC,GACd,KAAKkC,eAAiB,KAAKe,sBAC3B,KAAKD,aAAaM,UAAUvD,EAAYC,GAExCH,QAAQC,MAA+BC,yBAAAA,OAAAA,EAAeC,MAAAA,OAAAA,EAA0B,gBAAA,OAAA,KAAKkC,cAAgB,mDAAqD,sBAAyB,QAE1L,CAAA,IAAA,WAAA,MAED,SAASvB,GACD,KAAKuB,eAAiB,KAAKmB,qBAC3B,KAAKH,YAAYK,SAAS5C,GAE1Bd,QAAQC,MAA4C,sCAAA,OAAA,KAAKoC,cAAgB,kDAAoD,sBAAyB,QAE7J,CAAA,IAAA,WAAA,MAED,SAASjB,GACL,KAAKkC,eAAe5G,KAAK0E,GACrB,KAAKoC,sBACL,KAAKH,YAAYE,SAASnC,OAEjC,EA9Ge,GA8Gf,SAhGaK,EAAAA,GACVzB,QAAQC,MAAM,sBAAuBwB,GACrC,IAAK,IAAIE,EAAI,EAAGA,EAAI,KAAKG,qBAAqBzE,OAAQsE,IAClD,KAAKG,qBAAqBH,KAEjC,SAEY,IACT3B,QAAQC,MAAM,oBACd,IAAK,IAAI0B,EAAI,EAAGA,EAAI,KAAKE,kBAAkBxE,OAAQsE,IAC/C,KAAKE,kBAAkBF,KA0FnC,SAASgC,EAAuBC,GAC5B,IAAIC,EAAsB,GAC1B,IAAK,IAAMC,KAAKF,EAAeG,YACU,IAAjCH,EAAeG,WAAWD,IAC1BD,EAAoBnH,KAAKoH,EAAEE,eAGnC,MAAO,IAAMH,EAAoBI,KAAK,MAAQ,IAGlD,SAASC,EAAuBC,GAE5B,IADA,IAAIC,EAAe,GACVzC,EAAI,EAAGA,EAAIwC,EAAME,OAAOC,MAAMC,WAAY5C,IAC/CyC,EAAazC,GAAKwC,EAAME,OAAOC,MAAME,SAAS7C,GAElD,OAAO8C,OAAOC,aAAaC,MAAM,KAAMP,GAnBtC,QAAA,QAAA;;AC2ZA,aAAA,SAAA,EAAA,GAAA,OAAA,EAAA,mBAAA,QAAA,iBAAA,OAAA,SAAA,SAAA,GAAA,cAAA,GAAA,SAAA,GAAA,OAAA,GAAA,mBAAA,QAAA,EAAA,cAAA,QAAA,IAAA,OAAA,UAAA,gBAAA,IAAA,GAAA,SAAA,IAAA,OAAA,EAAA,oBAAA,SAAA,QAAA,IAAA,QAAA,IAAA,OAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,IAAA,EAAA,OAAA,yBAAA,EAAA,GAAA,OAAA,EAAA,IAAA,EAAA,IAAA,KAAA,UAAA,OAAA,EAAA,EAAA,GAAA,EAAA,SAAA,MAAA,KAAA,WAAA,SAAA,EAAA,EAAA,GAAA,MAAA,OAAA,UAAA,eAAA,KAAA,EAAA,IAAA,QAAA,EAAA,EAAA,MAAA,OAAA,EAAA,SAAA,EAAA,EAAA,GAAA,GAAA,mBAAA,GAAA,OAAA,EAAA,MAAA,IAAA,UAAA,sDAAA,EAAA,UAAA,OAAA,OAAA,GAAA,EAAA,UAAA,CAAA,YAAA,CAAA,MAAA,EAAA,UAAA,EAAA,cAAA,KAAA,OAAA,eAAA,EAAA,YAAA,CAAA,UAAA,IAAA,GAAA,EAAA,EAAA,GAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,OAAA,eAAA,OAAA,eAAA,OAAA,SAAA,EAAA,GAAA,OAAA,EAAA,UAAA,EAAA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,IAAA,OAAA,WAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,MAAA,YAAA,EAAA,QAAA,UAAA,EAAA,UAAA,QAAA,EAAA,EAAA,MAAA,KAAA,WAAA,OAAA,EAAA,KAAA,IAAA,SAAA,EAAA,EAAA,GAAA,GAAA,IAAA,WAAA,EAAA,IAAA,mBAAA,GAAA,OAAA,EAAA,QAAA,IAAA,EAAA,MAAA,IAAA,UAAA,4DAAA,OAAA,EAAA,GAAA,SAAA,EAAA,GAAA,QAAA,IAAA,EAAA,MAAA,IAAA,eAAA,6DAAA,OAAA,EAAA,SAAA,IAAA,GAAA,oBAAA,UAAA,QAAA,UAAA,OAAA,EAAA,GAAA,QAAA,UAAA,KAAA,OAAA,EAAA,GAAA,mBAAA,MAAA,OAAA,EAAA,IAAA,OAAA,QAAA,UAAA,QAAA,KAAA,QAAA,UAAA,QAAA,GAAA,gBAAA,EAAA,MAAA,GAAA,OAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EAAA,OAAA,eAAA,OAAA,eAAA,OAAA,SAAA,GAAA,OAAA,EAAA,WAAA,OAAA,eAAA,KAAA,GAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,SAAA,IAAA,MAAA,IAAA,UAAA,6IAAA,SAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,GAAA,iBAAA,EAAA,OAAA,EAAA,EAAA,GAAA,IAAA,EAAA,OAAA,UAAA,SAAA,KAAA,GAAA,MAAA,GAAA,GAAA,MAAA,WAAA,GAAA,EAAA,cAAA,EAAA,EAAA,YAAA,MAAA,QAAA,GAAA,QAAA,EAAA,MAAA,KAAA,GAAA,cAAA,GAAA,2CAAA,KAAA,GAAA,EAAA,EAAA,QAAA,GAAA,SAAA,EAAA,EAAA,IAAA,MAAA,GAAA,EAAA,EAAA,UAAA,EAAA,EAAA,QAAA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,MAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,EAAA,GAAA,OAAA,EAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,MAAA,EAAA,KAAA,oBAAA,QAAA,EAAA,OAAA,WAAA,EAAA,cAAA,GAAA,MAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,GAAA,EAAA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,IAAA,KAAA,IAAA,EAAA,CAAA,GAAA,OAAA,KAAA,EAAA,OAAA,GAAA,OAAA,OAAA,GAAA,EAAA,EAAA,KAAA,IAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,GAAA,GAAA,IAAA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,QAAA,IAAA,IAAA,GAAA,MAAA,EAAA,SAAA,EAAA,EAAA,SAAA,OAAA,KAAA,GAAA,OAAA,QAAA,GAAA,EAAA,MAAA,GAAA,OAAA,GAAA,SAAA,EAAA,GAAA,GAAA,MAAA,QAAA,GAAA,OAAA,EAAA,SAAA,EAAA,EAAA,GAAA,KAAA,aAAA,GAAA,MAAA,IAAA,UAAA,qCAAA,SAAA,EAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,UAAA,GAAA,OAAA,eAAA,EAAA,EAAA,EAAA,KAAA,IAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,GAAA,EAAA,EAAA,UAAA,GAAA,GAAA,EAAA,EAAA,GAAA,OAAA,eAAA,EAAA,YAAA,CAAA,UAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,GAAA,EAAA,IAAA,EAAA,GAAA,SAAA,EAAA,EAAA,GAAA,GAAA,EAAA,IAAA,GAAA,MAAA,IAAA,UAAA,kEAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,MAAA,EAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,UAAA,MAAA,WAAA,EAAA,GAAA,EAAA,OAAA,GAAA,SAAA,EAAA,EAAA,GAAA,GAAA,WAAA,EAAA,IAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,OAAA,aAAA,QAAA,IAAA,EAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,GAAA,WAAA,GAAA,WAAA,EAAA,GAAA,OAAA,EAAA,MAAA,IAAA,UAAA,gDAAA,OAAA,WAAA,EAAA,OAAA,QAAA,GAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,IAAA,EAAA,IAAA,KAAA,GAAA,EAAA,MAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,IAAA,GAAA,MAAA,IAAA,UAAA,gBAAA,EAAA,kCAAA,OAAA,EAAA,IAAA,GAAA,SAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,IAAA,EAAA,IAAA,KAAA,EAAA,OAAA,CAAA,IAAA,EAAA,SAAA,MAAA,IAAA,UAAA,4CAAA,EAAA,MAAA,GAAA,OAAA,eAAA,QAAA,aAAA,CAAA,OAAA,IAAA,QAAA,OAAA,QAAA,gBAAA,QAAA,cAAA,QAAA,aAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QArpBCQ,EAAW,WAUb,SAAY7B,EAAAA,EAAI8B,GAAM,IAAA,EAAA,KAAA,EAAA,KAAA,GAAA,EAAA,KAAA,cAAA,GAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MARfC,OAAOC,mBAAgB,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MAIlB,KAAE,EACJ,KAAA,UAAA,IAAE,EACE,KAAA,eAAA,GAGV,KAAKC,OAASjJ,SAASa,cAAc,UACrC,KAAKoI,OAAOC,aAAa,KAAMlC,GAC/B8B,EAAK/H,YAAY,KAAKkI,QAEtBxD,iBAAiB,SAAU,WAAA,OAAM,EAAK0D,WACtC,KAAKA,SAELlF,QAAQC,MAAM,iBAAkB,KAAK+E,QAErCzI,YAAY,WACR,EAAK4I,gBACN,IA2EN,OAxED,EAAA,EAAA,CAAA,CAAA,IAAA,SAAA,MACA,WACI,EAAI,KAAQ,EAAA,KAAKH,OAAOI,WAAW,OACnC,EAAI,KAAW,GAACC,iBAAiB,KAAKL,QAAQM,iBAAiB,UAAUC,MAAM,GAAI,IACnF,EAAI,KAAU,GAACF,iBAAiB,KAAKL,QAAQM,iBAAiB,SAASC,MAAM,GAAI,IACjF,KAAKP,OAAOC,aAAa,SAAU,EAAI,KAAW,GAAA,EAAA,KAAS,IAC3D,KAAKD,OAAOC,aAAa,QAAS,EAAI,KAAU,GAAA,EAAA,KAAS,MAG7D,CAAA,IAAA,kBAAA,MACA,SAAgBO,GAAK,OAAOA,EAAI,EAAA,KAAS,KAEzC,CAAA,IAAA,kBAAA,MACA,SAAgBC,GAAK,OAAOA,EAAI,EAAA,KAAS,KAEzC,CAAA,IAAA,YAAA,MACA,SAAUD,EAAGC,GACTD,GAAK,EAAA,KAAS,GACdC,GAAK,EAAA,KAAS,GACd,IAAK,IAAI9D,EAAI,EAAGA,EAAI,EAAI,KAAWtE,GAAAA,OAAQsE,IACvC,GAAK,EAAI,KAAWA,GAAAA,aAAc+D,GAC1B,EAAI,KAAW/D,GAAAA,GAAGgE,SAAS,EAAA,KAAWH,GAAAA,EAAGC,GAC7C,OAAO,EAAI,KAAW9D,GAAAA,KAKlC,CAAA,IAAA,eAAA,MACA,WACI,EAAI,KAAMiE,GAAAA,UAAU,EAAG,EAAG,EAAI,KAAU,GAAA,EAAA,KAAS,GAAE,EAAI,KAAW,GAAA,EAAA,KAAS,IAC3E,IAAK,IAAIjE,EAAI,EAAGA,EAAI,EAAI,KAAWtE,GAAAA,OAAQsE,IACvC,EAAI,KAAWA,GAAAA,GAAGkE,KAAK,EAAA,KAAU,IAEjC,KAAKC,aACL,KAAKC,gBAIb,CAAA,IAAA,cAAA,MACA,SAAYtE,GAER,IADA,IAAMuE,EAAS,CAAC,YAAa,YAAa,YAAa,cAAe,iBACpCC,EAAAA,EAAAA,EAAAA,OAAOC,QAAQ,KAAKC,SAAU,EAAA,EAAA,OAAA,IAAA,CAA3D,IAAA,EAAA,EAAA,EAAA,GAAA,GAAOC,EAAU,EAAA,GAAEC,EAAK,EAAA,GACzB,EAAI,KAAMC,GAAAA,YACV,EAAI,KAAMC,GAAAA,IAAIF,EAAMb,EAAI,EAAA,KAAS,GAAEa,EAAMZ,EAAI,EAAA,KAAS,GAAE,GAAK,EAAA,KAAS,GAAE,EAAG,EAAEe,KAAKC,IAAI,GACtF,EAAI,KAAMC,GAAAA,UAAoBV,QAAAA,OAAAA,EAAOI,GAAmB,UACxD,EAAI,KAAMO,GAAAA,OAEV,EAAI,KAAMC,GAAAA,UAAY,EACtB,EAAI,KAAMC,GAAAA,YAAsBb,QAAAA,OAAAA,EAAOI,GAAmB,UAC1D,EAAI,KAAMU,GAAAA,YAIlB,CAAA,IAAA,aAAA,MACA,SAAWC,GACP,EAAI,KAAWrK,GAAAA,KAAKqK,GACpBA,EAAQC,SAGZ,CAAA,IAAA,oBAAA,MACA,SAAkBjE,GACd,IAAK,IAAIpB,EAAI,EAAGA,EAAI,EAAI,KAAWtE,GAAAA,OAAQsE,IACvC,GAAIoB,IAAO,EAAI,KAAWpB,GAAAA,GAAGoB,GAEzB,YADA,EAAI,KAAWkE,GAAAA,OAAOtF,EAAG,KAMrC,CAAA,IAAA,oBAAA,MACA,WACI,EAAI,KAAWsF,GAAAA,OAAO,EAAG,EAAI,KAAW5J,GAAAA,YAC3C,EAjGY,GAqGX6J,EAAO,WAYT,SAAYC,EAAAA,EAAMC,GAAS,EAAA,KAAA,GAAA,EAAA,KAAA,eAAA,GAAA,EAAA,KAAA,UAAA,GAAA,EAAA,KAAA,SAAA,GAAA,EAAA,KAAA,SAAA,GAAA,EAAA,KAAA,cAAA,GAAA,EAAA,KAAA,cAAA,GAAA,EAAA,KAAA,YAAA,GAAA,EAAA,KAAA,gBAAA,GAAA,EAAA,KAAA,gBAAA,GAAA,EAFpB,KAAA,OAAA,WAGH,IAAIC,EAAQpB,OAAOqB,OAAO,CACtBvE,GAAI,KACJyC,EAAG,EACHC,EAAG,EACH8B,OAAQ,KACRC,OAAQ,MACTL,GACH,KAAKpE,GAAKsE,EAAMtE,GAChB,KAAKyC,EAAI6B,EAAM7B,EACf,KAAKC,EAAI4B,EAAM5B,EACf,KAAK8B,OAASF,EAAME,OACpB,KAAKC,OAASH,EAAMG,OACpB,KAAKJ,QAAUA,EA+ClB,OA5CD,EAAA,EAAA,CAAA,CAAA,IAAA,OAAA,MACA,cAEA,CAAA,IAAA,YAAA,MACA,SAAUK,GACN,OAAOA,EAAIzC,OAAO0C,MAAQ,MAG9B,CAAA,IAAA,YAAA,MACA,SAAUD,GACN,OAAOA,EAAIzC,OAAO2C,OAAS,MAG/B,CAAA,IAAA,OAAA,MACA,SAAKF,GACD,IAAIjC,EAAI,KAAKA,EAAI,KAAKoC,UAAUH,GAOhC,MANoB,WAAhB,KAAKF,SACL/B,EAAKiC,EAAIzC,OAAO0C,MAAQ,EAAKlC,GAEb,UAAhB,KAAK+B,SACL/B,EAAIiC,EAAIzC,OAAO0C,MAAQlC,GAEpBA,IAGX,CAAA,IAAA,OAAA,MACA,SAAKiC,GACD,IAAIhC,EAAI,KAAKA,EAAI,KAAKmC,UAAUH,GAOhC,MANoB,WAAhB,KAAKD,SACL/B,EAAKgC,EAAIzC,OAAO2C,OAAS,EAAKlC,GAEd,WAAhB,KAAK+B,SACL/B,EAAIgC,EAAIzC,OAAO2C,OAASlC,GAErBA,IAGX,CAAA,IAAA,OAAA,MACA,SAAKgC,MAEL,CAAA,IAAA,WAAA,MACA,SAASA,EAAKjC,EAAGC,GAEb,OADA,KAAKoC,SAAWJ,EAAIK,cAAc,KAAKC,KAAMvC,EAAGC,GACzC,KAAKoC,aACf,EAxEQ,GA4EAG,EAAM,SAAA,GAAA,EAAA,EAASd,GAAT,IAAA,EAAA,EAAA,GAAA,SAAA,IAAA,OAAA,EAAA,KAAA,GAAA,EAAA,MAAA,KAAA,WAOd,OAPc,EAAA,EAAA,CAAA,CAAA,IAAA,OAAA,MACf,SAAKO,GACD,KAAKM,KAAO,IAAIE,OAChB,IAAIC,EAA0B,GAAtB,KAAKN,UAAUH,GACvB,KAAKM,KAAKI,KAAK,KAAKC,KAAKX,GAAQS,EAAE,EAAI,KAAKG,KAAKZ,GAAQS,EAAE,EAAIA,EAAGA,GAClET,EAAIf,UAAsC,2BAC1Ce,EAAId,KAAK,KAAKoB,UACjB,EAPc,GAAgB,QAAA,OAAA,EAAA,IAU7BrC,EAAY,SAAA,GAAA,EAAA,EAASwB,GAAT,IAAA,EAAA,EAAA,GAAA,SAAA,IAAA,IAAA,EAAA,EAAA,KAAA,GAAA,IAAA,IAAA,EAAA,UAAA,OAAA,EAAA,IAAA,MAAA,GAAA,EAAA,EAAA,EAAA,EAAA,IAAA,EAAA,GAAA,UAAA,GAEA,OAFA,EACP,EADO,EAAA,EAAA,KAAA,MAAA,EAAA,CAAA,MAAA,OAAA,KACP,OAAA,gBAAc,EACR,EAAA,GAAA,aAAA,GAAC,EAsBb,OAtBa,EAAA,EAAA,CAAA,CAAA,IAAA,YAAA,MAEd,SAAUzF,GAAuB,IAApB6G,IAAc,UAAA,OAAA,QAAA,IAAA,UAAA,KAAA,UAAA,GACnB,CAAC,MAAO,UAAUC,SAAS9G,EAAE+G,OAAS,KAAKC,aAC/C,IAAIC,EAAmB,SAAVjH,EAAE+G,KACVE,IAAW,KAAKC,UAAiC,GAAnB,KAAKF,aACpC,KAAKE,SAAWD,EACZJ,GACA,KAAKlB,QAAQwB,0BAA0B,KAAKC,uBACxC,KAAKF,SAAW,aAAe,cAI7B,SAAVlH,EAAE+G,MAAmB,KAAKC,eACjC,CAAA,IAAA,yBAAA,MAED,SAAuBK,GACnB,MAAO,CACH/F,GAAI,KAAKA,GACT+F,OAAQA,EACRN,KAAM,KAAKA,UAElB,EAxBa,GA4BLO,EAAa,SAAA,GAAA,EAAA,EAASrD,GAAT,IAAA,EAAA,EAAA,GAMtB,SAAYyB,EAAAA,GAAM,IAAA,EAAA,EAAA,KAAA,GACd,IAAIE,EAAQpB,OAAOqB,OAAO,CACtB0B,eAAgB,KAChBC,QAAS,KACTC,aAAc,OACdC,MAAO,SACRhC,GAKoC,OAJ3B,EAAA,EAAZ,EAAMA,EAAAA,KAAAA,KAAAA,IAAM,aAAA,GAAA,EAAA,EAAA,GAAA,eAAA,GAAA,EAAA,EAAA,GAAA,oBAAA,GAAA,EATT,EAAA,GAAA,OAAA,iBAUH,EAAK6B,eAAiB3B,EAAM2B,eAC5B,EAAKG,MAAQ9B,EAAM8B,MACnB,EAAKF,QAAU5B,EAAM4B,QACrB,EAAKC,aAAe7B,EAAM6B,aAAa,EAuD1C,OAtDA,EAAA,EAAA,CAAA,CAAA,IAAA,OAAA,MAED,WACgC,OAAxB,KAAKF,gBACL,KAAK5B,QAAQgC,mBAAmB,KAAKJ,eAAgB,QAE5D,CAAA,IAAA,OAAA,MAED,SAAKvB,GAED,GADA,KAAKM,KAAO,IAAIE,OACG,UAAf,KAAKkB,MACL,KAAKpB,KAAKxB,IAAI,KAAK6B,KAAKX,GAAM,KAAKY,KAAKZ,GAA4B,GAAtB,KAAKG,UAAUH,GAAW,EAAG,EAAEjB,KAAKC,IAAI,QACnF,GAAmB,WAAf,KAAK0C,MAAoB,CAChC,IAAIjB,EAA0B,GAAtB,KAAKN,UAAUH,GACvB,KAAKM,KAAKI,KAAK,KAAKC,KAAKX,GAAQS,EAAE,EAAI,KAAKG,KAAKZ,GAAQS,EAAE,EAAIA,EAAGA,GAElE,KAAKS,SACLlB,EAAIf,UAAiC,sBAErCe,EAAIf,UAAsC,2BAE9Ce,EAAId,KAAK,KAAKoB,MAEd,IAAIsB,EAAO7C,GAAAA,OAAAA,KAAK8C,OAA2B,EAApB,KAAK1B,UAAUH,IAAQ8B,YAAgC,uBAO9E,GANA9B,EAAI+B,KAAOH,EACX5B,EAAIgC,aAAe,SACnBhC,EAAIiC,UAAY,SAChBjC,EAAIf,UAAoC,yBACxCe,EAAIkC,SAAS,KAAK5G,GAAI,KAAKqF,KAAKX,GAAM,KAAKY,KAAKZ,IAE1B,OAAjB,KAAKwB,SAAsB,KAAK7B,QAAQwC,YAAc,CACvDnC,EAAInB,YACJmB,EAAI+B,KAAUhD,GAAAA,OAAAA,KAAK8C,OAA2B,EAApB,KAAK1B,UAAUH,IAAQ8B,YAAgC,uBACjF9B,EAAIgC,aAAe,SACnBhC,EAAIiC,UAAY,SAChBjC,EAAIf,UAAoC,yBACxC,IAAImD,EAAK,KAAKzB,KAAKX,GACfqC,EAAK,KAAKzB,KAAKZ,GACnB,OAAQ,KAAKyB,cACT,IAAK,OACDW,GAA6B,GAAtB,KAAKjC,UAAUH,GACtB,MACJ,IAAK,QACDoC,GAA6B,GAAtB,KAAKjC,UAAUH,GACtB,MACJ,IAAK,MACDqC,GAA6B,GAAtB,KAAKlC,UAAUH,GACtB,MACJ,IAAK,SACDqC,GAA6B,GAAtB,KAAKlC,UAAUH,GAG9BA,EAAIkC,SAAS,KAAKV,QAASY,EAAIC,QAEtC,EAxEqB,GAAqB,QAAA,cAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QA4ElCC,EAAe,SAAA,GAAA,EAAA,EAASrE,GAAT,IAAA,EAAA,EAAA,GAaxB,SAAYyB,EAAAA,GAAM,IAAA,EAAA,EAAA,KAAA,GACd,IAAIE,EAAQpB,OAAOqB,OAAO,CACtB0C,OAAO,EACPC,OAAO,EACPC,YAAY,EACZC,OAAQ,KACRC,SAAU,KACVC,UAAW,KACXC,SAAU,MACXnD,GAO4B,OANnB,EAtBT,EAsBH,EAAMA,EAAAA,KAAAA,KAAAA,IAtBH,OAAA,mBAAiB,EACf,EAAA,GAAA,SAAA,GAAC,EACD,EAAA,GAAA,SAAA,GAAC,EACL,EAAA,GAAA,KAAA,GAAC,EACD,EAAA,GAAA,KAAA,GAAC,EACD,EAAA,GAAA,KAAA,GAAC,EAAA,EAAA,GAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,EAAA,GAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,EAAA,GAAA,EAAA,CAAA,UAAA,EAAA,MAKS,KAaX,EAAcE,EAAAA,GAAAA,EAAAA,EAAM2C,OACpB,EAAc3C,EAAAA,GAAAA,EAAAA,EAAM4C,OACpB,EAAKE,OAAS9C,EAAM8C,OACpB,EAAKC,SAAW/C,EAAM+C,SACtB,EAAKC,UAAYhD,EAAMgD,UACvB,EAAKC,SAAWjD,EAAMiD,SAAS,EAoGlC,OAnGA,EAAA,EAAA,CAAA,CAAA,IAAA,OAAA,MAED,WACwB,OAAhB,KAAKH,QACL,KAAK/C,QAAQgC,mBAAmB,KAAKe,OAAQ,MAE3B,OAAlB,KAAKC,UACL,KAAKhD,QAAQgC,mBAAmB,KAAKgB,SAAU,MAE5B,OAAnB,KAAKC,WACL,KAAKjD,QAAQgC,mBAAmB,KAAKiB,UAAW,MAE9B,OAAlB,KAAKC,UACL,KAAKlD,QAAQgC,mBAAmB,KAAKkB,SAAU,QAEtD,CAAA,IAAA,eAAA,MAED,SAAaC,GACT,OAAiB,OAARA,GACG,EAAI,KAAcC,GAAAA,eAAeD,IACjC,EAAI,KAAcA,GAAAA,GAAO,IACxC,CAAA,IAAA,yBAAA,MAED,SAAuBzB,GACnB,MAAO,CACH/F,GAAI,KAAKA,GACT+F,OAAQA,EACRN,KAAM,KAAKA,KACXhD,EAAGgB,KAAKiE,MAAO,KAAKC,OAAS,KAAKC,GAAM,KACxClF,EAAGe,KAAKiE,MAAO,KAAKG,OAAS,KAAKD,GAAM,QAE/C,CAAA,IAAA,YAAA,MAED,SAAUlJ,GACN,EAAgBA,EAAAA,EAAAA,WAAAA,YAAAA,MAAAA,KAAAA,KAAAA,GAAG,GACfA,EAAE+I,eAAe,SACZ,EAAI,KAAcA,GAAAA,eAAe/I,EAAE8I,OACpC,EAAI,KAAc9I,GAAAA,EAAE8I,KAAO,GAE3B,CAAC,SAAShC,SAAS9G,EAAE+G,OACrB,EAAI,KAAc/G,GAAAA,EAAE8I,OAEpB,CAAC,MAAO,UAAUhC,SAAS9G,EAAE+G,OAC7B,EAAI,KAAc/G,GAAAA,EAAE8I,QAI5B,IAAIM,EAAM,KAAKF,GACV,EAAA,KAAW,KACRlJ,EAAE+I,eAAe,OACjB,KAAKE,OAAS,KAAKI,GAAK,KAAK1D,QAAQ2D,MAAMC,gBAAgBvJ,EAAE+D,GAC7D,KAAKkF,OAASlE,KAAKyE,IAAIzE,KAAK0E,IAAI,KAAKR,QAASG,GAAOrE,KAAK2E,KAAK,KAAKT,QACpE,KAAKA,SAAW,GAEhB,KAAKU,aAAa,KAAKhB,YAAa,KAAKM,QAAUG,GACnD,KAAKO,aAAa,KAAKf,aAAc,KAAKK,OAASG,GACnD,KAAKO,aAAa,KAAKhB,WAAa,KAAKgB,aAAa,KAAKf,aAAc,KAAKK,OAAS,GACtF,KAAK/B,WAAY,KAAK+B,OAAS,IAEnC,EAAA,KAAW,KACRjJ,EAAE+I,eAAe,OACjB,KAAKI,OAAS,KAAKS,GAAK,KAAKjE,QAAQ2D,MAAMO,gBAAgB7J,EAAEgE,GAC7D,KAAKmF,OAASpE,KAAKyE,IAAIzE,KAAK0E,IAAI,KAAKN,QAASC,GAAOrE,KAAK2E,KAAK,KAAKP,SAEpE,KAAKQ,aAAa,KAAKjB,UAAW,KAAKS,OAASC,GAChD,KAAKO,aAAa,KAAKd,YAAa,KAAKM,QAAUC,GACnD,KAAKO,aAAa,KAAKjB,SAAW,KAAKiB,aAAa,KAAKd,YAAa,KAAKM,OAAS,GACnF,KAAKjC,WAAY,KAAKiC,OAAS,IAGxC,IAAI9B,EAAS,YACT,KAAKH,UAAgC,GAAnB,KAAKF,YAAgC,UAAXhH,EAAE+G,OAC9CM,EAAS,cAER,KAAKH,WACNG,EAAS,YAEb,KAAK1B,QAAQwB,0BAA0B,KAAKC,uBAAuBC,MACtE,CAAA,IAAA,OAAA,MAED,SAAKrB,GACD,KAAKqD,GAAK,KAAK1C,KAAKX,GACpB,KAAK4D,GAAK,KAAKhD,KAAKZ,GACpB,KAAKkD,GAA2B,GAAtB,KAAK/C,UAAUH,GAEzB,KAAKM,KAAO,IAAIE,OAChB,KAAKF,KAAKxB,IAAI,KAAKuE,GAAI,KAAKO,GAAI,KAAKV,GAAI,EAAG,EAAEnE,KAAKC,IAAI,GACnD,KAAKkC,SACLlB,EAAIf,UAAmC,wBAEvCe,EAAIf,UAAsC,2BAE9Ce,EAAId,KAAK,KAAKoB,MAEdN,EAAInB,YACJmB,EAAIlB,IAAI,KAAKuE,GAAK,KAAKJ,OAAQ,KAAKW,GAAK,KAAKT,OAA8B,GAAtB,KAAKhD,UAAUH,GAAW,EAAG,EAAEjB,KAAKC,IAAI,GAC9FgB,EAAIf,UAAoC,yBACxCe,EAAId,WAEP,EAjIuB,GAAqB,QAAA,gBAAA,EAAA,IAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAAA,EAAA,IAAA,QAqIpC4E,EAAO,WAchB,SAAc,IAAA,EAAA,KAAA,GAAA,EAAA,KAAA,aAAA,GAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,WAAA,IAAA,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MATH,KAAE,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MACE,KAAE,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MACJ,KAAE,EAAA,KAAA,EAAA,CAAA,UAAA,EAAA,MACQ,KAAE,EAEb,KAAA,aAAA,GAAK,EACH,KAAA,eAAA,GAAI,EACA,KAAA,mBAAA,GAGd,KAAKR,MAAQ,IAAInG,EAAY,UAAW7I,SAASC,cAAc,qBAC/D,KAAKwP,oBA6NR,OA5NA,EAAA,EAAA,CAAA,CAAA,IAAA,oBAAA,MAED,WAAoB,IAAA,EAAA,KACZC,EAAK,CAAC,UAAW,SACrB,IAAI,IAAIhK,KAAKgK,EACT1P,SAASyF,iBAAiBiK,EAAGhK,GAAI,SAACA,GAAC,OAAK,EAAKiK,eAAejK,KAAI,GAGpE,IAAI,IAAIA,KADRgK,EAAK,CAAC,aAAc,WAAY,cAAe,aAE3C,KAAKV,MAAM/F,OAAOxD,iBAAiBiK,EAAGhK,GAAI,SAACA,GAAC,OAAK,EAAKkK,iBAAiBlK,KAAI,GAG/E,IAAI,IAAIA,KADRgK,EAAK,CAAC,YAAa,UAAW,aAE1B,KAAKV,MAAM/F,OAAOxD,iBAAiBiK,EAAGhK,GAAI,SAACA,GAAC,OAAK,EAAKmK,iBAAiBnK,KAAI,KAInF,CAAA,IAAA,qBAAA,MACA,SAAmBoK,EAAS9E,GACxB,EAAI,KAAc8E,GAAAA,GAAW9E,IAGjC,CAAA,IAAA,iBAAA,MACA,SAAetF,GAKX,GAHK,EAAI,KAAY+I,GAAAA,eAAe/I,EAAEqK,WAClC,EAAI,KAAYrK,GAAAA,EAAEqK,SAAW,CAACC,SAAS,IAEvC,EAAI,KAAcvB,GAAAA,eAAe/I,EAAE8I,KAAM,CACzC,IAAIxH,EAAYtB,OAAAA,OAAAA,EAAE8I,KACdlG,EAAS,EAAI,KAAc5C,GAAAA,EAAE8I,KAC7ByB,EAAU,CACVC,QAASlJ,EACTwH,IAAK9I,EAAE8I,IACP/B,KAVS,CAAC,QAAW,QAAS,MAAS,OAUxB/G,EAAE+G,OAErB,OAAQ/G,EAAE+G,MACN,IAAK,UACD,GAAI,EAAI,KAAY/G,GAAAA,EAAEqK,SAASC,QAAW,OAC1C,EAAI,KAAYtK,GAAAA,EAAEqK,SAASC,SAAU,EAErC,EAAI,KAAUhJ,GAAAA,GAAM,GACpB,EAAI,KAAUA,GAAAA,GAAIsB,OAASA,EACvB,EAAI,KAAUtB,GAAAA,GAAIyH,eAAe,WACF,MAA5B,EAAI,KAAUzH,GAAAA,GAAIsB,QACrB,EAAI,KAAUtB,GAAAA,GAAIsB,OAAO6H,UAAUF,GAEvC,MACJ,IAAK,QACD,IAAK,EAAI,KAAYvK,GAAAA,EAAEqK,SAASC,QAAW,OAC3C,EAAI,KAAYtK,GAAAA,EAAEqK,SAASC,SAAU,EAEjC,EAAI,KAAUhJ,GAAAA,GAAIyH,eAAe,WACF,MAA5B,EAAI,KAAUzH,GAAAA,GAAIsB,QACrB,EAAI,KAAUtB,GAAAA,GAAIsB,OAAO6H,UAAUF,UAEhC,EAAI,KAAUjJ,GAAAA,IAIjC,KAAKgI,MAAM5E,QAAU,EAAA,KAAa,GAClC,KAAKgG,iBAGT,CAAA,IAAA,mBAAA,MAEA,SAAiB1K,GAEb,KAAK2K,yBAAyB,CAC1B5G,EAAG/D,EAAE4K,QACL5G,EAAGhE,EAAE6K,QACLL,QAAS,QACTzD,KALa,CAAC,UAAa,QAAS,QAAW,MAAO,UAAa,QAKpD/G,EAAE+G,UAIzB,CAAA,IAAA,mBAAA,MAEA,SAAiB/G,GACbA,EAAE8K,iBAEF,IADA,IAAMC,EAAW,CAAC,WAAc,QAAS,SAAY,MAAO,YAAe,MAAO,UAAa,QACtF7K,EAAI,EAAGA,EAAIF,EAAEgL,eAAepP,OAAQsE,IAAK,CAC9C,IAAI0E,EAAQ5E,EAAEgL,eAAe9K,GAC7B,KAAKyK,yBAAyB,CAC1B5G,EAAGa,EAAMgG,QACT5G,EAAGY,EAAMiG,QACTL,QAAS5F,EAAMD,WACfoC,KAAMgE,EAAS/K,EAAE+G,WAK7B,CAAA,IAAA,2BAAA,MACA,SAAyBwD,GACrB,IAAI3H,EAAS,KAAK0G,MAAM2B,UAAUV,EAAQxG,EAAGwG,EAAQvG,GACrD,OAAQuG,EAAQxD,MACZ,IAAK,QACD,EAAI,KAAUwD,GAAAA,EAAQC,SAAW,GACjC,EAAI,KAAUD,GAAAA,EAAQC,SAAS5H,OAASA,EAC5C,IAAK,OACG,EAAI,KAAUmG,GAAAA,eAAewB,EAAQC,WACrC,EAAI,KAAUD,GAAAA,EAAQC,SAASzG,EAAIwG,EAAQxG,EAC3C,EAAI,KAAUwG,GAAAA,EAAQC,SAASxG,EAAIuG,EAAQvG,EAEvC,EAAI,KAAUuG,GAAAA,EAAQC,SAASzB,eAAe,WACF,MAAzC,EAAI,KAAUwB,GAAAA,EAAQC,SAAS5H,QAClC,EAAI,KAAU2H,GAAAA,EAAQC,SAAS5H,OAAO6H,UAAUF,IAGxD,MAEJ,IAAK,MACL,IAAK,SACG,EAAI,KAAUA,GAAAA,EAAQC,SAASzB,eAAe,WACF,MAAzC,EAAI,KAAUwB,GAAAA,EAAQC,SAAS5H,QAClC,EAAI,KAAU2H,GAAAA,EAAQC,SAAS5H,OAAO6H,UAAUF,UAE7C,EAAI,KAAUA,GAAAA,EAAQC,SAC7B,MAEJ,QACIjM,QAAQ6C,IAAI,sBAAuBmJ,EAAQxD,MAEnD,KAAKuC,MAAM5E,QAAU,EAAA,KAAa,GAClC,KAAKgG,iBAGT,CAAA,IAAA,eAAA,MACA,WACI,IAAI9C,EAAI,GACR,GAAI,KAAKsD,UACL,IAAqB1G,IAAAA,EAAAA,EAAAA,EAAAA,OAAOC,QAAQ,EAAA,KAAc,IAAE,EAAA,EAAA,OAAA,IAAA,CAA/C,IAAA,EAAA,EAAA,EAAA,GAAA,GAAOvE,EAAC,EAAA,GAAEiL,EAAC,EAAA,GACZvD,GAAS1H,IAAAA,OAAAA,EAAK,MACViL,EAAEpC,eAAe,OACjBnB,GAAW7C,MAAAA,OAAAA,KAAKiE,MAAMmC,EAAEpH,EAAG,GAAUgB,SAAAA,OAAAA,KAAKiE,MAAMmC,EAAEnH,GAAK,MAE3D4D,GAAgBuD,WAAAA,OAAAA,EAAEvI,OAASuI,EAAEvI,OAAOtB,GAAK,KAAQ,MAGzDhH,SAASC,cAAc,oBAAoB0B,UAAY2L,IAG3D,CAAA,IAAA,4BAAA,MACA,SAA0B5H,GACtB,GAAI,KAAKoL,iBAAmB,CAAC,aAAc,YAAYtE,SAAS9G,EAAEqH,QAC9D,IACIhE,OAAOvC,UAAUuK,QAAQ,GAC3B,MAAOrL,GACLzB,QAAQmB,MAAMM,GAGtB,IAAK,IAAIE,EAAI,EAAGA,EAAI,EAAI,KAAsBtE,GAAAA,OAAQsE,IAClD,EAAI,KAAsBA,GAAAA,GAAGF,KAIrC,CAAA,IAAA,eAAA,MACA,SAAaL,GACT,EAAI,KAAsB1E,GAAAA,KAAK0E,KAGnC,CAAA,IAAA,cAAA,MACA,SAAY2L,GACR,IAAK,IAAIpL,EAAI,EAAGA,EAAIoL,EAAS1P,OAAQsE,IACjCoL,EAASpL,GAAGyF,QAAU,KACtB,KAAK2D,MAAMiC,WAAWD,EAASpL,MAIvC,CAAA,IAAA,qBAAA,MACA,SAAmBsL,GACf,IAAK,IAAItL,EAAI,EAAGA,EAAIsL,EAAW5P,OAAQsE,IACnC,KAAKoJ,MAAMmC,kBAAkBD,EAAWtL,MAIhD,CAAA,IAAA,oBAAA,MACA,WACI,KAAKoJ,MAAMoC,sBAGf,CAAA,IAAA,mBAAA,MACA,SAAiBC,GAGb,OAFApN,QAAQC,MAAuCmN,iCAAAA,OAAAA,EAA0C,qCACzF,KAAKD,oBACGC,GACJ,IAAK,IACD,KAAKC,YAAY,CACb,IAAIrF,EAAO,CAACjF,GAAI,UAAWyC,EAAG,GAAKC,EAAG,EAAG8B,OAAQ,OAASC,OAAQ,WAClE,IAAIuB,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,YAAaC,QAAS,IAAKC,aAAc,UACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,aAAaC,QAAS,IAAKC,aAAc,SACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,GAAI,GAAI8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,UAAaC,QAAS,IAAKC,aAAc,WACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAI,GAAI8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,YAAaC,QAAS,IAAKC,aAAc,QACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,QAASH,eAAgB,IAAKC,QAAS,IAAKC,aAAc,SAC/I,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,QAASH,eAAgB,IAAKC,QAAS,IAAKC,aAAc,UAC/I,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,GAAI,GAAI8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,QAASH,eAAgB,IAAKC,QAAS,IAAKC,aAAc,WAC/I,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAI,GAAI8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,QAASH,eAAgB,IAAKC,QAAS,IAAKC,aAAc,UAEnJ,MACJ,IAAK,IACD,KAAKmE,YAAY,CACb,IAAIrF,EAAO,CAACjF,GAAI,UAAWyC,EAAG,GAAKC,EAAG,EAAG8B,OAAQ,QAAUC,OAAQ,WACnE,IAAIQ,EAAO,CAACjF,GAAI,UAAWyC,EAAG,GAAKC,EAAG,EAAG8B,OAAQ,OAASC,OAAQ,WAClE,IAAIuB,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,YAAaC,QAAS,IAAKC,aAAc,UACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,aAAaC,QAAS,IAAKC,aAAc,SACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,GAAI,GAAI8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,UAAaC,QAAS,IAAKC,aAAc,WACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAI,GAAI8B,OAAQ,OAAQC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,YAAaC,QAAS,IAAKC,aAAc,QACvJ,IAAIH,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,MAC/G,IAAID,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAK,EAAG8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,MAC/G,IAAID,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,GAAI,GAAI8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,MAC/G,IAAID,EAAc,CAAChG,GAAI,IAAKyC,EAAG,GAAIC,EAAI,GAAI8B,OAAQ,QAASC,OAAQ,SAAU2B,MAAO,SAAUH,eAAgB,QAEnH,MACJ,IAAK,IACD,KAAKqE,YAAY,CACb,IAAItD,EAAgB,CAAChH,GAAI,OAAQyC,EAAG,GAAIC,EAAI,EAAG8B,OAAQ,OAASC,OAAQ,SAAUwC,OAAO,EAAMG,OAAQ,UAAWG,SAAU,cAC5H,IAAIP,EAAgB,CAAChH,GAAI,QAASyC,EAAG,GAAIC,EAAI,EAAG8B,OAAQ,QAASC,OAAQ,SAAUyC,OAAO,EAAMG,SAAU,YAAaC,UAAW,sBAIjJ,EA7Oe,GA6Of,QAAA,QAAA;;ACvbC,aA9NN,IAAA,EAAA,QAAA,UACA,EAAA,QAAA,kBACA,EAAA,QAAA,aAAoC,SAAA,EAAA,GAAA,OAAA,EAAA,mBAAA,QAAA,iBAAA,OAAA,SAAA,SAAA,GAAA,cAAA,GAAA,SAAA,GAAA,OAAA,GAAA,mBAAA,QAAA,EAAA,cAAA,QAAA,IAAA,OAAA,UAAA,gBAAA,IAAA,GAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAAA,SAAA,IAAA,MAAA,IAAA,UAAA,6IAAA,SAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,GAAA,iBAAA,EAAA,OAAA,EAAA,EAAA,GAAA,IAAA,EAAA,OAAA,UAAA,SAAA,KAAA,GAAA,MAAA,GAAA,GAAA,MAAA,WAAA,GAAA,EAAA,cAAA,EAAA,EAAA,YAAA,MAAA,QAAA,GAAA,QAAA,EAAA,MAAA,KAAA,GAAA,cAAA,GAAA,2CAAA,KAAA,GAAA,EAAA,EAAA,QAAA,GAAA,SAAA,EAAA,EAAA,IAAA,MAAA,GAAA,EAAA,EAAA,UAAA,EAAA,EAAA,QAAA,IAAA,IAAA,EAAA,EAAA,EAAA,IAAA,MAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,EAAA,GAAA,OAAA,EAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,MAAA,EAAA,KAAA,oBAAA,QAAA,EAAA,OAAA,WAAA,EAAA,cAAA,GAAA,MAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,GAAA,EAAA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,IAAA,KAAA,IAAA,EAAA,CAAA,GAAA,OAAA,KAAA,EAAA,OAAA,GAAA,OAAA,OAAA,GAAA,EAAA,EAAA,KAAA,IAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,SAAA,GAAA,GAAA,IAAA,MAAA,GAAA,GAAA,EAAA,EAAA,EAAA,QAAA,IAAA,IAAA,GAAA,MAAA,EAAA,SAAA,EAAA,EAAA,SAAA,OAAA,KAAA,GAAA,OAAA,QAAA,GAAA,EAAA,MAAA,GAAA,OAAA,GAAA,SAAA,EAAA,GAAA,GAAA,MAAA,QAAA,GAAA,OAAA,EAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,OAAA,KAAA,GAAA,GAAA,OAAA,sBAAA,CAAA,IAAA,EAAA,OAAA,sBAAA,GAAA,IAAA,EAAA,EAAA,OAAA,SAAA,GAAA,OAAA,OAAA,yBAAA,EAAA,GAAA,cAAA,EAAA,KAAA,MAAA,EAAA,GAAA,OAAA,EAAA,SAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CAAA,IAAA,EAAA,MAAA,UAAA,GAAA,UAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,GAAA,QAAA,SAAA,GAAA,EAAA,EAAA,EAAA,EAAA,MAAA,OAAA,0BAAA,OAAA,iBAAA,EAAA,OAAA,0BAAA,IAAA,EAAA,OAAA,IAAA,QAAA,SAAA,GAAA,OAAA,eAAA,EAAA,EAAA,OAAA,yBAAA,EAAA,MAAA,OAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,EAAA,EAAA,MAAA,EAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,UAAA,MAAA,WAAA,EAAA,GAAA,EAAA,OAAA,GAAA,SAAA,EAAA,EAAA,GAAA,GAAA,WAAA,EAAA,IAAA,OAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,OAAA,aAAA,QAAA,IAAA,EAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,GAAA,WAAA,GAAA,WAAA,EAAA,GAAA,OAAA,EAAA,MAAA,IAAA,UAAA,gDAAA,OAAA,WAAA,EAAA,OAAA,QAAA,GAAA,SADpC,IAAA,EAAA,WAAA,OAAA,GAAA,IAAA,EAAA,GAAA,EAAA,OAAA,UAAA,EAAA,EAAA,eAAA,EAAA,OAAA,gBAAA,SAAA,EAAA,EAAA,GAAA,EAAA,GAAA,EAAA,OAAA,EAAA,mBAAA,OAAA,OAAA,GAAA,EAAA,EAAA,UAAA,aAAA,EAAA,EAAA,eAAA,kBAAA,EAAA,EAAA,aAAA,gBAAA,SAAA,EAAA,EAAA,EAAA,GAAA,OAAA,OAAA,eAAA,EAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,IAAA,EAAA,GAAA,IAAA,EAAA,GAAA,IAAA,MAAA,GAAA,EAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,GAAA,GAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,GAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,IAAA,OAAA,EAAA,EAAA,UAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,MAAA,CAAA,KAAA,SAAA,IAAA,EAAA,KAAA,EAAA,IAAA,MAAA,GAAA,MAAA,CAAA,KAAA,QAAA,IAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAAA,SAAA,KAAA,SAAA,KAAA,SAAA,KAAA,IAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAAA,OAAA,OAAA,IAAA,EAAA,OAAA,eAAA,EAAA,GAAA,EAAA,EAAA,EAAA,MAAA,GAAA,IAAA,GAAA,EAAA,KAAA,EAAA,KAAA,EAAA,GAAA,IAAA,EAAA,EAAA,UAAA,EAAA,UAAA,OAAA,OAAA,GAAA,SAAA,EAAA,GAAA,CAAA,OAAA,QAAA,UAAA,QAAA,SAAA,GAAA,EAAA,EAAA,EAAA,SAAA,GAAA,OAAA,KAAA,QAAA,EAAA,OAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,KAAA,UAAA,CAAA,MAAA,SAAA,EAAA,GAAA,SAAA,IAAA,OAAA,IAAA,EAAA,SAAA,EAAA,IAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAAA,GAAA,UAAA,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,MAAA,OAAA,GAAA,UAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,SAAA,KAAA,SAAA,GAAA,EAAA,OAAA,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,QAAA,GAAA,KAAA,SAAA,GAAA,EAAA,MAAA,EAAA,EAAA,IAAA,SAAA,GAAA,OAAA,EAAA,QAAA,EAAA,EAAA,KAAA,EAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,KAAA,OAAA,EAAA,EAAA,EAAA,KAAA,EAAA,GAAA,OAAA,SAAA,EAAA,EAAA,EAAA,GAAA,IAAA,EAAA,iBAAA,OAAA,SAAA,EAAA,GAAA,GAAA,cAAA,EAAA,MAAA,IAAA,MAAA,gCAAA,GAAA,cAAA,EAAA,CAAA,GAAA,UAAA,EAAA,MAAA,EAAA,OAAA,IAAA,IAAA,EAAA,OAAA,EAAA,EAAA,IAAA,IAAA,CAAA,IAAA,EAAA,EAAA,SAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,EAAA,GAAA,GAAA,EAAA,CAAA,GAAA,IAAA,EAAA,SAAA,OAAA,GAAA,GAAA,SAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,SAAA,GAAA,UAAA,EAAA,OAAA,CAAA,GAAA,mBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,IAAA,EAAA,kBAAA,EAAA,SAAA,WAAA,EAAA,QAAA,EAAA,OAAA,SAAA,EAAA,KAAA,EAAA,YAAA,IAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,WAAA,EAAA,KAAA,CAAA,GAAA,EAAA,EAAA,KAAA,YAAA,iBAAA,EAAA,MAAA,EAAA,SAAA,MAAA,CAAA,MAAA,EAAA,IAAA,KAAA,EAAA,MAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,QAAA,EAAA,IAAA,EAAA,OAAA,SAAA,EAAA,EAAA,GAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,GAAA,QAAA,IAAA,EAAA,OAAA,EAAA,SAAA,KAAA,UAAA,GAAA,EAAA,SAAA,SAAA,EAAA,OAAA,SAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAAA,UAAA,EAAA,SAAA,WAAA,IAAA,EAAA,OAAA,QAAA,EAAA,IAAA,IAAA,UAAA,oCAAA,EAAA,aAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,SAAA,EAAA,KAAA,GAAA,UAAA,EAAA,KAAA,OAAA,EAAA,OAAA,QAAA,EAAA,IAAA,EAAA,IAAA,EAAA,SAAA,KAAA,EAAA,IAAA,EAAA,EAAA,IAAA,OAAA,EAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,QAAA,WAAA,EAAA,SAAA,EAAA,OAAA,OAAA,EAAA,SAAA,GAAA,EAAA,SAAA,KAAA,GAAA,GAAA,EAAA,OAAA,QAAA,EAAA,IAAA,IAAA,UAAA,oCAAA,EAAA,SAAA,KAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,CAAA,OAAA,EAAA,IAAA,KAAA,IAAA,EAAA,SAAA,EAAA,IAAA,KAAA,IAAA,EAAA,WAAA,EAAA,GAAA,EAAA,SAAA,EAAA,IAAA,KAAA,WAAA,KAAA,GAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,YAAA,GAAA,EAAA,KAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,SAAA,EAAA,GAAA,KAAA,WAAA,CAAA,CAAA,OAAA,SAAA,EAAA,QAAA,EAAA,MAAA,KAAA,OAAA,GAAA,SAAA,EAAA,GAAA,GAAA,EAAA,CAAA,IAAA,EAAA,EAAA,GAAA,GAAA,EAAA,OAAA,EAAA,KAAA,GAAA,GAAA,mBAAA,EAAA,KAAA,OAAA,EAAA,IAAA,MAAA,EAAA,QAAA,CAAA,IAAA,GAAA,EAAA,EAAA,SAAA,IAAA,OAAA,EAAA,EAAA,QAAA,GAAA,EAAA,KAAA,EAAA,GAAA,OAAA,EAAA,MAAA,EAAA,GAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,EAAA,MAAA,EAAA,GAAA,OAAA,EAAA,KAAA,GAAA,MAAA,CAAA,KAAA,GAAA,SAAA,IAAA,MAAA,CAAA,WAAA,EAAA,MAAA,GAAA,OAAA,EAAA,UAAA,EAAA,EAAA,EAAA,cAAA,CAAA,MAAA,EAAA,cAAA,IAAA,EAAA,EAAA,cAAA,CAAA,MAAA,EAAA,cAAA,IAAA,EAAA,YAAA,EAAA,EAAA,EAAA,qBAAA,EAAA,oBAAA,SAAA,GAAA,IAAA,EAAA,mBAAA,GAAA,EAAA,YAAA,QAAA,IAAA,IAAA,GAAA,uBAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,SAAA,GAAA,OAAA,OAAA,eAAA,OAAA,eAAA,EAAA,IAAA,EAAA,UAAA,EAAA,EAAA,EAAA,EAAA,sBAAA,EAAA,UAAA,OAAA,OAAA,GAAA,GAAA,EAAA,MAAA,SAAA,GAAA,MAAA,CAAA,QAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,UAAA,EAAA,WAAA,OAAA,OAAA,EAAA,cAAA,EAAA,EAAA,MAAA,SAAA,EAAA,EAAA,EAAA,EAAA,QAAA,IAAA,IAAA,EAAA,SAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,OAAA,EAAA,oBAAA,GAAA,EAAA,EAAA,OAAA,KAAA,SAAA,GAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,EAAA,aAAA,EAAA,EAAA,EAAA,WAAA,OAAA,OAAA,EAAA,EAAA,WAAA,WAAA,MAAA,uBAAA,EAAA,KAAA,SAAA,GAAA,IAAA,EAAA,OAAA,GAAA,EAAA,GAAA,IAAA,IAAA,KAAA,EAAA,EAAA,KAAA,GAAA,OAAA,EAAA,UAAA,SAAA,IAAA,KAAA,EAAA,QAAA,CAAA,IAAA,EAAA,EAAA,MAAA,GAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,UAAA,CAAA,YAAA,EAAA,MAAA,SAAA,GAAA,GAAA,KAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KAAA,KAAA,KAAA,WAAA,EAAA,KAAA,MAAA,EAAA,KAAA,SAAA,KAAA,KAAA,OAAA,OAAA,KAAA,SAAA,EAAA,KAAA,WAAA,QAAA,IAAA,EAAA,IAAA,IAAA,KAAA,KAAA,MAAA,EAAA,OAAA,IAAA,EAAA,KAAA,KAAA,KAAA,OAAA,EAAA,MAAA,MAAA,KAAA,QAAA,IAAA,KAAA,WAAA,KAAA,MAAA,EAAA,IAAA,EAAA,KAAA,WAAA,GAAA,WAAA,GAAA,UAAA,EAAA,KAAA,MAAA,EAAA,IAAA,OAAA,KAAA,MAAA,kBAAA,SAAA,GAAA,GAAA,KAAA,KAAA,MAAA,EAAA,IAAA,EAAA,KAAA,SAAA,EAAA,EAAA,GAAA,OAAA,EAAA,KAAA,QAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,OAAA,OAAA,EAAA,SAAA,KAAA,EAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,EAAA,EAAA,WAAA,GAAA,SAAA,EAAA,OAAA,OAAA,EAAA,OAAA,GAAA,EAAA,QAAA,KAAA,KAAA,CAAA,IAAA,EAAA,EAAA,KAAA,EAAA,YAAA,EAAA,EAAA,KAAA,EAAA,cAAA,GAAA,GAAA,EAAA,CAAA,GAAA,KAAA,KAAA,EAAA,SAAA,OAAA,EAAA,EAAA,UAAA,GAAA,GAAA,KAAA,KAAA,EAAA,WAAA,OAAA,EAAA,EAAA,iBAAA,GAAA,GAAA,GAAA,KAAA,KAAA,EAAA,SAAA,OAAA,EAAA,EAAA,UAAA,OAAA,CAAA,IAAA,EAAA,MAAA,IAAA,MAAA,0CAAA,GAAA,KAAA,KAAA,EAAA,WAAA,OAAA,EAAA,EAAA,gBAAA,OAAA,SAAA,EAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,QAAA,KAAA,MAAA,EAAA,KAAA,EAAA,eAAA,KAAA,KAAA,EAAA,WAAA,CAAA,IAAA,EAAA,EAAA,OAAA,IAAA,UAAA,GAAA,aAAA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,aAAA,EAAA,MAAA,IAAA,EAAA,EAAA,EAAA,WAAA,GAAA,OAAA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,GAAA,KAAA,OAAA,OAAA,KAAA,KAAA,EAAA,WAAA,GAAA,KAAA,SAAA,IAAA,SAAA,SAAA,EAAA,GAAA,GAAA,UAAA,EAAA,KAAA,MAAA,EAAA,IAAA,MAAA,UAAA,EAAA,MAAA,aAAA,EAAA,KAAA,KAAA,KAAA,EAAA,IAAA,WAAA,EAAA,MAAA,KAAA,KAAA,KAAA,IAAA,EAAA,IAAA,KAAA,OAAA,SAAA,KAAA,KAAA,OAAA,WAAA,EAAA,MAAA,IAAA,KAAA,KAAA,GAAA,GAAA,OAAA,SAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,aAAA,EAAA,OAAA,KAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,GAAA,IAAA,MAAA,SAAA,GAAA,IAAA,IAAA,EAAA,KAAA,WAAA,OAAA,EAAA,GAAA,IAAA,EAAA,CAAA,IAAA,EAAA,KAAA,WAAA,GAAA,GAAA,EAAA,SAAA,EAAA,CAAA,IAAA,EAAA,EAAA,WAAA,GAAA,UAAA,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,IAAA,EAAA,GAAA,OAAA,GAAA,MAAA,IAAA,MAAA,0BAAA,cAAA,SAAA,EAAA,EAAA,GAAA,OAAA,KAAA,SAAA,CAAA,SAAA,EAAA,GAAA,WAAA,EAAA,QAAA,GAAA,SAAA,KAAA,SAAA,KAAA,SAAA,GAAA,IAAA,EAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,IAAA,EAAA,EAAA,GAAA,GAAA,EAAA,EAAA,MAAA,MAAA,GAAA,YAAA,EAAA,GAAA,EAAA,KAAA,EAAA,GAAA,QAAA,QAAA,GAAA,KAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,WAAA,IAAA,EAAA,KAAA,EAAA,UAAA,OAAA,IAAA,QAAA,SAAA,EAAA,GAAA,IAAA,EAAA,EAAA,MAAA,EAAA,GAAA,SAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,SAAA,EAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,QAAA,GAAA,OAAA,MAIA,IAAIiD,EAAK,oBACL/K,UAAUgL,eACVhL,UAAUgL,cAAcC,SACpBF,EAAI,CAACG,MAAO,uBACdC,KAAK,SAAAC,GACHA,EAAaC,cAAgB,WACzB,IAAMC,EAAmBF,EAAaG,WACd,MAApBD,IACJA,EAAiBE,cAAgB,WACE,cAA3BF,EAAiBG,QACbzL,UAAUgL,cAAcU,YACxB,EAAApQ,EAAU,YAAC,8DAEX,EAAAE,EAAa,eAAC,0CAK9B4P,EAAaO,WACdC,MAAM,SAAAhN,IACL,EAAAvD,EAAU,YAAC,uCACXoC,QAAQmB,MAAM,4CAA6CA,KAKnEpF,SAASqS,eAAe,gCAAgC5M,iBAAiB,QAAS,WAC9EzF,SAASK,KAAKC,UAAUU,IAAI,8BAI3BwF,UAAUC,YAEXxC,QAAQmB,MAAM,iGACd,EAAA7D,EAAW,aAAC,gGAIhB,IAAI8J,EAAU,IAAImE,EAAO,QACzBzG,OAAOsC,QAAUA,EACjB,IAAIiH,EAAO,IAAIzM,EAAO,QACtBkD,OAAOuJ,KAAOA,EAGdtS,SAASC,cAAc,4BAA4BwF,iBAAiB,SAAU,SAAC8M,GAC3ElH,EAAQmH,iBAAiBD,EAAEjK,OAAOC,OAClCkK,aAAaC,QAAQ,gBAAiBH,EAAEjK,OAAOC,OAC/CvI,SAASC,cAAc,sBAAsB0B,UAAY,2BAEf,OAA1C8Q,aAAaE,QAAQ,kBAA6BF,aAAaC,QAAQ,gBAAiB,KAC5FrH,EAAQmH,iBAAiBC,aAAaE,QAAQ,kBAC9C3S,SAASC,cAAc,sBAAsB0B,UAAY,yBACzD3B,SAASC,cAAc,4BAA4BsI,MAAQkK,aAAaE,QAAQ,iBAGhF3S,SAASC,cAAc,kCAAkCwF,iBAAiB,SAAU,SAAC8M,GACjFlH,EAAQ2D,MAAMjF,YAAcwI,EAAEjK,OAAOsK,QACrCH,aAAaC,QAAQ,cAAeH,EAAEjK,OAAOsK,WAEL,OAAxCH,aAAaE,QAAQ,gBAA2BF,aAAaC,QAAQ,eAAe,GACxFrH,EAAQ2D,MAAMjF,YAAqD,QAAvC0I,aAAaE,QAAQ,eACjD3S,SAASC,cAAc,kCAAkC2S,QAAiD,QAAvCH,aAAaE,QAAQ,eAGxF3S,SAASC,cAAc,2CAA2CwF,iBAAiB,SAAU,SAAC8M,GAC1FlH,EAAQwC,YAAc0E,EAAEjK,OAAOsK,QAC/BH,aAAaC,QAAQ,cAAeH,EAAEjK,OAAOsK,WAEL,OAAxCH,aAAaE,QAAQ,gBAA2BF,aAAaC,QAAQ,eAAe,GACxFrH,EAAQwC,YAAqD,QAAvC4E,aAAaE,QAAQ,eAC3C3S,SAASC,cAAc,2CAA2C2S,QAAiD,QAAvCH,aAAaE,QAAQ,eAGjG3S,SAASC,cAAc,mCAAmCwF,iBAAiB,SAAU,SAAC8M,GAClFlH,EAAQyF,gBAAkByB,EAAEjK,OAAOsK,QACnCH,aAAaC,QAAQ,eAAgBH,EAAEjK,OAAOsK,WAEL,OAAzCH,aAAaE,QAAQ,iBAA4BF,aAAaC,QAAQ,gBAAgB,GAC1FrH,EAAQyF,gBAA0D,QAAxC2B,aAAaE,QAAQ,gBAC/C3S,SAASC,cAAc,mCAAmC2S,QAAkD,QAAxCH,aAAaE,QAAQ,gBAGzF3S,SAASC,cAAc,kCAAkCwF,iBAAiB,SAAU,SAAC8M,GACjFlH,EAAQuF,UAAY2B,EAAEjK,OAAOsK,QACzBL,EAAEjK,OAAOsK,QACT5S,SAASK,KAAKC,UAAUU,IAAI,SAE5BhB,SAASK,KAAKC,UAAUY,OAAO,SAEnCuR,aAAaC,QAAQ,cAAeH,EAAEjK,OAAOsK,WAEL,OAAxCH,aAAaE,QAAQ,gBAA2BF,aAAaC,QAAQ,eAAe,GACxFrH,EAAQuF,UAAmD,QAAvC6B,aAAaE,QAAQ,eACG,SAAxCF,aAAaE,QAAQ,eACrB3S,SAASK,KAAKC,UAAUU,IAAI,SAE5BhB,SAASK,KAAKC,UAAUY,OAAO,SAEnClB,SAASC,cAAc,kCAAkC2S,QAAiD,QAAvCH,aAAaE,QAAQ,eAGxF3S,SAASC,cAAc,sBAAsBwF,iBAAiB,QAAS,WACnEzF,SAASC,cAAc,oBAAoBK,UAAUU,IAAI,WAE7DhB,SAASC,cAAc,sBAAsBwF,iBAAiB,QAAS,WACnEzF,SAASC,cAAc,oBAAoBK,UAAUY,OAAO,WAIhElB,SAASC,cAAc,mBAAmBwF,iBAAiB,QAAS,WAChE6M,EAAK/L,eAETvG,SAASqS,eAAe,eAAe5M,iBAAiB,QAAS,EAAA,IAAA,KAAA,SAAA,IAAA,OAAA,IAAA,KAAA,SAAA,GAAA,OAAA,OAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAG5D,OAFIe,UAAUC,YACX,EAAAlF,EAAW,aAAC,0EACf,EAAA,KAAA,EAAA,EAAA,KAAA,EAES+Q,EAAKO,eAAc,KAAA,EAAA,EAAA,KAAA,EAAA,MAAA,KAAA,EAAA,EAAA,KAAA,EAAA,EAAA,GAAA,EAAA,MAAA,IAEzB,EAAAtR,EAAW,aAAsC,gCAAA,OAAA,EAAA,GAAA,MAAC,KAAA,EAAA,IAAA,MAAA,OAAA,EAAA,SAAA,EAAA,KAAA,CAAA,CAAA,EAAA,SAK1D,IAAIuR,EAAe,GACnBzH,EAAQ0H,aAAa,SAAArN,GAEb,CAAC,aAAc,aAAa8G,SAAS9G,EAAEqH,UACvC+F,EAAapN,EAAEsB,IAAG,EAAA,CAAIiL,OAAO,GAASvM,IAEtC,CAAC,YAAY8G,SAAS9G,EAAEqH,UACxB+F,EAAapN,EAAEsB,IAAG,EAAA,CAAIiL,OAAO,GAAUvM,IAG3C,IADA,IAAIsN,EAAc,GACS9I,EAAAA,EAAAA,EAAAA,OAAOC,QAAQ2I,GAAe,EAAA,EAAA,OAAA,IAAA,CAApD,IAAA,EAAA,EAAA,EAAA,GAAA,GAAOtE,EAAG,EAAA,GAAEjG,EAAK,EAAA,GAClByK,GAAkBxE,GAAAA,OAAAA,EAAQjG,MAAAA,OAAAA,EAAM0J,MAAQ,UAAY,eAChD1J,EAAMkG,eAAe,OACrBuE,GAAuBzK,QAAAA,OAAAA,EAAMkB,EAASlB,SAAAA,OAAAA,EAAMmB,EAAI,MAEpDsJ,GAAmB,KAEvBhT,SAASC,cAAc,sBAAsB0B,UAAYqR,IAG7D,IAAIC,EAAsB,GAC1B5H,EAAQ0H,aAAa,SAAArN,GACjB,IAAMvB,EAAazB,EAAS,UAACC,uBACzByB,EAAc,KACF,cAAZsB,EAAEqH,OACiB,KAARrH,EAAEsB,GACT5C,EAAc1B,EAAS,UAACE,uBACT,KAAR8C,EAAEsB,GACT5C,EAAc1B,EAAS,UAACI,uBACT,KAAR4C,EAAEsB,GACT5C,EAAc1B,EAAS,UAACM,uBACT,KAAR0C,EAAEsB,GACT5C,EAAc1B,EAAS,UAACQ,uBACT,KAARwC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACU,uBACT,KAARsC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACY,uBACT,KAARoC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACc,uBACT,KAARkC,EAAEsB,KACT5C,EAAc1B,EAAS,UAACgB,wBAET,YAAZgC,EAAEqH,SACU,KAARrH,EAAEsB,GACT5C,EAAc1B,EAAS,UAACG,qBACT,KAAR6C,EAAEsB,GACT5C,EAAc1B,EAAS,UAACK,qBACT,KAAR2C,EAAEsB,GACT5C,EAAc1B,EAAS,UAACO,qBACT,KAARyC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACS,qBACT,KAARuC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACW,qBACT,KAARqC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACa,qBACT,KAARmC,EAAEsB,GACT5C,EAAc1B,EAAS,UAACe,qBACT,KAARiC,EAAEsB,KACT5C,EAAc1B,EAAS,UAACiB,uBAG3B2O,EAAKhM,eAAkC,MAAflC,GACzBkO,EAAK5K,UAAUvD,EAAYC,GAGnB,SAARsB,EAAEsB,KACFiM,EAAoBxJ,EAAI/D,EAAE+D,GAElB,QAAR/D,EAAEsB,KACFiM,EAAoBvJ,EAAIhE,EAAEgE,KAKlC4I,EAAKY,UAAU,WACXlT,SAASK,KAAKC,UAAUU,IAAI,eAGhCsR,EAAKa,aAAa,WACdnT,SAASK,KAAKC,UAAUY,OAAO,eAInC,IAAI0E,EAAI,EACRpF,YAAY,WACA,GAAHoF,GAASqN,EAAoBxE,eAAe,MAC7C6D,EAAK3K,SAAcsL,KAAAA,OAAAA,EAAoBxJ,EAAM,OAEzC,GAAH7D,GAASqN,EAAoBxE,eAAe,MAC7C6D,EAAK3K,SAAcsL,KAAAA,OAAAA,EAAoBvJ,EAAM,SAEjD9D,EACM,IAAKA,EAAI,IAChB","file":"main.6a141175.js","sourceRoot":"../src","sourcesContent":["let waiting_timer = undefined;\nlet notif_queue = [];\n\nfunction notif(notif_c) {\n let notification_area = document.querySelector(\".statusline .notification-area\");\n\n if ((notification_area.querySelector(\".notification\") === null) && (waiting_timer === undefined)) {\n // This is just so no notifications will be played and disappears while the full screen landscape warning is in the way.\n if( (screen.availHeight > screen.availWidth) && (!document.body.classList.contains(\"ignore-landscape-warning\"))){\n waiting_timer = setInterval(() => {\n if( (screen.availHeight < screen.availWidth) || (document.body.classList.contains(\"ignore-landscape-warning\"))){\n clearInterval(waiting_timer);\n waiting_timer = undefined;\n notif(notif_queue.pop());\n }\n }, 1000);\n notif_queue.push(notif_c);\n return;\n }\n\n let notif_elem = document.createElement(\"div\");\n notif_elem.className = \"notification\";\n notif_elem.appendChild(notif_c[0]);\n notif_elem.appendChild(notif_c[1]);\n\n notification_area.appendChild(notif_elem);\n\n notification_area.classList.add(\"show\");\n setTimeout(() => {\n notification_area.classList.remove(\"show\");\n notif_elem.querySelector(\"p\").style.opacity = \"0\";\n setTimeout(() => {\n notification_area.removeChild(notif_elem);\n if (notif_queue.length > 0) {\n notif(notif_queue.pop());\n }\n }, 1000);\n }, 10000);\n } else {\n notif_queue.push(notif_c);\n }\n}\n\nexport function notif_alert(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"alert fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_warn(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"warning fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_info(info_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = info_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"info fas fa-info-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_success(success_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = success_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"success fas fa-check-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n","import { notif_alert, notif_warn, notif_info, notif_success } from './notification';\n/*\n * This code is written with a lot of help from these resources:\n * https://github.com/antefact/microBit.js/blob/master/src/microBit.js\n * https://gist.github.com/kotobuki/7c67f8b9361e08930da1a5cfcfb0653f\n * https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html\n */\nconst UART_SERVICE_UUID = \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for reading UART data from micro bit */\nconst UART_TX_CHARACTERISTIC_UUID = \"6e400002-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for writing UART data to micro bit */\nconst UART_RX_CHARACTERISTIC_UUID = \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\";\n/* The event service characteristic (which extends the uBit message bus over bluetooth) */\nconst EVENT_SERVICE_UUID = \"e95d93af-251d-470a-a062-fa1922dfa9a8\";\n/* This should be read once connected, as the ubit will advertise which events it wants to subscribe to */\nconst UBIT_REQUIREMENT_CHARACTERISTIC_UUID = \"e95db84c-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic where we should write the events we wish to be informed of from the microbit */\nconst CLIENTREQUIREMENTS_CHARACTERISTIC_UUID = \"e95d23c4-251d-470a-a062-fa1922dfa9a8\"\n/* The characteristic used for reading EventService messages */\nconst UBITEVENT_CHARACTERISTIC_UUID = \"e95d9775-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic used for writing EventService messages */\nconst CLIENTEVENT_CHARACTERISTIC_UUID = \"e95d5404-251d-470a-a062-fa1922dfa9a8\";\n\n/* This table is retrieved from this site:\n * https://github.com/lancaster-university/microbit-dal/blob/master/inc/bluetooth/MESEvents.h */\nexport const MESEvents = {\n MES_DPAD_CONTROLLER_ID: 1104,\n MES_DPAD_BUTTON_A_DOWN: 1,\n MES_DPAD_BUTTON_A_UP: 2,\n MES_DPAD_BUTTON_B_DOWN: 3,\n MES_DPAD_BUTTON_B_UP: 4,\n MES_DPAD_BUTTON_C_DOWN: 5,\n MES_DPAD_BUTTON_C_UP: 6,\n MES_DPAD_BUTTON_D_DOWN: 7,\n MES_DPAD_BUTTON_D_UP: 8,\n MES_DPAD_BUTTON_1_DOWN: 9,\n MES_DPAD_BUTTON_1_UP: 10,\n MES_DPAD_BUTTON_2_DOWN: 11,\n MES_DPAD_BUTTON_2_UP: 12,\n MES_DPAD_BUTTON_3_DOWN: 13,\n MES_DPAD_BUTTON_3_UP: 14,\n MES_DPAD_BUTTON_4_DOWN: 15,\n MES_DPAD_BUTTON_4_UP: 16\n}\n\nclass BluetoothService {\n static gattEventQueue = [];\n SERVICE_UUID = null;\n\n static doGattEvent() {\n if (BluetoothService.gattEventQueue <= 0) { return; }\n BluetoothService.gattEventQueue.pop()();\n }\n}\n\nclass EventService extends BluetoothService {\n /* Implements methods for interacting with microbit EventService */\n static SERVICE_UUID = EVENT_SERVICE_UUID;\n service;\n\n constructor(service, ubitEvent) {\n super();\n this.service = service;\n this.ubitEvent = ubitEvent;\n console.debug(\"EventService initialized.\");\n }\n\n sendEvent(event_type, event_value) {\n BluetoothService.gattEventQueue.push(() => {\n this.ubitEvent.writeValue(\n new Uint16Array([event_type, event_value])\n );\n });\n }\n\n static async getService(gattServer) {\n console.debug(\"Getting EventService\");\n let service = await gattServer.getPrimaryService(EventService.SERVICE_UUID);\n console.debug(\"Getting ClientEvent characteristic\");\n let ubitEventCharacteristic = await service.getCharacteristic(CLIENTEVENT_CHARACTERISTIC_UUID);\n return new EventService(service, ubitEventCharacteristic);\n }\n}\n\nclass UartService extends BluetoothService {\n /* Implements methods for interacting with microbit UartService */\n static SERVICE_UUID = UART_SERVICE_UUID;\n handlers = [];\n\n constructor(service, uartTx, uartRx) {\n super();\n this.service = service;\n this.uartTx = uartTx;\n this.uartRx = uartRx;\n console.debug(\"UartService initialized.\");\n }\n\n async sendUart(str, isVolatile=true) {\n let encoder = new TextEncoder();\n try {\n await this.uartRx.writeValue(\n encoder.encode(str)\n )\n } catch (e) {\n if (!isVolatile) {\n console.error(e);\n }\n }\n }\n\n #onUartTx(e) {\n for (let i = 0; i < this.handlers.length; i++) {\n this.handlers[i]();\n }\n }\n\n onUartTx(callback) {\n this.handlers.push(callback);\n }\n\n static async getService(gattServer) {\n console.debug(\"Getting UartService\");\n let service = await gattServer.getPrimaryService(UartService.SERVICE_UUID);\n\n console.debug(\"Getting Uart characteristics\");\n \n let uartTxCharacteristic = await service.getCharacteristic(UART_TX_CHARACTERISTIC_UUID);\n await uartTxCharacteristic.startNotifications();\n await uartTxCharacteristic.addEventListener(\"characteristicvaluechanged\", (e) => {\n this.#onUartTx(e);\n });\n\n let uartRxCharacteristic = await service.getCharacteristic(UART_RX_CHARACTERISTIC_UUID);\n\n return new UartService(service, uartTxCharacteristic, uartRxCharacteristic);\n }\n\n\n}\n\nexport class uBitBLE {\n eventService;\n eventServiceAvailable = false;\n uartService;\n uartServiceAvailable = false;\n uartTxHandlers = [];\n device;\n\n constructor() {\n this.onConnectCallback = [];\n this.onDisconnectCallback = [];\n this.pushInterval = setInterval(BluetoothService.doGattEvent, 40);\n }\n\n #onDisconnect(e) {\n console.debug(\"Device disconnected\", e);\n for (let i = 0; i < this.onDisconnectCallback.length; i++) {\n this.onDisconnectCallback[i]();\n }\n }\n\n #onConnect() {\n console.debug(\"Device connected\");\n for (let i = 0; i < this.onConnectCallback.length; i++) {\n this.onConnectCallback[i]();\n }\n }\n\n onConnect(callbackFunction) {\n this.onConnectCallback.push(callbackFunction);\n }\n\n onDisconnect(callbackFunction) {\n this.onDisconnectCallback.push(callbackFunction);\n }\n\n isConnected() {\n if (this.device) {\n return this.device.gatt.connected;\n } else {\n return false;\n }\n }\n\n disconnect() {\n if (this.isConnected()) {\n this.device.gatt.disconnect();\n }\n }\n\n async searchDevice() {\n this.device = await navigator.bluetooth.requestDevice({\n filters: [{namePrefix: \"BBC micro:bit\"}],\n optionalServices: [EVENT_SERVICE_UUID, UART_SERVICE_UUID]\n });\n this.device.addEventListener('gattserverdisconnected', (e) => this.#onDisconnect(e));\n console.log(\"Connected to new device\", this.device.name, this.device.id);\n\n console.debug(\"Connection to GATT server...\");\n const server = await this.device.gatt.connect()\n\n this.#onConnect();\n\n console.debug(\"Getting services...\");\n\n try {\n const eventService = await EventService.getService(server);\n this.eventService = eventService;\n this.eventServiceAvailable = true;\n } catch (e) {\n this.eventServiceAvailable = false;\n console.debug(\"Could not get EventService\");\n notif_warn(\"Connected device's firmware does not support bluetooth EventService, gamepad will not work.\");\n }\n\n try {\n const uartService = await UartService.getService(server);\n this.uartService = uartService;\n for (let i = 0; i < this.uartTxHandlers.length; i++) {\n this.uartService.onUartTx(this.uartTxHandlers[i]);\n }\n this.uartServiceAvailable = true;\n } catch (e) {\n this.uartServiceAvailable = false;\n console.debug(\"Could not get UartService\", e)\n notif_info(\"Connected device's firmware does not support bluetooth UartService, joysticks won't work.\");\n }\n }\n\n sendEvent(event_type, event_value) {\n if (this.isConnected() && this.eventServiceAvailable) {\n this.eventService.sendEvent(event_type, event_value);\n } else {\n console.debug(`Could not send event {${event_type}, ${event_value}}, because: ${this.isConnected() ? \"Device does not have EventService characteristic\" : \"No device connected\"}.`);\n }\n }\n\n sendUart(str) {\n if (this.isConnected() && this.uartServiceAvailable) {\n this.uartService.sendUart(str);\n } else {\n console.debug(`Could not send uart data, because: ${this.isConnected() ? \"Device does not have UartService characteristic\" : \"No device connected\"}.`);\n }\n }\n\n onUartTx(callback) {\n this.uartTxHandlers.push(callback);\n if (this.uartServiceAvailable) {\n this.uartService.onUartTx(callback);\n }\n }\n\n}\n\nfunction getSupportedProperties(characteristic) {\n let supportedProperties = [];\n for (const p in characteristic.properties) {\n if (characteristic.properties[p] === true) {\n supportedProperties.push(p.toUpperCase());\n }\n }\n return '[' + supportedProperties.join(', ') + ']';\n}\n\nfunction eventByteArrayToString(event) {\n let receivedData = [];\n for (var i = 0; i < event.target.value.byteLength; i++) {\n receivedData[i] = event.target.value.getUint8(i);\n }\n return String.fromCharCode.apply(null, receivedData);\n}\n","class CanvasStage {\n canvas;\n #dpi = window.devicePixelRatio;\n #width;\n #height;\n #ctx;\n #elements = [];\n touches = {};\n showTouches = false;\n\n constructor(id, node) {\n this.canvas = document.createElement(\"canvas\");\n this.canvas.setAttribute(\"id\", id);\n node.appendChild(this.canvas);\n\n addEventListener(\"resize\", () => this.resize());\n this.resize();\n\n console.debug(\"Created canvas\", this.canvas);\n\n setInterval(() => {\n this.drawElements();\n }, 10);\n }\n\n /* Resizes the canvas to be the correct size for the current screen */\n resize() {\n this.#ctx = this.canvas.getContext(\"2d\");\n this.#height = +getComputedStyle(this.canvas).getPropertyValue(\"height\").slice(0, -2);\n this.#width = +getComputedStyle(this.canvas).getPropertyValue(\"width\").slice(0, -2);\n this.canvas.setAttribute('height', this.#height * this.#dpi);\n this.canvas.setAttribute('width', this.#width * this.#dpi);\n }\n\n /* Translate a screen x coordinate to a canvas x coordinate */\n screenToCanvasX(x) { return x * this.#dpi; }\n\n /* Translate a screen y coordinate to a canvas y coordinate */\n screenToCanvasY(y) { return y * this.#dpi; }\n\n /* Get target at position, i.e. the element that intersects said position */\n getTarget(x, y) {\n x *= this.#dpi;\n y *= this.#dpi;\n for (let i = 0; i < this.#elements.length; i++) {\n if ((this.#elements[i] instanceof TouchElement)\n && (this.#elements[i].collides(this.#ctx, x, y))) {\n return this.#elements[i];\n }\n }\n }\n\n /* Redraws all elements of the stage on the screen. */\n drawElements() {\n this.#ctx.clearRect(0, 0, this.#width * this.#dpi, this.#height * this.#dpi);\n for (let i = 0; i < this.#elements.length; i++) {\n this.#elements[i].draw(this.#ctx);\n }\n if (this.showTouches) {\n this.drawTouches();\n }\n }\n\n /* Draws all touches on the screen, used to debug */\n drawTouches(e) {\n const colors = [\"200, 0, 0\", \"0, 200, 0\", \"0, 0, 200\", \"200, 200, 0\", \"200, 200, 200\"]\n for (const [identifier, touch] of Object.entries(this.touches)) {\n this.#ctx.beginPath();\n this.#ctx.arc(touch.x * this.#dpi, touch.y * this.#dpi, 20 * this.#dpi, 0, 2*Math.PI, true);\n this.#ctx.fillStyle = `rgba(${colors[identifier]}, 0.2)`;\n this.#ctx.fill();\n\n this.#ctx.lineWidth = 2.0;\n this.#ctx.strokeStyle = `rgba(${colors[identifier]}, 0.8)`;\n this.#ctx.stroke();\n }\n }\n\n /* Add a element to the stage */\n addElement(element) {\n this.#elements.push(element);\n element.init();\n }\n\n /* Remove a element from the stage by id */\n removeElementById(id) {\n for (let i = 0; i < this.#elements.length; i++) {\n if (id === this.#elements[i].id) {\n this.#elements.splice(i, 1);\n return;\n }\n }\n }\n\n /* Wipe all elements from the stage */\n removeAllElements() {\n this.#elements.splice(0, this.#elements.length);\n }\n\n}\n\nclass Element {\n gamepad;\n id;\n x;\n y;\n alignX;\n alignY;\n path;\n isInside;\n isActive;\n type = \"Element\";\n \n constructor(opts, gamepad) {\n let _opts = Object.assign({\n id: null,\n x: 0,\n y: 0,\n alignX: null,\n alignY: null\n }, opts);\n this.id = _opts.id;\n this.x = _opts.x;\n this.y = _opts.y;\n this.alignX = _opts.alignX;\n this.alignY = _opts.alignY;\n this.gamepad = gamepad;\n }\n\n /* Used for initializing the element onto the stage */\n init() {}\n\n /* Get the x-axis scaling factor (currently unused, only the y scaling factor is in use) */\n getScaleX(ctx) { \n return ctx.canvas.width / 100;\n }\n\n /* Get the y-axis scaling factor */\n getScaleY(ctx) { \n return ctx.canvas.height / 100;\n }\n\n /* Get the canvas x position of this element, adjusted from the virtual canvas coordinates */\n getX(ctx) {\n let x = this.x * this.getScaleY(ctx);\n if (this.alignX === \"center\") {\n x = (ctx.canvas.width / 2) + x;\n }\n if (this.alignX === \"right\") {\n x = ctx.canvas.width - x;\n }\n return x;\n }\n\n /* Get the canvas y position of this element, adjusted from the virtual canvas coordinates */\n getY(ctx) {\n let y = this.y * this.getScaleY(ctx);\n if (this.alignY === \"center\") {\n y = (ctx.canvas.height / 2) + y;\n }\n if (this.alignY === \"bottom\") {\n y = ctx.canvas.height - y;\n }\n return y;\n }\n\n /* Used to draw the element onto a canvas context */\n draw(ctx) {}\n\n /* Used to check wether the coordinates is inside this element */\n collides(ctx, x, y) {\n this.isInside = ctx.isPointInPath(this.path, x, y);\n return this.isInside;\n }\n\n}\n\nexport class Square extends Element {\n draw(ctx) {\n this.path = new Path2D();\n let w = this.getScaleY(ctx) * 20;\n this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n ctx.fill(this.path);\n }\n}\n\nclass TouchElement extends Element {\n type = \"TouchElement\";\n touchCount = 0;\n\n setActive(e, doCallbacks = true) {\n if ([\"end\", \"cancel\"].includes(e.type)) { this.touchCount--; }\n let eState = e.type == \"start\";\n if ((eState !== this.isActive) && (this.touchCount == 0)) {\n this.isActive = eState;\n if (doCallbacks) {\n this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(\n this.isActive ? \"touchstart\" : \"touchend\"\n ));\n }\n }\n if (e.type == \"start\") { this.touchCount++; }\n }\n\n createTouchEventObject(action) {\n return {\n id: this.id,\n action: action,\n type: this.type\n }\n }\n\n}\n\nexport class GamepadButton extends TouchElement {\n shape;\n altText;\n altTextAlign;\n type = \"GamepadButton\";\n\n constructor(opts) {\n let _opts = Object.assign({\n keyboardButton: null,\n altText: null,\n altTextAlign: \"left\",\n shape: \"round\"\n }, opts);\n super(opts);\n this.keyboardButton = _opts.keyboardButton;\n this.shape = _opts.shape;\n this.altText = _opts.altText;\n this.altTextAlign = _opts.altTextAlign;\n }\n\n init() {\n if (this.keyboardButton !== null) {\n this.gamepad.registerKeybinding(this.keyboardButton, this);\n }\n }\n\n draw(ctx) {\n this.path = new Path2D();\n if (this.shape === \"round\") {\n this.path.arc(this.getX(ctx), this.getY(ctx), this.getScaleY(ctx) * 10, 0, 4*Math.PI, true);\n } else if (this.shape === \"square\") {\n let w = this.getScaleY(ctx) * 20;\n this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n }\n if (this.isActive) {\n ctx.fillStyle = `rgba(80, 80, 80, 1)`;\n } else {\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n }\n ctx.fill(this.path);\n\n let s = `${Math.floor((this.getScaleY(ctx)*8).toString())}px 'Press Start 2P'`;\n ctx.font = s;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n ctx.fillStyle = `rgba(255, 255, 255, 1)`;\n ctx.fillText(this.id, this.getX(ctx), this.getY(ctx));\n\n if ((this.altText !== null) && (this.gamepad.showAltText)) {\n ctx.beginPath();\n ctx.font = `${Math.floor((this.getScaleY(ctx)*3).toString())}px 'Press Start 2P'`;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n ctx.fillStyle = `rgba(150, 150, 150, 1)`;\n let ax = this.getX(ctx);\n let ay = this.getY(ctx);\n switch (this.altTextAlign) {\n case \"left\":\n ax -= (this.getScaleY(ctx) * 13);\n break;\n case \"right\":\n ax += (this.getScaleY(ctx) * 13);\n break;\n case \"top\":\n ay -= (this.getScaleY(ctx) * 13);\n break;\n case \"bottom\":\n ay += (this.getScaleY(ctx) * 13);\n break;\n }\n ctx.fillText(this.altText, ax, ay);\n }\n }\n\n}\n\nexport class GamepadJoystick extends TouchElement {\n type = \"GamepadJoystick\";\n mouseX = 0;\n mouseY = 0;\n cR = 0;\n cX = 0;\n cY = 0;\n\n #lockX;\n #lockY;\n\n #pressedKeys = {};\n\n constructor(opts) {\n let _opts = Object.assign({\n lockX: false,\n lockY: false,\n autoCenter: true,\n bindUp: null,\n bindLeft: null,\n bindRight: null,\n bindDown: null\n }, opts);\n super(opts);\n this.#lockX = _opts.lockX;\n this.#lockY = _opts.lockY;\n this.bindUp = _opts.bindUp;\n this.bindLeft = _opts.bindLeft;\n this.bindRight = _opts.bindRight;\n this.bindDown = _opts.bindDown;\n }\n\n init() {\n if (this.bindUp !== null) {\n this.gamepad.registerKeybinding(this.bindUp, this);\n }\n if (this.bindLeft !== null) {\n this.gamepad.registerKeybinding(this.bindLeft, this);\n }\n if (this.bindRight !== null) {\n this.gamepad.registerKeybinding(this.bindRight, this);\n }\n if (this.bindDown !== null) {\n this.gamepad.registerKeybinding(this.bindDown, this);\n }\n }\n\n isKeyPressed(key) {\n return ((key !== null)\n && (this.#pressedKeys.hasOwnProperty(key))\n && (this.#pressedKeys[key] > 0));\n }\n\n createTouchEventObject(action) {\n return {\n id: this.id,\n action: action,\n type: this.type,\n x: Math.round((this.mouseX / this.cR) * 100),\n y: Math.round((this.mouseY / this.cR) * 100)\n }\n }\n\n setActive(e) {\n super.setActive(e, false);\n if (e.hasOwnProperty(\"key\")) {\n if (!this.#pressedKeys.hasOwnProperty(e.key)) {\n this.#pressedKeys[e.key] = 0;\n }\n if ([\"start\"].includes(e.type)) {\n this.#pressedKeys[e.key]++;\n }\n if ([\"end\", \"cancel\"].includes(e.type)) {\n this.#pressedKeys[e.key]--;\n }\n }\n\n let max = this.cR\n if (!this.#lockX) {\n if (e.hasOwnProperty(\"x\")) {\n this.mouseX = this.cX - this.gamepad.stage.screenToCanvasX(e.x);\n this.mouseX = Math.min(Math.abs(this.mouseX), max) * Math.sign(this.mouseX); \n this.mouseX *= -1;\n }\n if (this.isKeyPressed(this.bindLeft)) { this.mouseX = -max; } \n if (this.isKeyPressed(this.bindRight)) { this.mouseX = max; }\n if (this.isKeyPressed(this.bindLeft) && this.isKeyPressed(this.bindRight)) { this.mouseX = 0; }\n if (!this.isActive) { this.mouseX = 0; }\n }\n if (!this.#lockY) {\n if (e.hasOwnProperty(\"y\")) {\n this.mouseY = this.cY - this.gamepad.stage.screenToCanvasY(e.y);\n this.mouseY = Math.min(Math.abs(this.mouseY), max) * Math.sign(this.mouseY); \n } \n if (this.isKeyPressed(this.bindUp)) { this.mouseY = max; } \n if (this.isKeyPressed(this.bindDown)) { this.mouseY = -max; }\n if (this.isKeyPressed(this.bindUp) && this.isKeyPressed(this.bindDown)) { this.mouseY = 0; }\n if (!this.isActive) { this.mouseY = 0; }\n }\n\n let action = \"touchmove\";\n if (this.isActive && (this.touchCount == 1) && (e.type === \"start\")) {\n action = \"touchstart\";\n }\n if (!this.isActive) {\n action = \"touchend\";\n }\n this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(action));\n }\n\n draw(ctx) {\n this.cX = this.getX(ctx);\n this.cY = this.getY(ctx);\n this.cR = this.getScaleY(ctx) * 25;\n\n this.path = new Path2D();\n this.path.arc(this.cX, this.cY, this.cR, 0, 4*Math.PI, true);\n if (this.isActive) {\n ctx.fillStyle = `rgba(85, 85, 85, 0.8)`;\n } else {\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n }\n ctx.fill(this.path);\n\n ctx.beginPath();\n ctx.arc(this.cX + this.mouseX, this.cY - this.mouseY, this.getScaleY(ctx) * 15, 0, 4*Math.PI, true);\n ctx.fillStyle = `rgba(130, 130, 130, 1)`;\n ctx.fill();\n\n }\n\n}\n\nexport class Gamepad {\n stage;\n #width;\n #height;\n\n #touches = {};\n #keybindings = {};\n #keystates = {};\n #touchEventCallbacks = [];\n\n showDebug = false;\n showAltText = true;\n enableVibration = true;\n\n constructor() {\n this.stage = new CanvasStage(\"GamePad\", document.querySelector(\".gamepad-wrapper\"));\n this.addEventListeners();\n }\n\n addEventListeners() {\n let ev = [\"keydown\", \"keyup\"];\n for(var e in ev) {\n document.addEventListener(ev[e], (e) => this.handleKeyEvent(e), false);\n }\n ev = [\"touchstart\", \"touchend\", \"touchcancel\", \"touchmove\"];\n for(var e in ev) {\n this.stage.canvas.addEventListener(ev[e], (e) => this.handleTouchEvent(e), false);\n }\n ev = [\"mousedown\", \"mouseup\", \"mousemove\"];\n for(var e in ev) {\n this.stage.canvas.addEventListener(ev[e], (e) => this.handleMouseEvent(e), false);\n }\n }\n\n /* Used by stage elements to register themselves with some keybinding */\n registerKeybinding(binding, element) {\n this.#keybindings[binding] = element;\n }\n\n /* Event handler for keyboard events */\n handleKeyEvent(e) {\n const typedict = {\"keydown\": \"start\", \"keyup\": \"end\"}\n if (!this.#keystates.hasOwnProperty(e.keyCode)) {\n this.#keystates[e.keyCode] = {pressed: false};\n }\n if (this.#keybindings.hasOwnProperty(e.key)) {\n let id = `Key ${e.key}`\n let target = this.#keybindings[e.key];\n let gtEvent = {\n touchId: id,\n key: e.key,\n type: typedict[e.type]\n };\n switch (e.type) {\n case \"keydown\":\n if (this.#keystates[e.keyCode].pressed) { return; }\n this.#keystates[e.keyCode].pressed = true;\n\n this.#touches[id] = {};\n this.#touches[id].target = target;\n if (this.#touches[id].hasOwnProperty(\"target\")\n && this.#touches[id].target != null) {\n this.#touches[id].target.setActive(gtEvent);\n }\n break;\n case \"keyup\":\n if (!this.#keystates[e.keyCode].pressed) { return; }\n this.#keystates[e.keyCode].pressed = false;\n\n if (this.#touches[id].hasOwnProperty(\"target\")\n && this.#touches[id].target != null) {\n this.#touches[id].target.setActive(gtEvent);\n }\n delete this.#touches[id];\n break;\n }\n }\n this.stage.touches = this.#touches;\n this.debugTouches();\n }\n\n /* Event handler for mouse events, will just translate the event to a more common form\n * before further processing. */\n handleMouseEvent(e) {\n const typedict = {\"mousedown\": \"start\", \"mouseup\": \"end\", \"mousemove\": \"move\"}\n this.processGamepadTouchEvent({\n x: e.clientX,\n y: e.clientY,\n touchId: \"mouse\",\n type: typedict[e.type]\n });\n }\n\n /* Event handler for touch events, will just translate the event to a more common form\n * before further processing. */\n handleTouchEvent(e) {\n e.preventDefault();\n const typedict = {\"touchstart\": \"start\", \"touchend\": \"end\", \"touchcancel\": \"end\", \"touchmove\": \"move\"}\n for (let i = 0; i < e.changedTouches.length; i++) {\n let touch = e.changedTouches[i];\n this.processGamepadTouchEvent({\n x: touch.clientX,\n y: touch.clientY,\n touchId: touch.identifier,\n type: typedict[e.type]\n });\n }\n }\n\n /* Event handler for processing standarized touch/mouse events. */\n processGamepadTouchEvent(gtEvent) {\n let target = this.stage.getTarget(gtEvent.x, gtEvent.y)\n switch (gtEvent.type) {\n case \"start\":\n this.#touches[gtEvent.touchId] = {};\n this.#touches[gtEvent.touchId].target = target;\n case \"move\":\n if (this.#touches.hasOwnProperty(gtEvent.touchId)) {\n this.#touches[gtEvent.touchId].x = gtEvent.x;\n this.#touches[gtEvent.touchId].y = gtEvent.y;\n\n if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n && this.#touches[gtEvent.touchId].target != null) {\n this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n }\n }\n break;\n\n case \"end\":\n case \"cancel\":\n if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n && this.#touches[gtEvent.touchId].target != null) {\n this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n }\n delete this.#touches[gtEvent.touchId];\n break;\n\n default:\n console.log(\"Unknown touch event\", gtEvent.type);\n }\n this.stage.touches = this.#touches;\n this.debugTouches();\n }\n\n /* Update the debug text with all current touches */\n debugTouches() {\n let s = \"\";\n if (this.showDebug) {\n for (const [i, t] of Object.entries(this.#touches)) {\n s += `[${i}] `\n if (t.hasOwnProperty(\"x\")) {\n s += `x: ${Math.round(t.x, 2)}, y: ${Math.round(t.y)},`\n }\n s += `target: ${t.target ? t.target.id : null}\\n`;\n }\n }\n document.querySelector(\".gamepad-touches\").innerHTML = s;\n }\n\n /* Used by elements to process callbacks on actions to outside the gamepad */\n handleTouchEventCallbacks(e) {\n if (this.enableVibration && [\"touchstart\", \"touchend\"].includes(e.action)) {\n try {\n window.navigator.vibrate(5);\n } catch (e) {\n console.error(e);\n }\n }\n for (let i = 0; i < this.#touchEventCallbacks.length; i++) {\n this.#touchEventCallbacks[i](e);\n }\n }\n\n /* Register a method as a callback for gamepad touch events */\n onTouchEvent(callback) {\n this.#touchEventCallbacks.push(callback);\n }\n\n /* Add a list of elements to the gamepad stage */\n addElements(elements) {\n for (let i = 0; i < elements.length; i++) {\n elements[i].gamepad = this;\n this.stage.addElement(elements[i]);\n }\n }\n\n /* Remove a list of elements from the gamepad stage by id */\n removeElementsById(elementIds) {\n for (let i = 0; i < elementIds.length; i++) {\n this.stage.removeElementById(elementIds[i]);\n }\n }\n\n /* Remove all elements from the gamepad stage */\n removeAllElements() {\n this.stage.removeAllElements();\n }\n\n /* Initialize gamepad with a predefined layout */\n setGamepadLayout(variant) {\n console.debug(`Setting the gamepad layout to ${variant}, deleting all current elements.`);\n this.removeAllElements();\n switch (variant) {\n case \"1\":\n this.addElements([\n new Square({id: \"filler1\", x: 40, y: 0, alignX: \"left\", alignY: \"center\"}),\n new GamepadButton({id: \"C\", x: 20, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"D\", x: 60, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\", altText: \"▲\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"B\", x: 40, y: 20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n new GamepadButton({id: \"3\", x: 20, y: 0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"3\", altText: \"3\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"4\", x: 60, y: 0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"4\", altText: \"4\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"1\", altText: \"1\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"2\", x: 40, y: 20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"2\", altText: \"2\", altTextAlign: \"top\"}),\n ])\n break;\n case \"2\":\n this.addElements([\n new Square({id: \"filler2\", x: 40, y: 0, alignX: \"right\", alignY: \"center\"}),\n new Square({id: \"filler1\", x: 40, y: 0, alignX: \"left\", alignY: \"center\"}),\n new GamepadButton({id: \"C\", x: 20, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"D\", x: 60, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\", altText: \"▲\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"B\", x: 40, y: 20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n new GamepadButton({id: \"3\", x: 20, y: 0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"3\"}),\n new GamepadButton({id: \"4\", x: 60, y: 0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"4\"}),\n new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"1\"}),\n new GamepadButton({id: \"2\", x: 40, y: 20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"2\"}),\n ])\n break;\n case \"9\":\n this.addElements([\n new GamepadJoystick({id: \"left\", x: 40, y: 0, alignX: \"left\", alignY: \"center\", lockX: true, bindUp: \"ArrowUp\", bindDown: \"ArrowDown\"}),\n new GamepadJoystick({id: \"right\", x: 40, y: 0, alignX: \"right\", alignY: \"center\", lockY: true, bindLeft: \"ArrowLeft\", bindRight: \"ArrowRight\"})\n ]);\n break;\n }\n }\n\n}\n","import { uBitBLE, MESEvents } from \"./uBit\";\nimport { notif_alert, notif_warn, notif_info, notif_success } from './notification';\nimport { Gamepad } from './gamepad';\n\n/* Attempt to install service worker */\nlet sw = \"service-worker.js\";\nif (navigator.serviceWorker) {\n navigator.serviceWorker.register(\n sw, {scope: '/microbit-gamepad/'}\n ).then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) { return; }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n notif_info(\"New content is available, relaunch the app to install it.\");\n } else {\n notif_success(\"Content is cached for offline use.\");\n }\n }\n };\n };\n registration.update();\n }).catch(error => {\n notif_warn(\"Could not install service worker...\");\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\n/* Allow the ignore-landscape-warning button to work */\ndocument.getElementById(\"btn_ignore_landscape_warning\").addEventListener(\"click\", () => {\n document.body.classList.add(\"ignore-landscape-warning\");\n});\n\n/* Show a warning if bluetooth is unavailable in the browser. */\nif (!navigator.bluetooth) {\n //alert(\"Bluetooth not enabled in your browser, this won't work...\");\n console.error(\"You do not have a bluetooth enabled browser, you need to have a bluetooth enabled browser...\");\n notif_alert(\"Your browser does not seem to support bluetooth, try using Google Chrome or Microsoft Edge.\");\n}\n\n/* Define and initialize things */\nlet gamepad = new Gamepad();\nwindow.gamepad = gamepad;\nlet ubit = new uBitBLE();\nwindow.ubit = ubit;\n\n/* Setup storage and picker for the gamepad layout */\ndocument.querySelector(\".settings-dialog #layout\").addEventListener(\"change\", (v) => {\n gamepad.setGamepadLayout(v.target.value);\n localStorage.setItem(\"gamepadLayout\", v.target.value);\n document.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\n});\nif (localStorage.getItem(\"gamepadLayout\") === null) { localStorage.setItem(\"gamepadLayout\", \"1\"); }\ngamepad.setGamepadLayout(localStorage.getItem(\"gamepadLayout\"));\ndocument.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\ndocument.querySelector(\".settings-dialog #layout\").value = localStorage.getItem(\"gamepadLayout\");\n\n/* Setup storage for toggling touches */\ndocument.querySelector(\".settings-dialog #show-touches\").addEventListener(\"change\", (v) => {\n gamepad.stage.showTouches = v.target.checked;\n localStorage.setItem(\"showTouches\", v.target.checked);\n});\nif (localStorage.getItem(\"showTouches\") === null) { localStorage.setItem(\"showTouches\", false); }\ngamepad.stage.showTouches = localStorage.getItem(\"showTouches\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-touches\").checked = localStorage.getItem(\"showTouches\") == \"true\";\n\n/* Setup storage for toggling alt text */\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").addEventListener(\"change\", (v) => {\n gamepad.showAltText = v.target.checked;\n localStorage.setItem(\"showAltText\", v.target.checked);\n});\nif (localStorage.getItem(\"showAltText\") === null) { localStorage.setItem(\"showAltText\", false); }\ngamepad.showAltText = localStorage.getItem(\"showAltText\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").checked = localStorage.getItem(\"showAltText\") == \"true\";\n\n/* Setup storage for toggling vibration/haptic feedback */\ndocument.querySelector(\".settings-dialog #enable-haptic\").addEventListener(\"change\", (v) => {\n gamepad.enableVibration = v.target.checked;\n localStorage.setItem(\"enableHaptic\", v.target.checked);\n});\nif (localStorage.getItem(\"enableHaptic\") === null) { localStorage.setItem(\"enableHaptic\", true); }\ngamepad.enableVibration = localStorage.getItem(\"enableHaptic\") == \"true\";\ndocument.querySelector(\".settings-dialog #enable-haptic\").checked = localStorage.getItem(\"enableHaptic\") == \"true\";\n\n/* Setup storage for toggling debug mode */\ndocument.querySelector(\".settings-dialog #enable-debug\").addEventListener(\"change\", (v) => {\n gamepad.showDebug = v.target.checked;\n if (v.target.checked) {\n document.body.classList.add(\"debug\");\n } else {\n document.body.classList.remove(\"debug\");\n }\n localStorage.setItem(\"enableDebug\", v.target.checked);\n});\nif (localStorage.getItem(\"enableDebug\") === null) { localStorage.setItem(\"enableDebug\", false); }\ngamepad.showDebug = localStorage.getItem(\"enableDebug\") == \"true\";\nif (localStorage.getItem(\"enableDebug\") === \"true\") {\n document.body.classList.add(\"debug\");\n} else {\n document.body.classList.remove(\"debug\");\n}\ndocument.querySelector(\".settings-dialog #enable-debug\").checked = localStorage.getItem(\"enableDebug\") == \"true\";\n\n/* Setup buttons for opening/closing settings panel */\ndocument.querySelector(\"#btn_show_settings\").addEventListener(\"click\", () => {\n document.querySelector(\".settings-dialog\").classList.add(\"shown\");\n});\ndocument.querySelector(\"#btn_hide_settings\").addEventListener(\"click\", () => {\n document.querySelector(\".settings-dialog\").classList.remove(\"shown\");\n});\n\n/* Setup actions for bluetooth connect/disconnect buttons */\ndocument.querySelector(\"#btn_disconnect\").addEventListener(\"click\", () => {\n ubit.disconnect();\n});\ndocument.getElementById(\"btn_connect\").addEventListener(\"click\", async () => {\n if (!navigator.bluetooth) {\n notif_alert(\"You need a bluetooth enabled browser for this app to work, try chrome.\");\n }\n try {\n await ubit.searchDevice();\n } catch (e) {\n notif_alert(`Could not connect to device: ${e}.`);\n }\n});\n\n/* Handle gamepad events */\nlet gamepadState = {};\ngamepad.onTouchEvent(e => {\n /* This is just for the debug data */\n if ([\"touchstart\", \"touchmove\"].includes(e.action)) {\n gamepadState[e.id] = {state: true, ...e};\n }\n if ([\"touchend\"].includes(e.action)) {\n gamepadState[e.id] = {state: false, ...e};\n }\n let debugString = \"\";\n for (const [key, value] of Object.entries(gamepadState)) {\n debugString += `${key}: ${value.state ? 'Pressed' : 'Not pressed'}`;\n if (value.hasOwnProperty(\"x\")) {\n debugString += ` (x: ${value.x}, y: ${value.y})`;\n }\n debugString += `\\n`;\n }\n document.querySelector(\".button-states pre\").innerHTML = debugString;\n});\n\nlet gamepadJoysickState = {};\ngamepad.onTouchEvent(e => {\n const event_type = MESEvents.MES_DPAD_CONTROLLER_ID;\n let event_value = null;\n if (e.action == \"touchstart\") {\n if (e.id == \"A\") {\n event_value = MESEvents.MES_DPAD_BUTTON_A_DOWN;\n } else if (e.id == \"B\") {\n event_value = MESEvents.MES_DPAD_BUTTON_B_DOWN;\n } else if (e.id == \"C\") {\n event_value = MESEvents.MES_DPAD_BUTTON_C_DOWN;\n } else if (e.id == \"D\") {\n event_value = MESEvents.MES_DPAD_BUTTON_D_DOWN;\n } else if (e.id == \"1\") {\n event_value = MESEvents.MES_DPAD_BUTTON_1_DOWN;\n } else if (e.id == \"2\") {\n event_value = MESEvents.MES_DPAD_BUTTON_2_DOWN;\n } else if (e.id == \"3\") {\n event_value = MESEvents.MES_DPAD_BUTTON_3_DOWN;\n } else if (e.id == \"4\") {\n event_value = MESEvents.MES_DPAD_BUTTON_4_DOWN;\n }\n } else if (e.action == \"touchend\") {\n if (e.id == \"A\") {\n event_value = MESEvents.MES_DPAD_BUTTON_A_UP;\n } else if (e.id == \"B\") {\n event_value = MESEvents.MES_DPAD_BUTTON_B_UP;\n } else if (e.id == \"C\") {\n event_value = MESEvents.MES_DPAD_BUTTON_C_UP;\n } else if (e.id == \"D\") {\n event_value = MESEvents.MES_DPAD_BUTTON_D_UP;\n } else if (e.id == \"1\") {\n event_value = MESEvents.MES_DPAD_BUTTON_1_UP;\n } else if (e.id == \"2\") {\n event_value = MESEvents.MES_DPAD_BUTTON_2_UP;\n } else if (e.id == \"3\") {\n event_value = MESEvents.MES_DPAD_BUTTON_3_UP;\n } else if (e.id == \"4\") {\n event_value = MESEvents.MES_DPAD_BUTTON_4_UP;\n }\n }\n if ((ubit.isConnected()) && (event_value != null)) {\n ubit.sendEvent(event_type, event_value);\n }\n\n if (e.id == \"right\") {\n gamepadJoysickState.x = e.x;\n }\n if (e.id == \"left\") {\n gamepadJoysickState.y = e.y;\n }\n});\n\n/* Setup handlers for ubit (bluetooth) events */\nubit.onConnect(() => {\n document.body.classList.add(\"connected\");\n});\n\nubit.onDisconnect(() => {\n document.body.classList.remove(\"connected\");\n});\n\n\nlet i = 0;\nsetInterval(() => {\n if ((i==0) && gamepadJoysickState.hasOwnProperty(\"x\")) {\n ubit.sendUart(`x:${gamepadJoysickState.x}\\n`);\n }\n if ((i==1) && gamepadJoysickState.hasOwnProperty(\"y\")) {\n ubit.sendUart(`y:${gamepadJoysickState.y}\\n`);\n }\n i++;\n if (i>1) { i = 0; }\n}, 20);\n"]} \ No newline at end of file
diff --git a/main.fa7f93a2.js.map b/main.fa7f93a2.js.map
deleted file mode 100644
index f5749f1..0000000
--- a/main.fa7f93a2.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["js/notification.js","js/uBit.js","js/gamepad.js","js/main.js"],"names":["waiting_timer","undefined","notif_queue","notif","notif_c","notification_area","document","querySelector","screen","availHeight","availWidth","body","classList","contains","setInterval","clearInterval","pop","push","notif_elem","createElement","className","appendChild","add","setTimeout","remove","style","opacity","removeChild","length","notif_alert","alert_str","div","text","innerHTML","icon","notif_warn","notif_info","info_str","notif_success","success_str","UART_SERVICE_UUID","UART_TX_CHARACTERISTIC_UUID","UART_RX_CHARACTERISTIC_UUID","EVENT_SERVICE_UUID","UBIT_REQUIREMENT_CHARACTERISTIC_UUID","CLIENTREQUIREMENTS_CHARACTERISTIC_UUID","UBITEVENT_CHARACTERISTIC_UUID","CLIENTEVENT_CHARACTERISTIC_UUID","MESEvents","MES_DPAD_CONTROLLER_ID","MES_DPAD_BUTTON_A_DOWN","MES_DPAD_BUTTON_A_UP","MES_DPAD_BUTTON_B_DOWN","MES_DPAD_BUTTON_B_UP","MES_DPAD_BUTTON_C_DOWN","MES_DPAD_BUTTON_C_UP","MES_DPAD_BUTTON_D_DOWN","MES_DPAD_BUTTON_D_UP","MES_DPAD_BUTTON_1_DOWN","MES_DPAD_BUTTON_1_UP","MES_DPAD_BUTTON_2_DOWN","MES_DPAD_BUTTON_2_UP","MES_DPAD_BUTTON_3_DOWN","MES_DPAD_BUTTON_3_UP","MES_DPAD_BUTTON_4_DOWN","MES_DPAD_BUTTON_4_UP","BluetoothService","gattEventQueue","EventService","service","ubitEvent","console","debug","event_type","event_value","writeValue","Uint16Array","gattServer","getPrimaryService","SERVICE_UUID","getCharacteristic","ubitEventCharacteristic","UartService","uartTx","uartRx","str","isVolatile","encoder","TextEncoder","encode","error","callback","handlers","uartTxCharacteristic","startNotifications","addEventListener","e","uartRxCharacteristic","i","uBitBLE","onConnectCallback","onDisconnectCallback","pushInterval","doGattEvent","callbackFunction","device","gatt","connected","isConnected","disconnect","navigator","bluetooth","requestDevice","filters","namePrefix","optionalServices","log","name","id","connect","server","getService","eventService","eventServiceAvailable","uartService","uartTxHandlers","onUartTx","uartServiceAvailable","sendEvent","sendUart","getSupportedProperties","characteristic","supportedProperties","p","properties","toUpperCase","join","eventByteArrayToString","event","receivedData","target","value","byteLength","getUint8","String","fromCharCode","apply","CanvasStage","node","window","devicePixelRatio","canvas","setAttribute","resize","drawElements","getContext","getComputedStyle","getPropertyValue","slice","x","y","TouchElement","collides","clearRect","draw","showTouches","drawTouches","colors","Object","entries","touches","identifier","touch","beginPath","arc","Math","PI","fillStyle","fill","lineWidth","strokeStyle","stroke","element","init","splice","Element","opts","gamepad","_opts","assign","alignX","alignY","ctx","width","height","getScaleY","isInside","isPointInPath","path","Square","Path2D","w","rect","getX","getY","doCallbacks","includes","type","touchCount","eState","isActive","handleTouchEventCallbacks","createTouchEventObject","action","GamepadButton","keyboardButton","altText","altTextAlign","shape","registerKeybinding","s","floor","toString","font","textBaseline","textAlign","fillText","showAltText","ax","ay","GamepadJoystick","lockX","lockY","autoCenter","bindUp","bindLeft","bindRight","bindDown","key","hasOwnProperty","round","mouseX","cR","mouseY","max","cX","stage","screenToCanvasX","min","abs","sign","isKeyPressed","cY","screenToCanvasY","Gamepad","addEventListeners","ev","handleKeyEvent","handleTouchEvent","handleMouseEvent","binding","keyCode","pressed","gtEvent","touchId","setActive","debugTouches","processGamepadTouchEvent","clientX","clientY","preventDefault","typedict","changedTouches","getTarget","showDebug","t","enableVibration","vibrate","elements","addElement","elementIds","removeElementById","removeAllElements","variant","addElements","sw","serviceWorker","register","scope","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","update","catch","getElementById","ubit","v","setGamepadLayout","localStorage","setItem","getItem","checked","searchDevice","gamepadState","onTouchEvent","debugString","onConnect","onDisconnect"],"mappings":"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","file":"main.fa7f93a2.js","sourceRoot":"../src","sourcesContent":["let waiting_timer = undefined;\nlet notif_queue = [];\n\nfunction notif(notif_c) {\n let notification_area = document.querySelector(\".statusline .notification-area\");\n\n if ((notification_area.querySelector(\".notification\") === null) && (waiting_timer === undefined)) {\n // This is just so no notifications will be played and disappears while the full screen landscape warning is in the way.\n if( (screen.availHeight > screen.availWidth) && (!document.body.classList.contains(\"ignore-landscape-warning\"))){\n waiting_timer = setInterval(() => {\n if( (screen.availHeight < screen.availWidth) || (document.body.classList.contains(\"ignore-landscape-warning\"))){\n clearInterval(waiting_timer);\n waiting_timer = undefined;\n notif(notif_queue.pop());\n }\n }, 1000);\n notif_queue.push(notif_c);\n return;\n }\n\n let notif_elem = document.createElement(\"div\");\n notif_elem.className = \"notification\";\n notif_elem.appendChild(notif_c[0]);\n notif_elem.appendChild(notif_c[1]);\n\n notification_area.appendChild(notif_elem);\n\n notification_area.classList.add(\"show\");\n setTimeout(() => {\n notification_area.classList.remove(\"show\");\n notif_elem.querySelector(\"p\").style.opacity = \"0\";\n setTimeout(() => {\n notification_area.removeChild(notif_elem);\n if (notif_queue.length > 0) {\n notif(notif_queue.pop());\n }\n }, 1000);\n }, 10000);\n } else {\n notif_queue.push(notif_c);\n }\n}\n\nexport function notif_alert(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"alert fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_warn(alert_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = alert_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"warning fas fa-exclamation-triangle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_info(info_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = info_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"info fas fa-info-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n\nexport function notif_success(success_str) {\n let div = document.createElement(\"div\");\n div.className = \"notification-content\";\n\n let text = document.createElement(\"p\");\n text.innerHTML = success_str;\n div.appendChild(text);\n\n let icon = document.createElement(\"i\");\n icon.className = \"success fas fa-check-circle\";\n div.appendChild(icon);\n\n notif([icon, div]);\n}\n","import { notif_alert, notif_warn, notif_info, notif_success } from './notification';\n/*\n * This code is written with a lot of help from these resources:\n * https://github.com/antefact/microBit.js/blob/master/src/microBit.js\n * https://gist.github.com/kotobuki/7c67f8b9361e08930da1a5cfcfb0653f\n * https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html\n */\nconst UART_SERVICE_UUID = \"6e400001-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for reading UART data from micro bit */\nconst UART_TX_CHARACTERISTIC_UUID = \"6e400002-b5a3-f393-e0a9-e50e24dcca9e\";\n/* Used for writing UART data to micro bit */\nconst UART_RX_CHARACTERISTIC_UUID = \"6e400003-b5a3-f393-e0a9-e50e24dcca9e\";\n/* The event service characteristic (which extends the uBit message bus over bluetooth) */\nconst EVENT_SERVICE_UUID = \"e95d93af-251d-470a-a062-fa1922dfa9a8\";\n/* This should be read once connected, as the ubit will advertise which events it wants to subscribe to */\nconst UBIT_REQUIREMENT_CHARACTERISTIC_UUID = \"e95db84c-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic where we should write the events we wish to be informed of from the microbit */\nconst CLIENTREQUIREMENTS_CHARACTERISTIC_UUID = \"e95d23c4-251d-470a-a062-fa1922dfa9a8\"\n/* The characteristic used for reading EventService messages */\nconst UBITEVENT_CHARACTERISTIC_UUID = \"e95d9775-251d-470a-a062-fa1922dfa9a8\";\n/* The characteristic used for writing EventService messages */\nconst CLIENTEVENT_CHARACTERISTIC_UUID = \"e95d5404-251d-470a-a062-fa1922dfa9a8\";\n\n/* This table is retrieved from this site:\n * https://github.com/lancaster-university/microbit-dal/blob/master/inc/bluetooth/MESEvents.h */\nexport const MESEvents = {\n MES_DPAD_CONTROLLER_ID: 1104,\n MES_DPAD_BUTTON_A_DOWN: 1,\n MES_DPAD_BUTTON_A_UP: 2,\n MES_DPAD_BUTTON_B_DOWN: 3,\n MES_DPAD_BUTTON_B_UP: 4,\n MES_DPAD_BUTTON_C_DOWN: 5,\n MES_DPAD_BUTTON_C_UP: 6,\n MES_DPAD_BUTTON_D_DOWN: 7,\n MES_DPAD_BUTTON_D_UP: 8,\n MES_DPAD_BUTTON_1_DOWN: 9,\n MES_DPAD_BUTTON_1_UP: 10,\n MES_DPAD_BUTTON_2_DOWN: 11,\n MES_DPAD_BUTTON_2_UP: 12,\n MES_DPAD_BUTTON_3_DOWN: 13,\n MES_DPAD_BUTTON_3_UP: 14,\n MES_DPAD_BUTTON_4_DOWN: 15,\n MES_DPAD_BUTTON_4_UP: 16\n}\n\nclass BluetoothService {\n static gattEventQueue = [];\n SERVICE_UUID = null;\n\n static doGattEvent() {\n if (BluetoothService.gattEventQueue <= 0) { return; }\n BluetoothService.gattEventQueue.pop()();\n }\n}\n\nclass EventService extends BluetoothService {\n /* Implements methods for interacting with microbit EventService */\n static SERVICE_UUID = EVENT_SERVICE_UUID;\n service;\n\n constructor(service, ubitEvent) {\n super();\n this.service = service;\n this.ubitEvent = ubitEvent;\n console.debug(\"EventService initialized.\");\n }\n\n sendEvent(event_type, event_value) {\n BluetoothService.gattEventQueue.push(() => {\n this.ubitEvent.writeValue(\n new Uint16Array([event_type, event_value])\n );\n });\n }\n\n static async getService(gattServer) {\n console.debug(\"Getting EventService\");\n let service = await gattServer.getPrimaryService(EventService.SERVICE_UUID);\n console.debug(\"Getting ClientEvent characteristic\");\n let ubitEventCharacteristic = await service.getCharacteristic(CLIENTEVENT_CHARACTERISTIC_UUID);\n return new EventService(service, ubitEventCharacteristic);\n }\n}\n\nclass UartService extends BluetoothService {\n /* Implements methods for interacting with microbit UartService */\n static SERVICE_UUID = UART_SERVICE_UUID;\n handlers = [];\n\n constructor(service, uartTx, uartRx) {\n super();\n this.service = service;\n this.uartTx = uartTx;\n this.uartRx = uartRx;\n console.debug(\"UartService initialized.\");\n }\n\n async sendUart(str, isVolatile=true) {\n let encoder = new TextEncoder();\n try {\n await this.uartRx.writeValue(\n encoder.encode(str)\n )\n } catch (e) {\n if (!isVolatile) {\n console.error(e);\n }\n }\n }\n\n #onUartTx(e) {\n for (let i = 0; i < this.handlers.length; i++) {\n this.handlers[i]();\n }\n }\n\n onUartTx(callback) {\n this.handlers.push(callback);\n }\n\n static async getService(gattServer) {\n console.debug(\"Getting UartService\");\n let service = await gattServer.getPrimaryService(UartService.SERVICE_UUID);\n\n console.debug(\"Getting Uart characteristics\");\n \n let uartTxCharacteristic = await service.getCharacteristic(UART_TX_CHARACTERISTIC_UUID);\n await uartTxCharacteristic.startNotifications();\n await uartTxCharacteristic.addEventListener(\"characteristicvaluechanged\", (e) => {\n this.#onUartTx(e);\n });\n\n let uartRxCharacteristic = await service.getCharacteristic(UART_RX_CHARACTERISTIC_UUID);\n\n return new UartService(service, uartTxCharacteristic, uartRxCharacteristic);\n }\n\n\n}\n\nexport class uBitBLE {\n eventService;\n eventServiceAvailable = false;\n uartService;\n uartServiceAvailable = false;\n uartTxHandlers = [];\n device;\n\n constructor() {\n this.onConnectCallback = [];\n this.onDisconnectCallback = [];\n this.pushInterval = setInterval(BluetoothService.doGattEvent, 40);\n }\n\n #onDisconnect(e) {\n console.debug(\"Device disconnected\", e);\n for (let i = 0; i < this.onDisconnectCallback.length; i++) {\n this.onDisconnectCallback[i]();\n }\n }\n\n #onConnect() {\n console.debug(\"Device connected\");\n for (let i = 0; i < this.onConnectCallback.length; i++) {\n this.onConnectCallback[i]();\n }\n }\n\n onConnect(callbackFunction) {\n this.onConnectCallback.push(callbackFunction);\n }\n\n onDisconnect(callbackFunction) {\n this.onDisconnectCallback.push(callbackFunction);\n }\n\n isConnected() {\n if (this.device) {\n return this.device.gatt.connected;\n } else {\n return false;\n }\n }\n\n disconnect() {\n if (this.isConnected()) {\n this.device.gatt.disconnect();\n }\n }\n\n async searchDevice() {\n this.device = await navigator.bluetooth.requestDevice({\n filters: [{namePrefix: \"BBC micro:bit\"}],\n optionalServices: [EVENT_SERVICE_UUID, UART_SERVICE_UUID]\n });\n this.device.addEventListener('gattserverdisconnected', (e) => this.#onDisconnect(e));\n console.log(\"Connected to new device\", this.device.name, this.device.id);\n\n console.debug(\"Connection to GATT server...\");\n const server = await this.device.gatt.connect()\n\n this.#onConnect();\n\n console.debug(\"Getting services...\");\n\n try {\n const eventService = await EventService.getService(server);\n this.eventService = eventService;\n this.eventServiceAvailable = true;\n } catch (e) {\n this.eventServiceAvailable = false;\n console.debug(\"Could not get EventService\");\n notif_warn(\"Connected device's firmware does not support bluetooth EventService, gamepad will not work.\");\n }\n\n try {\n const uartService = await UartService.getService(server);\n this.uartService = uartService;\n for (let i = 0; i < this.uartTxHandlers.length; i++) {\n this.uartService.onUartTx(this.uartTxHandlers[i]);\n }\n this.uartServiceAvailable = true;\n } catch (e) {\n this.uartServiceAvailable = false;\n console.debug(\"Could not get UartService\", e)\n notif_info(\"Connected device's firmware does not support bluetooth UartService, joysticks won't work.\");\n }\n }\n\n sendEvent(event_type, event_value) {\n if (this.isConnected() && this.eventServiceAvailable) {\n this.eventService.sendEvent(event_type, event_value);\n } else {\n console.debug(`Could not send event {${event_type}, ${event_value}}, because: ${this.isConnected() ? \"Device does not have EventService characteristic\" : \"No device connected\"}.`);\n }\n }\n\n sendUart(str) {\n if (this.isConnected() && this.uartServiceAvailable) {\n this.uartService.sendUart(str);\n } else {\n console.debug(`Could not send uart data, because: ${this.isConnected() ? \"Device does not have UartService characteristic\" : \"No device connected\"}.`);\n }\n }\n\n onUartTx(callback) {\n this.uartTxHandlers.push(callback);\n if (this.uartServiceAvailable) {\n this.uartService.onUartTx(callback);\n }\n }\n\n}\n\nfunction getSupportedProperties(characteristic) {\n let supportedProperties = [];\n for (const p in characteristic.properties) {\n if (characteristic.properties[p] === true) {\n supportedProperties.push(p.toUpperCase());\n }\n }\n return '[' + supportedProperties.join(', ') + ']';\n}\n\nfunction eventByteArrayToString(event) {\n let receivedData = [];\n for (var i = 0; i < event.target.value.byteLength; i++) {\n receivedData[i] = event.target.value.getUint8(i);\n }\n return String.fromCharCode.apply(null, receivedData);\n}\n","class CanvasStage {\n canvas;\n #dpi = window.devicePixelRatio;\n #width;\n #height;\n #ctx;\n #elements = [];\n touches = {};\n showTouches = false;\n\n constructor(id, node) {\n this.canvas = document.createElement(\"canvas\");\n this.canvas.setAttribute(\"id\", id);\n node.appendChild(this.canvas);\n\n addEventListener(\"resize\", () => this.resize());\n this.resize();\n\n console.debug(\"Created canvas\", this.canvas);\n\n setInterval(() => {\n this.drawElements();\n }, 10);\n }\n\n /* Resizes the canvas to be the correct size for the current screen */\n resize() {\n this.#ctx = this.canvas.getContext(\"2d\");\n this.#height = +getComputedStyle(this.canvas).getPropertyValue(\"height\").slice(0, -2);\n this.#width = +getComputedStyle(this.canvas).getPropertyValue(\"width\").slice(0, -2);\n this.canvas.setAttribute('height', this.#height * this.#dpi);\n this.canvas.setAttribute('width', this.#width * this.#dpi);\n }\n\n /* Translate a screen x coordinate to a canvas x coordinate */\n screenToCanvasX(x) { return x * this.#dpi; }\n\n /* Translate a screen y coordinate to a canvas y coordinate */\n screenToCanvasY(y) { return y * this.#dpi; }\n\n /* Get target at position, i.e. the element that intersects said position */\n getTarget(x, y) {\n x *= this.#dpi;\n y *= this.#dpi;\n for (let i = 0; i < this.#elements.length; i++) {\n if ((this.#elements[i] instanceof TouchElement)\n && (this.#elements[i].collides(this.#ctx, x, y))) {\n return this.#elements[i];\n }\n }\n }\n\n /* Redraws all elements of the stage on the screen. */\n drawElements() {\n this.#ctx.clearRect(0, 0, this.#width * this.#dpi, this.#height * this.#dpi);\n for (let i = 0; i < this.#elements.length; i++) {\n this.#elements[i].draw(this.#ctx);\n }\n if (this.showTouches) {\n this.drawTouches();\n }\n }\n\n /* Draws all touches on the screen, used to debug */\n drawTouches(e) {\n const colors = [\"200, 0, 0\", \"0, 200, 0\", \"0, 0, 200\", \"200, 200, 0\", \"200, 200, 200\"]\n for (const [identifier, touch] of Object.entries(this.touches)) {\n this.#ctx.beginPath();\n this.#ctx.arc(touch.x * this.#dpi, touch.y * this.#dpi, 20 * this.#dpi, 0, 2*Math.PI, true);\n this.#ctx.fillStyle = `rgba(${colors[identifier]}, 0.2)`;\n this.#ctx.fill();\n\n this.#ctx.lineWidth = 2.0;\n this.#ctx.strokeStyle = `rgba(${colors[identifier]}, 0.8)`;\n this.#ctx.stroke();\n }\n }\n\n /* Add a element to the stage */\n addElement(element) {\n this.#elements.push(element);\n element.init();\n }\n\n /* Remove a element from the stage by id */\n removeElementById(id) {\n for (let i = 0; i < this.#elements.length; i++) {\n if (id === this.#elements[i].id) {\n this.#elements.splice(i, 1);\n return;\n }\n }\n }\n\n /* Wipe all elements from the stage */\n removeAllElements() {\n this.#elements.splice(0, this.#elements.length);\n }\n\n}\n\nclass Element {\n gamepad;\n id;\n x;\n y;\n alignX;\n alignY;\n path;\n isInside;\n isActive;\n type = \"Element\";\n \n constructor(opts, gamepad) {\n let _opts = Object.assign({\n id: null,\n x: 0,\n y: 0,\n alignX: null,\n alignY: null\n }, opts);\n this.id = _opts.id;\n this.x = _opts.x;\n this.y = _opts.y;\n this.alignX = _opts.alignX;\n this.alignY = _opts.alignY;\n this.gamepad = gamepad;\n }\n\n /* Used for initializing the element onto the stage */\n init() {}\n\n /* Get the x-axis scaling factor (currently unused, only the y scaling factor is in use) */\n getScaleX(ctx) { \n return ctx.canvas.width / 100;\n }\n\n /* Get the y-axis scaling factor */\n getScaleY(ctx) { \n return ctx.canvas.height / 100;\n }\n\n /* Get the canvas x position of this element, adjusted from the virtual canvas coordinates */\n getX(ctx) {\n let x = this.x * this.getScaleY(ctx);\n if (this.alignX === \"center\") {\n x = (ctx.canvas.width / 2) + x;\n }\n if (this.alignX === \"right\") {\n x = ctx.canvas.width - x;\n }\n return x;\n }\n\n /* Get the canvas y position of this element, adjusted from the virtual canvas coordinates */\n getY(ctx) {\n let y = this.y * this.getScaleY(ctx);\n if (this.alignY === \"center\") {\n y = (ctx.canvas.height / 2) + y;\n }\n if (this.alignY === \"bottom\") {\n y = ctx.canvas.height - y;\n }\n return y;\n }\n\n /* Used to draw the element onto a canvas context */\n draw(ctx) {}\n\n /* Used to check wether the coordinates is inside this element */\n collides(ctx, x, y) {\n this.isInside = ctx.isPointInPath(this.path, x, y);\n return this.isInside;\n }\n\n}\n\nexport class Square extends Element {\n draw(ctx) {\n this.path = new Path2D();\n let w = this.getScaleY(ctx) * 20;\n this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n ctx.fill(this.path);\n }\n}\n\nclass TouchElement extends Element {\n type = \"TouchElement\";\n touchCount = 0;\n\n setActive(e, doCallbacks = true) {\n if ([\"end\", \"cancel\"].includes(e.type)) { this.touchCount--; }\n let eState = e.type == \"start\";\n if ((eState !== this.isActive) && (this.touchCount == 0)) {\n this.isActive = eState;\n if (doCallbacks) {\n this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(\n this.isActive ? \"touchstart\" : \"touchend\"\n ));\n }\n }\n if (e.type == \"start\") { this.touchCount++; }\n }\n\n createTouchEventObject(action) {\n return {\n id: this.id,\n action: action,\n type: this.type\n }\n }\n\n}\n\nexport class GamepadButton extends TouchElement {\n shape;\n altText;\n altTextAlign;\n type = \"GamepadButton\";\n\n constructor(opts) {\n let _opts = Object.assign({\n keyboardButton: null,\n altText: null,\n altTextAlign: \"left\",\n shape: \"round\"\n }, opts);\n super(opts);\n this.keyboardButton = _opts.keyboardButton;\n this.shape = _opts.shape;\n this.altText = _opts.altText;\n this.altTextAlign = _opts.altTextAlign;\n }\n\n init() {\n if (this.keyboardButton !== null) {\n this.gamepad.registerKeybinding(this.keyboardButton, this);\n }\n }\n\n draw(ctx) {\n this.path = new Path2D();\n if (this.shape === \"round\") {\n this.path.arc(this.getX(ctx), this.getY(ctx), this.getScaleY(ctx) * 10, 0, 4*Math.PI, true);\n } else if (this.shape === \"square\") {\n let w = this.getScaleY(ctx) * 20;\n this.path.rect(this.getX(ctx) - (w/2), this.getY(ctx) - (w/2), w, w);\n }\n if (this.isActive) {\n ctx.fillStyle = `rgba(80, 80, 80, 1)`;\n } else {\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n }\n ctx.fill(this.path);\n\n let s = `${Math.floor((this.getScaleY(ctx)*8).toString())}px 'Press Start 2P'`;\n ctx.font = s;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n ctx.fillStyle = `rgba(255, 255, 255, 1)`;\n ctx.fillText(this.id, this.getX(ctx), this.getY(ctx));\n\n if ((this.altText !== null) && (this.gamepad.showAltText)) {\n ctx.beginPath();\n ctx.font = `${Math.floor((this.getScaleY(ctx)*3).toString())}px 'Press Start 2P'`;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n ctx.fillStyle = `rgba(150, 150, 150, 1)`;\n let ax = this.getX(ctx);\n let ay = this.getY(ctx);\n switch (this.altTextAlign) {\n case \"left\":\n ax -= (this.getScaleY(ctx) * 13);\n break;\n case \"right\":\n ax += (this.getScaleY(ctx) * 13);\n break;\n case \"top\":\n ay -= (this.getScaleY(ctx) * 13);\n break;\n case \"bottom\":\n ay += (this.getScaleY(ctx) * 13);\n break;\n }\n ctx.fillText(this.altText, ax, ay);\n }\n }\n\n}\n\nexport class GamepadJoystick extends TouchElement {\n type = \"GamepadJoystick\";\n mouseX = 0;\n mouseY = 0;\n cR = 0;\n cX = 0;\n cY = 0;\n\n #lockX;\n #lockY;\n\n #pressedKeys = {};\n\n constructor(opts) {\n let _opts = Object.assign({\n lockX: false,\n lockY: false,\n autoCenter: true,\n bindUp: null,\n bindLeft: null,\n bindRight: null,\n bindDown: null\n }, opts);\n super(opts);\n this.#lockX = _opts.lockX;\n this.#lockY = _opts.lockY;\n this.bindUp = _opts.bindUp;\n this.bindLeft = _opts.bindLeft;\n this.bindRight = _opts.bindRight;\n this.bindDown = _opts.bindDown;\n }\n\n init() {\n if (this.bindUp !== null) {\n this.gamepad.registerKeybinding(this.bindUp, this);\n }\n if (this.bindLeft !== null) {\n this.gamepad.registerKeybinding(this.bindLeft, this);\n }\n if (this.bindRight !== null) {\n this.gamepad.registerKeybinding(this.bindRight, this);\n }\n if (this.bindDown !== null) {\n this.gamepad.registerKeybinding(this.bindDown, this);\n }\n }\n\n isKeyPressed(key) {\n return ((key !== null)\n && (this.#pressedKeys.hasOwnProperty(key))\n && (this.#pressedKeys[key] > 0));\n }\n\n createTouchEventObject(action) {\n return {\n id: this.id,\n action: action,\n type: this.type,\n x: Math.round((this.mouseX / this.cR) * 100),\n y: Math.round((this.mouseY / this.cR) * 100)\n }\n }\n\n setActive(e) {\n super.setActive(e, false);\n if (e.hasOwnProperty(\"key\")) {\n if (!this.#pressedKeys.hasOwnProperty(e.key)) {\n this.#pressedKeys[e.key] = 0;\n }\n if ([\"start\"].includes(e.type)) {\n this.#pressedKeys[e.key]++;\n }\n if ([\"end\", \"cancel\"].includes(e.type)) {\n this.#pressedKeys[e.key]--;\n }\n }\n\n let max = this.cR\n if (!this.#lockX) {\n if (e.hasOwnProperty(\"x\")) {\n this.mouseX = this.cX - this.gamepad.stage.screenToCanvasX(e.x);\n this.mouseX = Math.min(Math.abs(this.mouseX), max) * Math.sign(this.mouseX); \n this.mouseX *= -1;\n }\n if (this.isKeyPressed(this.bindLeft)) { this.mouseX = -max; } \n if (this.isKeyPressed(this.bindRight)) { this.mouseX = max; }\n if (this.isKeyPressed(this.bindLeft) && this.isKeyPressed(this.bindRight)) { this.mouseX = 0; }\n if (!this.isActive) { this.mouseX = 0; }\n }\n if (!this.#lockY) {\n if (e.hasOwnProperty(\"y\")) {\n this.mouseY = this.cY - this.gamepad.stage.screenToCanvasY(e.y);\n this.mouseY = Math.min(Math.abs(this.mouseY), max) * Math.sign(this.mouseY); \n } \n if (this.isKeyPressed(this.bindUp)) { this.mouseY = max; } \n if (this.isKeyPressed(this.bindDown)) { this.mouseY = -max; }\n if (this.isKeyPressed(this.bindUp) && this.isKeyPressed(this.bindDown)) { this.mouseY = 0; }\n if (!this.isActive) { this.mouseY = 0; }\n }\n\n let action = \"touchmove\";\n if (this.isActive && (this.touchCount == 1) && (e.type === \"start\")) {\n action = \"touchstart\";\n }\n if (!this.isActive) {\n action = \"touchend\";\n }\n this.gamepad.handleTouchEventCallbacks(this.createTouchEventObject(action));\n }\n\n draw(ctx) {\n this.cX = this.getX(ctx);\n this.cY = this.getY(ctx);\n this.cR = this.getScaleY(ctx) * 25;\n\n this.path = new Path2D();\n this.path.arc(this.cX, this.cY, this.cR, 0, 4*Math.PI, true);\n if (this.isActive) {\n ctx.fillStyle = `rgba(85, 85, 85, 0.8)`;\n } else {\n ctx.fillStyle = `rgba(100, 100, 100, 0.8)`;\n }\n ctx.fill(this.path);\n\n ctx.beginPath();\n ctx.arc(this.cX + this.mouseX, this.cY - this.mouseY, this.getScaleY(ctx) * 15, 0, 4*Math.PI, true);\n ctx.fillStyle = `rgba(130, 130, 130, 1)`;\n ctx.fill();\n\n }\n\n}\n\nexport class Gamepad {\n stage;\n #width;\n #height;\n\n #touches = {};\n #keybindings = {};\n #keystates = {};\n #touchEventCallbacks = [];\n\n showDebug = false;\n showAltText = true;\n enableVibration = true;\n\n constructor() {\n this.stage = new CanvasStage(\"GamePad\", document.querySelector(\".gamepad-wrapper\"));\n this.addEventListeners();\n }\n\n addEventListeners() {\n let ev = [\"keydown\", \"keyup\"];\n for(var e in ev) {\n document.addEventListener(ev[e], (e) => this.handleKeyEvent(e), false);\n }\n ev = [\"touchstart\", \"touchend\", \"touchcancel\", \"touchmove\"];\n for(var e in ev) {\n this.stage.canvas.addEventListener(ev[e], (e) => this.handleTouchEvent(e), false);\n }\n ev = [\"mousedown\", \"mouseup\", \"mousemove\"];\n for(var e in ev) {\n this.stage.canvas.addEventListener(ev[e], (e) => this.handleMouseEvent(e), false);\n }\n }\n\n /* Used by stage elements to register themselves with some keybinding */\n registerKeybinding(binding, element) {\n this.#keybindings[binding] = element;\n }\n\n /* Event handler for keyboard events */\n handleKeyEvent(e) {\n const typedict = {\"keydown\": \"start\", \"keyup\": \"end\"}\n if (!this.#keystates.hasOwnProperty(e.keyCode)) {\n this.#keystates[e.keyCode] = {pressed: false};\n }\n if (this.#keybindings.hasOwnProperty(e.key)) {\n let id = `Key ${e.key}`\n let target = this.#keybindings[e.key];\n let gtEvent = {\n touchId: id,\n key: e.key,\n type: typedict[e.type]\n };\n switch (e.type) {\n case \"keydown\":\n if (this.#keystates[e.keyCode].pressed) { return; }\n this.#keystates[e.keyCode].pressed = true;\n\n this.#touches[id] = {};\n this.#touches[id].target = target;\n if (this.#touches[id].hasOwnProperty(\"target\")\n && this.#touches[id].target != null) {\n this.#touches[id].target.setActive(gtEvent);\n }\n break;\n case \"keyup\":\n if (!this.#keystates[e.keyCode].pressed) { return; }\n this.#keystates[e.keyCode].pressed = false;\n\n if (this.#touches[id].hasOwnProperty(\"target\")\n && this.#touches[id].target != null) {\n this.#touches[id].target.setActive(gtEvent);\n }\n delete this.#touches[id];\n break;\n }\n }\n this.stage.touches = this.#touches;\n this.debugTouches();\n }\n\n /* Event handler for mouse events, will just translate the event to a more common form\n * before further processing. */\n handleMouseEvent(e) {\n const typedict = {\"mousedown\": \"start\", \"mouseup\": \"end\", \"mousemove\": \"move\"}\n this.processGamepadTouchEvent({\n x: e.clientX,\n y: e.clientY,\n touchId: \"mouse\",\n type: typedict[e.type]\n });\n }\n\n /* Event handler for touch events, will just translate the event to a more common form\n * before further processing. */\n handleTouchEvent(e) {\n e.preventDefault();\n const typedict = {\"touchstart\": \"start\", \"touchend\": \"end\", \"touchcancel\": \"end\", \"touchmove\": \"move\"}\n for (let i = 0; i < e.changedTouches.length; i++) {\n let touch = e.changedTouches[i];\n this.processGamepadTouchEvent({\n x: touch.clientX,\n y: touch.clientY,\n touchId: touch.identifier,\n type: typedict[e.type]\n });\n }\n }\n\n /* Event handler for processing standarized touch/mouse events. */\n processGamepadTouchEvent(gtEvent) {\n let target = this.stage.getTarget(gtEvent.x, gtEvent.y)\n switch (gtEvent.type) {\n case \"start\":\n this.#touches[gtEvent.touchId] = {};\n this.#touches[gtEvent.touchId].target = target;\n case \"move\":\n if (this.#touches.hasOwnProperty(gtEvent.touchId)) {\n this.#touches[gtEvent.touchId].x = gtEvent.x;\n this.#touches[gtEvent.touchId].y = gtEvent.y;\n\n if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n && this.#touches[gtEvent.touchId].target != null) {\n this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n }\n }\n break;\n\n case \"end\":\n case \"cancel\":\n if (this.#touches[gtEvent.touchId].hasOwnProperty(\"target\")\n && this.#touches[gtEvent.touchId].target != null) {\n this.#touches[gtEvent.touchId].target.setActive(gtEvent);\n }\n delete this.#touches[gtEvent.touchId];\n break;\n\n default:\n console.log(\"Unknown touch event\", gtEvent.type);\n }\n this.stage.touches = this.#touches;\n this.debugTouches();\n }\n\n /* Update the debug text with all current touches */\n debugTouches() {\n let s = \"\";\n if (this.showDebug) {\n for (const [i, t] of Object.entries(this.#touches)) {\n s += `[${i}] `\n if (t.hasOwnProperty(\"x\")) {\n s += `x: ${Math.round(t.x, 2)}, y: ${Math.round(t.y)},`\n }\n s += `target: ${t.target ? t.target.id : null}\\n`;\n }\n }\n document.querySelector(\".gamepad-touches\").innerHTML = s;\n }\n\n /* Used by elements to process callbacks on actions to outside the gamepad */\n handleTouchEventCallbacks(e) {\n if (this.enableVibration && [\"touchstart\", \"touchend\"].includes(e.action)) {\n try {\n window.navigator.vibrate(5);\n } catch (e) {\n console.error(e);\n }\n }\n for (let i = 0; i < this.#touchEventCallbacks.length; i++) {\n this.#touchEventCallbacks[i](e);\n }\n }\n\n /* Register a method as a callback for gamepad touch events */\n onTouchEvent(callback) {\n this.#touchEventCallbacks.push(callback);\n }\n\n /* Add a list of elements to the gamepad stage */\n addElements(elements) {\n for (let i = 0; i < elements.length; i++) {\n elements[i].gamepad = this;\n this.stage.addElement(elements[i]);\n }\n }\n\n /* Remove a list of elements from the gamepad stage by id */\n removeElementsById(elementIds) {\n for (let i = 0; i < elementIds.length; i++) {\n this.stage.removeElementById(elementIds[i]);\n }\n }\n\n /* Remove all elements from the gamepad stage */\n removeAllElements() {\n this.stage.removeAllElements();\n }\n\n /* Initialize gamepad with a predefined layout */\n setGamepadLayout(variant) {\n console.debug(`Setting the gamepad layout to ${variant}, deleting all current elements.`);\n this.removeAllElements();\n switch (variant) {\n case \"1\":\n this.addElements([\n new Square({id: \"filler1\", x: 40, y: 0, alignX: \"left\", alignY: \"center\"}),\n new GamepadButton({id: \"C\", x: 20, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"D\", x: 60, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\", altText: \"▲\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"B\", x: 40, y: 20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n new GamepadButton({id: \"3\", x: 20, y: 0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"3\", altText: \"3\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"4\", x: 60, y: 0, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"4\", altText: \"4\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"1\", altText: \"1\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"2\", x: 40, y: 20, alignX: \"right\", alignY: \"center\", shape: \"round\", keyboardButton: \"2\", altText: \"2\", altTextAlign: \"top\"}),\n ])\n break;\n case \"2\":\n this.addElements([\n new Square({id: \"filler2\", x: 40, y: 0, alignX: \"right\", alignY: \"center\"}),\n new Square({id: \"filler1\", x: 40, y: 0, alignX: \"left\", alignY: \"center\"}),\n new GamepadButton({id: \"C\", x: 20, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowLeft\", altText: \"◀\", altTextAlign: \"right\"}),\n new GamepadButton({id: \"D\", x: 60, y: 0, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowRight\",altText: \"▶\", altTextAlign: \"left\"}),\n new GamepadButton({id: \"A\", x: 40, y: -20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowUp\", altText: \"▲\", altTextAlign: \"bottom\"}),\n new GamepadButton({id: \"B\", x: 40, y: 20, alignX: \"left\", alignY: \"center\", shape: \"square\", keyboardButton: \"ArrowDown\", altText: \"▼\", altTextAlign: \"top\"}),\n new GamepadButton({id: \"3\", x: 20, y: 0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"3\"}),\n new GamepadButton({id: \"4\", x: 60, y: 0, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"4\"}),\n new GamepadButton({id: \"1\", x: 40, y: -20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"1\"}),\n new GamepadButton({id: \"2\", x: 40, y: 20, alignX: \"right\", alignY: \"center\", shape: \"square\", keyboardButton: \"2\"}),\n ])\n break;\n case \"9\":\n this.addElements([\n new GamepadJoystick({id: \"left\", x: 40, y: 0, alignX: \"left\", alignY: \"center\", lockX: true, bindUp: \"ArrowUp\", bindDown: \"ArrowDown\"}),\n new GamepadJoystick({id: \"right\", x: 40, y: 0, alignX: \"right\", alignY: \"center\", lockY: true, bindLeft: \"ArrowLeft\", bindRight: \"ArrowRight\"})\n ]);\n break;\n }\n }\n\n}\n","import { uBitBLE, MESEvents } from \"./uBit\";\nimport { notif_alert, notif_warn, notif_info, notif_success } from './notification';\nimport { Gamepad } from './gamepad';\n\n/* Attempt to install service worker */\nlet sw = \"service-worker.js\";\nif (navigator.serviceWorker) {\n navigator.serviceWorker.register(\n sw, {scope: '/microbit-gamepad/'}\n ).then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) { return; }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n notif_info(\"New content is available, relaunch the app to install it.\");\n } else {\n notif_success(\"Content is cached for offline use.\");\n }\n }\n };\n };\n registration.update();\n }).catch(error => {\n notif_warn(\"Could not install service worker...\");\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\n/* Allow the ignore-landscape-warning button to work */\ndocument.getElementById(\"btn_ignore_landscape_warning\").addEventListener(\"click\", () => {\n document.body.classList.add(\"ignore-landscape-warning\");\n});\n\n/* Show a warning if bluetooth is unavailable in the browser. */\nif (!navigator.bluetooth) {\n //alert(\"Bluetooth not enabled in your browser, this won't work...\");\n console.error(\"You do not have a bluetooth enabled browser, you need to have a bluetooth enabled browser...\");\n notif_alert(\"Your browser does not seem to support bluetooth, try using Google Chrome or Microsoft Edge.\");\n}\n\n/* Define and initialize things */\nlet gamepad = new Gamepad();\nwindow.gamepad = gamepad;\nlet ubit = new uBitBLE();\nwindow.ubit = ubit;\n\n/* Setup storage and picker for the gamepad layout */\ndocument.querySelector(\".settings-dialog #layout\").addEventListener(\"change\", (v) => {\n gamepad.setGamepadLayout(v.target.value);\n localStorage.setItem(\"gamepadLayout\", v.target.value);\n document.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\n});\nif (localStorage.getItem(\"gamepadLayout\") === null) { localStorage.setItem(\"gamepadLayout\", \"1\"); }\ngamepad.setGamepadLayout(localStorage.getItem(\"gamepadLayout\"));\ndocument.querySelector(\".button-states pre\").innerHTML = \"No buttons pressed yet\";\ndocument.querySelector(\".settings-dialog #layout\").value = localStorage.getItem(\"gamepadLayout\");\n\n/* Setup storage for toggling touches */\ndocument.querySelector(\".settings-dialog #show-touches\").addEventListener(\"change\", (v) => {\n gamepad.stage.showTouches = v.target.checked;\n localStorage.setItem(\"showTouches\", v.target.checked);\n});\nif (localStorage.getItem(\"showTouches\") === null) { localStorage.setItem(\"showTouches\", false); }\ngamepad.stage.showTouches = localStorage.getItem(\"showTouches\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-touches\").checked = localStorage.getItem(\"showTouches\") == \"true\";\n\n/* Setup storage for toggling alt text */\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").addEventListener(\"change\", (v) => {\n gamepad.showAltText = v.target.checked;\n localStorage.setItem(\"showAltText\", v.target.checked);\n});\nif (localStorage.getItem(\"showAltText\") === null) { localStorage.setItem(\"showAltText\", false); }\ngamepad.showAltText = localStorage.getItem(\"showAltText\") == \"true\";\ndocument.querySelector(\".settings-dialog #show-gamepad-alt-text\").checked = localStorage.getItem(\"showAltText\") == \"true\";\n\n/* Setup storage for toggling vibration/haptic feedback */\ndocument.querySelector(\".settings-dialog #enable-haptic\").addEventListener(\"change\", (v) => {\n gamepad.enableVibration = v.target.checked;\n localStorage.setItem(\"enableHaptic\", v.target.checked);\n});\nif (localStorage.getItem(\"enableHaptic\") === null) { localStorage.setItem(\"enableHaptic\", true); }\ngamepad.enableVibration = localStorage.getItem(\"enableHaptic\") == \"true\";\ndocument.querySelector(\".settings-dialog #enable-haptic\").checked = localStorage.getItem(\"enableHaptic\") == \"true\";\n\n/* Setup storage for toggling debug mode */\ndocument.querySelector(\".settings-dialog #enable-debug\").addEventListener(\"change\", (v) => {\n gamepad.showDebug = v.target.checked;\n if (v.target.checked) {\n document.body.classList.add(\"debug\");\n } else {\n document.body.classList.remove(\"debug\");\n }\n localStorage.setItem(\"enableDebug\", v.target.checked);\n});\nif (localStorage.getItem(\"enableDebug\") === null) { localStorage.setItem(\"enableDebug\", false); }\ngamepad.showDebug = localStorage.getItem(\"enableDebug\") == \"true\";\nif (localStorage.getItem(\"enableDebug\") === \"true\") {\n document.body.classList.add(\"debug\");\n} else {\n document.body.classList.remove(\"debug\");\n}\ndocument.querySelector(\".settings-dialog #enable-debug\").checked = localStorage.getItem(\"enableDebug\") == \"true\";\n\n/* Setup buttons for opening/closing settings panel */\ndocument.querySelector(\"#btn_show_settings\").addEventListener(\"click\", () => {\n document.querySelector(\".settings-dialog\").classList.add(\"shown\");\n});\ndocument.querySelector(\"#btn_hide_settings\").addEventListener(\"click\", () => {\n document.querySelector(\".settings-dialog\").classList.remove(\"shown\");\n});\n\n/* Setup actions for bluetooth connect/disconnect buttons */\ndocument.querySelector(\"#btn_disconnect\").addEventListener(\"click\", () => {\n ubit.disconnect();\n});\ndocument.getElementById(\"btn_connect\").addEventListener(\"click\", async () => {\n if (!navigator.bluetooth) {\n notif_alert(\"You need a bluetooth enabled browser for this app to work, try chrome.\");\n }\n try {\n await ubit.searchDevice();\n } catch (e) {\n notif_alert(`Could not connect to device: ${e}.`);\n }\n});\n\n/* Handle gamepad events */\nlet gamepadState = {};\ngamepad.onTouchEvent(e => {\n /* This is just for the debug data */\n if ([\"touchstart\", \"touchmove\"].includes(e.action)) {\n gamepadState[e.id] = {state: true, ...e};\n }\n if ([\"touchend\"].includes(e.action)) {\n gamepadState[e.id] = {state: false, ...e};\n }\n let debugString = \"\";\n for (const [key, value] of Object.entries(gamepadState)) {\n debugString += `${key}: ${value.state ? 'Pressed' : 'Not pressed'}`;\n if (value.hasOwnProperty(\"x\")) {\n debugString += ` (x: ${value.x}, y: ${value.y})`;\n }\n debugString += `\\n`;\n }\n document.querySelector(\".button-states pre\").innerHTML = debugString;\n});\n\ngamepad.onTouchEvent(e => {\n const event_type = MESEvents.MES_DPAD_CONTROLLER_ID;\n let event_value = null;\n if (e.action == \"touchstart\") {\n if (e.id == \"A\") {\n event_value = MESEvents.MES_DPAD_BUTTON_A_DOWN;\n } else if (e.id == \"B\") {\n event_value = MESEvents.MES_DPAD_BUTTON_B_DOWN;\n } else if (e.id == \"C\") {\n event_value = MESEvents.MES_DPAD_BUTTON_C_DOWN;\n } else if (e.id == \"D\") {\n event_value = MESEvents.MES_DPAD_BUTTON_D_DOWN;\n } else if (e.id == \"1\") {\n event_value = MESEvents.MES_DPAD_BUTTON_1_DOWN;\n } else if (e.id == \"2\") {\n event_value = MESEvents.MES_DPAD_BUTTON_2_DOWN;\n } else if (e.id == \"3\") {\n event_value = MESEvents.MES_DPAD_BUTTON_3_DOWN;\n } else if (e.id == \"4\") {\n event_value = MESEvents.MES_DPAD_BUTTON_4_DOWN;\n }\n } else if (e.action == \"touchend\") {\n if (e.id == \"A\") {\n event_value = MESEvents.MES_DPAD_BUTTON_A_UP;\n } else if (e.id == \"B\") {\n event_value = MESEvents.MES_DPAD_BUTTON_B_UP;\n } else if (e.id == \"C\") {\n event_value = MESEvents.MES_DPAD_BUTTON_C_UP;\n } else if (e.id == \"D\") {\n event_value = MESEvents.MES_DPAD_BUTTON_D_UP;\n } else if (e.id == \"1\") {\n event_value = MESEvents.MES_DPAD_BUTTON_1_UP;\n } else if (e.id == \"2\") {\n event_value = MESEvents.MES_DPAD_BUTTON_2_UP;\n } else if (e.id == \"3\") {\n event_value = MESEvents.MES_DPAD_BUTTON_3_UP;\n } else if (e.id == \"4\") {\n event_value = MESEvents.MES_DPAD_BUTTON_4_UP;\n }\n }\n if ((ubit.isConnected()) && (event_value != null)) {\n ubit.sendEvent(event_type, event_value);\n }\n\n if ((e.id == \"right\") && e.hasOwnProperty(\"x\")) {\n ubit.sendUart(`x:${e.x}\\n`);\n }\n if ((e.id == \"left\") && e.hasOwnProperty(\"y\")) {\n ubit.sendUart(`y:${e.y}\\n`);\n }\n});\n\n/* Setup handlers for ubit (bluetooth) events */\nubit.onConnect(() => {\n document.body.classList.add(\"connected\");\n});\n\nubit.onDisconnect(() => {\n document.body.classList.remove(\"connected\");\n});\n\n"]} \ No newline at end of file
diff --git a/service-worker.js b/service-worker.js
index 1c84182..3cc286d 100644
--- a/service-worker.js
+++ b/service-worker.js
@@ -1,7 +1,7 @@
var APP_PREFIX = 'microbitgamepad' // Identifier for this app (this needs to be consistent across every cache update)
-var VERSION = '1.0.3' // Version of the off-line cache (change this value everytime you want to update cache)
+var VERSION = '1.0.4' // Version of the off-line cache (change this value everytime you want to update cache)
var CACHE_NAME = APP_PREFIX + VERSION
-var URLS = ['/microbit-gamepad/','/microbit-gamepad/fa-brands-400.04246ac6.woff','/microbit-gamepad/fa-brands-400.a1db9459.woff2','/microbit-gamepad/fa-brands-400.ac88be85.svg','/microbit-gamepad/fa-brands-400.ae1da9aa.eot','/microbit-gamepad/fa-brands-400.e8eab21c.ttf','/microbit-gamepad/fa-regular-400.4f946da8.woff','/microbit-gamepad/fa-regular-400.6adc9fcd.eot','/microbit-gamepad/fa-regular-400.6e35f891.woff2','/microbit-gamepad/fa-regular-400.a215af91.ttf','/microbit-gamepad/fa-regular-400.ed807156.svg','/microbit-gamepad/fa-solid-900.88a6089c.woff','/microbit-gamepad/fa-solid-900.ab906712.woff2','/microbit-gamepad/fa-solid-900.e5b19c09.svg','/microbit-gamepad/fa-solid-900.ec16851e.ttf','/microbit-gamepad/fa-solid-900.ef18b3bb.eot','/microbit-gamepad/index.html','/microbit-gamepad/main.fa7f93a2.js','/microbit-gamepad/main.fa7f93a2.js.map','/microbit-gamepad/maskable_icon_x128.ae1e74f9.png','/microbit-gamepad/maskable_icon_x144.fc14e37c.png','/microbit-gamepad/maskable_icon_x152.ce6c1441.png','/microbit-gamepad/maskable_icon_x384.1af8edb2.png','/microbit-gamepad/maskable_icon_x512.a9ac38fa.png','/microbit-gamepad/maskable_icon_x72.b43d35ec.png','/microbit-gamepad/maskable_icon_x96.e03bc2e8.png','/microbit-gamepad/pwa-192x192.b3dbd8bb.png','/microbit-gamepad/pwa-512x512.b27071b7.png','/microbit-gamepad/service-worker.js','/microbit-gamepad/styles.ac699ce3.css','/microbit-gamepad/styles.ac699ce3.css.map'] // This will be replaced by the deploy-script
+var URLS = ['/microbit-gamepad/','/microbit-gamepad/fa-brands-400.04246ac6.woff','/microbit-gamepad/fa-brands-400.a1db9459.woff2','/microbit-gamepad/fa-brands-400.ac88be85.svg','/microbit-gamepad/fa-brands-400.ae1da9aa.eot','/microbit-gamepad/fa-brands-400.e8eab21c.ttf','/microbit-gamepad/fa-regular-400.4f946da8.woff','/microbit-gamepad/fa-regular-400.6adc9fcd.eot','/microbit-gamepad/fa-regular-400.6e35f891.woff2','/microbit-gamepad/fa-regular-400.a215af91.ttf','/microbit-gamepad/fa-regular-400.ed807156.svg','/microbit-gamepad/fa-solid-900.88a6089c.woff','/microbit-gamepad/fa-solid-900.ab906712.woff2','/microbit-gamepad/fa-solid-900.e5b19c09.svg','/microbit-gamepad/fa-solid-900.ec16851e.ttf','/microbit-gamepad/fa-solid-900.ef18b3bb.eot','/microbit-gamepad/index.html','/microbit-gamepad/main.6a141175.js','/microbit-gamepad/main.6a141175.js.map','/microbit-gamepad/maskable_icon_x128.ae1e74f9.png','/microbit-gamepad/maskable_icon_x144.fc14e37c.png','/microbit-gamepad/maskable_icon_x152.ce6c1441.png','/microbit-gamepad/maskable_icon_x384.1af8edb2.png','/microbit-gamepad/maskable_icon_x512.a9ac38fa.png','/microbit-gamepad/maskable_icon_x72.b43d35ec.png','/microbit-gamepad/maskable_icon_x96.e03bc2e8.png','/microbit-gamepad/pwa-192x192.b3dbd8bb.png','/microbit-gamepad/pwa-512x512.b27071b7.png','/microbit-gamepad/service-worker.js','/microbit-gamepad/styles.ac699ce3.css','/microbit-gamepad/styles.ac699ce3.css.map'] // This will be replaced by the deploy-script
// Respond with cached resources
self.addEventListener('fetch', function (e) {