From 2e0478d326be13c3e6ecea639fc63f7da09b0a23 Mon Sep 17 00:00:00 2001 From: Mathieu Hermann Date: Thu, 18 Jan 2024 18:37:42 +0100 Subject: [PATCH] Updates --- assets/index-1qdjJMob.css | 1 + .../{index-CiyYEfGU.js => index-IP4ASJEm.js} | 94 ++-- assets/index-NYnQYsoM.css | 1 - index.html | 15 +- test.txt | 1 - tracks/adelboden.json | 426 ++++++++++++++++++ tracks/davos.json | 14 +- tracks/soelden.json | 1 + tracks/wengen.json | 418 +++++++++++++++++ tracks/zermatt.json | 426 ++++++++++++++++++ 10 files changed, 1345 insertions(+), 52 deletions(-) create mode 100644 assets/index-1qdjJMob.css rename assets/{index-CiyYEfGU.js => index-IP4ASJEm.js} (77%) delete mode 100644 assets/index-NYnQYsoM.css delete mode 100644 test.txt create mode 100644 tracks/adelboden.json create mode 100644 tracks/wengen.json create mode 100644 tracks/zermatt.json diff --git a/assets/index-1qdjJMob.css b/assets/index-1qdjJMob.css new file mode 100644 index 0000000..4486cfb --- /dev/null +++ b/assets/index-1qdjJMob.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css2?family=Inter&display=swap";html body{padding:0;margin:0;font-family:Inter,sans-serif;color:#4a8291}.ui-container{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;width:100vw;background-color:#b0d4dd;overflow:hidden}.ui-container .header{display:flex;width:calc(100% - 4rem);align-items:center;justify-content:center}.ui-container .header img{width:80px;height:80px}.ui-container .hud-container{position:relative;border-radius:10px;overflow:hidden}.ui-container .hud-container .actions-toolbar{position:absolute;right:0;width:200px;padding:2rem;gap:1rem;display:flex;align-items:center;justify-content:flex-end;color:#fff;z-index:10}.ui-container .hud-container .actions-toolbar #sound-button,.ui-container .hud-container .actions-toolbar #sound-mute-button{cursor:pointer;display:none}.ui-container .hud-container .dialog{display:flex;flex-direction:column;padding-bottom:1rem;width:calc(100% - 4rem);height:calc(100% - 4rem);padding:2rem;border:none;color:#fff;background-color:#4a8291}.ui-container .hud-container .dialog .dialog-content{flex:1 1 auto;padding:1rem}.ui-container .hud-container .dialog .dialog-actions{padding:1rem}.ui-container .hud-container #event-setup{display:none;position:absolute;width:100%;height:100%;align-items:center;justify-content:center}.ui-container .hud-container #event-setup .dialog{font-size:1.3rem}.ui-container .hud-container #event-setup .dialog .title{margin-bottom:2rem}.ui-container .hud-container #event-setup .dialog .dialog-content{font-size:1.7rem;justify-content:center;display:flex;flex-direction:column;gap:2rem}.ui-container .hud-container #event-setup .dialog .dialog-content .form-line{display:flex;gap:1rem;justify-content:space-between;align-items:center;overflow:hidden}.ui-container .hud-container #event-setup .dialog .dialog-content .form-line .input{display:flex;overflow:hidden}.ui-container .hud-container #event-setup select,.ui-container .hud-container #event-setup input,.ui-container .hud-container #event-setup input:active,.ui-container .hud-container #event-setup input:focus{max-width:300px;font-size:1.5rem;padding:.5rem 1rem!important;color:#fff;background-color:transparent;border:2px solid white;border-radius:4px;outline:none}.ui-container .hud-container #event-setup select{max-width:500px!important;width:calc(300px + 2rem)!important;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#4a8291}.ui-container .hud-container #event-manager{display:none;position:absolute;width:100%;height:100%;align-items:center;justify-content:center}.ui-container .hud-container #event-manager .dialog{font-size:1.3rem}.ui-container .hud-container #event-manager .dialog .title{margin-bottom:.5rem}.ui-container .hud-container #event-manager .dialog .dialog-content{display:flex;flex:1 1 auto;flex-direction:column;justify-content:space-between}.ui-container .hud-container #event-manager .dialog .dialog-content .section-title{font-size:.9rem;margin-top:.5rem}.ui-container .hud-container #event-manager .dialog .dialog-content #last-results-container,.ui-container .hud-container #event-manager .dialog .dialog-content #next-races-container,.ui-container .hud-container #event-manager .dialog .dialog-content #actual-ranking-container{display:flex;flex-direction:column;max-height:120px;overflow:auto;border-radius:5px}.ui-container .hud-container #event-manager .dialog .dialog-content .placeholder{display:flex;font-size:.8rem;justify-content:center;padding:.5rem;color:#cecece}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.header-line,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.header-line{display:flex;justify-content:space-between;padding:.3rem 1rem;font-size:.75rem;color:#cecece}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line{display:flex;justify-content:space-between;padding:.3rem 1rem;font-size:.75rem;background-color:#ffffff29}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line.next,.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line.first,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line.next,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line.first{background-color:#6aff9091}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line div,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line div{min-width:100px;max-width:100px;overflow:hidden}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line div.winner,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line div.winner{font-weight:700;color:#6aff9091}.ui-container .hud-container #event-manager .dialog .dialog-content button{margin-top:1rem}.ui-container .hud-container button{cursor:pointer;font-size:1.8rem;font-weight:400;border-radius:10px;width:100%;padding:1rem;color:#fff;border:0;background-color:#3d3378!important}.ui-container .hud-container .game-container{width:800px;max-width:100vw;height:600px;max-height:100vh}.ui-container .hud-container .game-container .start-button{font-weight:200;border:none;background-color:#3d3378!important;font-size:1.5rem;width:300px}.ui-container .hud-container #result{position:absolute;top:50px;left:0;width:calc(100% - 2rem);max-height:500px;padding:1rem;display:none;flex-direction:column;align-items:center;justify-content:center;gap:1rem;background-color:#4a8291ce}.ui-container .hud-container #result #position{font-size:4rem;color:#fff}.ui-container .hud-container #result #timing{font-size:2rem;font-style:italic;color:#fff}.ui-container .hud-container #result .results-table{display:flex;flex-direction:column;width:100%;align-items:center;justify-content:center;overflow:hidden;font-family:monospace}.ui-container .hud-container #result .results-table #results-container{display:flex;flex-direction:column;height:300px;overflow-y:auto}.ui-container .hud-container #result .results-table .header-line,.ui-container .hud-container #result .results-table .result-line{padding:.5rem;display:flex;font-size:.75rem;color:#ffffffce}.ui-container .hud-container #result .results-table .header-line div:first-child,.ui-container .hud-container #result .results-table .result-line div:first-child{width:75px}.ui-container .hud-container #result .results-table .header-line div,.ui-container .hud-container #result .results-table .result-line div{width:150px}.ui-container .hud-container #result .results-table .header-line div.time,.ui-container .hud-container #result .results-table .result-line div.time{text-align:right}.ui-container .hud-container #result .results-table .result-line{color:#fff;background-color:#ffffff29}.ui-container .hud-container #result .results-table .result-line.current{background-color:#6aff9091}.ui-container .hud-container #result button#back-to-manager{margin-top:1rem;font-size:1.8rem;width:200px}.ui-container .hud-container #speedometer,.ui-container .hud-container #timer{display:flex;width:90px;align-items:center;justify-content:end;position:absolute;bottom:0;color:#4c829087;font-size:1.1rem;padding:.25rem .5rem;height:40px;visibility:hidden}.ui-container .hud-container #speedometer#speedometer,.ui-container .hud-container #timer#speedometer{left:0}.ui-container .hud-container #speedometer#timer,.ui-container .hud-container #timer#timer{right:0}.ui-container .footer{display:flex;justify-content:center;align-items:center;padding:2rem}i.fa-solid{font-size:1.2rem}::-webkit-scrollbar{width:0px} diff --git a/assets/index-CiyYEfGU.js b/assets/index-IP4ASJEm.js similarity index 77% rename from assets/index-CiyYEfGU.js rename to assets/index-IP4ASJEm.js index 218c687..3a96e15 100644 --- a/assets/index-CiyYEfGU.js +++ b/assets/index-IP4ASJEm.js @@ -1,10 +1,10 @@ -var Ga=Object.defineProperty;var Na=(u,d,a)=>d in u?Ga(u,d,{enumerable:!0,configurable:!0,writable:!0,value:a}):u[d]=a;var S=(u,d,a)=>(Na(u,typeof d!="symbol"?d+"":d,a),a);(function(){const d=document.createElement("link").relList;if(d&&d.supports&&d.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))c(g);new MutationObserver(g=>{for(const m of g)if(m.type==="childList")for(const x of m.addedNodes)x.tagName==="LINK"&&x.rel==="modulepreload"&&c(x)}).observe(document,{childList:!0,subtree:!0});function a(g){const m={};return g.integrity&&(m.integrity=g.integrity),g.referrerPolicy&&(m.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?m.credentials="include":g.crossOrigin==="anonymous"?m.credentials="omit":m.credentials="same-origin",m}function c(g){if(g.ep)return;g.ep=!0;const m=a(g);fetch(g.href,m)}})();/*! +var Na=Object.defineProperty;var Ha=(u,d,a)=>d in u?Na(u,d,{enumerable:!0,configurable:!0,writable:!0,value:a}):u[d]=a;var S=(u,d,a)=>(Ha(u,typeof d!="symbol"?d+"":d,a),a);(function(){const d=document.createElement("link").relList;if(d&&d.supports&&d.supports("modulepreload"))return;for(const g of document.querySelectorAll('link[rel="modulepreload"]'))c(g);new MutationObserver(g=>{for(const p of g)if(p.type==="childList")for(const x of p.addedNodes)x.tagName==="LINK"&&x.rel==="modulepreload"&&c(x)}).observe(document,{childList:!0,subtree:!0});function a(g){const p={};return g.integrity&&(p.integrity=g.integrity),g.referrerPolicy&&(p.referrerPolicy=g.referrerPolicy),g.crossOrigin==="use-credentials"?p.credentials="include":g.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function c(g){if(g.ep)return;g.ep=!0;const p=a(g);fetch(g.href,p)}})();/*! * excalibur - 0.29.0-alpha.4+6f6d7bb - 2024-1-13 * https://github.com/excaliburjs/Excalibur * Copyright (c) 2024 Excalibur.js * Licensed BSD-2-Clause * @preserve - */var Qa={1388:(u,d,a)=>{a.d(d,{Z:()=>P});var c=a(272),g=a.n(c),m=a(2609),x=a.n(m),I=x()(g());I.push([u.id,`/* Buttons styles start */ + */var Qa={1388:(u,d,a)=>{a.d(d,{Z:()=>T});var c=a(272),g=a.n(c),p=a(2609),x=a.n(p),C=x()(g());C.push([u.id,`/* Buttons styles start */ button#excalibur-play { display: inline-block; @@ -248,7 +248,7 @@ button#excalibur-play:active { opacity: 1; } } -`],sourceRoot:""}]);const P=I},7379:(u,d,a)=>{a.d(d,{Z:()=>P});var c=a(272),g=a.n(c),m=a(2609),x=a.n(m),I=x()(g());I.push([u.id,` +`],sourceRoot:""}]);const T=C},7379:(u,d,a)=>{a.d(d,{Z:()=>T});var c=a(272),g=a.n(c),p=a(2609),x=a.n(p),C=x()(g());C.push([u.id,` #ex-toast-container { position: absolute; height: 0; @@ -304,29 +304,29 @@ button#excalibur-play:active { .ex-toast-message button { align-self: flex-start; -}`],sourceRoot:""}]);const P=I},2609:u=>{u.exports=function(d){var a=[];return a.toString=function(){return this.map(function(g){var m="",x=typeof g[5]<"u";return g[4]&&(m+="@supports (".concat(g[4],") {")),g[2]&&(m+="@media ".concat(g[2]," {")),x&&(m+="@layer".concat(g[5].length>0?" ".concat(g[5]):""," {")),m+=d(g),x&&(m+="}"),g[2]&&(m+="}"),g[4]&&(m+="}"),m}).join("")},a.i=function(g,m,x,I,P){typeof g=="string"&&(g=[[null,g,void 0]]);var B={};if(x)for(var T=0;T"u"||(O[1]="@layer".concat(O[5].length>0?" ".concat(O[5]):""," {").concat(O[1],"}")),O[5]=P),m&&(O[2]&&(O[1]="@media ".concat(O[2]," {").concat(O[1],"}")),O[2]=m),I&&(O[4]?(O[1]="@supports (".concat(O[4],") {").concat(O[1],"}"),O[4]=I):O[4]="".concat(I)),a.push(O))}},a}},272:u=>{u.exports=function(d){var a=d[1],c=d[3];if(!c)return a;if(typeof btoa=="function"){var g=btoa(unescape(encodeURIComponent(JSON.stringify(c)))),m="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(g),x="/*# ".concat(m," */");return[a].concat([x]).join(` +}`],sourceRoot:""}]);const T=C},2609:u=>{u.exports=function(d){var a=[];return a.toString=function(){return this.map(function(g){var p="",x=typeof g[5]<"u";return g[4]&&(p+="@supports (".concat(g[4],") {")),g[2]&&(p+="@media ".concat(g[2]," {")),x&&(p+="@layer".concat(g[5].length>0?" ".concat(g[5]):""," {")),p+=d(g),x&&(p+="}"),g[2]&&(p+="}"),g[4]&&(p+="}"),p}).join("")},a.i=function(g,p,x,C,T){typeof g=="string"&&(g=[[null,g,void 0]]);var B={};if(x)for(var P=0;P"u"||(O[1]="@layer".concat(O[5].length>0?" ".concat(O[5]):""," {").concat(O[1],"}")),O[5]=T),p&&(O[2]&&(O[1]="@media ".concat(O[2]," {").concat(O[1],"}")),O[2]=p),C&&(O[4]?(O[1]="@supports (".concat(O[4],") {").concat(O[1],"}"),O[4]=C):O[4]="".concat(C)),a.push(O))}},a}},272:u=>{u.exports=function(d){var a=d[1],c=d[3];if(!c)return a;if(typeof btoa=="function"){var g=btoa(unescape(encodeURIComponent(JSON.stringify(c)))),p="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(g),x="/*# ".concat(p," */");return[a].concat([x]).join(` `)}return[a].join(` -`)}},1324:(u,d,a)=>{a(7206);var c=a(8193);u.exports=c("Array","sort")},3571:(u,d,a)=>{a(9867);var c=a(8588);u.exports=c.Object.keys},1052:(u,d,a)=>{var c=a(688),g=a(3397),m=TypeError;u.exports=function(x){if(c(x))return x;throw new m(g(x)+" is not a function")}},9175:(u,d,a)=>{var c=a(5309),g=String,m=TypeError;u.exports=function(x){if(c(x))return x;throw new m(g(x)+" is not an object")}},1138:(u,d,a)=>{var c=a(6854),g=a(7352),m=a(8344),x=function(I){return function(P,B,T){var z=c(P),G=m(z),O=g(T,G),Q;if(I&&B!==B){for(;G>O;)if(Q=z[O++],Q!==Q)return!0}else for(;G>O;O++)if((I||O in z)&&z[O]===B)return I||O||0;return!I&&-1}};u.exports={includes:x(!0),indexOf:x(!1)}},567:(u,d,a)=>{var c=a(4694);u.exports=function(g,m){var x=[][g];return!!x&&c(function(){x.call(null,m||function(){return 1},1)})}},6403:(u,d,a)=>{var c=a(7352),g=a(8344),m=a(3182),x=Array,I=Math.max;u.exports=function(P,B,T){for(var z=g(P),G=c(B,z),O=c(T===void 0?z:T,z),Q=x(I(O-G,0)),$=0;G{var c=a(6403),g=Math.floor,m=function(P,B){var T=P.length,z=g(T/2);return T<8?x(P,B):I(P,m(c(P,0,z),B),m(c(P,z),B),B)},x=function(P,B){for(var T=P.length,z=1,G,O;z0;)P[O]=P[--O];O!==z++&&(P[O]=G)}return P},I=function(P,B,T,z){for(var G=B.length,O=T.length,Q=0,$=0;Q{var c=a(9668),g=c({}.toString),m=c("".slice);u.exports=function(x){return m(g(x),8,-1)}},1566:(u,d,a)=>{var c=a(2522),g=a(688),m=a(2177),x=a(2032),I=x("toStringTag"),P=Object,B=m(function(){return arguments}())==="Arguments",T=function(z,G){try{return z[G]}catch{}};u.exports=c?m:function(z){var G,O,Q;return z===void 0?"Undefined":z===null?"Null":typeof(O=T(G=P(z),I))=="string"?O:B?m(G):(Q=m(G))==="Object"&&g(G.callee)?"Arguments":Q}},3891:(u,d,a)=>{var c=a(4678),g=a(990),m=a(7537),x=a(2131);u.exports=function(I,P,B){for(var T=g(P),z=x.f,G=m.f,O=0;O{var c=a(9924),g=a(2131),m=a(7781);u.exports=c?function(x,I,P){return g.f(x,I,m(1,P))}:function(x,I,P){return x[I]=P,x}},7781:u=>{u.exports=function(d,a){return{enumerable:!(d&1),configurable:!(d&2),writable:!(d&4),value:a}}},3182:(u,d,a)=>{var c=a(2358),g=a(2131),m=a(7781);u.exports=function(x,I,P){var B=c(I);B in x?g.f(x,B,m(0,P)):x[B]=P}},2470:(u,d,a)=>{var c=a(688),g=a(2131),m=a(1135),x=a(1604);u.exports=function(I,P,B,T){T||(T={});var z=T.enumerable,G=T.name!==void 0?T.name:P;if(c(B)&&m(B,G,T),T.global)z?I[P]=B:x(P,B);else{try{T.unsafe?I[P]&&(z=!0):delete I[P]}catch{}z?I[P]=B:g.f(I,P,{value:B,enumerable:!1,configurable:!T.nonConfigurable,writable:!T.nonWritable})}return I}},1604:(u,d,a)=>{var c=a(2150),g=Object.defineProperty;u.exports=function(m,x){try{g(c,m,{value:x,configurable:!0,writable:!0})}catch{c[m]=x}return x}},955:(u,d,a)=>{var c=a(3397),g=TypeError;u.exports=function(m,x){if(!delete m[x])throw new g("Cannot delete property "+c(x)+" of "+c(m))}},9924:(u,d,a)=>{var c=a(4694);u.exports=!c(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7})},1811:u=>{var d=typeof document=="object"&&document.all,a=typeof d>"u"&&d!==void 0;u.exports={all:d,IS_HTMLDDA:a}},1442:(u,d,a)=>{var c=a(2150),g=a(5309),m=c.document,x=g(m)&&g(m.createElement);u.exports=function(I){return x?m.createElement(I):{}}},9016:(u,d,a)=>{var c=a(1370),g=c.match(/firefox\/(\d+)/i);u.exports=!!g&&+g[1]},821:(u,d,a)=>{var c=a(1370);u.exports=/MSIE|Trident/.test(c)},1370:u=>{u.exports=typeof navigator<"u"&&String(navigator.userAgent)||""},7067:(u,d,a)=>{var c=a(2150),g=a(1370),m=c.process,x=c.Deno,I=m&&m.versions||x&&x.version,P=I&&I.v8,B,T;P&&(B=P.split("."),T=B[0]>0&&B[0]<4?1:+(B[0]+B[1])),!T&&g&&(B=g.match(/Edge\/(\d+)/),(!B||B[1]>=74)&&(B=g.match(/Chrome\/(\d+)/),B&&(T=+B[1]))),u.exports=T},4389:(u,d,a)=>{var c=a(1370),g=c.match(/AppleWebKit\/(\d+)\./);u.exports=!!g&&+g[1]},8193:(u,d,a)=>{var c=a(2150),g=a(9668);u.exports=function(m,x){return g(c[m].prototype[x])}},2367:u=>{u.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},5532:(u,d,a)=>{var c=a(2150),g=a(7537).f,m=a(2385),x=a(2470),I=a(1604),P=a(3891),B=a(1633);u.exports=function(T,z){var G=T.target,O=T.global,Q=T.stat,$,et,K,st,ht,mt;if(O?et=c:Q?et=c[G]||I(G,{}):et=(c[G]||{}).prototype,et)for(K in z){if(ht=z[K],T.dontCallGetSet?(mt=g(et,K),st=mt&&mt.value):st=et[K],$=B(O?K:G+(Q?".":"#")+K,T.forced),!$&&st!==void 0){if(typeof ht==typeof st)continue;P(ht,st)}(T.sham||st&&st.sham)&&m(ht,"sham",!0),x(et,K,ht,T)}}},4694:u=>{u.exports=function(d){try{return!!d()}catch{return!0}}},6398:(u,d,a)=>{var c=a(4694);u.exports=!c(function(){var g=(function(){}).bind();return typeof g!="function"||g.hasOwnProperty("prototype")})},8724:(u,d,a)=>{var c=a(6398),g=Function.prototype.call;u.exports=c?g.bind(g):function(){return g.apply(g,arguments)}},453:(u,d,a)=>{var c=a(9924),g=a(4678),m=Function.prototype,x=c&&Object.getOwnPropertyDescriptor,I=g(m,"name"),P=I&&(function(){}).name==="something",B=I&&(!c||c&&x(m,"name").configurable);u.exports={EXISTS:I,PROPER:P,CONFIGURABLE:B}},9668:(u,d,a)=>{var c=a(6398),g=Function.prototype,m=g.call,x=c&&g.bind.bind(m,m);u.exports=c?x:function(I){return function(){return m.apply(I,arguments)}}},2160:(u,d,a)=>{var c=a(2150),g=a(688),m=function(x){return g(x)?x:void 0};u.exports=function(x,I){return arguments.length<2?m(c[x]):c[x]&&c[x][I]}},5383:(u,d,a)=>{var c=a(1052),g=a(5268);u.exports=function(m,x){var I=m[x];return g(I)?void 0:c(I)}},2150:function(u,d,a){var c=function(g){return g&&g.Math===Math&&g};u.exports=c(typeof globalThis=="object"&&globalThis)||c(typeof window=="object"&&window)||c(typeof self=="object"&&self)||c(typeof a.g=="object"&&a.g)||c(typeof this=="object"&&this)||function(){return this}()||Function("return this")()},4678:(u,d,a)=>{var c=a(9668),g=a(298),m=c({}.hasOwnProperty);u.exports=Object.hasOwn||function(I,P){return m(g(I),P)}},7390:u=>{u.exports={}},7913:(u,d,a)=>{var c=a(9924),g=a(4694),m=a(1442);u.exports=!c&&!g(function(){return Object.defineProperty(m("div"),"a",{get:function(){return 7}}).a!==7})},4347:(u,d,a)=>{var c=a(9668),g=a(4694),m=a(2177),x=Object,I=c("".split);u.exports=g(function(){return!x("z").propertyIsEnumerable(0)})?function(P){return m(P)==="String"?I(P,""):x(P)}:x},1881:(u,d,a)=>{var c=a(9668),g=a(688),m=a(6762),x=c(Function.toString);g(m.inspectSource)||(m.inspectSource=function(I){return x(I)}),u.exports=m.inspectSource},7804:(u,d,a)=>{var c=a(4724),g=a(2150),m=a(5309),x=a(2385),I=a(4678),P=a(6762),B=a(1962),T=a(7390),z="Object already initialized",G=g.TypeError,O=g.WeakMap,Q,$,et,K=function(tt){return et(tt)?$(tt):Q(tt,{})},st=function(tt){return function(ot){var gt;if(!m(ot)||(gt=$(ot)).type!==tt)throw new G("Incompatible receiver, "+tt+" required");return gt}};if(c||P.state){var ht=P.state||(P.state=new O);ht.get=ht.get,ht.has=ht.has,ht.set=ht.set,Q=function(tt,ot){if(ht.has(tt))throw new G(z);return ot.facade=tt,ht.set(tt,ot),ot},$=function(tt){return ht.get(tt)||{}},et=function(tt){return ht.has(tt)}}else{var mt=B("state");T[mt]=!0,Q=function(tt,ot){if(I(tt,mt))throw new G(z);return ot.facade=tt,x(tt,mt,ot),ot},$=function(tt){return I(tt,mt)?tt[mt]:{}},et=function(tt){return I(tt,mt)}}u.exports={set:Q,get:$,has:et,enforce:K,getterFor:st}},688:(u,d,a)=>{var c=a(1811),g=c.all;u.exports=c.IS_HTMLDDA?function(m){return typeof m=="function"||m===g}:function(m){return typeof m=="function"}},1633:(u,d,a)=>{var c=a(4694),g=a(688),m=/#|\.prototype\./,x=function(z,G){var O=P[I(z)];return O===T?!0:O===B?!1:g(G)?c(G):!!G},I=x.normalize=function(z){return String(z).replace(m,".").toLowerCase()},P=x.data={},B=x.NATIVE="N",T=x.POLYFILL="P";u.exports=x},5268:u=>{u.exports=function(d){return d==null}},5309:(u,d,a)=>{var c=a(688),g=a(1811),m=g.all;u.exports=g.IS_HTMLDDA?function(x){return typeof x=="object"?x!==null:c(x)||x===m}:function(x){return typeof x=="object"?x!==null:c(x)}},6555:u=>{u.exports=!1},7935:(u,d,a)=>{var c=a(2160),g=a(688),m=a(6148),x=a(4866),I=Object;u.exports=x?function(P){return typeof P=="symbol"}:function(P){var B=c("Symbol");return g(B)&&m(B.prototype,I(P))}},8344:(u,d,a)=>{var c=a(7331);u.exports=function(g){return c(g.length)}},1135:(u,d,a)=>{var c=a(9668),g=a(4694),m=a(688),x=a(4678),I=a(9924),P=a(453).CONFIGURABLE,B=a(1881),T=a(7804),z=T.enforce,G=T.get,O=String,Q=Object.defineProperty,$=c("".slice),et=c("".replace),K=c([].join),st=I&&!g(function(){return Q(function(){},"length",{value:8}).length!==8}),ht=String(String).split("String"),mt=u.exports=function(tt,ot,gt){$(O(ot),0,7)==="Symbol("&&(ot="["+et(O(ot),/^Symbol\(([^)]*)\)/,"$1")+"]"),gt&>.getter&&(ot="get "+ot),gt&>.setter&&(ot="set "+ot),(!x(tt,"name")||P&&tt.name!==ot)&&(I?Q(tt,"name",{value:ot,configurable:!0}):tt.name=ot),st&>&&x(gt,"arity")&&tt.length!==gt.arity&&Q(tt,"length",{value:gt.arity});try{gt&&x(gt,"constructor")&>.constructor?I&&Q(tt,"prototype",{writable:!1}):tt.prototype&&(tt.prototype=void 0)}catch{}var Pe=z(tt);return x(Pe,"source")||(Pe.source=K(ht,typeof ot=="string"?ot:"")),tt};Function.prototype.toString=mt(function(){return m(this)&&G(this).source||B(this)},"toString")},1787:u=>{var d=Math.ceil,a=Math.floor;u.exports=Math.trunc||function(g){var m=+g;return(m>0?a:d)(m)}},2131:(u,d,a)=>{var c=a(9924),g=a(7913),m=a(2666),x=a(9175),I=a(2358),P=TypeError,B=Object.defineProperty,T=Object.getOwnPropertyDescriptor,z="enumerable",G="configurable",O="writable";d.f=c?m?function($,et,K){if(x($),et=I(et),x(K),typeof $=="function"&&et==="prototype"&&"value"in K&&O in K&&!K[O]){var st=T($,et);st&&st[O]&&($[et]=K.value,K={configurable:G in K?K[G]:st[G],enumerable:z in K?K[z]:st[z],writable:!1})}return B($,et,K)}:B:function($,et,K){if(x($),et=I(et),x(K),g)try{return B($,et,K)}catch{}if("get"in K||"set"in K)throw new P("Accessors not supported");return"value"in K&&($[et]=K.value),$}},7537:(u,d,a)=>{var c=a(9924),g=a(8724),m=a(8208),x=a(7781),I=a(6854),P=a(2358),B=a(4678),T=a(7913),z=Object.getOwnPropertyDescriptor;d.f=c?z:function(O,Q){if(O=I(O),Q=P(Q),T)try{return z(O,Q)}catch{}if(B(O,Q))return x(!g(m.f,O,Q),O[Q])}},6217:(u,d,a)=>{var c=a(1528),g=a(2367),m=g.concat("length","prototype");d.f=Object.getOwnPropertyNames||function(I){return c(I,m)}},5168:(u,d)=>{d.f=Object.getOwnPropertySymbols},6148:(u,d,a)=>{var c=a(9668);u.exports=c({}.isPrototypeOf)},1528:(u,d,a)=>{var c=a(9668),g=a(4678),m=a(6854),x=a(1138).indexOf,I=a(7390),P=c([].push);u.exports=function(B,T){var z=m(B),G=0,O=[],Q;for(Q in z)!g(I,Q)&&g(z,Q)&&P(O,Q);for(;T.length>G;)g(z,Q=T[G++])&&(~x(O,Q)||P(O,Q));return O}},1728:(u,d,a)=>{var c=a(1528),g=a(2367);u.exports=Object.keys||function(x){return c(x,g)}},8208:(u,d)=>{var a={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,g=c&&!a.call({1:2},1);d.f=g?function(x){var I=c(this,x);return!!I&&I.enumerable}:a},110:(u,d,a)=>{var c=a(8724),g=a(688),m=a(5309),x=TypeError;u.exports=function(I,P){var B,T;if(P==="string"&&g(B=I.toString)&&!m(T=c(B,I))||g(B=I.valueOf)&&!m(T=c(B,I))||P!=="string"&&g(B=I.toString)&&!m(T=c(B,I)))return T;throw new x("Can't convert object to primitive value")}},990:(u,d,a)=>{var c=a(2160),g=a(9668),m=a(6217),x=a(5168),I=a(9175),P=g([].concat);u.exports=c("Reflect","ownKeys")||function(T){var z=m.f(I(T)),G=x.f;return G?P(z,G(T)):z}},8588:(u,d,a)=>{var c=a(2150);u.exports=c},1166:(u,d,a)=>{var c=a(5268),g=TypeError;u.exports=function(m){if(c(m))throw new g("Can't call method on "+m);return m}},1962:(u,d,a)=>{var c=a(2645),g=a(5736),m=c("keys");u.exports=function(x){return m[x]||(m[x]=g(x))}},6762:(u,d,a)=>{var c=a(2150),g=a(1604),m="__core-js_shared__",x=c[m]||g(m,{});u.exports=x},2645:(u,d,a)=>{var c=a(6555),g=a(6762);(u.exports=function(m,x){return g[m]||(g[m]=x!==void 0?x:{})})("versions",[]).push({version:"3.33.3",mode:c?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.33.3/LICENSE",source:"https://github.com/zloirock/core-js"})},4112:(u,d,a)=>{var c=a(7067),g=a(4694),m=a(2150),x=m.String;u.exports=!!Object.getOwnPropertySymbols&&!g(function(){var I=Symbol("symbol detection");return!x(I)||!(Object(I)instanceof Symbol)||!Symbol.sham&&c&&c<41})},7352:(u,d,a)=>{var c=a(1680),g=Math.max,m=Math.min;u.exports=function(x,I){var P=c(x);return P<0?g(P+I,0):m(P,I)}},6854:(u,d,a)=>{var c=a(4347),g=a(1166);u.exports=function(m){return c(g(m))}},1680:(u,d,a)=>{var c=a(1787);u.exports=function(g){var m=+g;return m!==m||m===0?0:c(m)}},7331:(u,d,a)=>{var c=a(1680),g=Math.min;u.exports=function(m){return m>0?g(c(m),9007199254740991):0}},298:(u,d,a)=>{var c=a(1166),g=Object;u.exports=function(m){return g(c(m))}},1272:(u,d,a)=>{var c=a(8724),g=a(5309),m=a(7935),x=a(5383),I=a(110),P=a(2032),B=TypeError,T=P("toPrimitive");u.exports=function(z,G){if(!g(z)||m(z))return z;var O=x(z,T),Q;if(O){if(G===void 0&&(G="default"),Q=c(O,z,G),!g(Q)||m(Q))return Q;throw new B("Can't convert object to primitive value")}return G===void 0&&(G="number"),I(z,G)}},2358:(u,d,a)=>{var c=a(1272),g=a(7935);u.exports=function(m){var x=c(m,"string");return g(x)?x:x+""}},2522:(u,d,a)=>{var c=a(2032),g=c("toStringTag"),m={};m[g]="z",u.exports=String(m)==="[object z]"},599:(u,d,a)=>{var c=a(1566),g=String;u.exports=function(m){if(c(m)==="Symbol")throw new TypeError("Cannot convert a Symbol value to a string");return g(m)}},3397:u=>{var d=String;u.exports=function(a){try{return d(a)}catch{return"Object"}}},5736:(u,d,a)=>{var c=a(9668),g=0,m=Math.random(),x=c(1 .toString);u.exports=function(I){return"Symbol("+(I===void 0?"":I)+")_"+x(++g+m,36)}},4866:(u,d,a)=>{var c=a(4112);u.exports=c&&!Symbol.sham&&typeof Symbol.iterator=="symbol"},2666:(u,d,a)=>{var c=a(9924),g=a(4694);u.exports=c&&g(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42})},4724:(u,d,a)=>{var c=a(2150),g=a(688),m=c.WeakMap;u.exports=g(m)&&/native code/.test(String(m))},2032:(u,d,a)=>{var c=a(2150),g=a(2645),m=a(4678),x=a(5736),I=a(4112),P=a(4866),B=c.Symbol,T=g("wks"),z=P?B.for||B:B&&B.withoutSetter||x;u.exports=function(G){return m(T,G)||(T[G]=I&&m(B,G)?B[G]:z("Symbol."+G)),T[G]}},7206:(u,d,a)=>{var c=a(5532),g=a(9668),m=a(1052),x=a(298),I=a(8344),P=a(955),B=a(599),T=a(4694),z=a(3097),G=a(567),O=a(9016),Q=a(821),$=a(7067),et=a(4389),K=[],st=g(K.sort),ht=g(K.push),mt=T(function(){K.sort(void 0)}),tt=T(function(){K.sort(null)}),ot=G("sort"),gt=!T(function(){if($)return $<70;if(!(O&&O>3)){if(Q)return!0;if(et)return et<603;var re="",St,wt,$t,Lt;for(St=65;St<76;St++){switch(wt=String.fromCharCode(St),St){case 66:case 69:case 70:case 72:$t=3;break;case 68:case 71:$t=4;break;default:$t=2}for(Lt=0;Lt<47;Lt++)K.push({k:wt+Lt,v:$t})}for(K.sort(function(Re,bt){return bt.v-Re.v}),Lt=0;LtB(wt)?1:-1}};c({target:"Array",proto:!0,forced:Pe},{sort:function(St){St!==void 0&&m(St);var wt=x(this);if(gt)return St===void 0?st(wt):st(wt,St);var $t=[],Lt=I(wt),Re,bt;for(bt=0;bt{var c=a(5532),g=a(298),m=a(1728),x=a(4694),I=x(function(){m(1)});c({target:"Object",stat:!0,forced:I},{keys:function(B){return m(g(B))}})}},no={};function pt(u){var d=no[u];if(d!==void 0)return d.exports;var a=no[u]={id:u,exports:{}};return Qa[u].call(a.exports,a,a.exports,pt),a.exports}pt.n=u=>{var d=u&&u.__esModule?()=>u.default:()=>u;return pt.d(d,{a:d}),d};pt.d=(u,d)=>{for(var a in d)pt.o(d,a)&&!pt.o(u,a)&&Object.defineProperty(u,a,{enumerable:!0,get:d[a]})};pt.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch{if(typeof window=="object")return window}}();pt.o=(u,d)=>Object.prototype.hasOwnProperty.call(u,d);pt.r=u=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(u,"__esModule",{value:!0})};var _={};(()=>{pt.d(_,{y1j:()=>Rs,fWn:()=>Bi,Ia8:()=>jn,rqv:()=>ln,zH6:()=>Ps,hLI:()=>fi,yyv:()=>Or,tX5:()=>bs,vtX:()=>Kt,r7K:()=>Yn,lCh:()=>Ar,cE4:()=>Et,fwF:()=>me,sce:()=>Di,AQ6:()=>ga,_c7:()=>de,KUs:()=>Pr,Ajp:()=>hi,dkO:()=>ni,RDh:()=>gs,_H9:()=>ls,mxs:()=>or,OmD:()=>it,kBf:()=>J,C4F:()=>es,NQt:()=>rn,JjN:()=>Yr,EK_:()=>si,V1s:()=>xr,xHm:()=>ca,Xz7:()=>qi,Cdc:()=>os,FKn:()=>kt,SUY:()=>an,ab2:()=>ss,GfZ:()=>pe,YMS:()=>De,oyv:()=>Ct,aUb:()=>je,SdD:()=>bi,JUv:()=>di,jEj:()=>ge,TFq:()=>le,HDU:()=>ji,R_y:()=>Ji,ydN:()=>Ze,t50:()=>yi,s$$:()=>nn,v2G:()=>q,Ilk:()=>L,s9i:()=>Qr,dxL:()=>Ke,LLX:()=>Nr,wA2:()=>ie,R_p:()=>Mt,IQ$:()=>Mr,I5F:()=>Bs,X8$:()=>Rr,FR6:()=>Zi,U8o:()=>Wi,kbG:()=>Nt,iS_:()=>Es,cGG:()=>Hr,RPN:()=>fs,skb:()=>Fr,SLU:()=>Ls,RdJ:()=>Ht,cNu:()=>hr,gU7:()=>Gn,LSk:()=>lr,Nmp:()=>ds,d1Y:()=>Tt,xrL:()=>Ks,sRW:()=>Xs,cmV:()=>fn,qWz:()=>rr,N0Q:()=>nr,q8b:()=>xt,ynB:()=>Vt,jT9:()=>mr,wAz:()=>mi,D4V:()=>xi,NLr:()=>ya,N6H:()=>Ss,W1A:()=>Is,JHW:()=>Rt,ZZ$:()=>ha,v2K:()=>br,pBf:()=>ba,vpe:()=>P,GMl:()=>B,zW2:()=>u,B0K:()=>Ws,Nv7:()=>Xi,C_p:()=>Me,MUA:()=>Ts,xqU:()=>Cs,pTp:()=>ar,vUK:()=>x,j9l:()=>tn,Zxw:()=>pi,v51:()=>dt,Hdx:()=>cs,Z$d:()=>as,iqV:()=>Zr,o$7:()=>Ui,olM:()=>Ne,Zm$:()=>T,$QH:()=>Q,i78:()=>$,nJg:()=>Ci,h6u:()=>$t,hts:()=>wt,j88:()=>re,VME:()=>St,fy2:()=>Ei,nt:()=>Fa,Ukr:()=>Li,zsu:()=>jt,oA6:()=>Ft,TVh:()=>Fi,TwZ:()=>Ri,GTT:()=>ns,xxj:()=>Dr,XdK:()=>Re,Jmb:()=>Ot,cXo:()=>Us,Dm5:()=>ii,IIB:()=>c,ebW:()=>Vr,zI0:()=>is,LYD:()=>vs,cEG:()=>Ur,SEl:()=>Ca,t9V:()=>Kr,ez5:()=>oi,N1d:()=>Ms,R8U:()=>ri,SKZ:()=>z,__J:()=>Ea,RI$:()=>vr,x12:()=>dn,ccz:()=>Qt,aNw:()=>Ln,XrL:()=>na,xwn:()=>pr,dNK:()=>gr,ini:()=>zt,YdH:()=>V,F5T:()=>kn,y3G:()=>Jt,l57:()=>Os,xn0:()=>Zs,t2V:()=>en,uxB:()=>yt,cpd:()=>Tr,fiy:()=>Xn,$XZ:()=>qn,UG6:()=>Te,uqK:()=>ke,STE:()=>On,y$z:()=>fe,mAD:()=>Lr,sOq:()=>se,hUw:()=>us,_0G:()=>Ia,Sqs:()=>qr,hpZ:()=>ms,Vol:()=>kr,vYX:()=>_i,wIZ:()=>Z,cBi:()=>xs,c30:()=>zr,MPV:()=>_e,RFv:()=>ui,Ux6:()=>vi,rxy:()=>zi,I$c:()=>Ge,kfC:()=>_s,VjY:()=>ve,mgq:()=>un,YVA:()=>Pt,Kgp:()=>Mn,HH$:()=>ze,M_d:()=>tt,rgh:()=>K,Ra6:()=>ei,KhR:()=>O,gvQ:()=>ht,BS5:()=>gt,xhz:()=>bt,xOq:()=>mt,a9j:()=>et,bHk:()=>Pe,CgK:()=>G,cEd:()=>st,cuY:()=>ot,kvE:()=>Pi,SBu:()=>Ti,PsT:()=>Fe,AE_:()=>Er,ctO:()=>Cr,OLH:()=>_r,kky:()=>Ii,nSF:()=>li,zHn:()=>Se,zwx:()=>Br,AeJ:()=>rs,hLz:()=>Zn,D9g:()=>yr,wA:()=>Vn,jhr:()=>Kn,GVs:()=>Ns,_zO:()=>Vi,LXZ:()=>Eo,w6$:()=>tr,mhV:()=>$n,MOD:()=>ne,kwd:()=>ir,Lmr:()=>er,xsS:()=>Oi,K5l:()=>_a,lLr:()=>Qs,Z$r:()=>yn,IXb:()=>sn,Xsu:()=>Vo,SGH:()=>Gr,SMj:()=>Oe,L34:()=>La,exe:()=>ee,bnF:()=>Dt,MFA:()=>_t,$uU:()=>Un,Sap:()=>sa,jyi:()=>He,E03:()=>Ki,V6q:()=>Ye,rg2:()=>hn,DVW:()=>$i,nVo:()=>fr,F6N:()=>Xr,xP7:()=>ce,Odq:()=>Ir,Zif:()=>Xt,ZGJ:()=>js,MJk:()=>Jr,xvT:()=>Mi,PHM:()=>hs,dpR:()=>Bt,n9L:()=>ur,KwO:()=>dr,SxM:()=>la,B7y:()=>Ve,x7r:()=>jr,wx7:()=>Je,Uvn:()=>H,OFT:()=>Vs,xzN:()=>wr,CcZ:()=>da,M5Z:()=>ae,ZrN:()=>g,OWs:()=>A,dF9:()=>Js,oZy:()=>Ce,rD2:()=>Ie,VHo:()=>Lt,ohE:()=>We,R$E:()=>Fn,xQN:()=>Xe,AdJ:()=>on,q3I:()=>Sr,Pab:()=>ai,uZ5:()=>Gt,McK:()=>I,F9c:()=>xo,k0b:()=>$s,hnT:()=>Ta,RSJ:()=>Ma,Mku:()=>Ra,h90:()=>Da,rms:()=>ka,ErP:()=>Sa,aVg:()=>Ba,lPc:()=>Pa,Z8E:()=>Wn,_N2:()=>ki,yFn:()=>fa,lNv:()=>Jn,cu9:()=>cr,MZQ:()=>Nn,FUM:()=>Qn,BxR:()=>nt,vdf:()=>Ee,iaL:()=>Ao,w6H:()=>Cn,Q4c:()=>ra,Xxe:()=>te,Uxb:()=>En,Yr5:()=>wo,Bhw:()=>R,yOA:()=>d});var u={};pt.r(u),pt.d(u,{ActionCompleteEvent:()=>Rs,ActionStartEvent:()=>Ps,ActivateEvent:()=>bs,CollisionEndEvent:()=>bi,CollisionPostSolveEvent:()=>ji,CollisionPreSolveEvent:()=>Ji,CollisionStartEvent:()=>yi,ContactEndEvent:()=>Zi,ContactStartEvent:()=>Wi,DeactivateEvent:()=>Es,EnterTriggerEvent:()=>Ss,EnterViewPortEvent:()=>Is,EventTypes:()=>B,ExitTriggerEvent:()=>Ts,ExitViewPortEvent:()=>Cs,GameEvent:()=>T,GameStartEvent:()=>Q,GameStopEvent:()=>$,GamepadAxisEvent:()=>$t,GamepadButtonEvent:()=>wt,GamepadConnectEvent:()=>re,GamepadDisconnectEvent:()=>St,HiddenEvent:()=>Re,InitializeEvent:()=>ii,KillEvent:()=>z,PostCollisionEvent:()=>ze,PostDebugDrawEvent:()=>tt,PostDrawEvent:()=>K,PostFrameEvent:()=>ei,PostKillEvent:()=>O,PostTransformDrawEvent:()=>ht,PostUpdateEvent:()=>gt,PreCollisionEvent:()=>bt,PreDebugDrawEvent:()=>mt,PreDrawEvent:()=>et,PreFrameEvent:()=>Pe,PreKillEvent:()=>G,PreTransformDrawEvent:()=>st,PreUpdateEvent:()=>ot,VisibleEvent:()=>Lt});var d={};pt.r(d),pt.d(d,{getAttributeComponentSize:()=>Rn,getAttributePointerType:()=>Bn,getGlTypeSizeBytes:()=>Gs});var a={};pt.r(a),pt.d(a,{circle:()=>$o,line:()=>Hs,point:()=>Xo,roundRect:()=>Ys,vector:()=>qo});var c={};pt.r(c),pt.d(c,{Axes:()=>ni,Buttons:()=>si,Gamepad:()=>Ci,Gamepads:()=>Ei,KeyEvent:()=>oi,Keyboard:()=>Ms,Keys:()=>ri,NativePointerButton:()=>Te,PointerButton:()=>_e,PointerComponent:()=>ui,PointerEvent:()=>vi,PointerEventReceiver:()=>zi,PointerScope:()=>Ge,PointerSystem:()=>_s,PointerType:()=>ve,WheelDeltaMode:()=>Xe,WheelEvent:()=>on});var g={};pt.r(g),pt.d(g,{ConsoleAppender:()=>Bs,DrawUtil:()=>a,EasingFunctions:()=>xt,LogLevel:()=>zt,Logger:()=>V,Observable:()=>fe,ScreenAppender:()=>yn,addItemToArray:()=>yo,contains:()=>Ds,delay:()=>Fs,fail:()=>In,getPosition:()=>Si,omit:()=>Sn,removeItemFromArray:()=>Be}),pt(1324),pt(3571);function m(){if(typeof window>"u"&&(window={audioContext:function(){}}),typeof window<"u"&&!window.requestAnimationFrame&&(window.requestAnimationFrame=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(r){window.setInterval(r,1e3/60)}),typeof window<"u"&&!window.cancelAnimationFrame&&(window.cancelAnimationFrame=window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(){}),typeof window<"u"&&!window.AudioContext){if(window.webkitAudioContext){const t=window.webkitAudioContext.prototype.decodeAudioData;window.webkitAudioContext.prototype.decodeAudioData=function(e){return new Promise((i,s)=>{t.call(this,e,i,s)})}}window.AudioContext=window.AudioContext||window.webkitAudioContext||window.mozAudioContext||window.msAudioContext||window.oAudioContext}typeof window<"u"&&!window.devicePixelRatio&&(window.devicePixelRatio=window.devicePixelRatio||1)}class x{static useCanvasGraphicsContext(){x.enable("use-canvas-context")}static freeze(){x._FROZEN=!0}static _reset(){x._FROZEN=!1,x._FLAGS={}}static enable(t){if(this._FROZEN)throw Error("Feature flags can only be enabled before Engine constructor time");x._FLAGS[t]=!0}static disable(t){if(this._FROZEN)throw Error("Feature flags can only be disabled before Engine constructor time");x._FLAGS[t]=!1}static isEnabled(t){return!!x._FLAGS[t]}static show(){return Object.keys(x._FLAGS)}}x._FROZEN=!1,x._FLAGS={};function I(r,t){return{type:r,value:t}}class P{constructor(){this._paused=!1,this._listeners={},this._listenersOnce={},this._pipes=[]}clear(){this._listeners={},this._listenersOnce={},this._pipes.length=0}on(t,e){var i;return this._listeners[t]=(i=this._listeners[t])!==null&&i!==void 0?i:[],this._listeners[t].push(e),{close:()=>this.off(t,e)}}once(t,e){var i;return this._listenersOnce[t]=(i=this._listenersOnce[t])!==null&&i!==void 0?i:[],this._listenersOnce[t].push(e),{close:()=>this.off(t,e)}}off(t,e){var i,s;if(e){const n=(i=this._listeners[t])===null||i===void 0?void 0:i.filter(h=>h!==e);this._listeners[t]=n;const o=(s=this._listenersOnce[t])===null||s===void 0?void 0:s.filter(h=>h!==e);this._listenersOnce[t]=o}else delete this._listeners[t]}emit(t,e){var i;if(this._paused)return;(i=this._listeners[t])===null||i===void 0||i.forEach(n=>n(e));const s=this._listenersOnce[t];this._listenersOnce[t]=[],s&&s.forEach(n=>n(e)),this._pipes.forEach(n=>{n.emit(t,e)})}pipe(t){if(this===t)throw Error("Cannot pipe to self");return this._pipes.push(t),{close:()=>{const e=this._pipes.indexOf(t);e>-1&&this._pipes.splice(e,1)}}}unpipe(t){const e=this._pipes.indexOf(t);e>-1&&this._pipes.splice(e,1)}pause(){this._paused=!0}unpause(){this._paused=!1}}var B;(function(r){r.Kill="kill",r.PreKill="prekill",r.PostKill="postkill",r.PreDraw="predraw",r.PostDraw="postdraw",r.PreDebugDraw="predebugdraw",r.PostDebugDraw="postdebugdraw",r.PreUpdate="preupdate",r.PostUpdate="postupdate",r.PreFrame="preframe",r.PostFrame="postframe",r.PreCollision="precollision",r.CollisionStart="collisionstart",r.CollisionEnd="collisionend",r.PostCollision="postcollision",r.Initialize="initialize",r.Activate="activate",r.Deactivate="deactivate",r.ExitViewport="exitviewport",r.EnterViewport="enterviewport",r.ExitTrigger="exit",r.EnterTrigger="enter",r.Connect="connect",r.Disconnect="disconnect",r.Button="button",r.Axis="axis",r.Visible="visible",r.Hidden="hidden",r.Start="start",r.Stop="stop",r.PointerUp="pointerup",r.PointerDown="pointerdown",r.PointerMove="pointermove",r.PointerEnter="pointerenter",r.PointerLeave="pointerleave",r.PointerCancel="pointercancel",r.PointerWheel="pointerwheel",r.Up="up",r.Down="down",r.Move="move",r.Enter="enter",r.Leave="leave",r.Cancel="cancel",r.Wheel="wheel",r.Press="press",r.Release="release",r.Hold="hold",r.PointerDragStart="pointerdragstart",r.PointerDragEnd="pointerdragend",r.PointerDragEnter="pointerdragenter",r.PointerDragLeave="pointerdragleave",r.PointerDragMove="pointerdragmove",r.ActionStart="actionstart",r.ActionComplete="actioncomplete"})(B||(B={}));class T{constructor(){this._bubbles=!0}get bubbles(){return this._bubbles}set bubbles(t){this._bubbles=t}stopPropagation(){this.bubbles=!1}}class z extends T{constructor(t){super(),this.target=t}}class G extends T{constructor(t){super(),this.target=t}}class O extends T{constructor(t){super(),this.target=t}}class Q extends T{constructor(t){super(),this.target=t}}class $ extends T{constructor(t){super(),this.target=t}}class et extends T{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class K extends T{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class st extends T{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class ht extends T{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class mt extends T{constructor(t,e){super(),this.ctx=t,this.target=e}}class tt extends T{constructor(t,e){super(),this.ctx=t,this.target=e}}class ot extends T{constructor(t,e,i){super(),this.engine=t,this.delta=e,this.target=i}}class gt extends T{constructor(t,e,i){super(),this.engine=t,this.delta=e,this.target=i}}class Pe extends T{constructor(t,e){super(),this.engine=t,this.prevStats=e,this.target=t}}class ei extends T{constructor(t,e){super(),this.engine=t,this.stats=e,this.target=t}}class re extends T{constructor(t,e){super(),this.index=t,this.gamepad=e,this.target=e}}class St extends T{constructor(t,e){super(),this.index=t,this.gamepad=e,this.target=e}}class wt extends T{constructor(t,e,i){super(),this.button=t,this.value=e,this.target=i}}class $t extends T{constructor(t,e,i){super(),this.axis=t,this.value=e,this.target=i}}class Lt extends T{constructor(t){super(),this.target=t}}class Re extends T{constructor(t){super(),this.target=t}}class bt extends T{constructor(t,e,i,s,n){super(),this.other=e,this.side=i,this.intersection=s,this.contact=n,this.target=t}}class ze extends T{constructor(t,e,i,s,n){super(),this.other=e,this.side=i,this.intersection=s,this.contact=n,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class Wi{constructor(t,e,i,s){this.target=t,this.other=e,this.side=i,this.contact=s}}class Zi{constructor(t,e){this.target=t,this.other=e}}class Ji{constructor(t,e,i,s,n){this.target=t,this.other=e,this.side=i,this.intersection=s,this.contact=n}}class ji{constructor(t,e,i,s,n){this.target=t,this.other=e,this.side=i,this.intersection=s,this.contact=n}}class yi extends T{constructor(t,e,i,s){super(),this.other=e,this.side=i,this.contact=s,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class bi extends T{constructor(t,e){super(),this.other=e,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class ii extends T{constructor(t,e){super(),this.engine=t,this.target=e}}class bs extends T{constructor(t,e){super(),this.context=t,this.target=e}}class Es extends T{constructor(t,e){super(),this.context=t,this.target=e}}class Cs extends T{constructor(t){super(),this.target=t}}class Is extends T{constructor(t){super(),this.target=t}}class Ss extends T{constructor(t,e){super(),this.target=t,this.actor=e}}class Ts extends T{constructor(t,e){super(),this.target=t,this.actor=e}}class Ps extends T{constructor(t,e){super(),this.action=t,this.target=e}}class Rs extends T{constructor(t,e){super(),this.action=t,this.target=e}}class Ei{constructor(){this.events=new P,this.enabled=!1,this.supported=!!navigator.getGamepads,this._gamePadTimeStamps=[0,0,0,0],this._oldPads=[],this._pads=[],this._initSuccess=!1,this._navigator=navigator,this._minimumConfiguration=null}init(){this.supported&&(this._initSuccess||(this._oldPads=this._clonePads(this._navigator.getGamepads()),this._oldPads.length&&this._oldPads[0]&&(this._initSuccess=!0)))}setMinimumGamepadConfiguration(t){this._enableAndUpdate(),this._minimumConfiguration=t}_enableAndUpdate(){this.enabled||(this.enabled=!0,this.update())}_isGamepadValid(t){if(!this._minimumConfiguration)return!0;if(!t)return!1;const e=t.axes.filter(s=>typeof s!==void 0).length,i=t.buttons.filter(s=>typeof s!==void 0).length;return e>=this._minimumConfiguration.axis&&i>=this._minimumConfiguration.buttons&&t.connected}emit(t,e){this.events.emit(t,e)}on(t,e){return this._enableAndUpdate(),this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this._enableAndUpdate(),this.events.off(t,e)}update(){if(!this.enabled||!this.supported)return;this.init();const t=this._navigator.getGamepads();for(let e=0;e=this._pads.length)for(let e=this._pads.length-1,i=t;et.connected).length}_clonePads(t){const e=[];for(let i=0,s=t.length;i=e}isButtonHeld(t,e=1){return this._buttons[t]>=e}wasButtonPressed(t,e=1){return this._buttonsDown[t]>=e}wasButtonReleased(t){return!!this._buttonsUp[t]}getButton(t){return this._buttons[t]}getAxes(t){const e=this._axes[t];return Math.abs(e)=this.defaultLevel&&this._appenders[s].log(t,e)}debug(...t){this._log(zt.Debug,t)}info(...t){this._log(zt.Info,t)}warn(...t){this._log(zt.Warn,t)}error(...t){this._log(zt.Error,t)}fatal(...t){this._log(zt.Fatal,t)}}V._INSTANCE=null;class Bs{log(t,e){if(!console&&!console.log&&console.warn&&console.error)return;const i=[];i.unshift.apply(i,e),i.unshift("["+zt[t]+"] : "),t0?n-.05:0}}function bn(){try{const r=()=>{};window.top.addEventListener("blur",r),window.top.removeEventListener("blur",r)}catch{return!0}return!1}var ri;(function(r){r.Num0="Numpad0",r.Num1="Numpad1",r.Num2="Numpad2",r.Num3="Numpad3",r.Num4="Numpad4",r.Num5="Numpad5",r.Num6="Numpad6",r.Num7="Numpad7",r.Num8="Numpad8",r.Num9="Numpad9",r.NumAdd="NumpadAdd",r.NumSubtract="NumpadSubtract",r.NumMultiply="NumpadMultiply",r.NumDivide="NumpadDivide",r.NumDecimal="NumpadDecimal",r.Numpad0="Numpad0",r.Numpad1="Numpad1",r.Numpad2="Numpad2",r.Numpad3="Numpad3",r.Numpad4="Numpad4",r.Numpad5="Numpad5",r.Numpad6="Numpad6",r.Numpad7="Numpad7",r.Numpad8="Numpad8",r.Numpad9="Numpad9",r.NumpadAdd="NumpadAdd",r.NumpadSubtract="NumpadSubtract",r.NumpadMultiply="NumpadMultiply",r.NumpadDivide="NumpadDivide",r.NumpadDecimal="NumpadDecimal",r.NumLock="NumLock",r.ShiftLeft="ShiftLeft",r.ShiftRight="ShiftRight",r.AltLeft="AltLeft",r.AltRight="AltRight",r.ControlLeft="ControlLeft",r.ControlRight="ControlRight",r.MetaLeft="MetaLeft",r.MetaRight="MetaRight",r.Key0="Digit0",r.Key1="Digit1",r.Key2="Digit2",r.Key3="Digit3",r.Key4="Digit4",r.Key5="Digit5",r.Key6="Digit6",r.Key7="Digit7",r.Key8="Digit8",r.Key9="Digit9",r.Digit0="Digit0",r.Digit1="Digit1",r.Digit2="Digit2",r.Digit3="Digit3",r.Digit4="Digit4",r.Digit5="Digit5",r.Digit6="Digit6",r.Digit7="Digit7",r.Digit8="Digit8",r.Digit9="Digit9",r.F1="F1",r.F2="F2",r.F3="F3",r.F4="F4",r.F5="F5",r.F6="F6",r.F7="F7",r.F8="F8",r.F9="F9",r.F10="F10",r.F11="F11",r.F12="F12",r.A="KeyA",r.B="KeyB",r.C="KeyC",r.D="KeyD",r.E="KeyE",r.F="KeyF",r.G="KeyG",r.H="KeyH",r.I="KeyI",r.J="KeyJ",r.K="KeyK",r.L="KeyL",r.M="KeyM",r.N="KeyN",r.O="KeyO",r.P="KeyP",r.Q="KeyQ",r.R="KeyR",r.S="KeyS",r.T="KeyT",r.U="KeyU",r.V="KeyV",r.W="KeyW",r.X="KeyX",r.Y="KeyY",r.Z="KeyZ",r.KeyA="KeyA",r.KeyB="KeyB",r.KeyC="KeyC",r.KeyD="KeyD",r.KeyE="KeyE",r.KeyF="KeyF",r.KeyG="KeyG",r.KeyH="KeyH",r.KeyI="KeyI",r.KeyJ="KeyJ",r.KeyK="KeyK",r.KeyL="KeyL",r.KeyM="KeyM",r.KeyN="KeyN",r.KeyO="KeyO",r.KeyP="KeyP",r.KeyQ="KeyQ",r.KeyR="KeyR",r.KeyS="KeyS",r.KeyT="KeyT",r.KeyU="KeyU",r.KeyV="KeyV",r.KeyW="KeyW",r.KeyX="KeyX",r.KeyY="KeyY",r.KeyZ="KeyZ",r.Semicolon="Semicolon",r.Quote="Quote",r.Comma="Comma",r.Minus="Minus",r.Period="Period",r.Slash="Slash",r.Equal="Equal",r.BracketLeft="BracketLeft",r.Backslash="Backslash",r.BracketRight="BracketRight",r.Backquote="Backquote",r.Up="ArrowUp",r.Down="ArrowDown",r.Left="ArrowLeft",r.Right="ArrowRight",r.ArrowUp="ArrowUp",r.ArrowDown="ArrowDown",r.ArrowLeft="ArrowLeft",r.ArrowRight="ArrowRight",r.Space="Space",r.Backspace="Backspace",r.Delete="Delete",r.Esc="Escape",r.Escape="Escape",r.Enter="Enter",r.NumpadEnter="NumpadEnter",r.ContextMenu="ContextMenu"})(ri||(ri={}));class oi extends T{constructor(t,e,i){super(),this.key=t,this.value=e,this.originalEvent=i}}class Ms{constructor(){this.events=new P,this._keys=[],this._keysUp=[],this._keysDown=[],this._releaseAllKeys=t=>{for(const e of this._keys){const i=new oi(e,t.key,t);this.events.emit("up",i),this.events.emit("release",i)}this._keysUp=Array.from(new Set(this._keys.concat(this._keysUp))),this._keys.length=0},this._handleKeyDown=t=>{!t.metaKey&&(this._keys.includes(ri.MetaLeft)||this._keys.includes(ri.MetaRight))&&this._releaseAllKeys(t);const e=t.code;if(this._keys.indexOf(e)===-1){this._keys.push(e),this._keysDown.push(e);const i=new oi(e,t.key,t);this.events.emit("down",i),this.events.emit("press",i)}},this._handleKeyUp=t=>{const e=t.code,i=this._keys.indexOf(e);this._keys.splice(i,1),this._keysUp.push(e);const s=new oi(e,t.key,t);this.events.emit("up",s),this.events.emit("release",s),t.key==="Meta"&&this._releaseAllKeys(t)}}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}init(t){let{global:e}=t;const{grabWindowFocus:i}=t;e||(bn()?(e=window,i&&window.focus(),V.getInstance().warn("Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus")):e=window.top),e.addEventListener("blur",()=>{this._keys.length=0}),e.addEventListener("keyup",this._handleKeyUp),e.addEventListener("keydown",this._handleKeyDown)}update(){this._keysDown.length=0,this._keysUp.length=0;for(let t=0;t-1}isHeld(t){return this._keys.indexOf(t)>-1}wasReleased(t){return this._keysUp.indexOf(t)>-1}triggerEvent(t,e,i){t==="down"&&this._handleKeyDown(new KeyboardEvent("keydown",{code:e,key:i??null})),t==="up"&&this._handleKeyUp(new KeyboardEvent("keyup",{code:e,key:i??null}))}}var Ge;(function(r){r.Canvas="Canvas",r.Document="Document"})(Ge||(Ge={}));const ks=4294967295;class Ii{constructor(t){this.seed=t,this._lowerMask=2147483647,this._upperMask=2147483648,this._w=32,this._n=624,this._m=397,this._a=2567483615,this._u=11,this._s=7,this._b=2636928640,this._t=15,this._c=4022730752,this._l=18,this._f=1812433253,this._mt=new Array(this._n),this._mt[0]=(t||Date.now())>>>0;for(let e=1;e>>this._w-2;this._mt[e]=(this._f*((i&4294901760)>>>16)<<16)+this._f*(i&65535)+e>>>0}this._index=this._n}_twist(){const t=[0,this._a];let e=0,i=0;for(;i>>1^t[e&1]&ks;for(;i>>1^t[e&1]&ks;e=this._mt[this._n-1]&this._upperMask|this._mt[0]&this._lowerMask,this._mt[this._n-1]=this._mt[this._m-1]^e>>>1^t[e&1]&ks,this._index=0}nextInt(){this._index>=this._n&&this._twist();let t=this._mt[this._index++];return t^=t>>>this._u,t^=t<>>this._l,t>>>0}next(){return this.nextInt()*(1/4294967296)}floating(t,e){return(e-t)*this.next()+t}integer(t,e){return Math.floor((e-t+1)*this.next()+t)}bool(t=.5){return this.next()<=t}pickOne(t){return t[this.integer(0,t.length-1)]}pickSet(t,e,i=!1){return i?this._pickSetWithDuplicates(t,e):this._pickSetWithoutDuplicates(t,e)}_pickSetWithoutDuplicates(t,e){if(e>t.length||e<0)throw new Error("Invalid number of elements to pick, must pick a value 0 < n <= length");if(e===t.length)return t;const i=new Array(e);let s=0;const n=t.slice(0);for(;s=0?r-Math.floor(r):r-Math.ceil(r)}function te(r){return r===0?0:r<0?-1:1}function Gt(r,t,e){return Math.min(Math.max(t,r),e)}function ai(r){let t=r;if(r>ae)for(;t>ae;)t-=ae;if(r<0)for(;t<0;)t+=ae;return t}function En(r){return 180/Math.PI*r}function wo(r){return r/180*Math.PI}const Cn=(r,t)=>Array.from(new Array(t-r+1),(e,i)=>i+r);function Ee(r,t,e=new Ii){return e?e.floating(r,t):r+Math.random()*(t-r)}function Ao(r,t,e=new Ii){return e?e.integer(r,t):Math.round(Ee(r,t))}class A{static get Zero(){return new A(0,0)}static get One(){return new A(1,1)}static get Half(){return new A(.5,.5)}static get Up(){return new A(0,-1)}static get Down(){return new A(0,1)}static get Left(){return new A(-1,0)}static get Right(){return new A(1,0)}static fromAngle(t){return new A(Math.cos(t),Math.sin(t))}static isValid(t){return!(t==null||isNaN(t.x)||isNaN(t.y)||t.x===1/0||t.y===1/0||t.x===-1/0||t.y===-1/0)}static distance(t,e){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}static min(t,e){return new A(Math.min(t.x,e.x),Math.min(t.y,e.y))}static max(t,e){return new A(Math.max(t.x,e.x),Math.max(t.y,e.y))}constructor(t,e){this._x=0,this._y=0,this._x=t,this._y=e}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}setTo(t,e){this.x=t,this.y=e}equals(t,e=.001){return Math.abs(this.x-t.x)<=e&&Math.abs(this.y-t.y)<=e}distance(t){if(!t)return Math.sqrt(this.x*this.x+this.y*this.y);const e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}squareDistance(t){t||(t=A.Zero);const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}clampMagnitude(t){const e=this.size,i=Gt(e,0,t);return this.size=i,this}get size(){return this.distance()}set size(t){const e=this.normalize().scale(t);this.setTo(e.x,e.y)}normalize(){const t=this.distance();return t>0?new A(this.x/t,this.y/t):new A(0,1)}average(t){return this.add(t).scale(.5)}scale(t,e){const i=e||new A(0,0);return t instanceof A?(i.x=this.x*t.x,i.y=this.y*t.y):(i.x=this.x*t,i.y=this.y*t),i}add(t,e){return e?(e.x=this.x+t.x,e.y=this.y+t.y,e):new A(this.x+t.x,this.y+t.y)}sub(t){return new A(this.x-t.x,this.y-t.y)}addEqual(t){return this.setTo(this.x+t.x,this.y+t.y),this}subEqual(t){return this.setTo(this.x-t.x,this.y-t.y),this}scaleEqual(t){return this.setTo(this.x*t,this.y*t),this}dot(t){return this.x*t.x+this.y*t.y}cross(t){if(t instanceof A)return this.x*t.y-this.y*t.x;if(typeof t=="number")return new A(t*this.y,-t*this.x)}static cross(t,e){return new A(-t*e.y,t*e.x)}perpendicular(){return new A(this.y,-this.x)}normal(){return this.perpendicular().normalize()}negate(){return this.scale(-1)}toAngle(){return Math.atan2(this.y,this.x)}rotate(t,e){e||(e=new A(0,0));const i=Math.sin(t),s=Math.cos(t),n=s*(this.x-e.x)-i*(this.y-e.y)+e.x,o=i*(this.x-e.x)+s*(this.y-e.y)+e.y;return new A(n,o)}clone(t){const e=t??new A(0,0);return e.x=this.x,e.y=this.y,e}toString(t){return t?`(${this.x.toFixed(t)}, ${this.y.toFixed(t)})`:`(${this.x}, ${this.y})`}}function R(r,t){return new A(r,t)}class L{constructor(t,e,i,s){this.r=t,this.g=e,this.b=i,this.a=s??1}static fromRGB(t,e,i,s){return new L(t,e,i,s)}static fromRGBString(t){const e=/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)/i;let i=null;if(i=t.match(e)){const s=parseInt(i[1],10),n=parseInt(i[2],10),o=parseInt(i[3],10);let h=1;return i[4]&&(h=parseFloat(i[4])),new L(s,n,o,h)}else throw new Error("Invalid rgb/a string: "+t)}static fromHex(t){const e=/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;let i=null;if(i=t.match(e)){const s=parseInt(i[1],16),n=parseInt(i[2],16),o=parseInt(i[3],16);let h=1;return i[4]&&(h=parseInt(i[4],16)/255),new L(s,n,o,h)}else throw new Error("Invalid hex string: "+t)}static fromHSL(t,e,i,s=1){return new he(t,e,i,s).toRGBA()}lighten(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.l+=(1-e.l)*t,e.toRGBA()}darken(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.l-=e.l*t,e.toRGBA()}saturate(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.s+=e.s*t,e.toRGBA()}desaturate(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.s-=e.s*t,e.toRGBA()}multiply(t){const e=t.r/255*this.r/255*255,i=t.g/255*this.g/255*255,s=t.b/255*this.b/255*255,n=t.a*this.a;return new L(e,i,s,n)}screen(t){const e=t.invert(),i=t.invert();return e.multiply(i).invert()}invert(){return new L(255-this.r,255-this.g,255-this.b,1-this.a)}average(t){const e=(t.r+this.r)/2,i=(t.g+this.g)/2,s=(t.b+this.b)/2,n=(t.a+this.a)/2;return new L(e,i,s,n)}equal(t){return this.toString()===t.toString()}toString(t="rgb"){switch(t){case"rgb":return this.toRGBA();case"hsl":return this.toHSLA();case"hex":return this.toHex();default:throw new Error("Invalid Color format")}}_componentToHex(t){const e=t.toString(16);return e.length===1?"0"+e:e}toHex(){return"#"+this._componentToHex(this.r)+this._componentToHex(this.g)+this._componentToHex(this.b)}toRGBA(){const t=String(this.r.toFixed(0))+", "+String(this.g.toFixed(0))+", "+String(this.b.toFixed(0));return this.a!==void 0||this.a!==null?"rgba("+t+", "+String(this.a)+")":"rgb("+t+")"}toHSLA(){return he.fromRGBA(this.r,this.g,this.b,this.a).toString()}fillStyle(){return this.toString()}clone(){return new L(this.r,this.g,this.b,this.a)}static get Black(){return L.fromHex("#000000")}static get White(){return L.fromHex("#FFFFFF")}static get Gray(){return L.fromHex("#808080")}static get LightGray(){return L.fromHex("#D3D3D3")}static get DarkGray(){return L.fromHex("#A9A9A9")}static get Yellow(){return L.fromHex("#FFFF00")}static get Orange(){return L.fromHex("#FFA500")}static get Red(){return L.fromHex("#FF0000")}static get Vermilion(){return L.fromHex("#FF5B31")}static get Rose(){return L.fromHex("#FF007F")}static get Magenta(){return L.fromHex("#FF00FF")}static get Violet(){return L.fromHex("#7F00FF")}static get Blue(){return L.fromHex("#0000FF")}static get Azure(){return L.fromHex("#007FFF")}static get Cyan(){return L.fromHex("#00FFFF")}static get Viridian(){return L.fromHex("#59978F")}static get Green(){return L.fromHex("#00FF00")}static get Chartreuse(){return L.fromHex("#7FFF00")}static get Transparent(){return L.fromHex("#FFFFFF00")}static get ExcaliburBlue(){return L.fromHex("#176BAA")}}class he{constructor(t,e,i,s){this.h=t,this.s=e,this.l=i,this.a=s}static hue2rgb(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+(e-t)*6*i:i<1/2?e:i<2/3?t+(e-t)*(2/3-i)*6:t}static fromRGBA(t,e,i,s){t/=255,e/=255,i/=255;const n=Math.max(t,e,i),o=Math.min(t,e,i);let h,l;const f=(n+o)/2;if(n===o)h=l=0;else{const p=n-o;switch(l=f>.5?p/(2-n-o):p/(n+o),n){case t:h=(e-i)/p+(eo&&(o=s[l].dot(i),h=l);return n[h]}r.fromDirection=e}(_t||(_t={}));class J{constructor(t=0,e=0,i=0,s=0){typeof t=="object"?(this.left=t.left,this.top=t.top,this.right=t.right,this.bottom=t.bottom):typeof t=="number"&&(this.left=t,this.top=e,this.right=i,this.bottom=s)}clone(){return new J(this.left,this.top,this.right,this.bottom)}static getSideFromIntersection(t){return t&&t?Math.abs(t.x)>Math.abs(t.y)?t.x<0?_t.Right:_t.Left:t.y<0?_t.Bottom:_t.Top:_t.None}static fromPoints(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(let o=0;os&&(s=t[o].x),t[o].yn&&(n=t[o].y);return new J(e,i,s,n)}static fromDimension(t,e,i=A.Half,s=A.Zero){return new J(-t*i.x+s.x,-e*i.y+s.y,t-t*i.x+s.x,e-e*i.y+s.y)}get width(){return this.right-this.left}get height(){return this.bottom-this.top}hasZeroDimensions(){return this.width===0||this.height===0}get center(){return new A((this.left+this.right)/2,(this.top+this.bottom)/2)}translate(t){return new J(this.left+t.x,this.top+t.y,this.right+t.x,this.bottom+t.y)}rotate(t,e=A.Zero){const i=this.getPoints().map(s=>s.rotate(t,e));return J.fromPoints(i)}scale(t,e=A.Zero){const i=this.translate(e);return new J(i.left*t.x,i.top*t.y,i.right*t.x,i.bottom*t.y)}transform(t){const e=t.data[0]*this.left,i=t.data[1]*this.left,s=t.data[0]*this.right,n=t.data[1]*this.right,o=t.data[2]*this.top,h=t.data[3]*this.top,l=t.data[2]*this.bottom,f=t.data[3]*this.bottom,p=t.getPosition(),v=Math.min(e,s)+Math.min(o,l)+p.x,w=Math.min(i,n)+Math.min(h,f)+p.y,y=Math.max(e,s)+Math.max(o,l)+p.x,b=Math.max(i,n)+Math.max(h,f)+p.y;return new J({left:v,top:w,right:y,bottom:b})}getPerimeter(){const t=this.width,e=this.height;return 2*(t+e)}getPoints(){const t=[];return t.push(new A(this.left,this.top)),t.push(new A(this.right,this.top)),t.push(new A(this.right,this.bottom)),t.push(new A(this.left,this.bottom)),t}rayCast(t,e=1/0){let i=-1/0,s=1/0;const n=t.dir.x===0?Number.MAX_VALUE:1/t.dir.x,o=t.dir.y===0?Number.MAX_VALUE:1/t.dir.y,h=(this.left-t.pos.x)*n,l=(this.right-t.pos.x)*n;i=Math.min(h,l),s=Math.max(h,l);const f=(this.top-t.pos.y)*o,p=(this.bottom-t.pos.y)*o;return i=Math.max(i,Math.min(f,p)),s=Math.min(s,Math.max(f,p)),s>=Math.max(0,i)&&i=Math.max(0,i)&&i=t.y&&this.right>=t.x:t instanceof J?this.left<=t.left&&this.top<=t.top&&t.bottom<=this.bottom&&t.right<=this.right:!1}combine(t){return new J(Math.min(this.left,t.left),Math.min(this.top,t.top),Math.max(this.right,t.right),Math.max(this.bottom,t.bottom))}get dimensions(){return new A(this.width,this.height)}overlaps(t,e){const i=e||0;if(t.hasZeroDimensions())return this.contains(t);if(this.hasZeroDimensions())return t.contains(this);const s=this.combine(t);return s.width+i=t.left&&this.right<=t.right?i=t.left-this.right:i=t.right-this.left;let s=0;return this.top<=t.bottom&&this.top>=t.top?s=t.bottom-this.top:s=t.top-this.bottom,Math.abs(i)=0?this.right-t.right<=t.left-this.left?i=t.left-this.right:i=t.right-this.left:t.right-this.right<=this.left-t.left?i=this.left-t.right:i=this.right-t.left;let s=0;return this.height-t.height>=0?this.bottom-t.bottom<=t.top-this.top?s=t.top-this.bottom:s=t.bottom-this.top:t.bottom-this.bottom<=this.top-t.top?s=this.top-t.bottom:s=this.bottom-t.top,Math.abs(i){this._resolver=t,this._rejecter=e})}get isCompleted(){return this._isCompleted}resolve(t){this._isCompleted||(this._isCompleted=!0,this._resolver(t))}reject(t){this._isCompleted||(this._isCompleted=!0,this._rejecter(t))}}function Si(r){let t=0,e=0;const i=n=>{t+=n.offsetLeft,n.offsetParent&&i(n.offsetParent)},s=n=>{e+=n.offsetTop,n.offsetParent&&s(n.offsetParent)};return i(r),s(r),new A(t,e)}function yo(r,t){return t.indexOf(r)===-1?(t.push(r),!0):!1}function Be(r,t){let e=-1;return(e=t.indexOf(r))>-1?(t.splice(e,1),!0):!1}function Ds(r,t){for(let e=0;e{i.resolve()},r),i.promise}function Sn(r,t){const e={};for(const i in r)t.includes(i)||(e[i]=r[i]);return e}var Os;(function(r){r[r.X=12]="X",r[r.Y=13]="Y"})(Os||(Os={}));class Jt{constructor(){this.data=new Float32Array(16),this._scaleX=1,this._scaleSignX=1,this._scaleY=1,this._scaleSignY=1}static ortho(t,e,i,s,n,o){const h=new Jt;return h.data[0]=2/(e-t),h.data[1]=0,h.data[2]=0,h.data[3]=0,h.data[4]=0,h.data[5]=2/(s-i),h.data[6]=0,h.data[7]=0,h.data[8]=0,h.data[9]=0,h.data[10]=-2/(o-n),h.data[11]=0,h.data[12]=-(e+t)/(e-t),h.data[13]=-(s+i)/(s-i),h.data[14]=-(o+n)/(o-n),h.data[15]=1,h}clone(t){const e=t||new Jt;return e.data[0]=this.data[0],e.data[1]=this.data[1],e.data[2]=this.data[2],e.data[3]=this.data[3],e.data[4]=this.data[4],e.data[5]=this.data[5],e.data[6]=this.data[6],e.data[7]=this.data[7],e.data[8]=this.data[8],e.data[9]=this.data[9],e.data[10]=this.data[10],e.data[11]=this.data[11],e.data[12]=this.data[12],e.data[13]=this.data[13],e.data[14]=this.data[14],e.data[15]=this.data[15],e}toDOMMatrix(){return new DOMMatrix([...this.data])}static fromFloat32Array(t){const e=new Jt;return e.data=t,e}static identity(){const t=new Jt;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=0,t.data[4]=0,t.data[5]=1,t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=0,t.data[13]=0,t.data[14]=0,t.data[15]=1,t}reset(){const t=this;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=0,t.data[4]=0,t.data[5]=1,t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=0,t.data[13]=0,t.data[14]=0,t.data[15]=1,t}static translation(t,e){const i=Jt.identity();return i.data[12]=t,i.data[13]=e,i}static scale(t,e){const i=Jt.identity();return i.data[0]=t,i.data[5]=e,i.data[10]=1,i.data[15]=1,i}static rotation(t){const e=Jt.identity();return e.data[0]=Math.cos(t),e.data[4]=-Math.sin(t),e.data[1]=Math.sin(t),e.data[5]=Math.cos(t),e}multiply(t,e){if(t instanceof A){const i=e||new A(0,0),s=t,n=s.x*this.data[0]+s.y*this.data[4]+this.data[12],o=s.x*this.data[1]+s.y*this.data[5]+this.data[13];return i.x=n,i.y=o,i}else{const i=e||new Jt,s=t,n=this.data[0],o=this.data[1],h=this.data[2],l=this.data[3],f=this.data[4],p=this.data[5],v=this.data[6],w=this.data[7],y=this.data[8],b=this.data[9],k=this.data[10],D=this.data[11],C=this.data[12],E=this.data[13],F=this.data[14],U=this.data[15],j=s.data[0],Y=s.data[1],M=s.data[2],rt=s.data[3],ct=s.data[4],ft=s.data[5],at=s.data[6],It=s.data[7],qt=s.data[8],Wt=s.data[9],Zt=s.data[10],ue=s.data[11],xe=s.data[12],we=s.data[13],X=s.data[14],qe=s.data[15];i.data[0]=n*j+f*Y+y*M+C*rt,i.data[1]=o*j+p*Y+b*M+E*rt,i.data[2]=h*j+v*Y+k*M+F*rt,i.data[3]=l*j+w*Y+D*M+U*rt,i.data[4]=n*ct+f*ft+y*at+C*It,i.data[5]=o*ct+p*ft+b*at+E*It,i.data[6]=h*ct+v*ft+k*at+F*It,i.data[7]=l*ct+w*ft+D*at+U*It,i.data[8]=n*qt+f*Wt+y*Zt+C*ue,i.data[9]=o*qt+p*Wt+b*Zt+E*ue,i.data[10]=h*qt+v*Wt+k*Zt+F*ue,i.data[11]=l*qt+w*Wt+D*Zt+U*ue,i.data[12]=n*xe+f*we+y*X+C*qe,i.data[13]=o*xe+p*we+b*X+E*qe,i.data[14]=h*xe+v*we+k*X+F*qe,i.data[15]=l*xe+w*we+D*X+U*qe;const wi=this.getScale();return i._scaleSignX=te(wi.x)*te(i._scaleSignX),i._scaleSignY=te(wi.y)*te(i._scaleSignY),i}}translate(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5],f=this.data[6],p=this.data[7],v=this.data[8],w=this.data[9],y=this.data[10],b=this.data[11],k=this.data[12],D=this.data[13],C=this.data[14],E=this.data[15],F=0,U=1;return this.data[12]=i*t+h*e+v*F+k*U,this.data[13]=s*t+l*e+w*F+D*U,this.data[14]=n*t+f*e+y*F+C*U,this.data[15]=o*t+p*e+b*F+E*U,this}setPosition(t,e){this.data[12]=t,this.data[13]=e}getPosition(){return R(this.data[12],this.data[13])}rotate(t){const e=this.data[0],i=this.data[1],s=this.data[2],n=this.data[3],o=this.data[4],h=this.data[5],l=this.data[6],f=this.data[7],p=Math.sin(t),v=Math.cos(t);return this.data[0]=v*e+p*o,this.data[1]=v*i+p*h,this.data[2]=v*s+p*l,this.data[3]=v*n+p*f,this.data[4]=v*o-p*e,this.data[5]=v*h-p*i,this.data[6]=v*l-p*s,this.data[7]=v*f-p*n,this}scale(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5],f=this.data[6],p=this.data[7];return this.data[0]=i*t,this.data[1]=s*t,this.data[2]=n*t,this.data[3]=o*t,this.data[4]=h*e,this.data[5]=l*e,this.data[6]=f*e,this.data[7]=p*e,this}setRotation(t){const e=this.getScale(),i=Math.sin(t),s=Math.cos(t);this.data[0]=s*e.x,this.data[1]=i*e.y,this.data[4]=-i*e.x,this.data[5]=s*e.y}getRotation(){const t=Math.atan2(this.data[1]/this.getScaleY(),this.data[0]/this.getScaleX());return ai(t)}getScaleX(){const t=R(this.data[0],this.data[4]).size;return this._scaleSignX*t}getScaleY(){const t=R(this.data[1],this.data[5]).size;return this._scaleSignY*t}getScale(){return R(this.getScaleX(),this.getScaleY())}setScaleX(t){if(this._scaleX===t)return;this._scaleSignX=te(t);const e=R(this.data[0]*this._scaleSignX,this.data[4]*this._scaleSignX).normalize();this.data[0]=e.x*t,this.data[4]=e.y*t,this._scaleX=t}setScaleY(t){if(this._scaleY===t)return;this._scaleSignY=te(t);const e=R(this.data[1]*this._scaleSignY,this.data[5]*this._scaleSignY).normalize();this.data[1]=e.x*t,this.data[5]=e.y*t,this._scaleY=t}setScale(t){this.setScaleX(t.x),this.setScaleY(t.y)}getBasisDeterminant(){return this.data[0]*this.data[5]-this.data[1]*this.data[4]}getAffineInverse(t){const i=1/this.getBasisDeterminant(),s=this.data[0],n=this.data[4],o=this.data[1],h=this.data[5],l=t||Jt.identity();l.data[0]=h*i,l.data[1]=-o*i,l.data[4]=-n*i,l.data[5]=s*i;const f=this.data[12],p=this.data[13];return l.data[12]=-(f*l.data[0]+p*l.data[4]),l.data[13]=-(f*l.data[1]+p*l.data[5]),l}isIdentity(){return this.data[0]===1&&this.data[1]===0&&this.data[2]===0&&this.data[3]===0&&this.data[4]===0&&this.data[5]===1&&this.data[6]===0&&this.data[7]===0&&this.data[8]===0&&this.data[9]===0&&this.data[10]===1&&this.data[11]===0&&this.data[12]===0&&this.data[13]===0&&this.data[14]===0&&this.data[15]===1}toString(){return` +`)}},1324:(u,d,a)=>{a(7206);var c=a(8193);u.exports=c("Array","sort")},3571:(u,d,a)=>{a(9867);var c=a(8588);u.exports=c.Object.keys},1052:(u,d,a)=>{var c=a(688),g=a(3397),p=TypeError;u.exports=function(x){if(c(x))return x;throw new p(g(x)+" is not a function")}},9175:(u,d,a)=>{var c=a(5309),g=String,p=TypeError;u.exports=function(x){if(c(x))return x;throw new p(g(x)+" is not an object")}},1138:(u,d,a)=>{var c=a(6854),g=a(7352),p=a(8344),x=function(C){return function(T,B,P){var z=c(T),G=p(z),O=g(P,G),Q;if(C&&B!==B){for(;G>O;)if(Q=z[O++],Q!==Q)return!0}else for(;G>O;O++)if((C||O in z)&&z[O]===B)return C||O||0;return!C&&-1}};u.exports={includes:x(!0),indexOf:x(!1)}},567:(u,d,a)=>{var c=a(4694);u.exports=function(g,p){var x=[][g];return!!x&&c(function(){x.call(null,p||function(){return 1},1)})}},6403:(u,d,a)=>{var c=a(7352),g=a(8344),p=a(3182),x=Array,C=Math.max;u.exports=function(T,B,P){for(var z=g(T),G=c(B,z),O=c(P===void 0?z:P,z),Q=x(C(O-G,0)),$=0;G{var c=a(6403),g=Math.floor,p=function(T,B){var P=T.length,z=g(P/2);return P<8?x(T,B):C(T,p(c(T,0,z),B),p(c(T,z),B),B)},x=function(T,B){for(var P=T.length,z=1,G,O;z0;)T[O]=T[--O];O!==z++&&(T[O]=G)}return T},C=function(T,B,P,z){for(var G=B.length,O=P.length,Q=0,$=0;Q{var c=a(9668),g=c({}.toString),p=c("".slice);u.exports=function(x){return p(g(x),8,-1)}},1566:(u,d,a)=>{var c=a(2522),g=a(688),p=a(2177),x=a(2032),C=x("toStringTag"),T=Object,B=p(function(){return arguments}())==="Arguments",P=function(z,G){try{return z[G]}catch{}};u.exports=c?p:function(z){var G,O,Q;return z===void 0?"Undefined":z===null?"Null":typeof(O=P(G=T(z),C))=="string"?O:B?p(G):(Q=p(G))==="Object"&&g(G.callee)?"Arguments":Q}},3891:(u,d,a)=>{var c=a(4678),g=a(990),p=a(7537),x=a(2131);u.exports=function(C,T,B){for(var P=g(T),z=x.f,G=p.f,O=0;O{var c=a(9924),g=a(2131),p=a(7781);u.exports=c?function(x,C,T){return g.f(x,C,p(1,T))}:function(x,C,T){return x[C]=T,x}},7781:u=>{u.exports=function(d,a){return{enumerable:!(d&1),configurable:!(d&2),writable:!(d&4),value:a}}},3182:(u,d,a)=>{var c=a(2358),g=a(2131),p=a(7781);u.exports=function(x,C,T){var B=c(C);B in x?g.f(x,B,p(0,T)):x[B]=T}},2470:(u,d,a)=>{var c=a(688),g=a(2131),p=a(1135),x=a(1604);u.exports=function(C,T,B,P){P||(P={});var z=P.enumerable,G=P.name!==void 0?P.name:T;if(c(B)&&p(B,G,P),P.global)z?C[T]=B:x(T,B);else{try{P.unsafe?C[T]&&(z=!0):delete C[T]}catch{}z?C[T]=B:g.f(C,T,{value:B,enumerable:!1,configurable:!P.nonConfigurable,writable:!P.nonWritable})}return C}},1604:(u,d,a)=>{var c=a(2150),g=Object.defineProperty;u.exports=function(p,x){try{g(c,p,{value:x,configurable:!0,writable:!0})}catch{c[p]=x}return x}},955:(u,d,a)=>{var c=a(3397),g=TypeError;u.exports=function(p,x){if(!delete p[x])throw new g("Cannot delete property "+c(x)+" of "+c(p))}},9924:(u,d,a)=>{var c=a(4694);u.exports=!c(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7})},1811:u=>{var d=typeof document=="object"&&document.all,a=typeof d>"u"&&d!==void 0;u.exports={all:d,IS_HTMLDDA:a}},1442:(u,d,a)=>{var c=a(2150),g=a(5309),p=c.document,x=g(p)&&g(p.createElement);u.exports=function(C){return x?p.createElement(C):{}}},9016:(u,d,a)=>{var c=a(1370),g=c.match(/firefox\/(\d+)/i);u.exports=!!g&&+g[1]},821:(u,d,a)=>{var c=a(1370);u.exports=/MSIE|Trident/.test(c)},1370:u=>{u.exports=typeof navigator<"u"&&String(navigator.userAgent)||""},7067:(u,d,a)=>{var c=a(2150),g=a(1370),p=c.process,x=c.Deno,C=p&&p.versions||x&&x.version,T=C&&C.v8,B,P;T&&(B=T.split("."),P=B[0]>0&&B[0]<4?1:+(B[0]+B[1])),!P&&g&&(B=g.match(/Edge\/(\d+)/),(!B||B[1]>=74)&&(B=g.match(/Chrome\/(\d+)/),B&&(P=+B[1]))),u.exports=P},4389:(u,d,a)=>{var c=a(1370),g=c.match(/AppleWebKit\/(\d+)\./);u.exports=!!g&&+g[1]},8193:(u,d,a)=>{var c=a(2150),g=a(9668);u.exports=function(p,x){return g(c[p].prototype[x])}},2367:u=>{u.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},5532:(u,d,a)=>{var c=a(2150),g=a(7537).f,p=a(2385),x=a(2470),C=a(1604),T=a(3891),B=a(1633);u.exports=function(P,z){var G=P.target,O=P.global,Q=P.stat,$,et,X,st,ht,mt;if(O?et=c:Q?et=c[G]||C(G,{}):et=(c[G]||{}).prototype,et)for(X in z){if(ht=z[X],P.dontCallGetSet?(mt=g(et,X),st=mt&&mt.value):st=et[X],$=B(O?X:G+(Q?".":"#")+X,P.forced),!$&&st!==void 0){if(typeof ht==typeof st)continue;T(ht,st)}(P.sham||st&&st.sham)&&p(ht,"sham",!0),x(et,X,ht,P)}}},4694:u=>{u.exports=function(d){try{return!!d()}catch{return!0}}},6398:(u,d,a)=>{var c=a(4694);u.exports=!c(function(){var g=(function(){}).bind();return typeof g!="function"||g.hasOwnProperty("prototype")})},8724:(u,d,a)=>{var c=a(6398),g=Function.prototype.call;u.exports=c?g.bind(g):function(){return g.apply(g,arguments)}},453:(u,d,a)=>{var c=a(9924),g=a(4678),p=Function.prototype,x=c&&Object.getOwnPropertyDescriptor,C=g(p,"name"),T=C&&(function(){}).name==="something",B=C&&(!c||c&&x(p,"name").configurable);u.exports={EXISTS:C,PROPER:T,CONFIGURABLE:B}},9668:(u,d,a)=>{var c=a(6398),g=Function.prototype,p=g.call,x=c&&g.bind.bind(p,p);u.exports=c?x:function(C){return function(){return p.apply(C,arguments)}}},2160:(u,d,a)=>{var c=a(2150),g=a(688),p=function(x){return g(x)?x:void 0};u.exports=function(x,C){return arguments.length<2?p(c[x]):c[x]&&c[x][C]}},5383:(u,d,a)=>{var c=a(1052),g=a(5268);u.exports=function(p,x){var C=p[x];return g(C)?void 0:c(C)}},2150:function(u,d,a){var c=function(g){return g&&g.Math===Math&&g};u.exports=c(typeof globalThis=="object"&&globalThis)||c(typeof window=="object"&&window)||c(typeof self=="object"&&self)||c(typeof a.g=="object"&&a.g)||c(typeof this=="object"&&this)||function(){return this}()||Function("return this")()},4678:(u,d,a)=>{var c=a(9668),g=a(298),p=c({}.hasOwnProperty);u.exports=Object.hasOwn||function(C,T){return p(g(C),T)}},7390:u=>{u.exports={}},7913:(u,d,a)=>{var c=a(9924),g=a(4694),p=a(1442);u.exports=!c&&!g(function(){return Object.defineProperty(p("div"),"a",{get:function(){return 7}}).a!==7})},4347:(u,d,a)=>{var c=a(9668),g=a(4694),p=a(2177),x=Object,C=c("".split);u.exports=g(function(){return!x("z").propertyIsEnumerable(0)})?function(T){return p(T)==="String"?C(T,""):x(T)}:x},1881:(u,d,a)=>{var c=a(9668),g=a(688),p=a(6762),x=c(Function.toString);g(p.inspectSource)||(p.inspectSource=function(C){return x(C)}),u.exports=p.inspectSource},7804:(u,d,a)=>{var c=a(4724),g=a(2150),p=a(5309),x=a(2385),C=a(4678),T=a(6762),B=a(1962),P=a(7390),z="Object already initialized",G=g.TypeError,O=g.WeakMap,Q,$,et,X=function(tt){return et(tt)?$(tt):Q(tt,{})},st=function(tt){return function(ot){var gt;if(!p(ot)||(gt=$(ot)).type!==tt)throw new G("Incompatible receiver, "+tt+" required");return gt}};if(c||T.state){var ht=T.state||(T.state=new O);ht.get=ht.get,ht.has=ht.has,ht.set=ht.set,Q=function(tt,ot){if(ht.has(tt))throw new G(z);return ot.facade=tt,ht.set(tt,ot),ot},$=function(tt){return ht.get(tt)||{}},et=function(tt){return ht.has(tt)}}else{var mt=B("state");P[mt]=!0,Q=function(tt,ot){if(C(tt,mt))throw new G(z);return ot.facade=tt,x(tt,mt,ot),ot},$=function(tt){return C(tt,mt)?tt[mt]:{}},et=function(tt){return C(tt,mt)}}u.exports={set:Q,get:$,has:et,enforce:X,getterFor:st}},688:(u,d,a)=>{var c=a(1811),g=c.all;u.exports=c.IS_HTMLDDA?function(p){return typeof p=="function"||p===g}:function(p){return typeof p=="function"}},1633:(u,d,a)=>{var c=a(4694),g=a(688),p=/#|\.prototype\./,x=function(z,G){var O=T[C(z)];return O===P?!0:O===B?!1:g(G)?c(G):!!G},C=x.normalize=function(z){return String(z).replace(p,".").toLowerCase()},T=x.data={},B=x.NATIVE="N",P=x.POLYFILL="P";u.exports=x},5268:u=>{u.exports=function(d){return d==null}},5309:(u,d,a)=>{var c=a(688),g=a(1811),p=g.all;u.exports=g.IS_HTMLDDA?function(x){return typeof x=="object"?x!==null:c(x)||x===p}:function(x){return typeof x=="object"?x!==null:c(x)}},6555:u=>{u.exports=!1},7935:(u,d,a)=>{var c=a(2160),g=a(688),p=a(6148),x=a(4866),C=Object;u.exports=x?function(T){return typeof T=="symbol"}:function(T){var B=c("Symbol");return g(B)&&p(B.prototype,C(T))}},8344:(u,d,a)=>{var c=a(7331);u.exports=function(g){return c(g.length)}},1135:(u,d,a)=>{var c=a(9668),g=a(4694),p=a(688),x=a(4678),C=a(9924),T=a(453).CONFIGURABLE,B=a(1881),P=a(7804),z=P.enforce,G=P.get,O=String,Q=Object.defineProperty,$=c("".slice),et=c("".replace),X=c([].join),st=C&&!g(function(){return Q(function(){},"length",{value:8}).length!==8}),ht=String(String).split("String"),mt=u.exports=function(tt,ot,gt){$(O(ot),0,7)==="Symbol("&&(ot="["+et(O(ot),/^Symbol\(([^)]*)\)/,"$1")+"]"),gt&>.getter&&(ot="get "+ot),gt&>.setter&&(ot="set "+ot),(!x(tt,"name")||T&&tt.name!==ot)&&(C?Q(tt,"name",{value:ot,configurable:!0}):tt.name=ot),st&>&&x(gt,"arity")&&tt.length!==gt.arity&&Q(tt,"length",{value:gt.arity});try{gt&&x(gt,"constructor")&>.constructor?C&&Q(tt,"prototype",{writable:!1}):tt.prototype&&(tt.prototype=void 0)}catch{}var Pe=z(tt);return x(Pe,"source")||(Pe.source=X(ht,typeof ot=="string"?ot:"")),tt};Function.prototype.toString=mt(function(){return p(this)&&G(this).source||B(this)},"toString")},1787:u=>{var d=Math.ceil,a=Math.floor;u.exports=Math.trunc||function(g){var p=+g;return(p>0?a:d)(p)}},2131:(u,d,a)=>{var c=a(9924),g=a(7913),p=a(2666),x=a(9175),C=a(2358),T=TypeError,B=Object.defineProperty,P=Object.getOwnPropertyDescriptor,z="enumerable",G="configurable",O="writable";d.f=c?p?function($,et,X){if(x($),et=C(et),x(X),typeof $=="function"&&et==="prototype"&&"value"in X&&O in X&&!X[O]){var st=P($,et);st&&st[O]&&($[et]=X.value,X={configurable:G in X?X[G]:st[G],enumerable:z in X?X[z]:st[z],writable:!1})}return B($,et,X)}:B:function($,et,X){if(x($),et=C(et),x(X),g)try{return B($,et,X)}catch{}if("get"in X||"set"in X)throw new T("Accessors not supported");return"value"in X&&($[et]=X.value),$}},7537:(u,d,a)=>{var c=a(9924),g=a(8724),p=a(8208),x=a(7781),C=a(6854),T=a(2358),B=a(4678),P=a(7913),z=Object.getOwnPropertyDescriptor;d.f=c?z:function(O,Q){if(O=C(O),Q=T(Q),P)try{return z(O,Q)}catch{}if(B(O,Q))return x(!g(p.f,O,Q),O[Q])}},6217:(u,d,a)=>{var c=a(1528),g=a(2367),p=g.concat("length","prototype");d.f=Object.getOwnPropertyNames||function(C){return c(C,p)}},5168:(u,d)=>{d.f=Object.getOwnPropertySymbols},6148:(u,d,a)=>{var c=a(9668);u.exports=c({}.isPrototypeOf)},1528:(u,d,a)=>{var c=a(9668),g=a(4678),p=a(6854),x=a(1138).indexOf,C=a(7390),T=c([].push);u.exports=function(B,P){var z=p(B),G=0,O=[],Q;for(Q in z)!g(C,Q)&&g(z,Q)&&T(O,Q);for(;P.length>G;)g(z,Q=P[G++])&&(~x(O,Q)||T(O,Q));return O}},1728:(u,d,a)=>{var c=a(1528),g=a(2367);u.exports=Object.keys||function(x){return c(x,g)}},8208:(u,d)=>{var a={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,g=c&&!a.call({1:2},1);d.f=g?function(x){var C=c(this,x);return!!C&&C.enumerable}:a},110:(u,d,a)=>{var c=a(8724),g=a(688),p=a(5309),x=TypeError;u.exports=function(C,T){var B,P;if(T==="string"&&g(B=C.toString)&&!p(P=c(B,C))||g(B=C.valueOf)&&!p(P=c(B,C))||T!=="string"&&g(B=C.toString)&&!p(P=c(B,C)))return P;throw new x("Can't convert object to primitive value")}},990:(u,d,a)=>{var c=a(2160),g=a(9668),p=a(6217),x=a(5168),C=a(9175),T=g([].concat);u.exports=c("Reflect","ownKeys")||function(P){var z=p.f(C(P)),G=x.f;return G?T(z,G(P)):z}},8588:(u,d,a)=>{var c=a(2150);u.exports=c},1166:(u,d,a)=>{var c=a(5268),g=TypeError;u.exports=function(p){if(c(p))throw new g("Can't call method on "+p);return p}},1962:(u,d,a)=>{var c=a(2645),g=a(5736),p=c("keys");u.exports=function(x){return p[x]||(p[x]=g(x))}},6762:(u,d,a)=>{var c=a(2150),g=a(1604),p="__core-js_shared__",x=c[p]||g(p,{});u.exports=x},2645:(u,d,a)=>{var c=a(6555),g=a(6762);(u.exports=function(p,x){return g[p]||(g[p]=x!==void 0?x:{})})("versions",[]).push({version:"3.33.3",mode:c?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.33.3/LICENSE",source:"https://github.com/zloirock/core-js"})},4112:(u,d,a)=>{var c=a(7067),g=a(4694),p=a(2150),x=p.String;u.exports=!!Object.getOwnPropertySymbols&&!g(function(){var C=Symbol("symbol detection");return!x(C)||!(Object(C)instanceof Symbol)||!Symbol.sham&&c&&c<41})},7352:(u,d,a)=>{var c=a(1680),g=Math.max,p=Math.min;u.exports=function(x,C){var T=c(x);return T<0?g(T+C,0):p(T,C)}},6854:(u,d,a)=>{var c=a(4347),g=a(1166);u.exports=function(p){return c(g(p))}},1680:(u,d,a)=>{var c=a(1787);u.exports=function(g){var p=+g;return p!==p||p===0?0:c(p)}},7331:(u,d,a)=>{var c=a(1680),g=Math.min;u.exports=function(p){return p>0?g(c(p),9007199254740991):0}},298:(u,d,a)=>{var c=a(1166),g=Object;u.exports=function(p){return g(c(p))}},1272:(u,d,a)=>{var c=a(8724),g=a(5309),p=a(7935),x=a(5383),C=a(110),T=a(2032),B=TypeError,P=T("toPrimitive");u.exports=function(z,G){if(!g(z)||p(z))return z;var O=x(z,P),Q;if(O){if(G===void 0&&(G="default"),Q=c(O,z,G),!g(Q)||p(Q))return Q;throw new B("Can't convert object to primitive value")}return G===void 0&&(G="number"),C(z,G)}},2358:(u,d,a)=>{var c=a(1272),g=a(7935);u.exports=function(p){var x=c(p,"string");return g(x)?x:x+""}},2522:(u,d,a)=>{var c=a(2032),g=c("toStringTag"),p={};p[g]="z",u.exports=String(p)==="[object z]"},599:(u,d,a)=>{var c=a(1566),g=String;u.exports=function(p){if(c(p)==="Symbol")throw new TypeError("Cannot convert a Symbol value to a string");return g(p)}},3397:u=>{var d=String;u.exports=function(a){try{return d(a)}catch{return"Object"}}},5736:(u,d,a)=>{var c=a(9668),g=0,p=Math.random(),x=c(1 .toString);u.exports=function(C){return"Symbol("+(C===void 0?"":C)+")_"+x(++g+p,36)}},4866:(u,d,a)=>{var c=a(4112);u.exports=c&&!Symbol.sham&&typeof Symbol.iterator=="symbol"},2666:(u,d,a)=>{var c=a(9924),g=a(4694);u.exports=c&&g(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42})},4724:(u,d,a)=>{var c=a(2150),g=a(688),p=c.WeakMap;u.exports=g(p)&&/native code/.test(String(p))},2032:(u,d,a)=>{var c=a(2150),g=a(2645),p=a(4678),x=a(5736),C=a(4112),T=a(4866),B=c.Symbol,P=g("wks"),z=T?B.for||B:B&&B.withoutSetter||x;u.exports=function(G){return p(P,G)||(P[G]=C&&p(B,G)?B[G]:z("Symbol."+G)),P[G]}},7206:(u,d,a)=>{var c=a(5532),g=a(9668),p=a(1052),x=a(298),C=a(8344),T=a(955),B=a(599),P=a(4694),z=a(3097),G=a(567),O=a(9016),Q=a(821),$=a(7067),et=a(4389),X=[],st=g(X.sort),ht=g(X.push),mt=P(function(){X.sort(void 0)}),tt=P(function(){X.sort(null)}),ot=G("sort"),gt=!P(function(){if($)return $<70;if(!(O&&O>3)){if(Q)return!0;if(et)return et<603;var re="",St,wt,$t,Lt;for(St=65;St<76;St++){switch(wt=String.fromCharCode(St),St){case 66:case 69:case 70:case 72:$t=3;break;case 68:case 71:$t=4;break;default:$t=2}for(Lt=0;Lt<47;Lt++)X.push({k:wt+Lt,v:$t})}for(X.sort(function(Re,bt){return bt.v-Re.v}),Lt=0;LtB(wt)?1:-1}};c({target:"Array",proto:!0,forced:Pe},{sort:function(St){St!==void 0&&p(St);var wt=x(this);if(gt)return St===void 0?st(wt):st(wt,St);var $t=[],Lt=C(wt),Re,bt;for(bt=0;bt{var c=a(5532),g=a(298),p=a(1728),x=a(4694),C=x(function(){p(1)});c({target:"Object",stat:!0,forced:C},{keys:function(B){return p(g(B))}})}},ro={};function pt(u){var d=ro[u];if(d!==void 0)return d.exports;var a=ro[u]={id:u,exports:{}};return Qa[u].call(a.exports,a,a.exports,pt),a.exports}pt.n=u=>{var d=u&&u.__esModule?()=>u.default:()=>u;return pt.d(d,{a:d}),d};pt.d=(u,d)=>{for(var a in d)pt.o(d,a)&&!pt.o(u,a)&&Object.defineProperty(u,a,{enumerable:!0,get:d[a]})};pt.g=function(){if(typeof globalThis=="object")return globalThis;try{return this||new Function("return this")()}catch{if(typeof window=="object")return window}}();pt.o=(u,d)=>Object.prototype.hasOwnProperty.call(u,d);pt.r=u=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(u,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(u,"__esModule",{value:!0})};var _={};(()=>{pt.d(_,{y1j:()=>Ms,fWn:()=>Mi,Ia8:()=>jn,rqv:()=>cn,zH6:()=>Rs,hLI:()=>fi,yyv:()=>Ur,tX5:()=>Es,vtX:()=>Xt,r7K:()=>Wn,lCh:()=>yr,cE4:()=>Et,fwF:()=>_e,sce:()=>Di,AQ6:()=>pa,_c7:()=>de,KUs:()=>Rr,Ajp:()=>hi,dkO:()=>ni,RDh:()=>gs,_H9:()=>ls,mxs:()=>ar,OmD:()=>it,kBf:()=>J,C4F:()=>es,NQt:()=>on,JjN:()=>Wr,EK_:()=>si,V1s:()=>wr,xHm:()=>da,Xz7:()=>qi,Cdc:()=>os,FKn:()=>kt,SUY:()=>hn,ab2:()=>ss,GfZ:()=>me,YMS:()=>De,oyv:()=>Ct,aUb:()=>Ve,SdD:()=>bi,JUv:()=>di,jEj:()=>pe,TFq:()=>le,HDU:()=>Vi,R_y:()=>Ji,ydN:()=>Ze,t50:()=>yi,s$$:()=>rn,v2G:()=>q,Ilk:()=>L,s9i:()=>Qr,dxL:()=>Xe,LLX:()=>Hr,wA2:()=>ie,R_p:()=>Bt,IQ$:()=>kr,I5F:()=>Bs,X8$:()=>Mr,FR6:()=>Zi,U8o:()=>Wi,kbG:()=>Nt,iS_:()=>Cs,cGG:()=>Yr,RPN:()=>fs,skb:()=>Or,SLU:()=>zs,RdJ:()=>Qt,cNu:()=>lr,gU7:()=>Nn,LSk:()=>cr,Nmp:()=>ds,d1Y:()=>Tt,xrL:()=>Ks,sRW:()=>qs,cmV:()=>gn,qWz:()=>or,N0Q:()=>rr,q8b:()=>xt,ynB:()=>jt,jT9:()=>_r,wAz:()=>mi,D4V:()=>xi,NLr:()=>ba,N6H:()=>Ts,W1A:()=>Ss,JHW:()=>Rt,ZZ$:()=>la,v2K:()=>Er,pBf:()=>Ea,vpe:()=>T,GMl:()=>B,zW2:()=>u,B0K:()=>Zs,Nv7:()=>Ki,C_p:()=>Be,MUA:()=>Ps,xqU:()=>Is,pTp:()=>hr,vUK:()=>x,j9l:()=>en,Zxw:()=>pi,v51:()=>dt,Hdx:()=>cs,Z$d:()=>as,iqV:()=>Jr,o$7:()=>Ui,olM:()=>Ne,Zm$:()=>P,$QH:()=>Q,i78:()=>$,nJg:()=>Ci,h6u:()=>$t,hts:()=>wt,j88:()=>re,VME:()=>St,fy2:()=>Ei,nt:()=>Oa,Ukr:()=>Li,zsu:()=>Vt,oA6:()=>Ft,TVh:()=>Fi,TwZ:()=>Ri,GTT:()=>ns,xxj:()=>Fr,XdK:()=>Re,Jmb:()=>Ot,cXo:()=>Ls,Dm5:()=>ii,IIB:()=>c,ebW:()=>Xr,zI0:()=>is,LYD:()=>vs,cEG:()=>Lr,SEl:()=>Ia,t9V:()=>Kr,ez5:()=>oi,N1d:()=>ks,R8U:()=>ri,SKZ:()=>z,__J:()=>Ca,RI$:()=>xr,x12:()=>un,ccz:()=>Ht,aNw:()=>zn,XrL:()=>ra,xwn:()=>mr,dNK:()=>pr,ini:()=>zt,YdH:()=>j,F5T:()=>Dn,y3G:()=>Jt,l57:()=>Us,xn0:()=>Js,t2V:()=>sn,uxB:()=>yt,cpd:()=>Pr,fiy:()=>qn,$XZ:()=>$n,UG6:()=>Te,uqK:()=>ke,STE:()=>Un,y$z:()=>ge,mAD:()=>zr,sOq:()=>se,hUw:()=>us,_0G:()=>Sa,Sqs:()=>$r,hpZ:()=>ms,Vol:()=>Dr,vYX:()=>_i,wIZ:()=>Z,cBi:()=>xs,c30:()=>Gr,MPV:()=>ve,RFv:()=>ui,Ux6:()=>vi,rxy:()=>zi,I$c:()=>Ge,kfC:()=>_s,VjY:()=>xe,mgq:()=>fn,YVA:()=>Pt,Kgp:()=>kn,HH$:()=>ze,M_d:()=>tt,rgh:()=>X,Ra6:()=>ei,KhR:()=>O,gvQ:()=>ht,BS5:()=>gt,xhz:()=>bt,xOq:()=>mt,a9j:()=>et,bHk:()=>Pe,CgK:()=>G,cEd:()=>st,cuY:()=>ot,kvE:()=>Pi,SBu:()=>Ti,PsT:()=>Fe,AE_:()=>Cr,ctO:()=>Ir,OLH:()=>vr,kky:()=>Ii,nSF:()=>li,zHn:()=>Se,zwx:()=>Br,AeJ:()=>rs,hLz:()=>Jn,D9g:()=>br,wA:()=>Xn,jhr:()=>Kn,GVs:()=>Hs,_zO:()=>ji,LXZ:()=>Co,w6$:()=>er,mhV:()=>tr,MOD:()=>ne,kwd:()=>sr,Lmr:()=>ir,xsS:()=>Oi,K5l:()=>va,lLr:()=>Qs,Z$r:()=>bn,IXb:()=>nn,Xsu:()=>Xo,SGH:()=>Nr,SMj:()=>Oe,L34:()=>za,exe:()=>ee,bnF:()=>Dt,MFA:()=>_t,$uU:()=>Ln,Sap:()=>na,jyi:()=>Qe,E03:()=>Xi,V6q:()=>Ye,rg2:()=>ln,DVW:()=>$i,nVo:()=>gr,F6N:()=>qr,xP7:()=>ce,Odq:()=>Sr,Zif:()=>Kt,ZGJ:()=>js,MJk:()=>Vr,xvT:()=>Bi,PHM:()=>hs,dpR:()=>Mt,n9L:()=>fr,KwO:()=>ur,SxM:()=>ca,B7y:()=>je,x7r:()=>jr,wx7:()=>Je,Uvn:()=>Y,OFT:()=>Xs,xzN:()=>Ar,CcZ:()=>ua,M5Z:()=>ae,ZrN:()=>g,OWs:()=>A,dF9:()=>Vs,oZy:()=>Ce,rD2:()=>Ie,VHo:()=>Lt,ohE:()=>We,R$E:()=>On,xQN:()=>Ke,AdJ:()=>an,q3I:()=>Tr,Pab:()=>ai,uZ5:()=>Gt,McK:()=>C,F9c:()=>wo,k0b:()=>tn,hnT:()=>Pa,RSJ:()=>ka,Mku:()=>Ma,h90:()=>Fa,rms:()=>Da,ErP:()=>Ta,aVg:()=>Ba,lPc:()=>Ra,Z8E:()=>Zn,_N2:()=>ki,yFn:()=>ga,lNv:()=>Vn,cu9:()=>dr,MZQ:()=>Hn,FUM:()=>Qn,BxR:()=>nt,vdf:()=>Ee,iaL:()=>yo,w6H:()=>In,Q4c:()=>oa,Xxe:()=>te,Uxb:()=>Cn,Yr5:()=>Ao,Bhw:()=>R,yOA:()=>d});var u={};pt.r(u),pt.d(u,{ActionCompleteEvent:()=>Ms,ActionStartEvent:()=>Rs,ActivateEvent:()=>Es,CollisionEndEvent:()=>bi,CollisionPostSolveEvent:()=>Vi,CollisionPreSolveEvent:()=>Ji,CollisionStartEvent:()=>yi,ContactEndEvent:()=>Zi,ContactStartEvent:()=>Wi,DeactivateEvent:()=>Cs,EnterTriggerEvent:()=>Ts,EnterViewPortEvent:()=>Ss,EventTypes:()=>B,ExitTriggerEvent:()=>Ps,ExitViewPortEvent:()=>Is,GameEvent:()=>P,GameStartEvent:()=>Q,GameStopEvent:()=>$,GamepadAxisEvent:()=>$t,GamepadButtonEvent:()=>wt,GamepadConnectEvent:()=>re,GamepadDisconnectEvent:()=>St,HiddenEvent:()=>Re,InitializeEvent:()=>ii,KillEvent:()=>z,PostCollisionEvent:()=>ze,PostDebugDrawEvent:()=>tt,PostDrawEvent:()=>X,PostFrameEvent:()=>ei,PostKillEvent:()=>O,PostTransformDrawEvent:()=>ht,PostUpdateEvent:()=>gt,PreCollisionEvent:()=>bt,PreDebugDrawEvent:()=>mt,PreDrawEvent:()=>et,PreFrameEvent:()=>Pe,PreKillEvent:()=>G,PreTransformDrawEvent:()=>st,PreUpdateEvent:()=>ot,VisibleEvent:()=>Lt});var d={};pt.r(d),pt.d(d,{getAttributeComponentSize:()=>Mn,getAttributePointerType:()=>Bn,getGlTypeSizeBytes:()=>Ns});var a={};pt.r(a),pt.d(a,{circle:()=>ta,line:()=>Ys,point:()=>qo,roundRect:()=>Ws,vector:()=>$o});var c={};pt.r(c),pt.d(c,{Axes:()=>ni,Buttons:()=>si,Gamepad:()=>Ci,Gamepads:()=>Ei,KeyEvent:()=>oi,Keyboard:()=>ks,Keys:()=>ri,NativePointerButton:()=>Te,PointerButton:()=>ve,PointerComponent:()=>ui,PointerEvent:()=>vi,PointerEventReceiver:()=>zi,PointerScope:()=>Ge,PointerSystem:()=>_s,PointerType:()=>xe,WheelDeltaMode:()=>Ke,WheelEvent:()=>an});var g={};pt.r(g),pt.d(g,{ConsoleAppender:()=>Bs,DrawUtil:()=>a,EasingFunctions:()=>xt,LogLevel:()=>zt,Logger:()=>j,Observable:()=>ge,ScreenAppender:()=>bn,addItemToArray:()=>bo,contains:()=>Fs,delay:()=>Os,fail:()=>Sn,getPosition:()=>Si,omit:()=>Tn,removeItemFromArray:()=>Me}),pt(1324),pt(3571);function p(){if(typeof window>"u"&&(window={audioContext:function(){}}),typeof window<"u"&&!window.requestAnimationFrame&&(window.requestAnimationFrame=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(r){window.setInterval(r,1e3/60)}),typeof window<"u"&&!window.cancelAnimationFrame&&(window.cancelAnimationFrame=window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(){}),typeof window<"u"&&!window.AudioContext){if(window.webkitAudioContext){const t=window.webkitAudioContext.prototype.decodeAudioData;window.webkitAudioContext.prototype.decodeAudioData=function(e){return new Promise((i,s)=>{t.call(this,e,i,s)})}}window.AudioContext=window.AudioContext||window.webkitAudioContext||window.mozAudioContext||window.msAudioContext||window.oAudioContext}typeof window<"u"&&!window.devicePixelRatio&&(window.devicePixelRatio=window.devicePixelRatio||1)}class x{static useCanvasGraphicsContext(){x.enable("use-canvas-context")}static freeze(){x._FROZEN=!0}static _reset(){x._FROZEN=!1,x._FLAGS={}}static enable(t){if(this._FROZEN)throw Error("Feature flags can only be enabled before Engine constructor time");x._FLAGS[t]=!0}static disable(t){if(this._FROZEN)throw Error("Feature flags can only be disabled before Engine constructor time");x._FLAGS[t]=!1}static isEnabled(t){return!!x._FLAGS[t]}static show(){return Object.keys(x._FLAGS)}}x._FROZEN=!1,x._FLAGS={};function C(r,t){return{type:r,value:t}}class T{constructor(){this._paused=!1,this._listeners={},this._listenersOnce={},this._pipes=[]}clear(){this._listeners={},this._listenersOnce={},this._pipes.length=0}on(t,e){var i;return this._listeners[t]=(i=this._listeners[t])!==null&&i!==void 0?i:[],this._listeners[t].push(e),{close:()=>this.off(t,e)}}once(t,e){var i;return this._listenersOnce[t]=(i=this._listenersOnce[t])!==null&&i!==void 0?i:[],this._listenersOnce[t].push(e),{close:()=>this.off(t,e)}}off(t,e){var i,s;if(e){const n=(i=this._listeners[t])===null||i===void 0?void 0:i.filter(h=>h!==e);this._listeners[t]=n;const o=(s=this._listenersOnce[t])===null||s===void 0?void 0:s.filter(h=>h!==e);this._listenersOnce[t]=o}else delete this._listeners[t]}emit(t,e){var i;if(this._paused)return;(i=this._listeners[t])===null||i===void 0||i.forEach(n=>n(e));const s=this._listenersOnce[t];this._listenersOnce[t]=[],s&&s.forEach(n=>n(e)),this._pipes.forEach(n=>{n.emit(t,e)})}pipe(t){if(this===t)throw Error("Cannot pipe to self");return this._pipes.push(t),{close:()=>{const e=this._pipes.indexOf(t);e>-1&&this._pipes.splice(e,1)}}}unpipe(t){const e=this._pipes.indexOf(t);e>-1&&this._pipes.splice(e,1)}pause(){this._paused=!0}unpause(){this._paused=!1}}var B;(function(r){r.Kill="kill",r.PreKill="prekill",r.PostKill="postkill",r.PreDraw="predraw",r.PostDraw="postdraw",r.PreDebugDraw="predebugdraw",r.PostDebugDraw="postdebugdraw",r.PreUpdate="preupdate",r.PostUpdate="postupdate",r.PreFrame="preframe",r.PostFrame="postframe",r.PreCollision="precollision",r.CollisionStart="collisionstart",r.CollisionEnd="collisionend",r.PostCollision="postcollision",r.Initialize="initialize",r.Activate="activate",r.Deactivate="deactivate",r.ExitViewport="exitviewport",r.EnterViewport="enterviewport",r.ExitTrigger="exit",r.EnterTrigger="enter",r.Connect="connect",r.Disconnect="disconnect",r.Button="button",r.Axis="axis",r.Visible="visible",r.Hidden="hidden",r.Start="start",r.Stop="stop",r.PointerUp="pointerup",r.PointerDown="pointerdown",r.PointerMove="pointermove",r.PointerEnter="pointerenter",r.PointerLeave="pointerleave",r.PointerCancel="pointercancel",r.PointerWheel="pointerwheel",r.Up="up",r.Down="down",r.Move="move",r.Enter="enter",r.Leave="leave",r.Cancel="cancel",r.Wheel="wheel",r.Press="press",r.Release="release",r.Hold="hold",r.PointerDragStart="pointerdragstart",r.PointerDragEnd="pointerdragend",r.PointerDragEnter="pointerdragenter",r.PointerDragLeave="pointerdragleave",r.PointerDragMove="pointerdragmove",r.ActionStart="actionstart",r.ActionComplete="actioncomplete"})(B||(B={}));class P{constructor(){this._bubbles=!0}get bubbles(){return this._bubbles}set bubbles(t){this._bubbles=t}stopPropagation(){this.bubbles=!1}}class z extends P{constructor(t){super(),this.target=t}}class G extends P{constructor(t){super(),this.target=t}}class O extends P{constructor(t){super(),this.target=t}}class Q extends P{constructor(t){super(),this.target=t}}class $ extends P{constructor(t){super(),this.target=t}}class et extends P{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class X extends P{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class st extends P{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class ht extends P{constructor(t,e,i){super(),this.ctx=t,this.delta=e,this.target=i}}class mt extends P{constructor(t,e){super(),this.ctx=t,this.target=e}}class tt extends P{constructor(t,e){super(),this.ctx=t,this.target=e}}class ot extends P{constructor(t,e,i){super(),this.engine=t,this.delta=e,this.target=i}}class gt extends P{constructor(t,e,i){super(),this.engine=t,this.delta=e,this.target=i}}class Pe extends P{constructor(t,e){super(),this.engine=t,this.prevStats=e,this.target=t}}class ei extends P{constructor(t,e){super(),this.engine=t,this.stats=e,this.target=t}}class re extends P{constructor(t,e){super(),this.index=t,this.gamepad=e,this.target=e}}class St extends P{constructor(t,e){super(),this.index=t,this.gamepad=e,this.target=e}}class wt extends P{constructor(t,e,i){super(),this.button=t,this.value=e,this.target=i}}class $t extends P{constructor(t,e,i){super(),this.axis=t,this.value=e,this.target=i}}class Lt extends P{constructor(t){super(),this.target=t}}class Re extends P{constructor(t){super(),this.target=t}}class bt extends P{constructor(t,e,i,s,n){super(),this.other=e,this.side=i,this.intersection=s,this.contact=n,this.target=t}}class ze extends P{constructor(t,e,i,s,n){super(),this.other=e,this.side=i,this.intersection=s,this.contact=n,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class Wi{constructor(t,e,i,s){this.target=t,this.other=e,this.side=i,this.contact=s}}class Zi{constructor(t,e){this.target=t,this.other=e}}class Ji{constructor(t,e,i,s,n){this.target=t,this.other=e,this.side=i,this.intersection=s,this.contact=n}}class Vi{constructor(t,e,i,s,n){this.target=t,this.other=e,this.side=i,this.intersection=s,this.contact=n}}class yi extends P{constructor(t,e,i,s){super(),this.other=e,this.side=i,this.contact=s,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class bi extends P{constructor(t,e){super(),this.other=e,this.target=t}get actor(){return this.target}set actor(t){this.target=t}}class ii extends P{constructor(t,e){super(),this.engine=t,this.target=e}}class Es extends P{constructor(t,e){super(),this.context=t,this.target=e}}class Cs extends P{constructor(t,e){super(),this.context=t,this.target=e}}class Is extends P{constructor(t){super(),this.target=t}}class Ss extends P{constructor(t){super(),this.target=t}}class Ts extends P{constructor(t,e){super(),this.target=t,this.actor=e}}class Ps extends P{constructor(t,e){super(),this.target=t,this.actor=e}}class Rs extends P{constructor(t,e){super(),this.action=t,this.target=e}}class Ms extends P{constructor(t,e){super(),this.action=t,this.target=e}}class Ei{constructor(){this.events=new T,this.enabled=!1,this.supported=!!navigator.getGamepads,this._gamePadTimeStamps=[0,0,0,0],this._oldPads=[],this._pads=[],this._initSuccess=!1,this._navigator=navigator,this._minimumConfiguration=null}init(){this.supported&&(this._initSuccess||(this._oldPads=this._clonePads(this._navigator.getGamepads()),this._oldPads.length&&this._oldPads[0]&&(this._initSuccess=!0)))}setMinimumGamepadConfiguration(t){this._enableAndUpdate(),this._minimumConfiguration=t}_enableAndUpdate(){this.enabled||(this.enabled=!0,this.update())}_isGamepadValid(t){if(!this._minimumConfiguration)return!0;if(!t)return!1;const e=t.axes.filter(s=>typeof s!==void 0).length,i=t.buttons.filter(s=>typeof s!==void 0).length;return e>=this._minimumConfiguration.axis&&i>=this._minimumConfiguration.buttons&&t.connected}emit(t,e){this.events.emit(t,e)}on(t,e){return this._enableAndUpdate(),this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this._enableAndUpdate(),this.events.off(t,e)}update(){if(!this.enabled||!this.supported)return;this.init();const t=this._navigator.getGamepads();for(let e=0;e=this._pads.length)for(let e=this._pads.length-1,i=t;et.connected).length}_clonePads(t){const e=[];for(let i=0,s=t.length;i=e}isButtonHeld(t,e=1){return this._buttons[t]>=e}wasButtonPressed(t,e=1){return this._buttonsDown[t]>=e}wasButtonReleased(t){return!!this._buttonsUp[t]}getButton(t){return this._buttons[t]}getAxes(t){const e=this._axes[t];return Math.abs(e)=this.defaultLevel&&this._appenders[s].log(t,e)}debug(...t){this._log(zt.Debug,t)}info(...t){this._log(zt.Info,t)}warn(...t){this._log(zt.Warn,t)}error(...t){this._log(zt.Error,t)}fatal(...t){this._log(zt.Fatal,t)}}j._INSTANCE=null;class Bs{log(t,e){if(!console&&!console.log&&console.warn&&console.error)return;const i=[];i.unshift.apply(i,e),i.unshift("["+zt[t]+"] : "),t0?n-.05:0}}function En(){try{const r=()=>{};window.top.addEventListener("blur",r),window.top.removeEventListener("blur",r)}catch{return!0}return!1}var ri;(function(r){r.Num0="Numpad0",r.Num1="Numpad1",r.Num2="Numpad2",r.Num3="Numpad3",r.Num4="Numpad4",r.Num5="Numpad5",r.Num6="Numpad6",r.Num7="Numpad7",r.Num8="Numpad8",r.Num9="Numpad9",r.NumAdd="NumpadAdd",r.NumSubtract="NumpadSubtract",r.NumMultiply="NumpadMultiply",r.NumDivide="NumpadDivide",r.NumDecimal="NumpadDecimal",r.Numpad0="Numpad0",r.Numpad1="Numpad1",r.Numpad2="Numpad2",r.Numpad3="Numpad3",r.Numpad4="Numpad4",r.Numpad5="Numpad5",r.Numpad6="Numpad6",r.Numpad7="Numpad7",r.Numpad8="Numpad8",r.Numpad9="Numpad9",r.NumpadAdd="NumpadAdd",r.NumpadSubtract="NumpadSubtract",r.NumpadMultiply="NumpadMultiply",r.NumpadDivide="NumpadDivide",r.NumpadDecimal="NumpadDecimal",r.NumLock="NumLock",r.ShiftLeft="ShiftLeft",r.ShiftRight="ShiftRight",r.AltLeft="AltLeft",r.AltRight="AltRight",r.ControlLeft="ControlLeft",r.ControlRight="ControlRight",r.MetaLeft="MetaLeft",r.MetaRight="MetaRight",r.Key0="Digit0",r.Key1="Digit1",r.Key2="Digit2",r.Key3="Digit3",r.Key4="Digit4",r.Key5="Digit5",r.Key6="Digit6",r.Key7="Digit7",r.Key8="Digit8",r.Key9="Digit9",r.Digit0="Digit0",r.Digit1="Digit1",r.Digit2="Digit2",r.Digit3="Digit3",r.Digit4="Digit4",r.Digit5="Digit5",r.Digit6="Digit6",r.Digit7="Digit7",r.Digit8="Digit8",r.Digit9="Digit9",r.F1="F1",r.F2="F2",r.F3="F3",r.F4="F4",r.F5="F5",r.F6="F6",r.F7="F7",r.F8="F8",r.F9="F9",r.F10="F10",r.F11="F11",r.F12="F12",r.A="KeyA",r.B="KeyB",r.C="KeyC",r.D="KeyD",r.E="KeyE",r.F="KeyF",r.G="KeyG",r.H="KeyH",r.I="KeyI",r.J="KeyJ",r.K="KeyK",r.L="KeyL",r.M="KeyM",r.N="KeyN",r.O="KeyO",r.P="KeyP",r.Q="KeyQ",r.R="KeyR",r.S="KeyS",r.T="KeyT",r.U="KeyU",r.V="KeyV",r.W="KeyW",r.X="KeyX",r.Y="KeyY",r.Z="KeyZ",r.KeyA="KeyA",r.KeyB="KeyB",r.KeyC="KeyC",r.KeyD="KeyD",r.KeyE="KeyE",r.KeyF="KeyF",r.KeyG="KeyG",r.KeyH="KeyH",r.KeyI="KeyI",r.KeyJ="KeyJ",r.KeyK="KeyK",r.KeyL="KeyL",r.KeyM="KeyM",r.KeyN="KeyN",r.KeyO="KeyO",r.KeyP="KeyP",r.KeyQ="KeyQ",r.KeyR="KeyR",r.KeyS="KeyS",r.KeyT="KeyT",r.KeyU="KeyU",r.KeyV="KeyV",r.KeyW="KeyW",r.KeyX="KeyX",r.KeyY="KeyY",r.KeyZ="KeyZ",r.Semicolon="Semicolon",r.Quote="Quote",r.Comma="Comma",r.Minus="Minus",r.Period="Period",r.Slash="Slash",r.Equal="Equal",r.BracketLeft="BracketLeft",r.Backslash="Backslash",r.BracketRight="BracketRight",r.Backquote="Backquote",r.Up="ArrowUp",r.Down="ArrowDown",r.Left="ArrowLeft",r.Right="ArrowRight",r.ArrowUp="ArrowUp",r.ArrowDown="ArrowDown",r.ArrowLeft="ArrowLeft",r.ArrowRight="ArrowRight",r.Space="Space",r.Backspace="Backspace",r.Delete="Delete",r.Esc="Escape",r.Escape="Escape",r.Enter="Enter",r.NumpadEnter="NumpadEnter",r.ContextMenu="ContextMenu"})(ri||(ri={}));class oi extends P{constructor(t,e,i){super(),this.key=t,this.value=e,this.originalEvent=i}}class ks{constructor(){this.events=new T,this._keys=[],this._keysUp=[],this._keysDown=[],this._releaseAllKeys=t=>{for(const e of this._keys){const i=new oi(e,t.key,t);this.events.emit("up",i),this.events.emit("release",i)}this._keysUp=Array.from(new Set(this._keys.concat(this._keysUp))),this._keys.length=0},this._handleKeyDown=t=>{!t.metaKey&&(this._keys.includes(ri.MetaLeft)||this._keys.includes(ri.MetaRight))&&this._releaseAllKeys(t);const e=t.code;if(this._keys.indexOf(e)===-1){this._keys.push(e),this._keysDown.push(e);const i=new oi(e,t.key,t);this.events.emit("down",i),this.events.emit("press",i)}},this._handleKeyUp=t=>{const e=t.code,i=this._keys.indexOf(e);this._keys.splice(i,1),this._keysUp.push(e);const s=new oi(e,t.key,t);this.events.emit("up",s),this.events.emit("release",s),t.key==="Meta"&&this._releaseAllKeys(t)}}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}init(t){let{global:e}=t;const{grabWindowFocus:i}=t;e||(En()?(e=window,i&&window.focus(),j.getInstance().warn("Excalibur might be in a cross-origin iframe, in order to receive keyboard events it must be in focus")):e=window.top),e.addEventListener("blur",()=>{this._keys.length=0}),e.addEventListener("keyup",this._handleKeyUp),e.addEventListener("keydown",this._handleKeyDown)}update(){this._keysDown.length=0,this._keysUp.length=0;for(let t=0;t-1}isHeld(t){return this._keys.indexOf(t)>-1}wasReleased(t){return this._keysUp.indexOf(t)>-1}triggerEvent(t,e,i){t==="down"&&this._handleKeyDown(new KeyboardEvent("keydown",{code:e,key:i??null})),t==="up"&&this._handleKeyUp(new KeyboardEvent("keyup",{code:e,key:i??null}))}}var Ge;(function(r){r.Canvas="Canvas",r.Document="Document"})(Ge||(Ge={}));const Ds=4294967295;class Ii{constructor(t){this.seed=t,this._lowerMask=2147483647,this._upperMask=2147483648,this._w=32,this._n=624,this._m=397,this._a=2567483615,this._u=11,this._s=7,this._b=2636928640,this._t=15,this._c=4022730752,this._l=18,this._f=1812433253,this._mt=new Array(this._n),this._mt[0]=(t||Date.now())>>>0;for(let e=1;e>>this._w-2;this._mt[e]=(this._f*((i&4294901760)>>>16)<<16)+this._f*(i&65535)+e>>>0}this._index=this._n}_twist(){const t=[0,this._a];let e=0,i=0;for(;i>>1^t[e&1]&Ds;for(;i>>1^t[e&1]&Ds;e=this._mt[this._n-1]&this._upperMask|this._mt[0]&this._lowerMask,this._mt[this._n-1]=this._mt[this._m-1]^e>>>1^t[e&1]&Ds,this._index=0}nextInt(){this._index>=this._n&&this._twist();let t=this._mt[this._index++];return t^=t>>>this._u,t^=t<>>this._l,t>>>0}next(){return this.nextInt()*(1/4294967296)}floating(t,e){return(e-t)*this.next()+t}integer(t,e){return Math.floor((e-t+1)*this.next()+t)}bool(t=.5){return this.next()<=t}pickOne(t){return t[this.integer(0,t.length-1)]}pickSet(t,e,i=!1){return i?this._pickSetWithDuplicates(t,e):this._pickSetWithoutDuplicates(t,e)}_pickSetWithoutDuplicates(t,e){if(e>t.length||e<0)throw new Error("Invalid number of elements to pick, must pick a value 0 < n <= length");if(e===t.length)return t;const i=new Array(e);let s=0;const n=t.slice(0);for(;s=0?r-Math.floor(r):r-Math.ceil(r)}function te(r){return r===0?0:r<0?-1:1}function Gt(r,t,e){return Math.min(Math.max(t,r),e)}function ai(r){let t=r;if(r>ae)for(;t>ae;)t-=ae;if(r<0)for(;t<0;)t+=ae;return t}function Cn(r){return 180/Math.PI*r}function Ao(r){return r/180*Math.PI}const In=(r,t)=>Array.from(new Array(t-r+1),(e,i)=>i+r);function Ee(r,t,e=new Ii){return e?e.floating(r,t):r+Math.random()*(t-r)}function yo(r,t,e=new Ii){return e?e.integer(r,t):Math.round(Ee(r,t))}class A{static get Zero(){return new A(0,0)}static get One(){return new A(1,1)}static get Half(){return new A(.5,.5)}static get Up(){return new A(0,-1)}static get Down(){return new A(0,1)}static get Left(){return new A(-1,0)}static get Right(){return new A(1,0)}static fromAngle(t){return new A(Math.cos(t),Math.sin(t))}static isValid(t){return!(t==null||isNaN(t.x)||isNaN(t.y)||t.x===1/0||t.y===1/0||t.x===-1/0||t.y===-1/0)}static distance(t,e){return Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2))}static min(t,e){return new A(Math.min(t.x,e.x),Math.min(t.y,e.y))}static max(t,e){return new A(Math.max(t.x,e.x),Math.max(t.y,e.y))}constructor(t,e){this._x=0,this._y=0,this._x=t,this._y=e}get x(){return this._x}set x(t){this._x=t}get y(){return this._y}set y(t){this._y=t}setTo(t,e){this.x=t,this.y=e}equals(t,e=.001){return Math.abs(this.x-t.x)<=e&&Math.abs(this.y-t.y)<=e}distance(t){if(!t)return Math.sqrt(this.x*this.x+this.y*this.y);const e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)}squareDistance(t){t||(t=A.Zero);const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}clampMagnitude(t){const e=this.size,i=Gt(e,0,t);return this.size=i,this}get size(){return this.distance()}set size(t){const e=this.normalize().scale(t);this.setTo(e.x,e.y)}normalize(){const t=this.distance();return t>0?new A(this.x/t,this.y/t):new A(0,1)}average(t){return this.add(t).scale(.5)}scale(t,e){const i=e||new A(0,0);return t instanceof A?(i.x=this.x*t.x,i.y=this.y*t.y):(i.x=this.x*t,i.y=this.y*t),i}add(t,e){return e?(e.x=this.x+t.x,e.y=this.y+t.y,e):new A(this.x+t.x,this.y+t.y)}sub(t){return new A(this.x-t.x,this.y-t.y)}addEqual(t){return this.setTo(this.x+t.x,this.y+t.y),this}subEqual(t){return this.setTo(this.x-t.x,this.y-t.y),this}scaleEqual(t){return this.setTo(this.x*t,this.y*t),this}dot(t){return this.x*t.x+this.y*t.y}cross(t){if(t instanceof A)return this.x*t.y-this.y*t.x;if(typeof t=="number")return new A(t*this.y,-t*this.x)}static cross(t,e){return new A(-t*e.y,t*e.x)}perpendicular(){return new A(this.y,-this.x)}normal(){return this.perpendicular().normalize()}negate(){return this.scale(-1)}toAngle(){return Math.atan2(this.y,this.x)}rotate(t,e){e||(e=new A(0,0));const i=Math.sin(t),s=Math.cos(t),n=s*(this.x-e.x)-i*(this.y-e.y)+e.x,o=i*(this.x-e.x)+s*(this.y-e.y)+e.y;return new A(n,o)}clone(t){const e=t??new A(0,0);return e.x=this.x,e.y=this.y,e}toString(t){return t?`(${this.x.toFixed(t)}, ${this.y.toFixed(t)})`:`(${this.x}, ${this.y})`}}function R(r,t){return new A(r,t)}class L{constructor(t,e,i,s){this.r=t,this.g=e,this.b=i,this.a=s??1}static fromRGB(t,e,i,s){return new L(t,e,i,s)}static fromRGBString(t){const e=/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+(?:\.\d+)?))?\)/i;let i=null;if(i=t.match(e)){const s=parseInt(i[1],10),n=parseInt(i[2],10),o=parseInt(i[3],10);let h=1;return i[4]&&(h=parseFloat(i[4])),new L(s,n,o,h)}else throw new Error("Invalid rgb/a string: "+t)}static fromHex(t){const e=/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i;let i=null;if(i=t.match(e)){const s=parseInt(i[1],16),n=parseInt(i[2],16),o=parseInt(i[3],16);let h=1;return i[4]&&(h=parseInt(i[4],16)/255),new L(s,n,o,h)}else throw new Error("Invalid hex string: "+t)}static fromHSL(t,e,i,s=1){return new he(t,e,i,s).toRGBA()}lighten(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.l+=(1-e.l)*t,e.toRGBA()}darken(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.l-=e.l*t,e.toRGBA()}saturate(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.s+=e.s*t,e.toRGBA()}desaturate(t=.1){const e=he.fromRGBA(this.r,this.g,this.b,this.a);return e.s-=e.s*t,e.toRGBA()}multiply(t){const e=t.r/255*this.r/255*255,i=t.g/255*this.g/255*255,s=t.b/255*this.b/255*255,n=t.a*this.a;return new L(e,i,s,n)}screen(t){const e=t.invert(),i=t.invert();return e.multiply(i).invert()}invert(){return new L(255-this.r,255-this.g,255-this.b,1-this.a)}average(t){const e=(t.r+this.r)/2,i=(t.g+this.g)/2,s=(t.b+this.b)/2,n=(t.a+this.a)/2;return new L(e,i,s,n)}equal(t){return this.toString()===t.toString()}toString(t="rgb"){switch(t){case"rgb":return this.toRGBA();case"hsl":return this.toHSLA();case"hex":return this.toHex();default:throw new Error("Invalid Color format")}}_componentToHex(t){const e=t.toString(16);return e.length===1?"0"+e:e}toHex(){return"#"+this._componentToHex(this.r)+this._componentToHex(this.g)+this._componentToHex(this.b)}toRGBA(){const t=String(this.r.toFixed(0))+", "+String(this.g.toFixed(0))+", "+String(this.b.toFixed(0));return this.a!==void 0||this.a!==null?"rgba("+t+", "+String(this.a)+")":"rgb("+t+")"}toHSLA(){return he.fromRGBA(this.r,this.g,this.b,this.a).toString()}fillStyle(){return this.toString()}clone(){return new L(this.r,this.g,this.b,this.a)}static get Black(){return L.fromHex("#000000")}static get White(){return L.fromHex("#FFFFFF")}static get Gray(){return L.fromHex("#808080")}static get LightGray(){return L.fromHex("#D3D3D3")}static get DarkGray(){return L.fromHex("#A9A9A9")}static get Yellow(){return L.fromHex("#FFFF00")}static get Orange(){return L.fromHex("#FFA500")}static get Red(){return L.fromHex("#FF0000")}static get Vermilion(){return L.fromHex("#FF5B31")}static get Rose(){return L.fromHex("#FF007F")}static get Magenta(){return L.fromHex("#FF00FF")}static get Violet(){return L.fromHex("#7F00FF")}static get Blue(){return L.fromHex("#0000FF")}static get Azure(){return L.fromHex("#007FFF")}static get Cyan(){return L.fromHex("#00FFFF")}static get Viridian(){return L.fromHex("#59978F")}static get Green(){return L.fromHex("#00FF00")}static get Chartreuse(){return L.fromHex("#7FFF00")}static get Transparent(){return L.fromHex("#FFFFFF00")}static get ExcaliburBlue(){return L.fromHex("#176BAA")}}class he{constructor(t,e,i,s){this.h=t,this.s=e,this.l=i,this.a=s}static hue2rgb(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+(e-t)*6*i:i<1/2?e:i<2/3?t+(e-t)*(2/3-i)*6:t}static fromRGBA(t,e,i,s){t/=255,e/=255,i/=255;const n=Math.max(t,e,i),o=Math.min(t,e,i);let h,l;const f=(n+o)/2;if(n===o)h=l=0;else{const m=n-o;switch(l=f>.5?m/(2-n-o):m/(n+o),n){case t:h=(e-i)/m+(eo&&(o=s[l].dot(i),h=l);return n[h]}r.fromDirection=e}(_t||(_t={}));class J{constructor(t=0,e=0,i=0,s=0){typeof t=="object"?(this.left=t.left,this.top=t.top,this.right=t.right,this.bottom=t.bottom):typeof t=="number"&&(this.left=t,this.top=e,this.right=i,this.bottom=s)}clone(){return new J(this.left,this.top,this.right,this.bottom)}static getSideFromIntersection(t){return t&&t?Math.abs(t.x)>Math.abs(t.y)?t.x<0?_t.Right:_t.Left:t.y<0?_t.Bottom:_t.Top:_t.None}static fromPoints(t){let e=1/0,i=1/0,s=-1/0,n=-1/0;for(let o=0;os&&(s=t[o].x),t[o].yn&&(n=t[o].y);return new J(e,i,s,n)}static fromDimension(t,e,i=A.Half,s=A.Zero){return new J(-t*i.x+s.x,-e*i.y+s.y,t-t*i.x+s.x,e-e*i.y+s.y)}get width(){return this.right-this.left}get height(){return this.bottom-this.top}hasZeroDimensions(){return this.width===0||this.height===0}get center(){return new A((this.left+this.right)/2,(this.top+this.bottom)/2)}translate(t){return new J(this.left+t.x,this.top+t.y,this.right+t.x,this.bottom+t.y)}rotate(t,e=A.Zero){const i=this.getPoints().map(s=>s.rotate(t,e));return J.fromPoints(i)}scale(t,e=A.Zero){const i=this.translate(e);return new J(i.left*t.x,i.top*t.y,i.right*t.x,i.bottom*t.y)}transform(t){const e=t.data[0]*this.left,i=t.data[1]*this.left,s=t.data[0]*this.right,n=t.data[1]*this.right,o=t.data[2]*this.top,h=t.data[3]*this.top,l=t.data[2]*this.bottom,f=t.data[3]*this.bottom,m=t.getPosition(),v=Math.min(e,s)+Math.min(o,l)+m.x,w=Math.min(i,n)+Math.min(h,f)+m.y,y=Math.max(e,s)+Math.max(o,l)+m.x,b=Math.max(i,n)+Math.max(h,f)+m.y;return new J({left:v,top:w,right:y,bottom:b})}getPerimeter(){const t=this.width,e=this.height;return 2*(t+e)}getPoints(){const t=[];return t.push(new A(this.left,this.top)),t.push(new A(this.right,this.top)),t.push(new A(this.right,this.bottom)),t.push(new A(this.left,this.bottom)),t}rayCast(t,e=1/0){let i=-1/0,s=1/0;const n=t.dir.x===0?Number.MAX_VALUE:1/t.dir.x,o=t.dir.y===0?Number.MAX_VALUE:1/t.dir.y,h=(this.left-t.pos.x)*n,l=(this.right-t.pos.x)*n;i=Math.min(h,l),s=Math.max(h,l);const f=(this.top-t.pos.y)*o,m=(this.bottom-t.pos.y)*o;return i=Math.max(i,Math.min(f,m)),s=Math.min(s,Math.max(f,m)),s>=Math.max(0,i)&&i=Math.max(0,i)&&i=t.y&&this.right>=t.x:t instanceof J?this.left<=t.left&&this.top<=t.top&&t.bottom<=this.bottom&&t.right<=this.right:!1}combine(t){return new J(Math.min(this.left,t.left),Math.min(this.top,t.top),Math.max(this.right,t.right),Math.max(this.bottom,t.bottom))}get dimensions(){return new A(this.width,this.height)}overlaps(t,e){const i=e||0;if(t.hasZeroDimensions())return this.contains(t);if(this.hasZeroDimensions())return t.contains(this);const s=this.combine(t);return s.width+i=t.left&&this.right<=t.right?i=t.left-this.right:i=t.right-this.left;let s=0;return this.top<=t.bottom&&this.top>=t.top?s=t.bottom-this.top:s=t.top-this.bottom,Math.abs(i)=0?this.right-t.right<=t.left-this.left?i=t.left-this.right:i=t.right-this.left:t.right-this.right<=this.left-t.left?i=this.left-t.right:i=this.right-t.left;let s=0;return this.height-t.height>=0?this.bottom-t.bottom<=t.top-this.top?s=t.top-this.bottom:s=t.bottom-this.top:t.bottom-this.bottom<=this.top-t.top?s=this.top-t.bottom:s=this.bottom-t.top,Math.abs(i){this._resolver=t,this._rejecter=e})}get isCompleted(){return this._isCompleted}resolve(t){this._isCompleted||(this._isCompleted=!0,this._resolver(t))}reject(t){this._isCompleted||(this._isCompleted=!0,this._rejecter(t))}}function Si(r){let t=0,e=0;const i=n=>{t+=n.offsetLeft,n.offsetParent&&i(n.offsetParent)},s=n=>{e+=n.offsetTop,n.offsetParent&&s(n.offsetParent)};return i(r),s(r),new A(t,e)}function bo(r,t){return t.indexOf(r)===-1?(t.push(r),!0):!1}function Me(r,t){let e=-1;return(e=t.indexOf(r))>-1?(t.splice(e,1),!0):!1}function Fs(r,t){for(let e=0;e{i.resolve()},r),i.promise}function Tn(r,t){const e={};for(const i in r)t.includes(i)||(e[i]=r[i]);return e}var Us;(function(r){r[r.X=12]="X",r[r.Y=13]="Y"})(Us||(Us={}));class Jt{constructor(){this.data=new Float32Array(16),this._scaleX=1,this._scaleSignX=1,this._scaleY=1,this._scaleSignY=1}static ortho(t,e,i,s,n,o){const h=new Jt;return h.data[0]=2/(e-t),h.data[1]=0,h.data[2]=0,h.data[3]=0,h.data[4]=0,h.data[5]=2/(s-i),h.data[6]=0,h.data[7]=0,h.data[8]=0,h.data[9]=0,h.data[10]=-2/(o-n),h.data[11]=0,h.data[12]=-(e+t)/(e-t),h.data[13]=-(s+i)/(s-i),h.data[14]=-(o+n)/(o-n),h.data[15]=1,h}clone(t){const e=t||new Jt;return e.data[0]=this.data[0],e.data[1]=this.data[1],e.data[2]=this.data[2],e.data[3]=this.data[3],e.data[4]=this.data[4],e.data[5]=this.data[5],e.data[6]=this.data[6],e.data[7]=this.data[7],e.data[8]=this.data[8],e.data[9]=this.data[9],e.data[10]=this.data[10],e.data[11]=this.data[11],e.data[12]=this.data[12],e.data[13]=this.data[13],e.data[14]=this.data[14],e.data[15]=this.data[15],e}toDOMMatrix(){return new DOMMatrix([...this.data])}static fromFloat32Array(t){const e=new Jt;return e.data=t,e}static identity(){const t=new Jt;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=0,t.data[4]=0,t.data[5]=1,t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=0,t.data[13]=0,t.data[14]=0,t.data[15]=1,t}reset(){const t=this;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=0,t.data[4]=0,t.data[5]=1,t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=0,t.data[13]=0,t.data[14]=0,t.data[15]=1,t}static translation(t,e){const i=Jt.identity();return i.data[12]=t,i.data[13]=e,i}static scale(t,e){const i=Jt.identity();return i.data[0]=t,i.data[5]=e,i.data[10]=1,i.data[15]=1,i}static rotation(t){const e=Jt.identity();return e.data[0]=Math.cos(t),e.data[4]=-Math.sin(t),e.data[1]=Math.sin(t),e.data[5]=Math.cos(t),e}multiply(t,e){if(t instanceof A){const i=e||new A(0,0),s=t,n=s.x*this.data[0]+s.y*this.data[4]+this.data[12],o=s.x*this.data[1]+s.y*this.data[5]+this.data[13];return i.x=n,i.y=o,i}else{const i=e||new Jt,s=t,n=this.data[0],o=this.data[1],h=this.data[2],l=this.data[3],f=this.data[4],m=this.data[5],v=this.data[6],w=this.data[7],y=this.data[8],b=this.data[9],k=this.data[10],D=this.data[11],I=this.data[12],E=this.data[13],F=this.data[14],U=this.data[15],V=s.data[0],W=s.data[1],M=s.data[2],rt=s.data[3],ct=s.data[4],ft=s.data[5],at=s.data[6],It=s.data[7],qt=s.data[8],Wt=s.data[9],Zt=s.data[10],ue=s.data[11],we=s.data[12],Ae=s.data[13],K=s.data[14],qe=s.data[15];i.data[0]=n*V+f*W+y*M+I*rt,i.data[1]=o*V+m*W+b*M+E*rt,i.data[2]=h*V+v*W+k*M+F*rt,i.data[3]=l*V+w*W+D*M+U*rt,i.data[4]=n*ct+f*ft+y*at+I*It,i.data[5]=o*ct+m*ft+b*at+E*It,i.data[6]=h*ct+v*ft+k*at+F*It,i.data[7]=l*ct+w*ft+D*at+U*It,i.data[8]=n*qt+f*Wt+y*Zt+I*ue,i.data[9]=o*qt+m*Wt+b*Zt+E*ue,i.data[10]=h*qt+v*Wt+k*Zt+F*ue,i.data[11]=l*qt+w*Wt+D*Zt+U*ue,i.data[12]=n*we+f*Ae+y*K+I*qe,i.data[13]=o*we+m*Ae+b*K+E*qe,i.data[14]=h*we+v*Ae+k*K+F*qe,i.data[15]=l*we+w*Ae+D*K+U*qe;const wi=this.getScale();return i._scaleSignX=te(wi.x)*te(i._scaleSignX),i._scaleSignY=te(wi.y)*te(i._scaleSignY),i}}translate(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5],f=this.data[6],m=this.data[7],v=this.data[8],w=this.data[9],y=this.data[10],b=this.data[11],k=this.data[12],D=this.data[13],I=this.data[14],E=this.data[15],F=0,U=1;return this.data[12]=i*t+h*e+v*F+k*U,this.data[13]=s*t+l*e+w*F+D*U,this.data[14]=n*t+f*e+y*F+I*U,this.data[15]=o*t+m*e+b*F+E*U,this}setPosition(t,e){this.data[12]=t,this.data[13]=e}getPosition(){return R(this.data[12],this.data[13])}rotate(t){const e=this.data[0],i=this.data[1],s=this.data[2],n=this.data[3],o=this.data[4],h=this.data[5],l=this.data[6],f=this.data[7],m=Math.sin(t),v=Math.cos(t);return this.data[0]=v*e+m*o,this.data[1]=v*i+m*h,this.data[2]=v*s+m*l,this.data[3]=v*n+m*f,this.data[4]=v*o-m*e,this.data[5]=v*h-m*i,this.data[6]=v*l-m*s,this.data[7]=v*f-m*n,this}scale(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5],f=this.data[6],m=this.data[7];return this.data[0]=i*t,this.data[1]=s*t,this.data[2]=n*t,this.data[3]=o*t,this.data[4]=h*e,this.data[5]=l*e,this.data[6]=f*e,this.data[7]=m*e,this}setRotation(t){const e=this.getScale(),i=Math.sin(t),s=Math.cos(t);this.data[0]=s*e.x,this.data[1]=i*e.y,this.data[4]=-i*e.x,this.data[5]=s*e.y}getRotation(){const t=Math.atan2(this.data[1]/this.getScaleY(),this.data[0]/this.getScaleX());return ai(t)}getScaleX(){const t=R(this.data[0],this.data[4]).size;return this._scaleSignX*t}getScaleY(){const t=R(this.data[1],this.data[5]).size;return this._scaleSignY*t}getScale(){return R(this.getScaleX(),this.getScaleY())}setScaleX(t){if(this._scaleX===t)return;this._scaleSignX=te(t);const e=R(this.data[0]*this._scaleSignX,this.data[4]*this._scaleSignX).normalize();this.data[0]=e.x*t,this.data[4]=e.y*t,this._scaleX=t}setScaleY(t){if(this._scaleY===t)return;this._scaleSignY=te(t);const e=R(this.data[1]*this._scaleSignY,this.data[5]*this._scaleSignY).normalize();this.data[1]=e.x*t,this.data[5]=e.y*t,this._scaleY=t}setScale(t){this.setScaleX(t.x),this.setScaleY(t.y)}getBasisDeterminant(){return this.data[0]*this.data[5]-this.data[1]*this.data[4]}getAffineInverse(t){const i=1/this.getBasisDeterminant(),s=this.data[0],n=this.data[4],o=this.data[1],h=this.data[5],l=t||Jt.identity();l.data[0]=h*i,l.data[1]=-o*i,l.data[4]=-n*i,l.data[5]=s*i;const f=this.data[12],m=this.data[13];return l.data[12]=-(f*l.data[0]+m*l.data[4]),l.data[13]=-(f*l.data[1]+m*l.data[5]),l}isIdentity(){return this.data[0]===1&&this.data[1]===0&&this.data[2]===0&&this.data[3]===0&&this.data[4]===0&&this.data[5]===1&&this.data[6]===0&&this.data[7]===0&&this.data[8]===0&&this.data[9]===0&&this.data[10]===1&&this.data[11]===0&&this.data[12]===0&&this.data[13]===0&&this.data[14]===0&&this.data[15]===1}toString(){return` [${this.data[0]} ${this.data[4]} ${this.data[8]} ${this.data[12]}] [${this.data[1]} ${this.data[5]} ${this.data[9]} ${this.data[13]}] [${this.data[2]} ${this.data[6]} ${this.data[10]} ${this.data[14]}] [${this.data[3]} ${this.data[7]} ${this.data[11]} ${this.data[15]}] -`}}class Et{constructor(){this.data=new Float64Array(6),this._scale=new Float64Array([1,1]),this._scaleSignX=1,this._scaleSignY=1}toDOMMatrix(){return new DOMMatrix([...this.data])}static identity(){const t=new Et;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=1,t.data[4]=0,t.data[5]=0,t}static translation(t,e){const i=Et.identity();return i.data[4]=t,i.data[5]=e,i}static scale(t,e){const i=Et.identity();return i.data[0]=t,i.data[3]=e,i._scale[0]=t,i._scale[1]=e,i}static rotation(t){const e=Et.identity();return e.data[0]=Math.cos(t),e.data[1]=Math.sin(t),e.data[2]=-Math.sin(t),e.data[3]=Math.cos(t),e}setPosition(t,e){this.data[4]=t,this.data[5]=e}getPosition(){return R(this.data[4],this.data[5])}rotate(t){const e=this.data[0],i=this.data[1],s=this.data[2],n=this.data[3],o=Math.sin(t),h=Math.cos(t);return this.data[0]=h*e+o*s,this.data[1]=h*i+o*n,this.data[2]=h*s-o*e,this.data[3]=h*n-o*i,this}translate(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5];return this.data[4]=i*t+n*e+h,this.data[5]=s*t+o*e+l,this}scale(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3];return this.data[0]=i*t,this.data[1]=s*t,this.data[2]=n*e,this.data[3]=o*e,this._scale[0]=t,this._scale[1]=e,this}determinant(){return this.data[0]*this.data[3]-this.data[1]*this.data[2]}inverse(t){const i=1/this.determinant(),s=this.data[0],n=this.data[2],o=this.data[1],h=this.data[3],l=t||Et.identity();l.data[0]=h*i,l.data[1]=-o*i,l.data[2]=-n*i,l.data[3]=s*i;const f=this.data[4],p=this.data[5];return l.data[4]=-(f*l.data[0]+p*l.data[2]),l.data[5]=-(f*l.data[1]+p*l.data[3]),l}multiply(t,e){if(t instanceof A){const i=e||new A(0,0),s=t,n=s.x*this.data[0]+s.y*this.data[2]+this.data[4],o=s.x*this.data[1]+s.y*this.data[3]+this.data[5];return i.x=n,i.y=o,i}else{const i=e||new Et,s=t,n=this.data[0],o=this.data[1],h=this.data[2],l=this.data[3],f=this.data[4],p=this.data[5],v=s.data[0],w=s.data[1],y=s.data[2],b=s.data[3],k=s.data[4],D=s.data[5];i.data[0]=n*v+h*w,i.data[1]=o*v+l*w,i.data[2]=n*y+h*b,i.data[3]=o*y+l*b,i.data[4]=n*k+h*D+f,i.data[5]=o*k+l*D+p;const C=this.getScale();return i._scaleSignX=te(C.x)*te(i._scaleSignX),i._scaleSignY=te(C.y)*te(i._scaleSignY),i}}to4x4(){const t=new Jt;return t.data[0]=this.data[0],t.data[1]=this.data[1],t.data[2]=0,t.data[3]=0,t.data[4]=this.data[2],t.data[5]=this.data[3],t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=this.data[4],t.data[13]=this.data[5],t.data[14]=0,t.data[15]=1,t}setRotation(t){const e=this.getScale(),i=Math.sin(t),s=Math.cos(t);this.data[0]=s*e.x,this.data[1]=i*e.y,this.data[2]=-i*e.x,this.data[3]=s*e.y}getRotation(){const t=Math.atan2(this.data[1]/this.getScaleY(),this.data[0]/this.getScaleX());return ai(t)}getScaleX(){const t=R(this.data[0],this.data[2]).distance();return this._scaleSignX*t}getScaleY(){const t=R(this.data[1],this.data[3]).distance();return this._scaleSignY*t}getScale(){return R(this.getScaleX(),this.getScaleY())}setScaleX(t){if(t===this._scale[0])return;this._scaleSignX=te(t);const e=R(this.data[0]*this._scaleSignX,this.data[2]*this._scaleSignX).normalize();this.data[0]=e.x*t,this.data[2]=e.y*t,this._scale[0]=t}setScaleY(t){if(t===this._scale[1])return;this._scaleSignY=te(t);const e=R(this.data[1]*this._scaleSignY,this.data[3]*this._scaleSignY).normalize();this.data[1]=e.x*t,this.data[3]=e.y*t,this._scale[1]=t}setScale(t){this.setScaleX(t.x),this.setScaleY(t.y)}isIdentity(){return this.data[0]===1&&this.data[1]===0&&this.data[2]===0&&this.data[3]===1&&this.data[4]===0&&this.data[5]===0}reset(){const t=this;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=1,t.data[4]=0,t.data[5]=0,t}clone(t){const e=t||new Et;return e.data[0]=this.data[0],e.data[1]=this.data[1],e.data[2]=this.data[2],e.data[3]=this.data[3],e.data[4]=this.data[4],e.data[5]=this.data[5],e}toString(){return` +`}}class Et{constructor(){this.data=new Float64Array(6),this._scale=new Float64Array([1,1]),this._scaleSignX=1,this._scaleSignY=1}toDOMMatrix(){return new DOMMatrix([...this.data])}static identity(){const t=new Et;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=1,t.data[4]=0,t.data[5]=0,t}static translation(t,e){const i=Et.identity();return i.data[4]=t,i.data[5]=e,i}static scale(t,e){const i=Et.identity();return i.data[0]=t,i.data[3]=e,i._scale[0]=t,i._scale[1]=e,i}static rotation(t){const e=Et.identity();return e.data[0]=Math.cos(t),e.data[1]=Math.sin(t),e.data[2]=-Math.sin(t),e.data[3]=Math.cos(t),e}setPosition(t,e){this.data[4]=t,this.data[5]=e}getPosition(){return R(this.data[4],this.data[5])}rotate(t){const e=this.data[0],i=this.data[1],s=this.data[2],n=this.data[3],o=Math.sin(t),h=Math.cos(t);return this.data[0]=h*e+o*s,this.data[1]=h*i+o*n,this.data[2]=h*s-o*e,this.data[3]=h*n-o*i,this}translate(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3],h=this.data[4],l=this.data[5];return this.data[4]=i*t+n*e+h,this.data[5]=s*t+o*e+l,this}scale(t,e){const i=this.data[0],s=this.data[1],n=this.data[2],o=this.data[3];return this.data[0]=i*t,this.data[1]=s*t,this.data[2]=n*e,this.data[3]=o*e,this._scale[0]=t,this._scale[1]=e,this}determinant(){return this.data[0]*this.data[3]-this.data[1]*this.data[2]}inverse(t){const i=1/this.determinant(),s=this.data[0],n=this.data[2],o=this.data[1],h=this.data[3],l=t||Et.identity();l.data[0]=h*i,l.data[1]=-o*i,l.data[2]=-n*i,l.data[3]=s*i;const f=this.data[4],m=this.data[5];return l.data[4]=-(f*l.data[0]+m*l.data[2]),l.data[5]=-(f*l.data[1]+m*l.data[3]),l}multiply(t,e){if(t instanceof A){const i=e||new A(0,0),s=t,n=s.x*this.data[0]+s.y*this.data[2]+this.data[4],o=s.x*this.data[1]+s.y*this.data[3]+this.data[5];return i.x=n,i.y=o,i}else{const i=e||new Et,s=t,n=this.data[0],o=this.data[1],h=this.data[2],l=this.data[3],f=this.data[4],m=this.data[5],v=s.data[0],w=s.data[1],y=s.data[2],b=s.data[3],k=s.data[4],D=s.data[5];i.data[0]=n*v+h*w,i.data[1]=o*v+l*w,i.data[2]=n*y+h*b,i.data[3]=o*y+l*b,i.data[4]=n*k+h*D+f,i.data[5]=o*k+l*D+m;const I=this.getScale();return i._scaleSignX=te(I.x)*te(i._scaleSignX),i._scaleSignY=te(I.y)*te(i._scaleSignY),i}}to4x4(){const t=new Jt;return t.data[0]=this.data[0],t.data[1]=this.data[1],t.data[2]=0,t.data[3]=0,t.data[4]=this.data[2],t.data[5]=this.data[3],t.data[6]=0,t.data[7]=0,t.data[8]=0,t.data[9]=0,t.data[10]=1,t.data[11]=0,t.data[12]=this.data[4],t.data[13]=this.data[5],t.data[14]=0,t.data[15]=1,t}setRotation(t){const e=this.getScale(),i=Math.sin(t),s=Math.cos(t);this.data[0]=s*e.x,this.data[1]=i*e.y,this.data[2]=-i*e.x,this.data[3]=s*e.y}getRotation(){const t=Math.atan2(this.data[1]/this.getScaleY(),this.data[0]/this.getScaleX());return ai(t)}getScaleX(){const t=R(this.data[0],this.data[2]).distance();return this._scaleSignX*t}getScaleY(){const t=R(this.data[1],this.data[3]).distance();return this._scaleSignY*t}getScale(){return R(this.getScaleX(),this.getScaleY())}setScaleX(t){if(t===this._scale[0])return;this._scaleSignX=te(t);const e=R(this.data[0]*this._scaleSignX,this.data[2]*this._scaleSignX).normalize();this.data[0]=e.x*t,this.data[2]=e.y*t,this._scale[0]=t}setScaleY(t){if(t===this._scale[1])return;this._scaleSignY=te(t);const e=R(this.data[1]*this._scaleSignY,this.data[3]*this._scaleSignY).normalize();this.data[1]=e.x*t,this.data[3]=e.y*t,this._scale[1]=t}setScale(t){this.setScaleX(t.x),this.setScaleY(t.y)}isIdentity(){return this.data[0]===1&&this.data[1]===0&&this.data[2]===0&&this.data[3]===1&&this.data[4]===0&&this.data[5]===0}reset(){const t=this;return t.data[0]=1,t.data[1]=0,t.data[2]=0,t.data[3]=1,t.data[4]=0,t.data[5]=0,t}clone(t){const e=t||new Et;return e.data[0]=this.data[0],e.data[1]=this.data[1],e.data[2]=this.data[2],e.data[3]=this.data[3],e.data[4]=this.data[4],e.data[5]=this.data[5],e}toString(){return` [${this.data[0]} ${this.data[2]} ${this.data[4]}] [${this.data[1]} ${this.data[3]} ${this.data[5]}] [0 0 1] -`}}class bo{constructor(){this._transforms=[],this._currentTransform=Et.identity()}save(){this._transforms.push(this._currentTransform),this._currentTransform=this._currentTransform.clone()}restore(){this._currentTransform=this._transforms.pop()}translate(t,e){return this._currentTransform.translate(t,e)}rotate(t){return this._currentTransform.rotate(t)}scale(t,e){return this._currentTransform.scale(t,e)}set current(t){this._currentTransform=t}get current(){return this._currentTransform}}class Tn{constructor(){this._states=[],this._currentState=this._getDefaultState()}_getDefaultState(){return{opacity:1,z:0,tint:L.White,material:null}}_cloneState(){return{opacity:this._currentState.opacity,z:this._currentState.z,tint:this._currentState.tint.clone(),material:this._currentState.material}}save(){this._states.push(this._currentState),this._currentState=this._cloneState()}restore(){this._currentState=this._states.pop()}get current(){return this._currentState}set current(t){this._currentState=t}}const Eo={Complete:"complete",Load:"load",LoadStart:"loadstart",Progress:"progress",Error:"error"};class Vi{constructor(t,e,i=!1){this.path=t,this.responseType=e,this.bustCache=i,this.data=null,this.logger=V.getInstance(),this.events=new P}isLoaded(){return this.data!==null}_cacheBust(t){return/\?\w*=\w*/.test(t)?t+="&__="+Date.now():t+="?__="+Date.now(),t}load(){return new Promise((t,e)=>{if(this.data!==null){this.logger.debug("Already have data for resource",this.path),this.events.emit("complete",this.data),t(this.data);return}const i=new XMLHttpRequest;i.open("GET",this.bustCache?this._cacheBust(this.path):this.path,!0),i.responseType=this.responseType,i.addEventListener("loadstart",s=>this.events.emit("loadstart",s)),i.addEventListener("progress",s=>this.events.emit("progress",s)),i.addEventListener("error",s=>this.events.emit("error",s)),i.addEventListener("load",s=>this.events.emit("load",s)),i.addEventListener("load",()=>{if(i.status!==0&&i.status!==200){this.logger.error("Failed to load resource ",this.path," server responded with error code",i.status),this.events.emit("error",i.response),e(new Error(i.statusText));return}this.data=i.response,this.events.emit("complete",this.data),this.logger.debug("Completed loading resource",this.path),t(this.data)}),i.send()})}}function Qe(r,t){return r&&(r.__isProxy===void 0?new Proxy(r,{set:(e,i,s)=>(e[i]!==s&&(e[i]=s,typeof i=="string"&&i[0]!=="_"&&t(e)),!0),get:(e,i)=>i!=="__isProxy"?e[i]:!0}):r)}function Pn(r,t){return r&&(r.__isProxy===void 0?new Proxy(r,{set:(e,i,s)=>(e[i]=s,typeof i=="string"&&i[0]!=="_"&&t(e),!0),get:(e,i)=>i!=="__isProxy"?e[i]:!0}):r)}class jt{isStale(){return this._transformStale}get flipHorizontal(){return this._flipHorizontal}set flipHorizontal(t){this._flipHorizontal=t,this._transformStale=!0}get flipVertical(){return this._flipVertical}set flipVertical(t){this._flipVertical=t,this._transformStale=!0}get rotation(){return this._rotation}set rotation(t){this._rotation=t,this._transformStale=!0}get scale(){return this._scale}set scale(t){this._scale=Qe(t,()=>{this._transformStale=!0}),this._transformStale=!0}get origin(){return this._origin}set origin(t){this._origin=Qe(t,()=>{this._transformStale=!0}),this._transformStale=!0}constructor(t){var e,i,s,n,o,h,l;this.id=jt._ID++,this.transform=Et.identity(),this.tint=null,this._transformStale=!0,this.showDebug=!1,this._flipHorizontal=!1,this._flipVertical=!1,this._rotation=0,this.opacity=1,this._scale=A.One,this._origin=null,this._width=0,this._height=0,t&&(this.origin=(e=t.origin)!==null&&e!==void 0?e:this.origin,this.flipHorizontal=(i=t.flipHorizontal)!==null&&i!==void 0?i:this.flipHorizontal,this.flipVertical=(s=t.flipVertical)!==null&&s!==void 0?s:this.flipVertical,this.rotation=(n=t.rotation)!==null&&n!==void 0?n:this.rotation,this.opacity=(o=t.opacity)!==null&&o!==void 0?o:this.opacity,this.scale=(h=t.scale)!==null&&h!==void 0?h:this.scale,this.tint=(l=t.tint)!==null&&l!==void 0?l:this.tint)}cloneGraphicOptions(){return{width:this.width/this.scale.x,height:this.height/this.scale.y,origin:this.origin?this.origin.clone():null,flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,rotation:this.rotation,opacity:this.opacity,scale:this.scale?this.scale.clone():null,tint:this.tint?this.tint.clone():null}}get width(){return Math.abs(this._width*this.scale.x)}get height(){return Math.abs(this._height*this.scale.y)}set width(t){this._width=t,this._transformStale=!0}set height(t){this._height=t,this._transformStale=!0}get localBounds(){return J.fromDimension(this.width,this.height,A.Zero)}draw(t,e,i){this._preDraw(t,e,i),this._drawImage(t,0,0),this._postDraw(t)}_preDraw(t,e,i){t.save(),t.translate(e,i),this._transformStale&&(this.transform.reset(),this.transform.scale(Math.abs(this.scale.x),Math.abs(this.scale.y)),this._rotate(this.transform),this._flip(this.transform),this._transformStale=!1),t.multiply(this.transform),t.opacity=t.opacity*this.opacity,this.tint&&(t.tint=this.tint)}_rotate(t){var e;const i=this.scale.x>0?1:-1,s=this.scale.y>0?1:-1,n=(e=this.origin)!==null&&e!==void 0?e:R(this.width/2,this.height/2);t.translate(n.x,n.y),t.rotate(this.rotation),t.scale(i,s),t.translate(-n.x,-n.y)}_flip(t){this.flipHorizontal&&(t.translate(this.width/this.scale.x,0),t.scale(-1,1)),this.flipVertical&&(t.translate(0,this.height/this.scale.y),t.scale(1,-1))}_postDraw(t){this.showDebug&&t.debug.drawRect(0,0,this.width,this.height),t.restore()}}jt._ID=0;class He extends jt{static from(t){return new He({image:t})}constructor(t){var e,i;super(t),this._logger=V.getInstance(),this._dirty=!0,this._logNotLoadedWarning=!1,this.image=t.image;const{width:s,height:n}=t;this.sourceView=(e=t.sourceView)!==null&&e!==void 0?e:{x:0,y:0,width:s??0,height:n??0},this.destSize=(i=t.destSize)!==null&&i!==void 0?i:{width:s??0,height:n??0},this._updateSpriteDimensions(),this.image.ready.then(()=>{this._updateSpriteDimensions()})}get width(){return Math.abs(this.destSize.width*this.scale.x)}get height(){return Math.abs(this.destSize.height*this.scale.y)}set width(t){t/=Math.abs(this.scale.x),this.destSize.width=t,super.width=Math.ceil(this.destSize.width)}set height(t){t/=Math.abs(this.scale.y),this.destSize.height=t,super.height=Math.ceil(this.destSize.height)}_updateSpriteDimensions(){var t,e,i,s,n,o;const{width:h,height:l}=this.image;this.sourceView.width=((t=this.sourceView)===null||t===void 0?void 0:t.width)||h,this.sourceView.height=((e=this.sourceView)===null||e===void 0?void 0:e.height)||l,this.destSize.width=((i=this.destSize)===null||i===void 0?void 0:i.width)||((s=this.sourceView)===null||s===void 0?void 0:s.width)||h,this.destSize.height=((n=this.destSize)===null||n===void 0?void 0:n.height)||((o=this.sourceView)===null||o===void 0?void 0:o.height)||l,this.width=Math.ceil(this.destSize.width)*this.scale.x,this.height=Math.ceil(this.destSize.height)*this.scale.y}_preDraw(t,e,i){this.image.isLoaded()&&this._dirty&&(this._dirty=!1,this._updateSpriteDimensions()),super._preDraw(t,e,i)}_drawImage(t,e,i){this.image.isLoaded()?t.drawImage(this.image.image,this.sourceView.x,this.sourceView.y,this.sourceView.width,this.sourceView.height,e,i,this.destSize.width,this.destSize.height):(this._logNotLoadedWarning||this._logger.warn(`ImageSource ${this.image.path} is not yet loaded and won't be drawn. Please call .load() or include in a Loader. +`}}class Eo{constructor(){this._transforms=[],this._currentTransform=Et.identity()}save(){this._transforms.push(this._currentTransform),this._currentTransform=this._currentTransform.clone()}restore(){this._currentTransform=this._transforms.pop()}translate(t,e){return this._currentTransform.translate(t,e)}rotate(t){return this._currentTransform.rotate(t)}scale(t,e){return this._currentTransform.scale(t,e)}set current(t){this._currentTransform=t}get current(){return this._currentTransform}}class Pn{constructor(){this._states=[],this._currentState=this._getDefaultState()}_getDefaultState(){return{opacity:1,z:0,tint:L.White,material:null}}_cloneState(){return{opacity:this._currentState.opacity,z:this._currentState.z,tint:this._currentState.tint.clone(),material:this._currentState.material}}save(){this._states.push(this._currentState),this._currentState=this._cloneState()}restore(){this._currentState=this._states.pop()}get current(){return this._currentState}set current(t){this._currentState=t}}const Co={Complete:"complete",Load:"load",LoadStart:"loadstart",Progress:"progress",Error:"error"};class ji{constructor(t,e,i=!1){this.path=t,this.responseType=e,this.bustCache=i,this.data=null,this.logger=j.getInstance(),this.events=new T}isLoaded(){return this.data!==null}_cacheBust(t){return/\?\w*=\w*/.test(t)?t+="&__="+Date.now():t+="?__="+Date.now(),t}load(){return new Promise((t,e)=>{if(this.data!==null){this.logger.debug("Already have data for resource",this.path),this.events.emit("complete",this.data),t(this.data);return}const i=new XMLHttpRequest;i.open("GET",this.bustCache?this._cacheBust(this.path):this.path,!0),i.responseType=this.responseType,i.addEventListener("loadstart",s=>this.events.emit("loadstart",s)),i.addEventListener("progress",s=>this.events.emit("progress",s)),i.addEventListener("error",s=>this.events.emit("error",s)),i.addEventListener("load",s=>this.events.emit("load",s)),i.addEventListener("load",()=>{if(i.status!==0&&i.status!==200){this.logger.error("Failed to load resource ",this.path," server responded with error code",i.status),this.events.emit("error",i.response),e(new Error(i.statusText));return}this.data=i.response,this.events.emit("complete",this.data),this.logger.debug("Completed loading resource",this.path),t(this.data)}),i.send()})}}function He(r,t){return r&&(r.__isProxy===void 0?new Proxy(r,{set:(e,i,s)=>(e[i]!==s&&(e[i]=s,typeof i=="string"&&i[0]!=="_"&&t(e)),!0),get:(e,i)=>i!=="__isProxy"?e[i]:!0}):r)}function Rn(r,t){return r&&(r.__isProxy===void 0?new Proxy(r,{set:(e,i,s)=>(e[i]=s,typeof i=="string"&&i[0]!=="_"&&t(e),!0),get:(e,i)=>i!=="__isProxy"?e[i]:!0}):r)}class Vt{isStale(){return this._transformStale}get flipHorizontal(){return this._flipHorizontal}set flipHorizontal(t){this._flipHorizontal=t,this._transformStale=!0}get flipVertical(){return this._flipVertical}set flipVertical(t){this._flipVertical=t,this._transformStale=!0}get rotation(){return this._rotation}set rotation(t){this._rotation=t,this._transformStale=!0}get scale(){return this._scale}set scale(t){this._scale=He(t,()=>{this._transformStale=!0}),this._transformStale=!0}get origin(){return this._origin}set origin(t){this._origin=He(t,()=>{this._transformStale=!0}),this._transformStale=!0}constructor(t){var e,i,s,n,o,h,l;this.id=Vt._ID++,this.transform=Et.identity(),this.tint=null,this._transformStale=!0,this.showDebug=!1,this._flipHorizontal=!1,this._flipVertical=!1,this._rotation=0,this.opacity=1,this._scale=A.One,this._origin=null,this._width=0,this._height=0,t&&(this.origin=(e=t.origin)!==null&&e!==void 0?e:this.origin,this.flipHorizontal=(i=t.flipHorizontal)!==null&&i!==void 0?i:this.flipHorizontal,this.flipVertical=(s=t.flipVertical)!==null&&s!==void 0?s:this.flipVertical,this.rotation=(n=t.rotation)!==null&&n!==void 0?n:this.rotation,this.opacity=(o=t.opacity)!==null&&o!==void 0?o:this.opacity,this.scale=(h=t.scale)!==null&&h!==void 0?h:this.scale,this.tint=(l=t.tint)!==null&&l!==void 0?l:this.tint)}cloneGraphicOptions(){return{width:this.width/this.scale.x,height:this.height/this.scale.y,origin:this.origin?this.origin.clone():null,flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical,rotation:this.rotation,opacity:this.opacity,scale:this.scale?this.scale.clone():null,tint:this.tint?this.tint.clone():null}}get width(){return Math.abs(this._width*this.scale.x)}get height(){return Math.abs(this._height*this.scale.y)}set width(t){this._width=t,this._transformStale=!0}set height(t){this._height=t,this._transformStale=!0}get localBounds(){return J.fromDimension(this.width,this.height,A.Zero)}draw(t,e,i){this._preDraw(t,e,i),this._drawImage(t,0,0),this._postDraw(t)}_preDraw(t,e,i){t.save(),t.translate(e,i),this._transformStale&&(this.transform.reset(),this.transform.scale(Math.abs(this.scale.x),Math.abs(this.scale.y)),this._rotate(this.transform),this._flip(this.transform),this._transformStale=!1),t.multiply(this.transform),t.opacity=t.opacity*this.opacity,this.tint&&(t.tint=this.tint)}_rotate(t){var e;const i=this.scale.x>0?1:-1,s=this.scale.y>0?1:-1,n=(e=this.origin)!==null&&e!==void 0?e:R(this.width/2,this.height/2);t.translate(n.x,n.y),t.rotate(this.rotation),t.scale(i,s),t.translate(-n.x,-n.y)}_flip(t){this.flipHorizontal&&(t.translate(this.width/this.scale.x,0),t.scale(-1,1)),this.flipVertical&&(t.translate(0,this.height/this.scale.y),t.scale(1,-1))}_postDraw(t){this.showDebug&&t.debug.drawRect(0,0,this.width,this.height),t.restore()}}Vt._ID=0;class Qe extends Vt{static from(t){return new Qe({image:t})}constructor(t){var e,i;super(t),this._logger=j.getInstance(),this._dirty=!0,this._logNotLoadedWarning=!1,this.image=t.image;const{width:s,height:n}=t;this.sourceView=(e=t.sourceView)!==null&&e!==void 0?e:{x:0,y:0,width:s??0,height:n??0},this.destSize=(i=t.destSize)!==null&&i!==void 0?i:{width:s??0,height:n??0},this._updateSpriteDimensions(),this.image.ready.then(()=>{this._updateSpriteDimensions()})}get width(){return Math.abs(this.destSize.width*this.scale.x)}get height(){return Math.abs(this.destSize.height*this.scale.y)}set width(t){t/=Math.abs(this.scale.x),this.destSize.width=t,super.width=Math.ceil(this.destSize.width)}set height(t){t/=Math.abs(this.scale.y),this.destSize.height=t,super.height=Math.ceil(this.destSize.height)}_updateSpriteDimensions(){var t,e,i,s,n,o;const{width:h,height:l}=this.image;this.sourceView.width=((t=this.sourceView)===null||t===void 0?void 0:t.width)||h,this.sourceView.height=((e=this.sourceView)===null||e===void 0?void 0:e.height)||l,this.destSize.width=((i=this.destSize)===null||i===void 0?void 0:i.width)||((s=this.sourceView)===null||s===void 0?void 0:s.width)||h,this.destSize.height=((n=this.destSize)===null||n===void 0?void 0:n.height)||((o=this.sourceView)===null||o===void 0?void 0:o.height)||l,this.width=Math.ceil(this.destSize.width)*this.scale.x,this.height=Math.ceil(this.destSize.height)*this.scale.y}_preDraw(t,e,i){this.image.isLoaded()&&this._dirty&&(this._dirty=!1,this._updateSpriteDimensions()),super._preDraw(t,e,i)}_drawImage(t,e,i){this.image.isLoaded()?t.drawImage(this.image.image,this.sourceView.x,this.sourceView.y,this.sourceView.width,this.sourceView.height,e,i,this.destSize.width,this.destSize.height):(this._logNotLoadedWarning||this._logger.warn(`ImageSource ${this.image.path} is not yet loaded and won't be drawn. Please call .load() or include in a Loader. -Read https://excaliburjs.com/docs/imagesource for more information.`),this._logNotLoadedWarning=!0)}clone(){return new He({image:this.image,sourceView:{...this.sourceView},destSize:{...this.destSize},...this.cloneGraphicOptions()})}}var Ot;(function(r){r.Pixel="Pixel",r.Blended="Blended"})(Ot||(Ot={}));class Bt{constructor(t){this._textureMap=new Map,this._gl=t,Bt._MAX_TEXTURE_SIZE=t.getParameter(t.MAX_TEXTURE_SIZE)}get(t){return this._textureMap.get(t)}has(t){return this._textureMap.has(t)}load(t,e,i=!1){const s=this._gl;if(!s)return null;let n=null;if(this.has(t)&&(n=this.get(t)),n)return i&&(s.bindTexture(s.TEXTURE_2D,n),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,t)),n;n=s.createTexture(),Bt.checkImageSizeSupportedAndLog(t),s.bindTexture(s.TEXTURE_2D,n),s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE);const o=e??Bt.filtering;return s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,o===Ot.Pixel?s.NEAREST:s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,o===Ot.Pixel?s.NEAREST:s.LINEAR),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,t),this._textureMap.set(t,n),n}delete(t){const e=this._gl;if(!e)return null;let i=null;this.has(t)&&(i=this.get(t),e.deleteTexture(i))}static checkImageSizeSupportedAndLog(t){var e;const i=(e=t.dataset.originalSrc)!==null&&e!==void 0?e:"internal canvas bitmap";return t.width>Bt._MAX_TEXTURE_SIZE||t.height>Bt._MAX_TEXTURE_SIZE?(Bt._LOGGER.error(`The image [${i}] provided to Excalibur is too large for the device's maximum texture size of (${Bt._MAX_TEXTURE_SIZE}x${Bt._MAX_TEXTURE_SIZE}) please resize to an image for excalibur to render properly. +Read https://excaliburjs.com/docs/imagesource for more information.`),this._logNotLoadedWarning=!0)}clone(){return new Qe({image:this.image,sourceView:{...this.sourceView},destSize:{...this.destSize},...this.cloneGraphicOptions()})}}var Ot;(function(r){r.Pixel="Pixel",r.Blended="Blended"})(Ot||(Ot={}));class Mt{constructor(t){this._textureMap=new Map,this._gl=t,Mt._MAX_TEXTURE_SIZE=t.getParameter(t.MAX_TEXTURE_SIZE)}get(t){return this._textureMap.get(t)}has(t){return this._textureMap.has(t)}load(t,e,i=!1){const s=this._gl;if(!s)return null;let n=null;if(this.has(t)&&(n=this.get(t)),n)return i&&(s.bindTexture(s.TEXTURE_2D,n),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,t)),n;n=s.createTexture(),Mt.checkImageSizeSupportedAndLog(t),s.bindTexture(s.TEXTURE_2D,n),s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE);const o=e??Mt.filtering;return s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MIN_FILTER,o===Ot.Pixel?s.NEAREST:s.LINEAR),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_MAG_FILTER,o===Ot.Pixel?s.NEAREST:s.LINEAR),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,s.RGBA,s.UNSIGNED_BYTE,t),this._textureMap.set(t,n),n}delete(t){const e=this._gl;if(!e)return null;let i=null;this.has(t)&&(i=this.get(t),e.deleteTexture(i))}static checkImageSizeSupportedAndLog(t){var e;const i=(e=t.dataset.originalSrc)!==null&&e!==void 0?e:"internal canvas bitmap";return t.width>Mt._MAX_TEXTURE_SIZE||t.height>Mt._MAX_TEXTURE_SIZE?(Mt._LOGGER.error(`The image [${i}] provided to Excalibur is too large for the device's maximum texture size of (${Mt._MAX_TEXTURE_SIZE}x${Mt._MAX_TEXTURE_SIZE}) please resize to an image for excalibur to render properly. Images will likely render as black rectangles. -Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`),!1):((t.width>4096||t.height>4096)&&Bt._LOGGER.warn(`The image [${i}] provided to excalibur is too large may not work on all mobile devices, it is recommended you resize images to a maximum (4096x4096). +Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`),!1):((t.width>4096||t.height>4096)&&Mt._LOGGER.warn(`The image [${i}] provided to excalibur is too large may not work on all mobile devices, it is recommended you resize images to a maximum (4096x4096). Images will likely render as black rectangles on some mobile platforms. -Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`),!0)}}Bt._LOGGER=V.getInstance(),Bt.filtering=Ot.Blended,Bt._MAX_TEXTURE_SIZE=4096;class Us{get width(){return this.image.naturalWidth}get height(){return this.image.naturalHeight}isLoaded(){return this._src||(this._src=this.data.src),!!this._src}get image(){return this.data}constructor(t,e=!1,i){this.path=t,this._logger=V.getInstance(),this.data=new Image,this._readyFuture=new Ne,this.ready=this._readyFuture.promise,this._resource=new Vi(t,"blob",e),this.filtering=i,(t.endsWith(".svg")||t.endsWith(".gif"))&&this._logger.warn(`Image type is not fully supported, you may have mixed results ${t}. Fully supported: jpg, bmp, and png`)}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}async load(){if(this.isLoaded())return this.data;try{let t;if(this.path.includes("data:image/"))t=this.path;else{const s=await this._resource.load();t=URL.createObjectURL(s)}const e=new Image,i=new Ne;e.onload=()=>i.resolve(),e.src=t,e.setAttribute("data-original-src",this.path),await i.promise,this.data=e,Bt.checkImageSizeSupportedAndLog(this.data)}catch(t){throw`Error loading ImageSource from path '${this.path}' with error [${t.message}]`}return this.data.setAttribute("filtering",this.filtering),this._readyFuture.resolve(this.data),this.data}toSprite(){return He.from(this)}unload(){this.data=new Image}}class Ye{constructor(t){this._logger=V.getInstance(),this.sprites=[];const{sprites:e,rows:i,columns:s}=t;this.sprites=e,this.rows=i??1,this.columns=s??this.sprites.length}getSprite(t,e){if(t>=this.columns||t<0)return this._logger.warn(`No sprite exists in the SpriteSheet at (${t}, ${e}), x: ${t} should be between 0 and ${this.columns-1}`),null;if(e>=this.rows||e<0)return this._logger.warn(`No sprite exists in the SpriteSheet at (${t}, ${e}), y: ${e} should be between 0 and ${this.rows-1}`),null;const i=t+e*this.columns;return this.sprites[i]}static fromImageSourceWithSourceViews(t){const e=t.sourceViews.map(i=>new He({image:t.image,sourceView:i}));return new Ye({sprites:e})}static fromImageSource(t){var e;const i=[];t.spacing=(e=t.spacing)!==null&&e!==void 0?e:{};const{image:s,grid:{rows:n,columns:o,spriteWidth:h,spriteHeight:l},spacing:{originOffset:f,margin:p}}=t,v={x:0,y:0,...f},w={x:0,y:0,...p};for(let y=0;yt.clone()),rows:this.rows,columns:this.columns})}}class Ki extends jt{constructor(t){super(t),this._text="",this.alphabet="",this.shadow=null,this.caseInsensitive=!1,this.spacing=0,this._logger=V.getInstance(),this._alreadyWarnedAlphabet=!1,this._alreadyWarnedSpriteSheet=!1;const{alphabet:e,spriteSheet:i,caseInsensitive:s,spacing:n,shadow:o}=t;this.alphabet=e,this.spriteSheet=i,this.caseInsensitive=s??this.caseInsensitive,this.spacing=n??this.spacing,this.shadow=o??this.shadow}_getCharacterSprites(t){const e=[],i=this.caseInsensitive?t.toLocaleLowerCase():t,s=this.caseInsensitive?this.alphabet.toLocaleLowerCase():this.alphabet;for(let n=0;nl.length>f.length?l:f),n=this._getCharacterSprites(s);let o=0,h=0;for(const l of n)o+=l.width+this.spacing,h=Math.max(h,l.height);return J.fromDimension(o,h*i.length,A.Zero)}_drawImage(t,e,i,s){let n=0,o=0,h=0;const l=this._getLinesFromText(this._text,s);for(const f of l){for(const p of this._getCharacterSprites(f))p.draw(t,e+n,i+o),n+=p.width+this.spacing,h=Math.max(h,p.height);n=0,o+=h}}render(t,e,i,s,n,o){this._text=e;const h=this.measureText(e,o);this.width=h.width,this.height=h.height,this.shadow&&(t.save(),t.translate(this.shadow.offset.x,this.shadow.offset.y),this._preDraw(t,s,n),this._drawImage(t,0,0,o),this._postDraw(t),t.restore()),this._preDraw(t,s,n),this._drawImage(t,0,0,o),this._postDraw(t)}clone(){return new Ki({alphabet:this.alphabet,spriteSheet:this.spriteSheet,spacing:this.spacing})}_getLinesFromText(t,e){if(this._cachedText===t&&this._cachedRenderWidth===e)return this._cachedLines;const i=t.split(` -`);if(e==null)return i;for(let s=0;se){for(;this.measureText(n).width>e;)o=n[n.length-1]+o,n=n.slice(0,-1);i[s]=n,i[s+1]=o}}return this._cachedText=t,this._cachedLines=i,this._cachedRenderWidth=e,i}}const Co="data:image/png;base64,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";class Ls{constructor(){this.fontSheet=Co,this.size=16,this.load()}load(){return this._imageSource=new Us(this.fontSheet),this._imageSource.load().then(()=>{this._spriteSheet=Ye.fromImageSource({image:this._imageSource,grid:{rows:4,columns:16,spriteWidth:16,spriteHeight:16}}),this._spriteFont=new Ki({alphabet:`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!'&."?-()+# `,caseInsensitive:!0,spriteSheet:this._spriteSheet,spacing:-6})})}write(t,e,i){this._imageSource.isLoaded()&&this._spriteFont.render(t,e,null,i.x,i.y)}}class Io{constructor(t,e){this._gl=t,this._texture=e}use(){const t=this._gl;t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,this._texture)}disable(){const t=this._gl;t.bindTexture(t.TEXTURE_2D,null)}}class zs{constructor(t){this.width=t.width,this.height=t.height,this._gl=t.gl,this._setupFramebuffer()}setResolution(t,e){const i=this._gl;this.width=t,this.height=e,i.bindTexture(i.TEXTURE_2D,this._frameTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,this.width,this.height,0,i.RGBA,i.UNSIGNED_BYTE,null)}get frameBuffer(){return this._frameBuffer}get frameTexture(){return this._frameTexture}_setupFramebuffer(){const t=this._gl;this._frameTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this._frameTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE);const e=t.COLOR_ATTACHMENT0;this._frameBuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this._frameBuffer),t.framebufferTexture2D(t.FRAMEBUFFER,e,t.TEXTURE_2D,this._frameTexture,0),this.disable()}toRenderSource(){return new Io(this._gl,this._frameTexture)}use(){const t=this._gl;t.bindFramebuffer(t.FRAMEBUFFER,this._frameBuffer),t.viewport(0,0,this.width,this.height)}disable(){const t=this._gl;t.bindFramebuffer(t.FRAMEBUFFER,null),t.bindTexture(t.TEXTURE_2D,null)}}const So=`#version 300 es +Read more here: https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#understand_system_limits`),!0)}}Mt._LOGGER=j.getInstance(),Mt.filtering=Ot.Blended,Mt._MAX_TEXTURE_SIZE=4096;class Ls{get width(){return this.image.naturalWidth}get height(){return this.image.naturalHeight}isLoaded(){return this._src||(this._src=this.data.src),!!this._src}get image(){return this.data}constructor(t,e=!1,i){this.path=t,this._logger=j.getInstance(),this.data=new Image,this._readyFuture=new Ne,this.ready=this._readyFuture.promise,this._resource=new ji(t,"blob",e),this.filtering=i,(t.endsWith(".svg")||t.endsWith(".gif"))&&this._logger.warn(`Image type is not fully supported, you may have mixed results ${t}. Fully supported: jpg, bmp, and png`)}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}async load(){if(this.isLoaded())return this.data;try{let t;if(this.path.includes("data:image/"))t=this.path;else{const s=await this._resource.load();t=URL.createObjectURL(s)}const e=new Image,i=new Ne;e.onload=()=>i.resolve(),e.src=t,e.setAttribute("data-original-src",this.path),await i.promise,this.data=e,Mt.checkImageSizeSupportedAndLog(this.data)}catch(t){throw`Error loading ImageSource from path '${this.path}' with error [${t.message}]`}return this.data.setAttribute("filtering",this.filtering),this._readyFuture.resolve(this.data),this.data}toSprite(){return Qe.from(this)}unload(){this.data=new Image}}class Ye{constructor(t){this._logger=j.getInstance(),this.sprites=[];const{sprites:e,rows:i,columns:s}=t;this.sprites=e,this.rows=i??1,this.columns=s??this.sprites.length}getSprite(t,e){if(t>=this.columns||t<0)return this._logger.warn(`No sprite exists in the SpriteSheet at (${t}, ${e}), x: ${t} should be between 0 and ${this.columns-1}`),null;if(e>=this.rows||e<0)return this._logger.warn(`No sprite exists in the SpriteSheet at (${t}, ${e}), y: ${e} should be between 0 and ${this.rows-1}`),null;const i=t+e*this.columns;return this.sprites[i]}static fromImageSourceWithSourceViews(t){const e=t.sourceViews.map(i=>new Qe({image:t.image,sourceView:i}));return new Ye({sprites:e})}static fromImageSource(t){var e;const i=[];t.spacing=(e=t.spacing)!==null&&e!==void 0?e:{};const{image:s,grid:{rows:n,columns:o,spriteWidth:h,spriteHeight:l},spacing:{originOffset:f,margin:m}}=t,v={x:0,y:0,...f},w={x:0,y:0,...m};for(let y=0;yt.clone()),rows:this.rows,columns:this.columns})}}class Xi extends Vt{constructor(t){super(t),this._text="",this.alphabet="",this.shadow=null,this.caseInsensitive=!1,this.spacing=0,this._logger=j.getInstance(),this._alreadyWarnedAlphabet=!1,this._alreadyWarnedSpriteSheet=!1;const{alphabet:e,spriteSheet:i,caseInsensitive:s,spacing:n,shadow:o}=t;this.alphabet=e,this.spriteSheet=i,this.caseInsensitive=s??this.caseInsensitive,this.spacing=n??this.spacing,this.shadow=o??this.shadow}_getCharacterSprites(t){const e=[],i=this.caseInsensitive?t.toLocaleLowerCase():t,s=this.caseInsensitive?this.alphabet.toLocaleLowerCase():this.alphabet;for(let n=0;nl.length>f.length?l:f),n=this._getCharacterSprites(s);let o=0,h=0;for(const l of n)o+=l.width+this.spacing,h=Math.max(h,l.height);return J.fromDimension(o,h*i.length,A.Zero)}_drawImage(t,e,i,s){let n=0,o=0,h=0;const l=this._getLinesFromText(this._text,s);for(const f of l){for(const m of this._getCharacterSprites(f))m.draw(t,e+n,i+o),n+=m.width+this.spacing,h=Math.max(h,m.height);n=0,o+=h}}render(t,e,i,s,n,o){this._text=e;const h=this.measureText(e,o);this.width=h.width,this.height=h.height,this.shadow&&(t.save(),t.translate(this.shadow.offset.x,this.shadow.offset.y),this._preDraw(t,s,n),this._drawImage(t,0,0,o),this._postDraw(t),t.restore()),this._preDraw(t,s,n),this._drawImage(t,0,0,o),this._postDraw(t)}clone(){return new Xi({alphabet:this.alphabet,spriteSheet:this.spriteSheet,spacing:this.spacing})}_getLinesFromText(t,e){if(this._cachedText===t&&this._cachedRenderWidth===e)return this._cachedLines;const i=t.split(` +`);if(e==null)return i;for(let s=0;se){for(;this.measureText(n).width>e;)o=n[n.length-1]+o,n=n.slice(0,-1);i[s]=n,i[s+1]=o}}return this._cachedText=t,this._cachedLines=i,this._cachedRenderWidth=e,i}}const Io="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAABACAYAAAD1Xam+AAAAAXNSR0IArs4c6QAABlFJREFUeJztndmy4yoMRcWt/v9fdr8EWoDAaDD4JntVpeqcxBrMIGQDNhEAAAAAAAAAAAAAAOCrSbMfr+u6yoEpTY+906GV57YtPkjyXj9WZZ+wHWHfo2N3/bU6Tte9Rv6ptruqRyMvKvvIX/zY3I/vjLeqsg6l/CWdp0KHKO/1Y1H2EdsR9j06Ntdfp+N03SvkH2u7i3pu5XkQ+DNTkgNJSok+/183xpcdWZHjgUzpQ2pGD67vaf//KRAGAq3tdhCy2tcMQKPyXyz7iPqrdBjbX5h9g7xbtvWf4ZJvM4D/BKG24Sd+IkQ0TC9aW5NM5FbO2HgrPVzW2vmN50DZNv/QWtl5bfPy85SBtdy9dFmjsf2F2SehTBVE+u+tkE5+lAGcJlFwGuodwRRU2Qe3rx0FhPNflc3HWC7BEh8EDGVR5IMCiLnDONtPp87qhxVH/S/LvzUAuDs/kyGimA5oSONKR1w8vsLpv+v+S9vhmS71JRiX1xB5CWZNw7m6rMrllMag/RJyWb67BEgpDVMWSydc+K47pr35w05kWd7ReEq6116KaG4CsbJ7OmV9PdZLEKkONiC1/7ZONVgDsajLIJPYp2OUAXRpnPcGmnIE6eSK4nv5YQqqSYO52JqnYfYj/PdQXQIY7XszuMofMgZRT/1LdeC5h2I5/0EdWDMY2Yb05WDE1RodVdpSA5r85slArAVnSf+89iP896St0f5bZKVA7Gk/3ja8q+152/+wrLqBWZTem3IBADbRBoDuHgAA4HdAAADgh0EAAOCHQQAA4IdBAADgh0EAAOCHuVsKbJ3P9M7jjuxHzGfv8j9iDt47Dx7hP8cjq5F/o/0T62Aer//ZOgDrajBp6aNlOWTEajKLjgj/Pcs/vfZD/a++3Pc8hNfZ966EVeh5vP75luDRJUAl0KzJfnopaqbaTuzZiulc2BS5lltFXntu3dcQsXadl59Wn1H+dfYNtrt2d6D/LDF9HkCQw6eXFbr8P9X5W/un5Ol8gz1t39p5pWOPn0vLynbgdnfe8maEQw+UIPJdfxdOd/4oTtVD0IYg8wDywGas0I04T5O3P8/qf2UWwPpkn1PbOT1bN2tFe59EM7TvKf+TRFw+erZ2ey4hpS3hp9qBkqq/tjsSU1OYqucBWB1yynt5QxC42Mdk30pAEIio//zRG3feBzLUX+TTjCKwlH83aI/KbpQBVEHgUGF0j/SitcLofHem8q6AyH0wBhFv4WszuOjy0yK2vc/oRWQoP2X9ve78jfaLnpncbBqQSC6s0HnIRT0a2yNZjfxT8+ir8t+yDsDTWaS6X70GP33+d77stp+I5HtBdwEAAPBl8ECApcAA/DBvfSowAGAB7/05ZAAA/DAIAADMMU3fOuS2ggAAwBjrorKoxWiPBxHMAgAg490Ts0VeePdA+ZfJDKcCh7sBqY88mmjklZeOt9iXPrvx2I2QPRnN2/qzyJ84h4gNcbtfasq5mM1rZr+bBWh2A+bIIX13Z9wqL+nQvFno7v3oq4tJItCed7isUT6C/I7BUn9KP95wDicYBYpcjncrO2c/dmW4tBtw4RiRld1IDxDyYsoXMHxF1w3dyz0Nne8033AOFsT6VgRCafl89fenTZUfbm8CGhrgdDcS7anAsvnkkP0IeCfQ+JzYunky6jhNYj5bl7++4fJvN9WDSKS/292A0wyANyKDI91bfkm3kcH7ckaP/SKW/VHKRZAcI14pP3beu0fPyn/DuZQbWMogNnsc16sziE96f7H/iai7uTf0/3N8lwFz/e13T00Djt4OrInCnkeChXT+qOcKOLA21tJpsv/G8/COnGnw97J9QwbTvd6djYSv7fxEVTuV/LzNhj7nOawv6bfbAGCYEpQ6HxFtuxs6sq9tzOYHobQ6Nje+6vo5BwFrPZ4OgMayS4PPt1NlzdLfbRCYBoBc+NaO4JWPwLEf33oN3unY3InKPQBW6Z7nEZzEmrl4iZjC804lqgePPEOguQcwWghUphxm343wyt/pWpWR0OrR+jvyxavHajfb9pTjbt9bH07Z5/expM4TLWfwb7QQqMoC+UDWXZo/4RgA38LOgUvLJAAQ1Td9y9//0ylxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+g79apuVUsS5ZmwAAAABJRU5ErkJggg==";class zs{constructor(){this.fontSheet=Io,this.size=16,this.load()}load(){return this._imageSource=new Ls(this.fontSheet),this._imageSource.load().then(()=>{this._spriteSheet=Ye.fromImageSource({image:this._imageSource,grid:{rows:4,columns:16,spriteWidth:16,spriteHeight:16}}),this._spriteFont=new Xi({alphabet:`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,!'&."?-()+# `,caseInsensitive:!0,spriteSheet:this._spriteSheet,spacing:-6})})}write(t,e,i){this._imageSource.isLoaded()&&this._spriteFont.render(t,e,null,i.x,i.y)}}class So{constructor(t,e){this._gl=t,this._texture=e}use(){const t=this._gl;t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,this._texture)}disable(){const t=this._gl;t.bindTexture(t.TEXTURE_2D,null)}}class Gs{constructor(t){this.width=t.width,this.height=t.height,this._gl=t.gl,this._setupFramebuffer()}setResolution(t,e){const i=this._gl;this.width=t,this.height=e,i.bindTexture(i.TEXTURE_2D,this._frameTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,this.width,this.height,0,i.RGBA,i.UNSIGNED_BYTE,null)}get frameBuffer(){return this._frameBuffer}get frameTexture(){return this._frameTexture}_setupFramebuffer(){const t=this._gl;this._frameTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this._frameTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE);const e=t.COLOR_ATTACHMENT0;this._frameBuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this._frameBuffer),t.framebufferTexture2D(t.FRAMEBUFFER,e,t.TEXTURE_2D,this._frameTexture,0),this.disable()}toRenderSource(){return new So(this._gl,this._frameTexture)}use(){const t=this._gl;t.bindFramebuffer(t.FRAMEBUFFER,this._frameBuffer),t.viewport(0,0,this.width,this.height)}disable(){const t=this._gl;t.bindFramebuffer(t.FRAMEBUFFER,null),t.bindTexture(t.TEXTURE_2D,null)}}const To=`#version 300 es in vec2 a_position; in vec4 a_color; @@ -340,7 +340,7 @@ void main() { // Passthrough the color v_color = a_color; -}`,To=`#version 300 es +}`,Po=`#version 300 es precision mediump float; // Color @@ -350,16 +350,16 @@ out vec4 fragColor; void main() { fragColor = v_color; -}`;function Gs(r,t){switch(t){case r.FLOAT:return 4;case r.SHORT:return 2;case r.UNSIGNED_SHORT:return 2;case r.BYTE:return 1;case r.UNSIGNED_BYTE:return 1;default:return 1}}function Rn(r,t){switch(t){case r.LOW_FLOAT:case r.HIGH_FLOAT:case r.FLOAT:return 1;case r.FLOAT_VEC2:return 2;case r.FLOAT_VEC3:return 3;case r.FLOAT_VEC4:return 4;case r.BYTE:return 1;case r.UNSIGNED_BYTE:return 1;case r.UNSIGNED_SHORT:case r.SHORT:return 1;default:return 1}}function Bn(r,t){switch(t){case r.LOW_FLOAT:case r.HIGH_FLOAT:case r.FLOAT:case r.FLOAT_VEC2:case r.FLOAT_VEC3:case r.FLOAT_VEC4:return r.FLOAT;case r.BYTE:return r.BYTE;case r.UNSIGNED_BYTE:return r.UNSIGNED_BYTE;case r.SHORT:return r.SHORT;case r.UNSIGNED_SHORT:return r.UNSIGNED_SHORT;default:return r.FLOAT}}class ee{get compiled(){return this._compiled}constructor(t){this._logger=V.getInstance(),this.uniforms={},this.attributes={},this._compiled=!1;const{gl:e,vertexSource:i,fragmentSource:s}=t;this._gl=e,this.vertexSource=i,this.fragmentSource=s}use(){this._gl.useProgram(this.program),ee._ACTIVE_SHADER_INSTANCE=this}isCurrentlyBound(){return ee._ACTIVE_SHADER_INSTANCE===this}compile(){const t=this._gl,e=this._compileShader(t,this.vertexSource,t.VERTEX_SHADER),i=this._compileShader(t,this.fragmentSource,t.FRAGMENT_SHADER);this.program=this._createProgram(t,e,i);const s=this.getAttributes();for(const o of s)this.attributes[o.name]=o;const n=this.getUniforms();for(const o of n)this.uniforms[o.name]=o;return this._compiled=!0,this.program}getUniforms(){const t=this._gl,e=t.getProgramParameter(this.program,t.ACTIVE_UNIFORMS),i=[];for(let s=0;sNumber(l));for(let l=0;l=this._maxLines}hasPendingDraws(){return this._lineCount!==0}flush(){if(this._lineCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),t.drawArrays(t.LINES,0,this._lineCount*2),vt.DrawnImagesCount+=this._lineCount,vt.DrawCallCount++,this._vertexIndex=0,this._lineCount=0}}const Ro=`#version 300 es + ${this._shader.vertexSource}`);this._layout.push(s)}let e=0;for(const i of this._layout){const s=Ns(this._gl,i.glType);this._vertexTotalSizeBytes+=s*i.size,e+=i.size}this._vertexBuffer.bufferData.length%e!==0&&this._logger.warn(`The vertex component size (${e}) does divide evenly into the specified vertex buffer (${this._vertexBuffer.bufferData.length})`)}use(t=!1,e){if(!this._shader)throw Error("No shader is associated with this vertex layout, a shader must be set");const i=this._gl;if(!this._shader.isCurrentlyBound())throw Error("Shader associated with this vertex layout is not active! Call shader.use() before layout.use()");this._vertexBuffer.bind(),t&&this._vertexBuffer.upload(e);let s=0;for(const n of this._layout)i.vertexAttribPointer(n.location,n.size,n.glType,n.normalized,this.totalVertexSizeBytes,s),i.enableVertexAttribArray(n.location),s+=Ns(i,n.glType)*n.size}}class vt{static clear(){vt.DrawCallCount=0,vt.DrawnImagesCount=0}}vt.DrawCallCount=0,vt.DrawnImagesCount=0;class Ro{constructor(){this.type="ex.line",this.priority=0,this._maxLines=10922,this._vertexIndex=0,this._lineCount=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,vertexSource:To,fragmentSource:Po}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._vertexBuffer=new Ce({gl:t,size:6*2*this._maxLines,type:"dynamic"}),this._layout=new Ie({gl:t,vertexBuffer:this._vertexBuffer,shader:this._shader,attributes:[["a_position",2],["a_color",4]]})}draw(t,e,i){this._isFull()&&this.flush(),this._lineCount++;const s=this._context.getTransform(),n=s.multiply(t),o=s.multiply(e),h=this._vertexBuffer.bufferData;h[this._vertexIndex++]=n.x,h[this._vertexIndex++]=n.y,h[this._vertexIndex++]=i.r/255,h[this._vertexIndex++]=i.g/255,h[this._vertexIndex++]=i.b/255,h[this._vertexIndex++]=i.a,h[this._vertexIndex++]=o.x,h[this._vertexIndex++]=o.y,h[this._vertexIndex++]=i.r/255,h[this._vertexIndex++]=i.g/255,h[this._vertexIndex++]=i.b/255,h[this._vertexIndex++]=i.a}_isFull(){return this._lineCount>=this._maxLines}hasPendingDraws(){return this._lineCount!==0}flush(){if(this._lineCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),t.drawArrays(t.LINES,0,this._lineCount*2),vt.DrawnImagesCount+=this._lineCount,vt.DrawCallCount++,this._vertexIndex=0,this._lineCount=0}}const Mo=`#version 300 es in vec2 a_position; in vec4 a_color; in float a_size; @@ -389,7 +389,7 @@ void main() { color.a = color.a * alpha; color.rgb = color.rgb * color.a; fragColor = color; -}`;class Mo{constructor(){this.type="ex.point",this.priority=0,this._maxPoints=10922,this._pointCount=0,this._vertexIndex=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,vertexSource:Ro,fragmentSource:Bo}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._buffer=new Ce({gl:t,size:7*this._maxPoints,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_color",4],["a_size",1]]})}draw(t,e,i){this._isFull()&&this.flush(),this._pointCount++;const s=this._context.getTransform(),n=this._context.opacity,o=this._context.snapToPixel,h=s.multiply(t);o&&(h.x=~~(h.x+nt),h.y=~~(h.y+nt));const l=this._buffer.bufferData;l[this._vertexIndex++]=h.x,l[this._vertexIndex++]=h.y,l[this._vertexIndex++]=e.r/255,l[this._vertexIndex++]=e.g/255,l[this._vertexIndex++]=e.b/255,l[this._vertexIndex++]=e.a*n,l[this._vertexIndex++]=i*Math.max(s.getScaleX(),s.getScaleY())}_isFull(){return this._pointCount>=this._maxPoints}hasPendingDraws(){return this._pointCount!==0}flush(){if(this._pointCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),t.drawArrays(t.POINTS,0,this._pointCount),vt.DrawnImagesCount+=this._pointCount,vt.DrawCallCount++,this._pointCount=0,this._vertexIndex=0}}const ko=`#version 300 es +}`;class ko{constructor(){this.type="ex.point",this.priority=0,this._maxPoints=10922,this._pointCount=0,this._vertexIndex=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,vertexSource:Mo,fragmentSource:Bo}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._buffer=new Ce({gl:t,size:7*this._maxPoints,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_color",4],["a_size",1]]})}draw(t,e,i){this._isFull()&&this.flush(),this._pointCount++;const s=this._context.getTransform(),n=this._context.opacity,o=this._context.snapToPixel,h=s.multiply(t);o&&(h.x=~~(h.x+nt),h.y=~~(h.y+nt));const l=this._buffer.bufferData;l[this._vertexIndex++]=h.x,l[this._vertexIndex++]=h.y,l[this._vertexIndex++]=e.r/255,l[this._vertexIndex++]=e.g/255,l[this._vertexIndex++]=e.b/255,l[this._vertexIndex++]=e.a*n,l[this._vertexIndex++]=i*Math.max(s.getScaleX(),s.getScaleY())}_isFull(){return this._pointCount>=this._maxPoints}hasPendingDraws(){return this._pointCount!==0}flush(){if(this._pointCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),t.drawArrays(t.POINTS,0,this._pointCount),vt.DrawnImagesCount+=this._pointCount,vt.DrawCallCount++,this._pointCount=0,this._vertexIndex=0}}const Do=`#version 300 es in vec2 a_position; in vec2 a_texcoord; @@ -400,7 +400,7 @@ void main() { // Pass the texcoord to the fragment shader. v_texcoord = a_texcoord; -}`,Do=`#version 300 es +}`,Fo=`#version 300 es precision mediump float; // Passed in from the vertex shader. @@ -413,7 +413,7 @@ out vec4 fragColor; void main() { fragColor = texture(u_texture, v_texcoord); -}`;class Fo{constructor(t){this._gl=t,this._shader=new ee({gl:t,vertexSource:ko,fragmentSource:Do}),this._shader.compile(),this._buffer=new Ce({gl:t,type:"static",data:new Float32Array([-1,-1,0,0,-1,1,0,1,1,-1,1,0,1,-1,1,0,-1,1,0,1,1,1,1,1])}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_texcoord",2]]}),this._buffer.upload()}renderWithPostProcessor(t){const e=this._gl;t.getShader().use(),t.getLayout().use(),e.drawArrays(e.TRIANGLES,0,6)}renderToScreen(){const t=this._gl;this._shader.use(),this._layout.use(),t.drawArrays(t.TRIANGLES,0,6)}}class Ti{constructor(t,e,i){this._logger=V.getInstance(),this._gl=t,this.buffer=t.createBuffer(),t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.buffer);const s=e*6;if(!i)this.bufferData=new Uint32Array(s);else{const h=Math.floor(16383.5);this.bufferGlType=t.UNSIGNED_SHORT,this.bufferData=new Uint16Array(s),e>h&&this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${h}) requested quads(${e})`)}let n=0;for(let o=0;oh&&this._logger.warn(`Total quads exceeds hardware index buffer limit (uint16), max(${h}) requested quads(${e})`)}let n=0;for(let o=0;on)),this._buffer=new Ce({gl:t,size:10*4*this._maxImages,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_opacity",1],["a_texcoord",2],["a_textureIndex",1],["a_tint",4]]}),this._quads=new Ti(t,this._maxImages,!0)}_transformFragmentSource(t,e){let i=t.replace("%%count%%",e.toString()),s="";for(let n=0;nn)),this._buffer=new Ce({gl:t,size:10*4*this._maxImages,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_opacity",1],["a_texcoord",2],["a_textureIndex",1],["a_tint",4]]}),this._quads=new Ti(t,this._maxImages,!0)}_transformFragmentSource(t,e){let i=t.replace("%%count%%",e.toString()),s="";for(let n=0;n=this._maxImages||this._textures.length>=this._maxTextures}draw(t,e,i,s,n,o,h,l,f){var p,v,w,y;this._isFull()&&this.flush(),this._imageCount++,this._addImageAsTexture(t);let b=(t==null?void 0:t.width)||s||0,k=(t==null?void 0:t.height)||n||0,D=[0,0,(p=s??(t==null?void 0:t.width))!==null&&p!==void 0?p:0,(v=n??(t==null?void 0:t.height))!==null&&v!==void 0?v:0],C=[e??1,i??1];o!==void 0&&h!==void 0&&l!==void 0&&f!==void 0&&(D=[e??1,i??1,(w=s??(t==null?void 0:t.width))!==null&&w!==void 0?w:0,(y=n??(t==null?void 0:t.height))!==null&&y!==void 0?y:0],C=[o,h],b=l,k=f),e=D[0],i=D[1];const E=D[2],F=D[3],U=this._context.getTransform(),j=this._context.opacity,Y=this._context.snapToPixel;let M=R(C[0],C[1]),rt=R(C[0]+b,C[1]),ct=R(C[0],C[1]+k),ft=R(C[0]+b,C[1]+k);M=U.multiply(M),rt=U.multiply(rt),ct=U.multiply(ct),ft=U.multiply(ft),Y&&(M.x=~~(M.x+nt),M.y=~~(M.y+nt),rt.x=~~(rt.x+nt),rt.y=~~(rt.y+nt),ct.x=~~(ct.x+nt),ct.y=~~(ct.y+nt),ft.x=~~(ft.x+nt),ft.y=~~(ft.y+nt));const at=this._context.tint,It=this._getTextureIdForImage(t),qt=t.width||b,Wt=t.height||k,Zt=e/qt,ue=i/Wt,xe=(e+E-.01)/qt,we=(i+F-.01)/Wt,X=this._layout.vertexBuffer.bufferData;X[this._vertexIndex++]=M.x,X[this._vertexIndex++]=M.y,X[this._vertexIndex++]=j,X[this._vertexIndex++]=Zt,X[this._vertexIndex++]=ue,X[this._vertexIndex++]=It,X[this._vertexIndex++]=at.r/255,X[this._vertexIndex++]=at.g/255,X[this._vertexIndex++]=at.b/255,X[this._vertexIndex++]=at.a,X[this._vertexIndex++]=ct.x,X[this._vertexIndex++]=ct.y,X[this._vertexIndex++]=j,X[this._vertexIndex++]=Zt,X[this._vertexIndex++]=we,X[this._vertexIndex++]=It,X[this._vertexIndex++]=at.r/255,X[this._vertexIndex++]=at.g/255,X[this._vertexIndex++]=at.b/255,X[this._vertexIndex++]=at.a,X[this._vertexIndex++]=rt.x,X[this._vertexIndex++]=rt.y,X[this._vertexIndex++]=j,X[this._vertexIndex++]=xe,X[this._vertexIndex++]=ue,X[this._vertexIndex++]=It,X[this._vertexIndex++]=at.r/255,X[this._vertexIndex++]=at.g/255,X[this._vertexIndex++]=at.b/255,X[this._vertexIndex++]=at.a,X[this._vertexIndex++]=ft.x,X[this._vertexIndex++]=ft.y,X[this._vertexIndex++]=j,X[this._vertexIndex++]=xe,X[this._vertexIndex++]=we,X[this._vertexIndex++]=It,X[this._vertexIndex++]=at.r/255,X[this._vertexIndex++]=at.g/255,X[this._vertexIndex++]=at.b/255,X[this._vertexIndex++]=at.a}hasPendingDraws(){return this._imageCount!==0}flush(){if(this._imageCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0,4*10*this._imageCount),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._bindTextures(t),this._quads.bind(),t.drawElements(t.TRIANGLES,this._imageCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._imageCount,vt.DrawCallCount++,this._imageCount=0,this._vertexIndex=0,this._textures.length=0}}const zo=`#version 300 es +`;return i=i.replace("%%texture_picker%%",s),i}_addImageAsTexture(t){const e=t.getAttribute("filtering");let i=null;(e===Ot.Blended||e===Ot.Pixel)&&(i=e);const s=t.getAttribute("forceUpload")==="true",n=this._context.textureLoader.load(t,i,s);t.removeAttribute("forceUpload"),this._textures.indexOf(n)===-1&&this._textures.push(n)}_bindTextures(t){for(let e=0;e=this._maxImages||this._textures.length>=this._maxTextures}draw(t,e,i,s,n,o,h,l,f){var m,v,w,y;this._isFull()&&this.flush(),this._imageCount++,this._addImageAsTexture(t);let b=(t==null?void 0:t.width)||s||0,k=(t==null?void 0:t.height)||n||0,D=[0,0,(m=s??(t==null?void 0:t.width))!==null&&m!==void 0?m:0,(v=n??(t==null?void 0:t.height))!==null&&v!==void 0?v:0],I=[e??1,i??1];o!==void 0&&h!==void 0&&l!==void 0&&f!==void 0&&(D=[e??1,i??1,(w=s??(t==null?void 0:t.width))!==null&&w!==void 0?w:0,(y=n??(t==null?void 0:t.height))!==null&&y!==void 0?y:0],I=[o,h],b=l,k=f),e=D[0],i=D[1];const E=D[2],F=D[3],U=this._context.getTransform(),V=this._context.opacity,W=this._context.snapToPixel;let M=R(I[0],I[1]),rt=R(I[0]+b,I[1]),ct=R(I[0],I[1]+k),ft=R(I[0]+b,I[1]+k);M=U.multiply(M),rt=U.multiply(rt),ct=U.multiply(ct),ft=U.multiply(ft),W&&(M.x=~~(M.x+nt),M.y=~~(M.y+nt),rt.x=~~(rt.x+nt),rt.y=~~(rt.y+nt),ct.x=~~(ct.x+nt),ct.y=~~(ct.y+nt),ft.x=~~(ft.x+nt),ft.y=~~(ft.y+nt));const at=this._context.tint,It=this._getTextureIdForImage(t),qt=t.width||b,Wt=t.height||k,Zt=e/qt,ue=i/Wt,we=(e+E-.01)/qt,Ae=(i+F-.01)/Wt,K=this._layout.vertexBuffer.bufferData;K[this._vertexIndex++]=M.x,K[this._vertexIndex++]=M.y,K[this._vertexIndex++]=V,K[this._vertexIndex++]=Zt,K[this._vertexIndex++]=ue,K[this._vertexIndex++]=It,K[this._vertexIndex++]=at.r/255,K[this._vertexIndex++]=at.g/255,K[this._vertexIndex++]=at.b/255,K[this._vertexIndex++]=at.a,K[this._vertexIndex++]=ct.x,K[this._vertexIndex++]=ct.y,K[this._vertexIndex++]=V,K[this._vertexIndex++]=Zt,K[this._vertexIndex++]=Ae,K[this._vertexIndex++]=It,K[this._vertexIndex++]=at.r/255,K[this._vertexIndex++]=at.g/255,K[this._vertexIndex++]=at.b/255,K[this._vertexIndex++]=at.a,K[this._vertexIndex++]=rt.x,K[this._vertexIndex++]=rt.y,K[this._vertexIndex++]=V,K[this._vertexIndex++]=we,K[this._vertexIndex++]=ue,K[this._vertexIndex++]=It,K[this._vertexIndex++]=at.r/255,K[this._vertexIndex++]=at.g/255,K[this._vertexIndex++]=at.b/255,K[this._vertexIndex++]=at.a,K[this._vertexIndex++]=ft.x,K[this._vertexIndex++]=ft.y,K[this._vertexIndex++]=V,K[this._vertexIndex++]=we,K[this._vertexIndex++]=Ae,K[this._vertexIndex++]=It,K[this._vertexIndex++]=at.r/255,K[this._vertexIndex++]=at.g/255,K[this._vertexIndex++]=at.b/255,K[this._vertexIndex++]=at.a}hasPendingDraws(){return this._imageCount!==0}flush(){if(this._imageCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0,4*10*this._imageCount),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._bindTextures(t),this._quads.bind(),t.drawElements(t.TRIANGLES,this._imageCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._imageCount,vt.DrawCallCount++,this._imageCount=0,this._vertexIndex=0,this._textures.length=0}}const Go=`#version 300 es precision mediump float; @@ -566,7 +566,7 @@ void main() { // vec4 finalColor = mix(v4FromColor, v4ToColor, mixPct); // gl_FragColor = finalColor; -}`,Go=`#version 300 es +}`,No=`#version 300 es in vec2 a_position; // UV coordinate @@ -608,7 +608,7 @@ void main() { v_strokeColor = a_strokeColor; // Pass through the stroke thickenss to the fragment shader v_strokeThickness = a_strokeThickness; -}`;class No{constructor(){this.type="ex.rectangle",this.priority=0,this._maxRectangles=10922,this._rectangleCount=0,this._vertexIndex=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,fragmentSource:zo,vertexSource:Go}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",e.ortho),this._buffer=new Ce({gl:t,size:16*4*this._maxRectangles,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_uv",2],["a_size",2],["a_opacity",1],["a_color",4],["a_strokeColor",4],["a_strokeThickness",1]]}),this._quads=new Ti(t,this._maxRectangles,!0)}_isFull(){return this._rectangleCount>=this._maxRectangles}draw(...t){t[0]instanceof A&&t[1]instanceof A?this.drawLine.apply(this,t):this.drawRectangle.apply(this,t)}drawLine(t,e,i,s=1){this._isFull()&&this.flush(),this._rectangleCount++;const n=this._context.getTransform(),o=this._context.opacity,h=this._context.snapToPixel,l=e.sub(t),f=l.size,p=l.normalize().perpendicular(),v=s/2,w=n.multiply(p.scale(v).add(t)),y=n.multiply(p.scale(-v).add(t)),b=n.multiply(p.scale(v).add(e)),k=n.multiply(p.scale(-v).add(e));h&&(w.x=~~(w.x+nt),w.y=~~(w.y+nt),b.x=~~(b.x+nt),b.y=~~(b.y+nt),y.x=~~(y.x+nt),y.y=~~(y.y+nt),k.x=~~(k.x+nt),k.y=~~(k.y+nt));const D=0,C=0,E=1,F=1,U=L.Transparent,j=0,Y=1,M=this._layout.vertexBuffer.bufferData;M[this._vertexIndex++]=w.x,M[this._vertexIndex++]=w.y,M[this._vertexIndex++]=D,M[this._vertexIndex++]=C,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=j/Y,M[this._vertexIndex++]=y.x,M[this._vertexIndex++]=y.y,M[this._vertexIndex++]=D,M[this._vertexIndex++]=F,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=j/Y,M[this._vertexIndex++]=b.x,M[this._vertexIndex++]=b.y,M[this._vertexIndex++]=E,M[this._vertexIndex++]=C,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=j/Y,M[this._vertexIndex++]=k.x,M[this._vertexIndex++]=k.y,M[this._vertexIndex++]=E,M[this._vertexIndex++]=F,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=j/Y}drawRectangle(t,e,i,s,n=L.Transparent,o=0){this._isFull()&&this.flush(),this._rectangleCount++;const h=this._context.getTransform(),l=this._context.opacity,f=this._context.snapToPixel,p=h.multiply(t.add(R(0,0))),v=h.multiply(t.add(R(e,0))),w=h.multiply(t.add(R(e,i))),y=h.multiply(t.add(R(0,i)));f&&(p.x=~~(p.x+nt),p.y=~~(p.y+nt),v.x=~~(v.x+nt),v.y=~~(v.y+nt),y.x=~~(y.x+nt),y.y=~~(y.y+nt),w.x=~~(w.x+nt),w.y=~~(w.y+nt));const b=0,k=0,D=1,C=1,E=this._layout.vertexBuffer.bufferData;E[this._vertexIndex++]=p.x,E[this._vertexIndex++]=p.y,E[this._vertexIndex++]=b,E[this._vertexIndex++]=k,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=y.x,E[this._vertexIndex++]=y.y,E[this._vertexIndex++]=b,E[this._vertexIndex++]=C,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=v.x,E[this._vertexIndex++]=v.y,E[this._vertexIndex++]=D,E[this._vertexIndex++]=k,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=w.x,E[this._vertexIndex++]=w.y,E[this._vertexIndex++]=D,E[this._vertexIndex++]=C,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o}hasPendingDraws(){return this._rectangleCount!==0}flush(){if(this._rectangleCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._quads.bind(),t.drawElements(t.TRIANGLES,this._rectangleCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._rectangleCount,vt.DrawCallCount++,this._rectangleCount=0,this._vertexIndex=0}}const Qo=`#version 300 es +}`;class Ho{constructor(){this.type="ex.rectangle",this.priority=0,this._maxRectangles=10922,this._rectangleCount=0,this._vertexIndex=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,fragmentSource:Go,vertexSource:No}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",e.ortho),this._buffer=new Ce({gl:t,size:16*4*this._maxRectangles,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_uv",2],["a_size",2],["a_opacity",1],["a_color",4],["a_strokeColor",4],["a_strokeThickness",1]]}),this._quads=new Ti(t,this._maxRectangles,!0)}_isFull(){return this._rectangleCount>=this._maxRectangles}draw(...t){t[0]instanceof A&&t[1]instanceof A?this.drawLine.apply(this,t):this.drawRectangle.apply(this,t)}drawLine(t,e,i,s=1){this._isFull()&&this.flush(),this._rectangleCount++;const n=this._context.getTransform(),o=this._context.opacity,h=this._context.snapToPixel,l=e.sub(t),f=l.size,m=l.normalize().perpendicular(),v=s/2,w=n.multiply(m.scale(v).add(t)),y=n.multiply(m.scale(-v).add(t)),b=n.multiply(m.scale(v).add(e)),k=n.multiply(m.scale(-v).add(e));h&&(w.x=~~(w.x+nt),w.y=~~(w.y+nt),b.x=~~(b.x+nt),b.y=~~(b.y+nt),y.x=~~(y.x+nt),y.y=~~(y.y+nt),k.x=~~(k.x+nt),k.y=~~(k.y+nt));const D=0,I=0,E=1,F=1,U=L.Transparent,V=0,W=1,M=this._layout.vertexBuffer.bufferData;M[this._vertexIndex++]=w.x,M[this._vertexIndex++]=w.y,M[this._vertexIndex++]=D,M[this._vertexIndex++]=I,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=V/W,M[this._vertexIndex++]=y.x,M[this._vertexIndex++]=y.y,M[this._vertexIndex++]=D,M[this._vertexIndex++]=F,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=V/W,M[this._vertexIndex++]=b.x,M[this._vertexIndex++]=b.y,M[this._vertexIndex++]=E,M[this._vertexIndex++]=I,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=V/W,M[this._vertexIndex++]=k.x,M[this._vertexIndex++]=k.y,M[this._vertexIndex++]=E,M[this._vertexIndex++]=F,M[this._vertexIndex++]=f,M[this._vertexIndex++]=s,M[this._vertexIndex++]=o,M[this._vertexIndex++]=i.r/255,M[this._vertexIndex++]=i.g/255,M[this._vertexIndex++]=i.b/255,M[this._vertexIndex++]=i.a,M[this._vertexIndex++]=U.r/255,M[this._vertexIndex++]=U.g/255,M[this._vertexIndex++]=U.b/255,M[this._vertexIndex++]=U.a,M[this._vertexIndex++]=V/W}drawRectangle(t,e,i,s,n=L.Transparent,o=0){this._isFull()&&this.flush(),this._rectangleCount++;const h=this._context.getTransform(),l=this._context.opacity,f=this._context.snapToPixel,m=h.multiply(t.add(R(0,0))),v=h.multiply(t.add(R(e,0))),w=h.multiply(t.add(R(e,i))),y=h.multiply(t.add(R(0,i)));f&&(m.x=~~(m.x+nt),m.y=~~(m.y+nt),v.x=~~(v.x+nt),v.y=~~(v.y+nt),y.x=~~(y.x+nt),y.y=~~(y.y+nt),w.x=~~(w.x+nt),w.y=~~(w.y+nt));const b=0,k=0,D=1,I=1,E=this._layout.vertexBuffer.bufferData;E[this._vertexIndex++]=m.x,E[this._vertexIndex++]=m.y,E[this._vertexIndex++]=b,E[this._vertexIndex++]=k,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=y.x,E[this._vertexIndex++]=y.y,E[this._vertexIndex++]=b,E[this._vertexIndex++]=I,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=v.x,E[this._vertexIndex++]=v.y,E[this._vertexIndex++]=D,E[this._vertexIndex++]=k,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o,E[this._vertexIndex++]=w.x,E[this._vertexIndex++]=w.y,E[this._vertexIndex++]=D,E[this._vertexIndex++]=I,E[this._vertexIndex++]=e,E[this._vertexIndex++]=i,E[this._vertexIndex++]=l,E[this._vertexIndex++]=s.r/255,E[this._vertexIndex++]=s.g/255,E[this._vertexIndex++]=s.b/255,E[this._vertexIndex++]=s.a,E[this._vertexIndex++]=n.r/255,E[this._vertexIndex++]=n.g/255,E[this._vertexIndex++]=n.b/255,E[this._vertexIndex++]=n.a,E[this._vertexIndex++]=o}hasPendingDraws(){return this._rectangleCount!==0}flush(){if(this._rectangleCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._quads.bind(),t.drawElements(t.TRIANGLES,this._rectangleCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._rectangleCount,vt.DrawCallCount++,this._rectangleCount=0,this._vertexIndex=0}}const Qo=`#version 300 es precision highp float; // UV coord @@ -660,7 +660,7 @@ void main() { finalColor.rgb = finalColor.rgb * v_opacity; finalColor.a = finalColor.a * v_opacity; fragColor = finalColor; -}`,Ho=`#version 300 es +}`,Yo=`#version 300 es in vec2 a_position; // UV coordinate @@ -697,7 +697,7 @@ void main() { v_strokeColor = a_strokeColor; // Pass through the stroke thickenss to the fragment shader v_strokeThickness = a_strokeThickness; -}`;class Yo{constructor(){this.type="ex.circle",this.priority=0,this._maxCircles=10922,this._circleCount=0,this._vertexIndex=0}initialize(t,e){this._gl=t,this._context=e,this._shader=new ee({gl:t,fragmentSource:Qo,vertexSource:Ho}),this._shader.compile(),this._shader.use(),this._shader.setUniformMatrix("u_matrix",e.ortho),this._buffer=new Ce({gl:t,size:14*4*this._maxCircles,type:"dynamic"}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_uv",2],["a_opacity",1],["a_color",4],["a_strokeColor",4],["a_strokeThickness",1]]}),this._quads=new Ti(t,this._maxCircles,!0)}_isFull(){return this._circleCount>=this._maxCircles}draw(t,e,i,s=L.Transparent,n=0){this._isFull()&&this.flush(),this._circleCount++;const o=this._context.getTransform(),h=this._context.opacity,l=this._context.snapToPixel,f=o.multiply(t.add(R(-e,-e))),p=o.multiply(t.add(R(e,-e))),v=o.multiply(t.add(R(e,e))),w=o.multiply(t.add(R(-e,e)));l&&(f.x=~~(f.x+nt),f.y=~~(f.y+nt),p.x=~~(p.x+nt),p.y=~~(p.y+nt),w.x=~~(w.x+nt),w.y=~~(w.y+nt),v.x=~~(v.x+nt),v.y=~~(v.y+nt));const y=0,b=0,k=1,D=1,C=this._layout.vertexBuffer.bufferData;C[this._vertexIndex++]=f.x,C[this._vertexIndex++]=f.y,C[this._vertexIndex++]=y,C[this._vertexIndex++]=b,C[this._vertexIndex++]=h,C[this._vertexIndex++]=i.r/255,C[this._vertexIndex++]=i.g/255,C[this._vertexIndex++]=i.b/255,C[this._vertexIndex++]=i.a,C[this._vertexIndex++]=s.r/255,C[this._vertexIndex++]=s.g/255,C[this._vertexIndex++]=s.b/255,C[this._vertexIndex++]=s.a,C[this._vertexIndex++]=n/e,C[this._vertexIndex++]=w.x,C[this._vertexIndex++]=w.y,C[this._vertexIndex++]=y,C[this._vertexIndex++]=D,C[this._vertexIndex++]=h,C[this._vertexIndex++]=i.r/255,C[this._vertexIndex++]=i.g/255,C[this._vertexIndex++]=i.b/255,C[this._vertexIndex++]=i.a,C[this._vertexIndex++]=s.r/255,C[this._vertexIndex++]=s.g/255,C[this._vertexIndex++]=s.b/255,C[this._vertexIndex++]=s.a,C[this._vertexIndex++]=n/e,C[this._vertexIndex++]=p.x,C[this._vertexIndex++]=p.y,C[this._vertexIndex++]=k,C[this._vertexIndex++]=b,C[this._vertexIndex++]=h,C[this._vertexIndex++]=i.r/255,C[this._vertexIndex++]=i.g/255,C[this._vertexIndex++]=i.b/255,C[this._vertexIndex++]=i.a,C[this._vertexIndex++]=s.r/255,C[this._vertexIndex++]=s.g/255,C[this._vertexIndex++]=s.b/255,C[this._vertexIndex++]=s.a,C[this._vertexIndex++]=n/e,C[this._vertexIndex++]=v.x,C[this._vertexIndex++]=v.y,C[this._vertexIndex++]=k,C[this._vertexIndex++]=D,C[this._vertexIndex++]=h,C[this._vertexIndex++]=i.r/255,C[this._vertexIndex++]=i.g/255,C[this._vertexIndex++]=i.b/255,C[this._vertexIndex++]=i.a,C[this._vertexIndex++]=s.r/255,C[this._vertexIndex++]=s.g/255,C[this._vertexIndex++]=s.b/255,C[this._vertexIndex++]=s.a,C[this._vertexIndex++]=n/e}hasPendingDraws(){return this._circleCount!==0}flush(){if(this._circleCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._quads.bind(),t.drawElements(t.TRIANGLES,this._circleCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._circleCount,vt.DrawCallCount++,this._circleCount=0,this._vertexIndex=0}}class Mn{constructor(t,e,i=100){this.builder=t,this.recycler=e,this.maxObjects=i,this.totalAllocations=0,this.index=0,this.objects=[],this.disableWarnings=!1,this._logger=V.getInstance()}preallocate(){for(let t=0;t=this._maxCircles}draw(t,e,i,s=L.Transparent,n=0){this._isFull()&&this.flush(),this._circleCount++;const o=this._context.getTransform(),h=this._context.opacity,l=this._context.snapToPixel,f=o.multiply(t.add(R(-e,-e))),m=o.multiply(t.add(R(e,-e))),v=o.multiply(t.add(R(e,e))),w=o.multiply(t.add(R(-e,e)));l&&(f.x=~~(f.x+nt),f.y=~~(f.y+nt),m.x=~~(m.x+nt),m.y=~~(m.y+nt),w.x=~~(w.x+nt),w.y=~~(w.y+nt),v.x=~~(v.x+nt),v.y=~~(v.y+nt));const y=0,b=0,k=1,D=1,I=this._layout.vertexBuffer.bufferData;I[this._vertexIndex++]=f.x,I[this._vertexIndex++]=f.y,I[this._vertexIndex++]=y,I[this._vertexIndex++]=b,I[this._vertexIndex++]=h,I[this._vertexIndex++]=i.r/255,I[this._vertexIndex++]=i.g/255,I[this._vertexIndex++]=i.b/255,I[this._vertexIndex++]=i.a,I[this._vertexIndex++]=s.r/255,I[this._vertexIndex++]=s.g/255,I[this._vertexIndex++]=s.b/255,I[this._vertexIndex++]=s.a,I[this._vertexIndex++]=n/e,I[this._vertexIndex++]=w.x,I[this._vertexIndex++]=w.y,I[this._vertexIndex++]=y,I[this._vertexIndex++]=D,I[this._vertexIndex++]=h,I[this._vertexIndex++]=i.r/255,I[this._vertexIndex++]=i.g/255,I[this._vertexIndex++]=i.b/255,I[this._vertexIndex++]=i.a,I[this._vertexIndex++]=s.r/255,I[this._vertexIndex++]=s.g/255,I[this._vertexIndex++]=s.b/255,I[this._vertexIndex++]=s.a,I[this._vertexIndex++]=n/e,I[this._vertexIndex++]=m.x,I[this._vertexIndex++]=m.y,I[this._vertexIndex++]=k,I[this._vertexIndex++]=b,I[this._vertexIndex++]=h,I[this._vertexIndex++]=i.r/255,I[this._vertexIndex++]=i.g/255,I[this._vertexIndex++]=i.b/255,I[this._vertexIndex++]=i.a,I[this._vertexIndex++]=s.r/255,I[this._vertexIndex++]=s.g/255,I[this._vertexIndex++]=s.b/255,I[this._vertexIndex++]=s.a,I[this._vertexIndex++]=n/e,I[this._vertexIndex++]=v.x,I[this._vertexIndex++]=v.y,I[this._vertexIndex++]=k,I[this._vertexIndex++]=D,I[this._vertexIndex++]=h,I[this._vertexIndex++]=i.r/255,I[this._vertexIndex++]=i.g/255,I[this._vertexIndex++]=i.b/255,I[this._vertexIndex++]=i.a,I[this._vertexIndex++]=s.r/255,I[this._vertexIndex++]=s.g/255,I[this._vertexIndex++]=s.b/255,I[this._vertexIndex++]=s.a,I[this._vertexIndex++]=n/e}hasPendingDraws(){return this._circleCount!==0}flush(){if(this._circleCount===0)return;const t=this._gl;this._shader.use(),this._layout.use(!0),this._shader.setUniformMatrix("u_matrix",this._context.ortho),this._quads.bind(),t.drawElements(t.TRIANGLES,this._circleCount*6,this._quads.bufferGlType,0),vt.DrawnImagesCount+=this._circleCount,vt.DrawCallCount++,this._circleCount=0,this._vertexIndex=0}}class kn{constructor(t,e,i=100){this.builder=t,this.recycler=e,this.maxObjects=i,this.totalAllocations=0,this.index=0,this.objects=[],this.disableWarnings=!1,this._logger=j.getInstance()}preallocate(){for(let t=0;t4096||t.height>4096)&&(e=!1),e}constructor(t){this._logger=V.getInstance(),this._renderers=new Map,this._isDrawLifecycle=!1,this.useDrawSorting=!0,this._drawCallPool=new Mn(()=>new Wo,l=>(l.priority=0,l.z=0,l.renderer=void 0,l.args=void 0,l),4e3),this._drawCalls=[],this._postProcessTargets=[],this._postprocessors=[],this._transform=new bo,this._state=new Tn,this.snapToPixel=!1,this.smoothing=!1,this.backgroundColor=L.ExcaliburBlue,this._alreadyWarnedDrawLifecycle=!1,this.debug=new Jo(this),this._totalPostProcessorTime=0;const{canvasElement:e,enableTransparency:i,smoothing:s,snapToPixel:n,backgroundColor:o,useDrawSorting:h}=t;if(this.__gl=e.getContext("webgl2",{antialias:s??this.smoothing,premultipliedAlpha:!1,alpha:i??!0,depth:!0,powerPreference:"high-performance"}),!this.__gl)throw Error("Failed to retrieve webgl context from browser");this.textureLoader=new Bt(this.__gl),this.snapToPixel=n??this.snapToPixel,this.smoothing=s??this.smoothing,this.backgroundColor=o??this.backgroundColor,this.useDrawSorting=h??this.useDrawSorting,this._drawCallPool.disableWarnings=!0,this._drawCallPool.preallocate(),this._init()}_init(){const t=this.__gl;this._ortho=Jt.ortho(0,t.canvas.width,t.canvas.height,0,400,-400),t.viewport(0,0,t.canvas.width,t.canvas.height),t.clearColor(this.backgroundColor.r/255,this.backgroundColor.g/255,this.backgroundColor.b/255,this.backgroundColor.a),t.clear(t.COLOR_BUFFER_BIT),t.enable(t.BLEND),t.blendEquation(t.FUNC_ADD),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.blendEquationSeparate(t.FUNC_ADD,t.FUNC_ADD),t.blendFuncSeparate(t.ONE,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA),this.register(new Lo),this.register(new Dn),this.register(new No),this.register(new Yo),this.register(new Mo),this.register(new Po),this.materialScreenTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.materialScreenTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.bindTexture(t.TEXTURE_2D,null),this._screenRenderer=new Fo(t),this._renderTarget=new zs({gl:t,width:t.canvas.width,height:t.canvas.height}),this._postProcessTargets=[new zs({gl:t,width:t.canvas.width,height:t.canvas.height}),new zs({gl:t,width:t.canvas.width,height:t.canvas.height})]}register(t){this._renderers.set(t.type,t),t.initialize(this.__gl,this)}get(t){return this._renderers.get(t)}_isCurrentRenderer(t){return!this._currentRenderer||this._currentRenderer===t}beginDrawLifecycle(){this._isDrawLifecycle=!0}endDrawLifecycle(){this._isDrawLifecycle=!1}draw(t,...e){!this._isDrawLifecycle&&!this._alreadyWarnedDrawLifecycle&&(this._logger.warn(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors. -If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`),this._alreadyWarnedDrawLifecycle=!0);const i=this._renderers.get(t);if(i)if(this.useDrawSorting){const s=this._drawCallPool.get();s.z=this._state.current.z,s.priority=i.priority,s.renderer=t,this.getTransform().clone(s.transform),s.state.z=this._state.current.z,s.state.opacity=this._state.current.opacity,s.state.tint=this._state.current.tint,s.state.material=this._state.current.material,s.args=e,this._drawCalls.push(s)}else this._currentRenderer||(this._currentRenderer=i),this._isCurrentRenderer(i)||this._currentRenderer.flush(),i.draw(...e),this._currentRenderer=i;else throw Error(`No renderer with name ${t} has been registered`)}resetTransform(){this._transform.current=Et.identity()}updateViewport(t){const e=this.__gl;this._ortho=this._ortho=Jt.ortho(0,t.width,t.height,0,400,-400),this._renderTarget.setResolution(e.canvas.width,e.canvas.height),this._postProcessTargets[0].setResolution(e.canvas.width,e.canvas.height),this._postProcessTargets[1].setResolution(e.canvas.width,e.canvas.height)}drawImage(t,e,i,s,n,o,h,l,f){if(!(s===0||n===0)){{if(l===0||f===0)return;if(t.width===0||t.height===0)return}if(!t){V.getInstance().warn("Cannot draw a null or undefined image"),console.trace&&console.trace();return}this._state.current.material?this.draw("ex.material",t,e,i,s,n,o,h,l,f):this.draw("ex.image",t,e,i,s,n,o,h,l,f)}}drawLine(t,e,i,s=1){this.draw("ex.rectangle",t,e,i,s)}drawRectangle(t,e,i,s,n,o){this.draw("ex.rectangle",t,e,i,s,n,o)}drawCircle(t,e,i,s,n){this.draw("ex.circle",t,e,i,s,n)}save(){this._transform.save(),this._state.save()}restore(){this._transform.restore(),this._state.restore()}translate(t,e){this._transform.translate(this.snapToPixel?~~(t+nt):t,this.snapToPixel?~~(e+nt):e)}rotate(t){this._transform.rotate(t)}scale(t,e){this._transform.scale(t,e)}transform(t){this._transform.current=t}getTransform(){return this._transform.current}multiply(t){this._transform.current.multiply(t,this._transform.current)}addPostProcessor(t){this._postprocessors.push(t),t.initialize(this.__gl)}removePostProcessor(t){const e=this._postprocessors.indexOf(t);e!==-1&&this._postprocessors.splice(e,1)}clearPostProcessors(){this._postprocessors.length=0}updatePostProcessors(t){for(const e of this._postprocessors){const i=e.getShader();i.use();const s=i.getUniforms();this._totalPostProcessorTime+=t,s.find(n=>n.name==="u_time_ms")&&i.setUniformFloat("u_time_ms",this._totalPostProcessorTime),s.find(n=>n.name==="u_elapsed_ms")&&i.setUniformFloat("u_elapsed_ms",t),s.find(n=>n.name==="u_resolution")&&i.setUniformFloatVector("u_resolution",R(this.width,this.height)),e.onUpdate&&e.onUpdate(t)}}set material(t){this._state.current.material=t}get material(){return this._state.current.material}createMaterial(t){const e=new kn(t);return e.initialize(this.__gl,this),e}createShader(t){const e=this.__gl,{vertexSource:i,fragmentSource:s}=t,n=new ee({gl:e,vertexSource:i,fragmentSource:s});return n.compile(),n}clear(){const t=this.__gl;this._renderTarget.use(),t.clearColor(this.backgroundColor.r/255,this.backgroundColor.g/255,this.backgroundColor.b/255,this.backgroundColor.a),t.clear(t.COLOR_BUFFER_BIT)}flush(){const t=this.__gl;if(this._renderTarget.use(),this.useDrawSorting){const i=new Map;for(const[o]of this._renderers){const h=this._drawCalls.findIndex(l=>l.renderer===o);i.set(o,h)}this._drawCalls.sort((o,h)=>{const l=o.z-h.z,f=i.get(o.renderer)-i.get(h.renderer),p=o.priority-h.priority;return l===0?p===0?f:p:l});const s=this._transform.current,n=this._state.current;if(this._drawCalls.length){let o=this._drawCalls[0].renderer,h=this._renderers.get(o);for(let l=0;lv!==void 0).map(v=>typeof v=="number"&&this.snapToPixel?~~v:v);this.__ctx.drawImage.apply(this.__ctx,p),vt.DrawCallCount++,vt.DrawnImagesCount=1}drawLine(t,e,i,s=1){this.__ctx.save(),this.__ctx.beginPath(),this.__ctx.strokeStyle=i.toString(),this.__ctx.moveTo(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y),this.__ctx.lineTo(this.snapToPixel?~~(e.x+At):e.x,this.snapToPixel?~~(e.y+At):e.y),this.__ctx.lineWidth=s,this.__ctx.stroke(),this.__ctx.closePath(),this.__ctx.restore()}drawRectangle(t,e,i,s){this.__ctx.save(),this.__ctx.fillStyle=s.toString(),this.__ctx.fillRect(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y,this.snapToPixel?~~(e+At):e,this.snapToPixel?~~(i+At):i),this.__ctx.restore()}drawCircle(t,e,i,s,n){this.__ctx.save(),this.__ctx.beginPath(),s&&(this.__ctx.strokeStyle=s.toString()),n&&(this.__ctx.lineWidth=n),this.__ctx.fillStyle=i.toString(),this.__ctx.arc(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y,e,0,Math.PI*2),this.__ctx.fill(),s&&this.__ctx.stroke(),this.__ctx.closePath(),this.__ctx.restore()}save(){this.__ctx.save(),this._state.save()}restore(){this.__ctx.restore(),this._state.restore()}translate(t,e){this.__ctx.translate(this.snapToPixel?~~(t+At):t,this.snapToPixel?~~(e+At):e)}rotate(t){this.__ctx.rotate(t)}scale(t,e){this.__ctx.scale(t,e)}getTransform(){throw new Error("Not implemented")}multiply(t){this.__ctx.setTransform(this.__ctx.getTransform().multiply(t.toDOMMatrix()))}addPostProcessor(t){}removePostProcessor(t){}clearPostProcessors(){}updatePostProcessors(t){}beginDrawLifecycle(){}endDrawLifecycle(){}set material(t){this._state.current.material=t}get material(){return this._state.current.material}createMaterial(t){return null}clear(){this.__ctx.clearRect(0,0,this.width,this.height),this.__ctx.fillStyle=this.backgroundColor.toString(),this.__ctx.fillRect(0,0,this.width,this.height),vt.clear()}flush(){}}var Tt;(function(r){r.Fixed="Fixed",r.FitContainerAndFill="FitContainerAndFill",r.FitScreenAndFill="FitScreenAndFill",r.FitContainerAndZoom="FitContainerAndZoom",r.FitScreenAndZoom="FitScreenAndZoom",r.FitScreen="FitScreen",r.FillScreen="FillScreen",r.FitContainer="FitContainer",r.FillContainer="FillContainer"})(Tt||(Tt={}));class Ns{static get SVGA(){return{width:800,height:600}}static get Standard(){return{width:1920,height:1080}}static get Atari2600(){return{width:160,height:192}}static get GameBoy(){return{width:160,height:144}}static get GameBoyAdvance(){return{width:240,height:160}}static get NintendoDS(){return{width:256,height:192}}static get NES(){return{width:256,height:224}}static get SNES(){return{width:256,height:244}}}const Vo={ScreenResize:"resize",PixelRatioChange:"pixelratio",FullScreenChange:"fullscreen"};class Qs{constructor(t){var e,i,s;this.events=new P,this._antialiasing=!0,this._resolutionStack=[],this._viewportStack=[],this._pixelRatioOverride=null,this._isFullScreen=!1,this._isDisposed=!1,this._logger=V.getInstance(),this._fullscreenChangeHandler=()=>{this._isFullScreen=!this._isFullScreen,this._logger.debug("Fullscreen Change",this._isFullScreen),this.events.emit("fullscreen",{fullscreen:this.isFullScreen})},this._pixelRatioChangeHandler=()=>{this._logger.debug("Pixel Ratio Change",window.devicePixelRatio),this._listenForPixelRatio(),this._devicePixelRatio=this._calculateDevicePixelRatio(),this.applyResolutionAndViewport(),this.events.emit("pixelratio",{pixelRatio:this.pixelRatio})},this._resizeHandler=()=>{const n=this.parent;this._logger.debug("View port resized"),this._setResolutionAndViewportByDisplayMode(n),this.applyResolutionAndViewport(),this.events.emit("resize",{resolution:this.resolution,viewport:this.viewport})},this._devicePixelRatio=this._calculateDevicePixelRatio(),this._alreadyWarned=!1,this._contentArea=new J,this.viewport=t.viewport,this.resolution=(e=t.resolution)!==null&&e!==void 0?e:{...this.viewport},this._contentResolution=this.resolution,this._displayMode=(i=t.displayMode)!==null&&i!==void 0?i:Tt.Fixed,this._canvas=t.canvas,this.graphicsContext=t.context,this._antialiasing=(s=t.antialiasing)!==null&&s!==void 0?s:this._antialiasing,this._browser=t.browser,this._pixelRatioOverride=t.pixelRatio,this._applyDisplayMode(),this._listenForPixelRatio(),this._canvas.addEventListener("fullscreenchange",this._fullscreenChangeHandler),this.applyResolutionAndViewport()}_listenForPixelRatio(){this._mediaQueryList&&!this._mediaQueryList.addEventListener&&this._mediaQueryList.removeListener(this._pixelRatioChangeHandler),this._mediaQueryList=this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener?this._mediaQueryList.addEventListener("change",this._pixelRatioChangeHandler,{once:!0}):this._mediaQueryList.addListener(this._pixelRatioChangeHandler)}dispose(){this._isDisposed||(this._isDisposed=!0,this._browser.window.off("resize",this._resizeHandler),this._resizeObserver&&this._resizeObserver.disconnect(),this.parent.removeEventListener("resize",this._resizeHandler),this._mediaQueryList.removeEventListener?this._mediaQueryList.removeEventListener("change",this._pixelRatioChangeHandler):this._mediaQueryList.removeListener(this._pixelRatioChangeHandler),this._canvas.removeEventListener("fullscreenchange",this._fullscreenChangeHandler))}_calculateDevicePixelRatio(){return window.devicePixelRatio<1?1:window.devicePixelRatio||1}get pixelRatio(){return this._pixelRatioOverride?this._pixelRatioOverride:this._devicePixelRatio}get isHiDpi(){return this.pixelRatio!==1}get displayMode(){return this._displayMode}get canvas(){return this._canvas}get parent(){switch(this.displayMode){case Tt.FillContainer:case Tt.FitContainer:case Tt.FitContainerAndFill:case Tt.FitContainerAndZoom:return this.canvas.parentElement||document.body;default:return window}}get resolution(){return this._resolution}set resolution(t){this._resolution=t}get viewport(){return this._viewport?this._viewport:this._resolution}set viewport(t){this._viewport=t}get aspectRatio(){return this._resolution.width/this._resolution.height}get scaledWidth(){return this._resolution.width*this.pixelRatio}get scaledHeight(){return this._resolution.height*this.pixelRatio}setCurrentCamera(t){this._camera=t}pushResolutionAndViewport(){this._resolutionStack.push(this.resolution),this._viewportStack.push(this.viewport),this.resolution={...this.resolution},this.viewport={...this.viewport}}peekViewport(){return this._viewportStack[this._viewportStack.length-1]}peekResolution(){return this._resolutionStack[this._resolutionStack.length-1]}popResolutionAndViewport(){this.resolution=this._resolutionStack.pop(),this.viewport=this._viewportStack.pop()}applyResolutionAndViewport(){this._canvas.width=this.scaledWidth,this._canvas.height=this.scaledHeight,this.graphicsContext instanceof Me&&!this.graphicsContext.checkIfResolutionSupported({width:this.scaledWidth,height:this.scaledHeight})&&!this._alreadyWarned&&(this._alreadyWarned=!0,this._logger.warn(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio}) are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly. Try reducing the resolution or disabling Hi DPI scaling to avoid this (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).`)),this._antialiasing?this._canvas.style.imageRendering="auto":(this._canvas.style.imageRendering="pixelated",this._canvas.style.imageRendering===""&&(this._canvas.style.imageRendering="crisp-edges")),this._canvas.style.width=this.viewport.width+"px",this._canvas.style.height=this.viewport.height+"px",this.graphicsContext.updateViewport(this.resolution),this.graphicsContext.resetTransform(),this.graphicsContext.smoothing=this._antialiasing,this.graphicsContext instanceof Xi&&this.graphicsContext.scale(this.pixelRatio,this.pixelRatio)}get antialiasing(){return this._antialiasing}set antialiasing(t){this._antialiasing=t,this.graphicsContext.smoothing=this._antialiasing}get isFullScreen(){return this._isFullScreen}goFullScreen(t){if(t){const e=document.getElementById(t);if(e)return e.getAttribute("ex-fullscreen-listener")||(e.setAttribute("ex-fullscreen-listener","true"),e.addEventListener("fullscreenchange",this._fullscreenChangeHandler)),e.requestFullscreen()}return this._canvas.requestFullscreen()}exitFullScreen(){return document.exitFullscreen()}pageToScreenCoordinates(t){let e=t.x,i=t.y;if(this._isFullScreen||(e-=Si(this._canvas).x,i-=Si(this._canvas).y),this._isFullScreen)if(window.innerWidth/this.aspectRatiot?this.canvas.style.left=-(f-t)/2+"px":this.canvas.style.left="",p>e?this.canvas.style.top=-(p-e)/2+"px":this.canvas.style.top="",this.viewport={width:f,height:p};const v=J.fromDimension(this.viewport.width,this.viewport.height,A.Zero);if(this.viewport.width>t){const w=(this.viewport.width-t)/this.viewport.width*this.resolution.width;v.top=0,v.left=w/2,v.right=this.resolution.width-w/2,v.bottom=this.resolution.height}if(this.viewport.height>e){const w=(this.viewport.height-e)/this.viewport.height*this.resolution.height;v.top=w/2,v.left=0,v.bottom=this.resolution.height-w/2,v.right=this.resolution.width}this._contentArea=v}_computeFitContainer(){const t=this.aspectRatio;let e=0,i=0;const s=this.canvas.parentElement;s.clientWidth/t{this._resizeHandler()}),this._resizeObserver.observe(this.parent)),this.parent.addEventListener("resize",this._resizeHandler)}_setResolutionAndViewportByDisplayMode(t){this.displayMode===Tt.FillContainer&&(this.resolution={width:t.clientWidth,height:t.clientHeight},this.viewport=this.resolution),this.displayMode===Tt.FillScreen&&(document.body.style.margin="0px",document.body.style.overflow="hidden",this.resolution={width:t.innerWidth,height:t.innerHeight},this.viewport=this.resolution),this._contentArea=J.fromDimension(this.resolution.width,this.resolution.height,A.Zero),this.displayMode===Tt.FitScreen&&this._computeFit(),this.displayMode===Tt.FitContainer&&this._computeFitContainer(),this.displayMode===Tt.FitScreenAndFill&&this._computeFitScreenAndFill(),this.displayMode===Tt.FitContainerAndFill&&this._computeFitContainerAndFill(),this.displayMode===Tt.FitScreenAndZoom&&this._computeFitScreenAndZoom(),this.displayMode===Tt.FitContainerAndZoom&&this._computeFitContainerAndZoom()}}class hi{static create(){return this._INSTANCE||(window.AudioContext||window.webkitAudioContext)&&(this._INSTANCE=new AudioContext),this._INSTANCE}}hi._INSTANCE=null;function Ko(r){return!!r.playbackState}class We{static unlock(){return new Promise((e,i)=>{if(We._UNLOCKED||!hi.create())return e(!0);const s=setTimeout(()=>{V.getInstance().warn("Excalibur was unable to unlock the audio context, audio probably will not play in this browser."),e(!1)},200),n=hi.create();n.resume().then(()=>{const o=n.createBuffer(1,1,22050),h=n.createBufferSource();let l=!1;h.buffer=o,h.connect(n.destination),h.onended=()=>l=!0,h.start(0),setTimeout(()=>{Ko(h)?(h.playbackState===h.PLAYING_STATE||h.playbackState===h.FINISHED_STATE)&&(We._UNLOCKED=!0):(n.currentTime>0||l)&&(We._UNLOCKED=!0)},0),clearTimeout(s),e(!0)},()=>{i()})})}static isUnlocked(){return this._UNLOCKED}}We._UNLOCKED=!1;function Hs(r,t=L.Red,e,i,s,n,o=1,h="butt"){r.save(),r.beginPath(),r.lineWidth=o,r.lineCap=h,r.strokeStyle=t.toString(),r.moveTo(e,i),r.lineTo(s,n),r.closePath(),r.stroke(),r.restore()}function Xo(r,t=L.Red,e){r.beginPath(),r.strokeStyle=t.toString(),r.arc(e.x,e.y,5,0,Math.PI*2),r.closePath(),r.stroke()}function qo(r,t,e,i,s=1){const n=t?t.toString():"blue",o=i.scale(s);r.beginPath(),r.strokeStyle=n,r.moveTo(e.x,e.y),r.lineTo(e.x+o.x,e.y+o.y),r.closePath(),r.stroke()}function Ys(r,t,e,i,s,n=5,o=L.White,h=null){let l;if(typeof n=="number")l={tl:n,tr:n,br:n,bl:n};else{const f={tl:0,tr:0,br:0,bl:0};for(const p in f)if(f.hasOwnProperty(p)){const v=p;l[v]=n[v]||f[v]}}r.beginPath(),r.moveTo(t+l.tl,e),r.lineTo(t+i-l.tr,e),r.quadraticCurveTo(t+i,e,t+i,e+l.tr),r.lineTo(t+i,e+s-l.br),r.quadraticCurveTo(t+i,e+s,t+i-l.br,e+s),r.lineTo(t+l.bl,e+s),r.quadraticCurveTo(t,e+s,t,e+s-l.bl),r.lineTo(t,e+l.tl),r.quadraticCurveTo(t,e,t+l.tl,e),r.closePath(),h&&(r.fillStyle=h.toString(),r.fill()),o&&(r.strokeStyle=o.toString(),r.stroke())}function $o(r,t,e,i,s=L.White,n=null){r.beginPath(),r.arc(t,e,i,0,Math.PI*2),r.closePath(),n&&(r.fillStyle=n.toString(),r.fill()),s&&(r.strokeStyle=s.toString(),r.stroke())}const ta="data:image/png;base64,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";var ea=pt(1388);class li extends jt{constructor(t){var e,i,s,n,o,h,l,f,p,v;super(Sn(t,["width","height"])),this.filtering=null,this.lineCap="butt",this.quality=1,this._dirty=!0,this._smoothing=!1,this._color=Qe(L.Black,()=>this.flagDirty()),this._lineWidth=1,this._lineDash=[],this._padding=0,t&&(this.quality=(e=t.quality)!==null&&e!==void 0?e:this.quality,this.color=(i=t.color)!==null&&i!==void 0?i:L.Black,this.strokeColor=t==null?void 0:t.strokeColor,this.smoothing=(s=t.smoothing)!==null&&s!==void 0?s:this.smoothing,this.lineWidth=(n=t.lineWidth)!==null&&n!==void 0?n:this.lineWidth,this.lineDash=(o=t.lineDash)!==null&&o!==void 0?o:this.lineDash,this.lineCap=(h=t.lineCap)!==null&&h!==void 0?h:this.lineCap,this.padding=(l=t.padding)!==null&&l!==void 0?l:this.padding,this.filtering=(f=t.filtering)!==null&&f!==void 0?f:this.filtering),this._bitmap=document.createElement("canvas");const w=(p=t==null?void 0:t.width)!==null&&p!==void 0?p:this._bitmap.width,y=(v=t==null?void 0:t.height)!==null&&v!==void 0?v:this._bitmap.height;this.width=w,this.height=y;const b=this._bitmap.getContext("2d");if(b)this._ctx=b;else throw new Error("Browser does not support 2d canvas drawing, cannot create Raster graphic")}cloneRasterOptions(){return{color:this.color?this.color.clone():null,strokeColor:this.strokeColor?this.strokeColor.clone():null,smoothing:this.smoothing,lineWidth:this.lineWidth,lineDash:this.lineDash,lineCap:this.lineCap,quality:this.quality,padding:this.padding}}get dirty(){return this._dirty}flagDirty(){this._dirty=!0}get width(){return Math.abs(this._getTotalWidth()*this.scale.x)}set width(t){t/=Math.abs(this.scale.x),this._bitmap.width=t,this._originalWidth=t,this.flagDirty()}get height(){return Math.abs(this._getTotalHeight()*this.scale.y)}set height(t){t/=Math.abs(this.scale.y),this._bitmap.height=t,this._originalHeight=t,this.flagDirty()}_getTotalWidth(){var t;return(((t=this._originalWidth)!==null&&t!==void 0?t:this._bitmap.width)+this.padding*2)*1}_getTotalHeight(){var t;return(((t=this._originalHeight)!==null&&t!==void 0?t:this._bitmap.height)+this.padding*2)*1}get localBounds(){return J.fromDimension(this._getTotalWidth()*this.scale.x,this._getTotalHeight()*this.scale.y,A.Zero)}get smoothing(){return this._smoothing}set smoothing(t){this._smoothing=t,this.flagDirty()}get color(){return this._color}set color(t){this.flagDirty(),this._color=Qe(t,()=>this.flagDirty())}get strokeColor(){return this._strokeColor}set strokeColor(t){this.flagDirty(),this._strokeColor=Qe(t,()=>this.flagDirty())}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this.flagDirty()}get lineDash(){return this._lineDash}set lineDash(t){this._lineDash=t,this.flagDirty()}get padding(){return this._padding}set padding(t){this._padding=t,this.flagDirty()}rasterize(){this._dirty=!1,this._ctx.clearRect(0,0,this._getTotalWidth(),this._getTotalHeight()),this._ctx.save(),this._applyRasterProperties(this._ctx),this.execute(this._ctx),this._ctx.restore()}_applyRasterProperties(t){var e,i,s;this._bitmap.width=this._getTotalWidth()*this.quality,this._bitmap.height=this._getTotalHeight()*this.quality,this._bitmap.setAttribute("filtering",this.filtering),this._bitmap.setAttribute("forceUpload","true"),t.scale(this.quality,this.quality),t.translate(this.padding,this.padding),t.imageSmoothingEnabled=this.smoothing,t.lineWidth=this.lineWidth,t.setLineDash((e=this.lineDash)!==null&&e!==void 0?e:t.getLineDash()),t.lineCap=this.lineCap,t.strokeStyle=(i=this.strokeColor)===null||i===void 0?void 0:i.toString(),t.fillStyle=(s=this.color)===null||s===void 0?void 0:s.toString()}_drawImage(t,e,i){this._dirty&&this.rasterize(),t.scale(1/this.quality,1/this.quality),t.drawImage(this._bitmap,e,i)}}class qi extends li{get ctx(){return this._ctx}constructor(t){super(t),this._options=t}clone(){return new qi({...this._options,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){var e,i;!((e=this._options)===null||e===void 0)&&e.draw&&((i=this._options)===null||i===void 0||i.draw(t)),this._options.cache||this.flagDirty()}}class Ws{}Ws.type={any:"",blob:"blob",json:"json",text:"text",document:"document",arraybuffer:"arraybuffer"};class $i{constructor(){this.states=new Map}get currentState(){return this._currentState}set currentState(t){this._currentState=t}static create(t,e){const i=new $i;i.data=e;for(const s in t.states)i.states.set(s,{name:s,...t.states[s]});for(const s of i.states.values())for(const n of s.transitions)if(n!=="*"&&!i.states.has(n))throw Error(`Invalid state machine, state [${s.name}] has a transition to another state that doesn't exist [${n}]`);return i.currentState=i.startState=i.states.get(t.start),i}in(t){return this.currentState.name===t}go(t,e){var i,s;if(this.currentState.transitions.includes(t)||this.currentState.transitions.includes("*")){const n=this.states.get(t);return this.currentState.onExit&&((i=this.currentState)===null||i===void 0?void 0:i.onExit({to:n.name,data:this.data}))===!1||n!=null&&n.onEnter&&(n==null?void 0:n.onEnter({from:this.currentState.name,eventData:e,data:this.data}))===!1?!1:(this.currentState=n,!((s=this.currentState)===null||s===void 0)&&s.onState&&this.currentState.onState(),!0)}return!1}update(t){this.currentState.onUpdate&&this.currentState.onUpdate(this.data,t)}save(t){localStorage.setItem(t,JSON.stringify({currentState:this.currentState.name,data:this.data}))}restore(t){const e=JSON.parse(localStorage.getItem(t));this.currentState=this.states.get(e.currentState),this.data=e.data}}class Fn{_createNewBufferSource(){this._instance=this._audioContext.createBufferSource(),this._instance.buffer=this._src,this._instance.loop=this.loop,this._instance.playbackRate.value=this._playbackRate,this._instance.connect(this._volumeNode),this._volumeNode.connect(this._audioContext.destination)}_handleEnd(){this.loop||(this._instance.onended=()=>{this._playingFuture.resolve(!0)})}set loop(t){this._loop=t,this._instance&&(this._instance.loop=t,this.loop||(this._instance.onended=()=>{this._playingFuture.resolve(!0)}))}get loop(){return this._loop}set volume(t){t=Gt(t,0,1),this._volume=t,this._stateMachine.in("PLAYING")&&this._volumeNode.gain.setTargetAtTime?this._volumeNode.gain.setTargetAtTime(t,this._audioContext.currentTime,.1):this._volumeNode.gain.value=t}get volume(){return this._volume}get duration(){var t;return(t=this._duration)!==null&&t!==void 0?t:this.getTotalPlaybackDuration()}set duration(t){this._duration=t}constructor(t){this._src=t,this._audioContext=hi.create(),this._volumeNode=this._audioContext.createGain(),this._playingFuture=new Ne,this._stateMachine=$i.create({start:"STOPPED",states:{PLAYING:{onEnter:({data:e})=>{this._createNewBufferSource(),this._handleEnd(),this.loop?this._instance.start(0,e.pausedAt*this._playbackRate):this._instance.start(0,e.pausedAt*this._playbackRate,this.duration),e.startedAt=this._audioContext.currentTime-e.pausedAt,e.pausedAt=0},onState:()=>this._playStarted(),onExit:({to:e})=>{e==="STOPPED"&&this._playingFuture.resolve(!0),this._instance.onended=null,this._instance.disconnect(),this._instance.stop(0),this._instance=null},transitions:["STOPPED","PAUSED","SEEK"]},SEEK:{onEnter:({eventData:e,data:i})=>{i.pausedAt=(e??0)/this._playbackRate,i.startedAt=0},transitions:["*"]},STOPPED:{onEnter:({data:e})=>{e.pausedAt=0,e.startedAt=0,this._playingFuture.resolve(!0)},transitions:["PLAYING","PAUSED","SEEK"]},PAUSED:{onEnter:({data:e})=>{e.pausedAt=this._audioContext.currentTime-e.startedAt},transitions:["PLAYING","STOPPED","SEEK"]}}},{startedAt:0,pausedAt:0}),this._volume=1,this._loop=!1,this._playStarted=()=>{},this._playbackRate=1,this._createNewBufferSource()}isPlaying(){return this._stateMachine.in("PLAYING")}isPaused(){return this._stateMachine.in("PAUSED")||this._stateMachine.in("SEEK")}isStopped(){return this._stateMachine.in("STOPPED")}play(t=()=>{}){return this._playStarted=t,this._stateMachine.go("PLAYING"),this._playingFuture.promise}pause(){this._stateMachine.go("PAUSED")}stop(){this._stateMachine.go("STOPPED")}seek(t){this._stateMachine.go("PAUSED"),this._stateMachine.go("SEEK",t)}getTotalPlaybackDuration(){return this._src.duration}getPlaybackPosition(){const{pausedAt:t,startedAt:e}=this._stateMachine.data;return t?t*this._playbackRate:e?(this._audioContext.currentTime-e)*this._playbackRate:0}set playbackRate(t){this._instance.playbackRate.value=this._playbackRate=t}get playbackRate(){return this._instance.playbackRate.value}}class Zs extends T{set bubbles(t){}get bubbles(){return!1}get _path(){return null}set _path(t){}constructor(t,e="MediaEvent"){super(),this.target=t,this._name=e}stopPropagation(){}action(){}propagate(){}layPath(t){}}class ke extends Zs{constructor(t,e){super(t,"NativeSoundEvent"),this.track=e}}class On extends Zs{constructor(t,e){super(t,"NativeSoundProcessedEvent"),this._processedData=e,this.data=this._processedData}}function ia(r){try{const t=new Audio,e=/.*\.([A-Za-z0-9]+)(?:(?:\?|\#).*)*$/,i=r.match(e)[1];return!!t.canPlayType("audio/"+i)}catch(t){return V.getInstance().warn("Cannot determine audio support, assuming no support for the Audio Tag",t),!1}}const sa={VolumeChange:"volumechange",Processed:"processed",Pause:"pause",Stop:"stop",PlaybackEnd:"playbackend",Resume:"resume",PlaybackStart:"playbackstart"};class Un{set loop(t){this._loop=t;for(const e of this._tracks)e.loop=this._loop;this.logger.debug("Set loop for all instances of sound",this.path,"to",this._loop)}get loop(){return this._loop}set volume(t){this._volume=t;for(const e of this._tracks)e.volume=this._volume;this.events.emit("volumechange",new ke(this)),this.logger.debug("Set loop for all instances of sound",this.path,"to",this._volume)}get volume(){return this._volume}get duration(){return this._duration}set duration(t){this._duration=t}get instances(){return this._tracks}get path(){return this._resource.path}set path(t){this._resource.path=t}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}constructor(...t){this.events=new P,this.logger=V.getInstance(),this._loop=!1,this._volume=1,this._isStopped=!1,this._tracks=[],this._wasPlayingOnHidden=!1,this._playbackRate=1,this._audioContext=hi.create(),this._resource=new Vi("",Ws.type.arraybuffer);for(const e of t)if(ia(e)){this.path=e;break}this.path||(this.logger.warn("This browser does not support any of the audio files specified:",t.join(", ")),this.logger.warn("Attempting to use",t[0]),this.path=t[0])}isLoaded(){return!!this.data}async load(){var t,e;if(this.data)return this.data;const i=await this._resource.load(),s=await this.decodeAudio(i.slice(0));return this._duration=(e=(t=this._duration)!==null&&t!==void 0?t:s==null?void 0:s.duration)!==null&&e!==void 0?e:void 0,this.events.emit("processed",new On(this,s)),this.data=s}async decodeAudio(t){try{return await this._audioContext.decodeAudioData(t.slice(0))}catch{return this.logger.error("Unable to decode this browser may not fully support this format, or the file may be corrupt, if this is an mp3 try removing id3 tags and album art from the file."),await Promise.reject()}}wireEngine(t){t&&(this._engine=t,this._engine.on("hidden",()=>{t.pauseAudioWhenHidden&&this.isPlaying()&&(this._wasPlayingOnHidden=!0,this.pause())}),this._engine.on("visible",()=>{t.pauseAudioWhenHidden&&this._wasPlayingOnHidden&&(this.play(),this._wasPlayingOnHidden=!1)}),this._engine.on("start",()=>{this._isStopped=!1}),this._engine.on("stop",()=>{this.stop(),this._isStopped=!0}))}instanceCount(){return this._tracks.length}isPlaying(){return this._tracks.some(t=>t.isPlaying())}isPaused(){return this._tracks.some(t=>t.isPaused())}isStopped(){return this._tracks.some(t=>t.isStopped())}play(t){return this.isLoaded()?this._isStopped?(this.logger.warn("Cannot start playing. Engine is in a stopped state."),Promise.resolve(!1)):(this.volume=t||this.volume,this.isPaused()?this._resumePlayback():this._startPlayback()):(this.logger.warn("Cannot start playing. Resource",this.path,"is not loaded yet"),Promise.resolve(!0))}pause(){if(this.isPlaying()){for(const t of this._tracks)t.pause();this.events.emit("pause",new ke(this)),this.logger.debug("Paused all instances of sound",this.path)}}stop(){for(const t of this._tracks)t.stop();this.events.emit("stop",new ke(this)),this._tracks.length=0,this.logger.debug("Stopped all instances of sound",this.path)}get playbackRate(){return this._playbackRate}set playbackRate(t){this._playbackRate=t,this._tracks.forEach(e=>{e.playbackRate=this._playbackRate})}seek(t,e=0){this._tracks.length===0&&this._getTrackInstance(this.data),this._tracks[e].seek(t)}getTotalPlaybackDuration(){return this.data.duration}getPlaybackPosition(t=0){return this._tracks.length?this._tracks[t].getPlaybackPosition():0}getTrackId(t){return this._tracks.indexOf(t)}async _resumePlayback(){if(this.isPaused){const t=[];for(const e of this._tracks)t.push(e.play().then(()=>(this.events.emit("playbackend",new ke(this,e)),this._tracks.splice(this.getTrackId(e),1),!0)));this.events.emit("resume",new ke(this)),this.logger.debug("Resuming paused instances for sound",this.path,this._tracks),await Promise.all(t)}return!0}async _startPlayback(){const t=this._getTrackInstance(this.data),e=await t.play(()=>{this.events.emit("playbackstart",new ke(this,t)),this.logger.debug("Playing new instance for sound",this.path)});this.events.emit("playbackend",new ke(this,t));const i=this.getTrackId(t);return i!==-1&&this._tracks.splice(i,1),e}_getTrackInstance(t){const e=new Fn(t);return e.loop=this.loop,e.volume=this.volume,e.duration=this.duration,e.playbackRate=this._playbackRate,this._tracks.push(e),e}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}const na={};class Ln{get _image(){return this._imageElement||(this._imageElement=new Image,this._imageElement.src=this.logo),this._imageElement}_getScreenParent(){return this._engine?this._engine.screen.canvas.parentElement:document.body}get playButtonRootElement(){return this._playButtonRootElement}get playButtonElement(){return this._playButtonElement}get _playButton(){const t=document.getElementById("excalibur-play-root");return t&&(this._playButtonRootElement=t),this._playButtonRootElement||(this._playButtonRootElement=document.createElement("div"),this._playButtonRootElement.id="excalibur-play-root",this._playButtonRootElement.style.position="absolute",this._getScreenParent().appendChild(this._playButtonRootElement)),this._styleBlock||(this._styleBlock=document.createElement("style"),this._styleBlock.textContent=this._playButtonStyles,document.head.appendChild(this._styleBlock)),this._playButtonElement||(this._playButtonElement=this.startButtonFactory(),this._playButtonRootElement.appendChild(this._playButtonElement)),this._playButtonElement}constructor(t){this.events=new P,this.canvas=new qi({filtering:Ot.Blended,smoothing:!0,cache:!0,draw:this.draw.bind(this)}),this._resourceList=[],this._index=0,this._playButtonShown=!1,this._resourceCount=0,this._numLoaded=0,this._progressCounts={},this._totalCounts={},this.logo=ta,this.logoWidth=468,this.logoHeight=118,this.loadingBarColor=L.White,this.backgroundColor="#176BAA",this.suppressPlayButton=!1,this._playButtonStyles=ea.Z.toString(),this.playButtonText="Play game",this.startButtonFactory=()=>{let e=document.getElementById("excalibur-play");return e||(e=document.createElement("button")),e.id="excalibur-play",e.textContent=this.playButtonText,e.style.display="none",e},this._loaderResizeHandler=e=>{this._engine.screen.resolution=this._engine.screen.viewport,this._engine.screen.applyResolutionAndViewport(),this.canvas.width=e.viewport.width,this.canvas.height=e.viewport.height,this.canvas.flagDirty()},this._loadingFuture=new Ne,t&&this.addResources(t)}wireEngine(t){this._engine||(this._engine=t,this.canvas.width=this._engine.canvas.width,this.canvas.height=this._engine.canvas.height)}addResource(t){const e=this._index++;this._resourceList.push(t),this._progressCounts[e]=0,this._totalCounts[e]=1,this._resourceCount++}addResources(t){let e=0;const i=t.length;for(e;e{this._positionPlayButton()};return!((e=this._engine)===null||e===void 0)&&e.browser&&this._engine.browser.window.on("resize",i),this._playButtonShown=!0,this._playButton.style.display="block",document.body.addEventListener("keyup",n=>{n.key==="Enter"&&this._playButton.click()}),this._positionPlayButton(),await new Promise(n=>{const o=h=>{var l;h.stopPropagation(),this.hidePlayButton(),!((l=this._engine)===null||l===void 0)&&l.browser&&this._engine.browser.window.off("resize",i),n()};this._playButton.addEventListener("click",o),this._playButton.addEventListener("touchend",o),this._playButton.addEventListener("pointerup",o)})}}hidePlayButton(){this._playButtonShown=!1,this._playButton.style.display="none"}dispose(){this._playButtonRootElement.parentElement&&(this._playButtonRootElement.removeChild(this._playButtonElement),document.body.removeChild(this._playButtonRootElement),document.head.removeChild(this._styleBlock),this._playButtonRootElement=null,this._playButtonElement=null,this._styleBlock=null)}update(t,e){}areResourcesLoaded(){return this._loadingFuture.promise}async load(){var t,e;this._engine.screen.events.on("resize",this._loaderResizeHandler),await((t=this._image)===null||t===void 0?void 0:t.decode()),this.canvas.flagDirty(),await Promise.all(this._resourceList.map(async i=>{await i.load().finally(()=>{this._numLoaded++,this.canvas.flagDirty()})}));for(const i of this._resourceList)i instanceof Un&&i.wireEngine(this._engine);return this._loadingFuture.resolve(),await Fs(200,(e=this._engine)===null||e===void 0?void 0:e.clock),this.canvas.flagDirty(),await this.showPlayButton(),await We.unlock(),this._engine.screen.events.off("resize",this._loaderResizeHandler),this.data=this._resourceList}markResourceComplete(){this._numLoaded++}get progress(){return this._resourceCount>0?Gt(this._numLoaded,0,this._resourceCount)/this._resourceCount:1}_positionPlayButton(){if(this._engine){const t=this._engine.screen.viewport.height,e=this._engine.screen.viewport.width;if(this._playButtonRootElement){const i=this._engine.canvas.offsetLeft,s=this._engine.canvas.offsetTop,n=this._playButton.clientWidth,o=this._playButton.clientHeight;this.playButtonPosition?(this._playButtonRootElement.style.left=`${this.playButtonPosition.x}px`,this._playButtonRootElement.style.top=`${this.playButtonPosition.y}px`):(this._playButtonRootElement.style.left=`${i+e/2-n/2}px`,this._playButtonRootElement.style.top=`${s+t/2-o/2+100}px`)}}}draw(t){const e=this._engine.canvasHeight/this._engine.pixelRatio,i=this._engine.canvasWidth/this._engine.pixelRatio;this._positionPlayButton(),t.fillStyle=this.backgroundColor,t.fillRect(0,0,i,e);let s=e/2;const n=Math.min(this.logoWidth,i*.75);let o=i/2-n/2;this.logoPosition&&(o=this.logoPosition.x,s=this.logoPosition.y);const h=Math.floor(n*(this.logoHeight/this.logoWidth)),l=this._engine.getAntialiasing();if(this._engine.setAntialiasing(!0),this.logoPosition?t.drawImage(this._image,0,0,this.logoWidth,this.logoHeight,o,s,n,h):t.drawImage(this._image,0,0,this.logoWidth,this.logoHeight,o,s-h-20,n,h),!this.suppressPlayButton&&this._playButtonShown){this._engine.setAntialiasing(l);return}let f=o,p=s;this.loadingBarPosition&&(f=this.loadingBarPosition.x,p=this.loadingBarPosition.y),t.lineWidth=2,Ys(t,f,p,n,20,10,this.loadingBarColor);const v=n*this.progress,w=5,y=v-w*2,b=20-w*2;Ys(t,f+w,p+w,y>10?y:10,b,5,null,this.loadingBarColor),this._engine.setAntialiasing(l)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}const zn={webgl:"WebGL",webaudio:"WebAudio",gamepadapi:"Gamepad API"};class Gn{constructor(){this._features=null,this.failedTests=[],this._criticalTests={canvasSupport:function(){const t=document.createElement("canvas");return!!(t.getContext&&t.getContext("2d"))},arrayBufferSupport:function(){const t=new XMLHttpRequest;t.open("GET","/");try{t.responseType="arraybuffer"}catch{return!1}return t.responseType==="arraybuffer"},dataUrlSupport:function(){return document.createElement("canvas").toDataURL("image/png").indexOf("data:image/png")===0},objectUrlSupport:function(){return"URL"in window&&"revokeObjectURL"in URL&&"createObjectURL"in URL},rgbaSupport:function(){const t=document.createElement("a").style;return t.cssText="background-color:rgba(150,255,150,.5)",(""+t.backgroundColor).indexOf("rgba")>-1}},this._warningTest={webAudioSupport:function(){return!!(window.AudioContext||window.webkitAudioContext||window.mozAudioContext||window.msAudioContext||window.oAudioContext)},webglSupport:function(){const t=document.createElement("canvas");return!!(t.getContext&&t.getContext("webgl"))}},this._features=this._loadBrowserFeatures()}getBrowserFeatures(){return this._features===null&&(this._features=this._loadBrowserFeatures()),this._features}logBrowserFeatures(){let t=`%cSUPPORTED BROWSER FEATURES +`;class Dn{constructor(t){this._color=L.Transparent,this._initialized=!1;const{color:e,name:i,vertexSource:s,fragmentSource:n}=t;this._name=i,this._vertexSource=s??Jo,this._fragmentSource=n,this._color=e??this._color}initialize(t,e){this._initialized||(this._shader=e.createShader({vertexSource:this._vertexSource,fragmentSource:this._fragmentSource}),this._shader.compile(),this._initialized=!0)}get name(){var t;return(t=this._name)!==null&&t!==void 0?t:"anonymous material"}get isUsingScreenTexture(){return this._fragmentSource.includes("u_screen_texture")}update(t){this._shader&&(this._shader.use(),t(this._shader))}getShader(){return this._shader}use(){if(this._initialized)this._shader.use(),this._shader.trySetUniformFloatColor("u_color",this._color);else throw Error(`Material ${this.name} not yet initialized, use the ExcaliburGraphicsContext.createMaterial() to work around this.`)}}class Fn{constructor(){this.type="ex.material",this.priority=0,this._textures=[]}initialize(t,e){this._gl=t,this._context=e,this._buffer=new Ce({gl:t,size:6*4,type:"dynamic"}),this._layout=new Ie({gl:t,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_uv",2],["a_screenuv",2]]}),this._quads=new Ti(t,1,!0)}draw(t,e,i,s,n,o,h,l,f){var m,v,w,y;const b=this._gl,k=this._context.material;k.initialize(b,this._context);const D=this._context.getTransform(),I=this._context.opacity,E=k.getShader(),F=this._layout.vertexBuffer.bufferData;let U=0,V=(t==null?void 0:t.width)||s||0,W=(t==null?void 0:t.height)||n||0,M=[0,0,(m=s??(t==null?void 0:t.width))!==null&&m!==void 0?m:0,(v=n??(t==null?void 0:t.height))!==null&&v!==void 0?v:0],rt=[e??1,i??1];o!==void 0&&h!==void 0&&l!==void 0&&f!==void 0&&(M=[e??1,i??1,(w=s??(t==null?void 0:t.width))!==null&&w!==void 0?w:0,(y=n??(t==null?void 0:t.height))!==null&&y!==void 0?y:0],rt=[o,h],V=l,W=f),e=M[0],i=M[1];const ct=M[2],ft=M[3],at=R(rt[0],rt[1]),It=R(rt[0]+V,rt[1]),qt=R(rt[0],rt[1]+W),Wt=R(rt[0]+V,rt[1]+W),Zt=t.width||V,ue=t.height||W,we=e/Zt,Ae=i/ue,K=(e+ct-.01)/Zt,qe=(i+ft-.01)/ue,wi=D.getPosition(),to=wi.add(Wt),eo=wi.x/this._context.width,io=wi.y/this._context.height,so=to.x/this._context.width,no=to.y/this._context.height;F[U++]=at.x,F[U++]=at.y,F[U++]=we,F[U++]=Ae,F[U++]=eo,F[U++]=io,F[U++]=qt.x,F[U++]=qt.y,F[U++]=we,F[U++]=qe,F[U++]=eo,F[U++]=no,F[U++]=It.x,F[U++]=It.y,F[U++]=K,F[U++]=Ae,F[U++]=so,F[U++]=io,F[U++]=Wt.x,F[U++]=Wt.y,F[U++]=K,F[U++]=qe,F[U++]=so,F[U++]=no;const Ga=this._addImageAsTexture(t);k.use(),this._layout.shader=E,this._layout.use(!0),E.trySetUniformFloat("u_time_ms",performance.now()),E.trySetUniformFloat("u_opacity",I),E.trySetUniformFloatVector("u_resolution",R(this._context.width,this._context.height)),E.trySetUniformFloatVector("u_graphic_resolution",R(Zt,ue)),E.trySetUniformFloatVector("u_size",R(ct,ft)),E.trySetUniformMatrix("u_matrix",this._context.ortho),E.trySetUniformMatrix("u_transform",D.to4x4()),b.activeTexture(b.TEXTURE0+0),b.bindTexture(b.TEXTURE_2D,Ga),E.trySetUniformInt("u_graphic",0),b.activeTexture(b.TEXTURE0+1),b.bindTexture(b.TEXTURE_2D,this._context.materialScreenTexture),E.trySetUniformInt("u_screen_texture",1),this._quads.bind(),b.drawElements(b.TRIANGLES,6,this._quads.bufferGlType,0),vt.DrawnImagesCount++,vt.DrawCallCount++}_addImageAsTexture(t){const e=t.getAttribute("filtering");let i=null;(e===Ot.Blended||e===Ot.Pixel)&&(i=e);const s=t.getAttribute("forceUpload")==="true",n=this._context.textureLoader.load(t,i,s);return t.removeAttribute("forceUpload"),this._textures.indexOf(n)===-1&&this._textures.push(n),n}hasPendingDraws(){return!1}flush(){}}const nt=1e-4;class Vo{constructor(t){this._webglCtx=t,this._debugText=new zs}drawRect(t,e,i,s,n={color:L.Black}){this.drawLine(R(t,e),R(t+i,e),{...n}),this.drawLine(R(t+i,e),R(t+i,e+s),{...n}),this.drawLine(R(t+i,e+s),R(t,e+s),{...n}),this.drawLine(R(t,e+s),R(t,e),{...n})}drawLine(t,e,i={color:L.Black}){this._webglCtx.draw("ex.line",t,e,i.color)}drawPoint(t,e={color:L.Black,size:5}){this._webglCtx.draw("ex.point",t,e.color,e.size)}drawText(t,e){this._debugText.write(this._webglCtx,t,e)}}class Be{get z(){return this._state.current.z}set z(t){this._state.current.z=t}get opacity(){return this._state.current.opacity}set opacity(t){this._state.current.opacity=t}get tint(){return this._state.current.tint}set tint(t){this._state.current.tint=t}get width(){return this.__gl.canvas.width}get height(){return this.__gl.canvas.height}get ortho(){return this._ortho}checkIfResolutionSupported(t){let e=!0;return(t.width>4096||t.height>4096)&&(e=!1),e}constructor(t){this._logger=j.getInstance(),this._renderers=new Map,this._isDrawLifecycle=!1,this.useDrawSorting=!0,this._drawCallPool=new kn(()=>new Zo,l=>(l.priority=0,l.z=0,l.renderer=void 0,l.args=void 0,l),4e3),this._drawCalls=[],this._postProcessTargets=[],this._postprocessors=[],this._transform=new Eo,this._state=new Pn,this.snapToPixel=!1,this.smoothing=!1,this.backgroundColor=L.ExcaliburBlue,this._alreadyWarnedDrawLifecycle=!1,this.debug=new Vo(this),this._totalPostProcessorTime=0;const{canvasElement:e,enableTransparency:i,smoothing:s,snapToPixel:n,backgroundColor:o,useDrawSorting:h}=t;if(this.__gl=e.getContext("webgl2",{antialias:s??this.smoothing,premultipliedAlpha:!1,alpha:i??!0,depth:!0,powerPreference:"high-performance"}),!this.__gl)throw Error("Failed to retrieve webgl context from browser");this.textureLoader=new Mt(this.__gl),this.snapToPixel=n??this.snapToPixel,this.smoothing=s??this.smoothing,this.backgroundColor=o??this.backgroundColor,this.useDrawSorting=h??this.useDrawSorting,this._drawCallPool.disableWarnings=!0,this._drawCallPool.preallocate(),this._init()}_init(){const t=this.__gl;this._ortho=Jt.ortho(0,t.canvas.width,t.canvas.height,0,400,-400),t.viewport(0,0,t.canvas.width,t.canvas.height),t.clearColor(this.backgroundColor.r/255,this.backgroundColor.g/255,this.backgroundColor.b/255,this.backgroundColor.a),t.clear(t.COLOR_BUFFER_BIT),t.enable(t.BLEND),t.blendEquation(t.FUNC_ADD),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),t.blendEquationSeparate(t.FUNC_ADD,t.FUNC_ADD),t.blendFuncSeparate(t.ONE,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA),this.register(new zo),this.register(new Fn),this.register(new Ho),this.register(new Wo),this.register(new ko),this.register(new Ro),this.materialScreenTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.materialScreenTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.bindTexture(t.TEXTURE_2D,null),this._screenRenderer=new Oo(t),this._renderTarget=new Gs({gl:t,width:t.canvas.width,height:t.canvas.height}),this._postProcessTargets=[new Gs({gl:t,width:t.canvas.width,height:t.canvas.height}),new Gs({gl:t,width:t.canvas.width,height:t.canvas.height})]}register(t){this._renderers.set(t.type,t),t.initialize(this.__gl,this)}get(t){return this._renderers.get(t)}_isCurrentRenderer(t){return!this._currentRenderer||this._currentRenderer===t}beginDrawLifecycle(){this._isDrawLifecycle=!0}endDrawLifecycle(){this._isDrawLifecycle=!1}draw(t,...e){!this._isDrawLifecycle&&!this._alreadyWarnedDrawLifecycle&&(this._logger.warn(`Attempting to draw outside the the drawing lifecycle (preDraw/postDraw) is not supported and is a source of bugs/errors. +If you want to do custom drawing, use Actor.graphics, or any onPreDraw or onPostDraw handler.`),this._alreadyWarnedDrawLifecycle=!0);const i=this._renderers.get(t);if(i)if(this.useDrawSorting){const s=this._drawCallPool.get();s.z=this._state.current.z,s.priority=i.priority,s.renderer=t,this.getTransform().clone(s.transform),s.state.z=this._state.current.z,s.state.opacity=this._state.current.opacity,s.state.tint=this._state.current.tint,s.state.material=this._state.current.material,s.args=e,this._drawCalls.push(s)}else this._currentRenderer||(this._currentRenderer=i),this._isCurrentRenderer(i)||this._currentRenderer.flush(),i.draw(...e),this._currentRenderer=i;else throw Error(`No renderer with name ${t} has been registered`)}resetTransform(){this._transform.current=Et.identity()}updateViewport(t){const e=this.__gl;this._ortho=this._ortho=Jt.ortho(0,t.width,t.height,0,400,-400),this._renderTarget.setResolution(e.canvas.width,e.canvas.height),this._postProcessTargets[0].setResolution(e.canvas.width,e.canvas.height),this._postProcessTargets[1].setResolution(e.canvas.width,e.canvas.height)}drawImage(t,e,i,s,n,o,h,l,f){if(!(s===0||n===0)){{if(l===0||f===0)return;if(t.width===0||t.height===0)return}if(!t){j.getInstance().warn("Cannot draw a null or undefined image"),console.trace&&console.trace();return}this._state.current.material?this.draw("ex.material",t,e,i,s,n,o,h,l,f):this.draw("ex.image",t,e,i,s,n,o,h,l,f)}}drawLine(t,e,i,s=1){this.draw("ex.rectangle",t,e,i,s)}drawRectangle(t,e,i,s,n,o){this.draw("ex.rectangle",t,e,i,s,n,o)}drawCircle(t,e,i,s,n){this.draw("ex.circle",t,e,i,s,n)}save(){this._transform.save(),this._state.save()}restore(){this._transform.restore(),this._state.restore()}translate(t,e){this._transform.translate(this.snapToPixel?~~(t+nt):t,this.snapToPixel?~~(e+nt):e)}rotate(t){this._transform.rotate(t)}scale(t,e){this._transform.scale(t,e)}transform(t){this._transform.current=t}getTransform(){return this._transform.current}multiply(t){this._transform.current.multiply(t,this._transform.current)}addPostProcessor(t){this._postprocessors.push(t),t.initialize(this.__gl)}removePostProcessor(t){const e=this._postprocessors.indexOf(t);e!==-1&&this._postprocessors.splice(e,1)}clearPostProcessors(){this._postprocessors.length=0}updatePostProcessors(t){for(const e of this._postprocessors){const i=e.getShader();i.use();const s=i.getUniforms();this._totalPostProcessorTime+=t,s.find(n=>n.name==="u_time_ms")&&i.setUniformFloat("u_time_ms",this._totalPostProcessorTime),s.find(n=>n.name==="u_elapsed_ms")&&i.setUniformFloat("u_elapsed_ms",t),s.find(n=>n.name==="u_resolution")&&i.setUniformFloatVector("u_resolution",R(this.width,this.height)),e.onUpdate&&e.onUpdate(t)}}set material(t){this._state.current.material=t}get material(){return this._state.current.material}createMaterial(t){const e=new Dn(t);return e.initialize(this.__gl,this),e}createShader(t){const e=this.__gl,{vertexSource:i,fragmentSource:s}=t,n=new ee({gl:e,vertexSource:i,fragmentSource:s});return n.compile(),n}clear(){const t=this.__gl;this._renderTarget.use(),t.clearColor(this.backgroundColor.r/255,this.backgroundColor.g/255,this.backgroundColor.b/255,this.backgroundColor.a),t.clear(t.COLOR_BUFFER_BIT)}flush(){const t=this.__gl;if(this._renderTarget.use(),this.useDrawSorting){const i=new Map;for(const[o]of this._renderers){const h=this._drawCalls.findIndex(l=>l.renderer===o);i.set(o,h)}this._drawCalls.sort((o,h)=>{const l=o.z-h.z,f=i.get(o.renderer)-i.get(h.renderer),m=o.priority-h.priority;return l===0?m===0?f:m:l});const s=this._transform.current,n=this._state.current;if(this._drawCalls.length){let o=this._drawCalls[0].renderer,h=this._renderers.get(o);for(let l=0;lv!==void 0).map(v=>typeof v=="number"&&this.snapToPixel?~~v:v);this.__ctx.drawImage.apply(this.__ctx,m),vt.DrawCallCount++,vt.DrawnImagesCount=1}drawLine(t,e,i,s=1){this.__ctx.save(),this.__ctx.beginPath(),this.__ctx.strokeStyle=i.toString(),this.__ctx.moveTo(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y),this.__ctx.lineTo(this.snapToPixel?~~(e.x+At):e.x,this.snapToPixel?~~(e.y+At):e.y),this.__ctx.lineWidth=s,this.__ctx.stroke(),this.__ctx.closePath(),this.__ctx.restore()}drawRectangle(t,e,i,s){this.__ctx.save(),this.__ctx.fillStyle=s.toString(),this.__ctx.fillRect(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y,this.snapToPixel?~~(e+At):e,this.snapToPixel?~~(i+At):i),this.__ctx.restore()}drawCircle(t,e,i,s,n){this.__ctx.save(),this.__ctx.beginPath(),s&&(this.__ctx.strokeStyle=s.toString()),n&&(this.__ctx.lineWidth=n),this.__ctx.fillStyle=i.toString(),this.__ctx.arc(this.snapToPixel?~~(t.x+At):t.x,this.snapToPixel?~~(t.y+At):t.y,e,0,Math.PI*2),this.__ctx.fill(),s&&this.__ctx.stroke(),this.__ctx.closePath(),this.__ctx.restore()}save(){this.__ctx.save(),this._state.save()}restore(){this.__ctx.restore(),this._state.restore()}translate(t,e){this.__ctx.translate(this.snapToPixel?~~(t+At):t,this.snapToPixel?~~(e+At):e)}rotate(t){this.__ctx.rotate(t)}scale(t,e){this.__ctx.scale(t,e)}getTransform(){throw new Error("Not implemented")}multiply(t){this.__ctx.setTransform(this.__ctx.getTransform().multiply(t.toDOMMatrix()))}addPostProcessor(t){}removePostProcessor(t){}clearPostProcessors(){}updatePostProcessors(t){}beginDrawLifecycle(){}endDrawLifecycle(){}set material(t){this._state.current.material=t}get material(){return this._state.current.material}createMaterial(t){return null}clear(){this.__ctx.clearRect(0,0,this.width,this.height),this.__ctx.fillStyle=this.backgroundColor.toString(),this.__ctx.fillRect(0,0,this.width,this.height),vt.clear()}flush(){}}var Tt;(function(r){r.Fixed="Fixed",r.FitContainerAndFill="FitContainerAndFill",r.FitScreenAndFill="FitScreenAndFill",r.FitContainerAndZoom="FitContainerAndZoom",r.FitScreenAndZoom="FitScreenAndZoom",r.FitScreen="FitScreen",r.FillScreen="FillScreen",r.FitContainer="FitContainer",r.FillContainer="FillContainer"})(Tt||(Tt={}));class Hs{static get SVGA(){return{width:800,height:600}}static get Standard(){return{width:1920,height:1080}}static get Atari2600(){return{width:160,height:192}}static get GameBoy(){return{width:160,height:144}}static get GameBoyAdvance(){return{width:240,height:160}}static get NintendoDS(){return{width:256,height:192}}static get NES(){return{width:256,height:224}}static get SNES(){return{width:256,height:244}}}const Xo={ScreenResize:"resize",PixelRatioChange:"pixelratio",FullScreenChange:"fullscreen"};class Qs{constructor(t){var e,i,s;this.events=new T,this._antialiasing=!0,this._resolutionStack=[],this._viewportStack=[],this._pixelRatioOverride=null,this._isFullScreen=!1,this._isDisposed=!1,this._logger=j.getInstance(),this._fullscreenChangeHandler=()=>{this._isFullScreen=!this._isFullScreen,this._logger.debug("Fullscreen Change",this._isFullScreen),this.events.emit("fullscreen",{fullscreen:this.isFullScreen})},this._pixelRatioChangeHandler=()=>{this._logger.debug("Pixel Ratio Change",window.devicePixelRatio),this._listenForPixelRatio(),this._devicePixelRatio=this._calculateDevicePixelRatio(),this.applyResolutionAndViewport(),this.events.emit("pixelratio",{pixelRatio:this.pixelRatio})},this._resizeHandler=()=>{const n=this.parent;this._logger.debug("View port resized"),this._setResolutionAndViewportByDisplayMode(n),this.applyResolutionAndViewport(),this.events.emit("resize",{resolution:this.resolution,viewport:this.viewport})},this._devicePixelRatio=this._calculateDevicePixelRatio(),this._alreadyWarned=!1,this._contentArea=new J,this.viewport=t.viewport,this.resolution=(e=t.resolution)!==null&&e!==void 0?e:{...this.viewport},this._contentResolution=this.resolution,this._displayMode=(i=t.displayMode)!==null&&i!==void 0?i:Tt.Fixed,this._canvas=t.canvas,this.graphicsContext=t.context,this._antialiasing=(s=t.antialiasing)!==null&&s!==void 0?s:this._antialiasing,this._browser=t.browser,this._pixelRatioOverride=t.pixelRatio,this._applyDisplayMode(),this._listenForPixelRatio(),this._canvas.addEventListener("fullscreenchange",this._fullscreenChangeHandler),this.applyResolutionAndViewport()}_listenForPixelRatio(){this._mediaQueryList&&!this._mediaQueryList.addEventListener&&this._mediaQueryList.removeListener(this._pixelRatioChangeHandler),this._mediaQueryList=this._browser.window.nativeComponent.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener?this._mediaQueryList.addEventListener("change",this._pixelRatioChangeHandler,{once:!0}):this._mediaQueryList.addListener(this._pixelRatioChangeHandler)}dispose(){this._isDisposed||(this._isDisposed=!0,this._browser.window.off("resize",this._resizeHandler),this._resizeObserver&&this._resizeObserver.disconnect(),this.parent.removeEventListener("resize",this._resizeHandler),this._mediaQueryList.removeEventListener?this._mediaQueryList.removeEventListener("change",this._pixelRatioChangeHandler):this._mediaQueryList.removeListener(this._pixelRatioChangeHandler),this._canvas.removeEventListener("fullscreenchange",this._fullscreenChangeHandler))}_calculateDevicePixelRatio(){return window.devicePixelRatio<1?1:window.devicePixelRatio||1}get pixelRatio(){return this._pixelRatioOverride?this._pixelRatioOverride:this._devicePixelRatio}get isHiDpi(){return this.pixelRatio!==1}get displayMode(){return this._displayMode}get canvas(){return this._canvas}get parent(){switch(this.displayMode){case Tt.FillContainer:case Tt.FitContainer:case Tt.FitContainerAndFill:case Tt.FitContainerAndZoom:return this.canvas.parentElement||document.body;default:return window}}get resolution(){return this._resolution}set resolution(t){this._resolution=t}get viewport(){return this._viewport?this._viewport:this._resolution}set viewport(t){this._viewport=t}get aspectRatio(){return this._resolution.width/this._resolution.height}get scaledWidth(){return this._resolution.width*this.pixelRatio}get scaledHeight(){return this._resolution.height*this.pixelRatio}setCurrentCamera(t){this._camera=t}pushResolutionAndViewport(){this._resolutionStack.push(this.resolution),this._viewportStack.push(this.viewport),this.resolution={...this.resolution},this.viewport={...this.viewport}}peekViewport(){return this._viewportStack[this._viewportStack.length-1]}peekResolution(){return this._resolutionStack[this._resolutionStack.length-1]}popResolutionAndViewport(){this.resolution=this._resolutionStack.pop(),this.viewport=this._viewportStack.pop()}applyResolutionAndViewport(){this._canvas.width=this.scaledWidth,this._canvas.height=this.scaledHeight,this.graphicsContext instanceof Be&&!this.graphicsContext.checkIfResolutionSupported({width:this.scaledWidth,height:this.scaledHeight})&&!this._alreadyWarned&&(this._alreadyWarned=!0,this._logger.warn(`The currently configured resolution (${this.resolution.width}x${this.resolution.height}) and pixel ratio (${this.pixelRatio}) are too large for the platform WebGL implementation, this may work but cause WebGL rendering to behave oddly. Try reducing the resolution or disabling Hi DPI scaling to avoid this (read more here https://excaliburjs.com/docs/screens#understanding-viewport--resolution).`)),this._antialiasing?this._canvas.style.imageRendering="auto":(this._canvas.style.imageRendering="pixelated",this._canvas.style.imageRendering===""&&(this._canvas.style.imageRendering="crisp-edges")),this._canvas.style.width=this.viewport.width+"px",this._canvas.style.height=this.viewport.height+"px",this.graphicsContext.updateViewport(this.resolution),this.graphicsContext.resetTransform(),this.graphicsContext.smoothing=this._antialiasing,this.graphicsContext instanceof Ki&&this.graphicsContext.scale(this.pixelRatio,this.pixelRatio)}get antialiasing(){return this._antialiasing}set antialiasing(t){this._antialiasing=t,this.graphicsContext.smoothing=this._antialiasing}get isFullScreen(){return this._isFullScreen}goFullScreen(t){if(t){const e=document.getElementById(t);if(e)return e.getAttribute("ex-fullscreen-listener")||(e.setAttribute("ex-fullscreen-listener","true"),e.addEventListener("fullscreenchange",this._fullscreenChangeHandler)),e.requestFullscreen()}return this._canvas.requestFullscreen()}exitFullScreen(){return document.exitFullscreen()}pageToScreenCoordinates(t){let e=t.x,i=t.y;if(this._isFullScreen||(e-=Si(this._canvas).x,i-=Si(this._canvas).y),this._isFullScreen)if(window.innerWidth/this.aspectRatiot?this.canvas.style.left=-(f-t)/2+"px":this.canvas.style.left="",m>e?this.canvas.style.top=-(m-e)/2+"px":this.canvas.style.top="",this.viewport={width:f,height:m};const v=J.fromDimension(this.viewport.width,this.viewport.height,A.Zero);if(this.viewport.width>t){const w=(this.viewport.width-t)/this.viewport.width*this.resolution.width;v.top=0,v.left=w/2,v.right=this.resolution.width-w/2,v.bottom=this.resolution.height}if(this.viewport.height>e){const w=(this.viewport.height-e)/this.viewport.height*this.resolution.height;v.top=w/2,v.left=0,v.bottom=this.resolution.height-w/2,v.right=this.resolution.width}this._contentArea=v}_computeFitContainer(){const t=this.aspectRatio;let e=0,i=0;const s=this.canvas.parentElement;s.clientWidth/t{this._resizeHandler()}),this._resizeObserver.observe(this.parent)),this.parent.addEventListener("resize",this._resizeHandler)}_setResolutionAndViewportByDisplayMode(t){this.displayMode===Tt.FillContainer&&(this.resolution={width:t.clientWidth,height:t.clientHeight},this.viewport=this.resolution),this.displayMode===Tt.FillScreen&&(document.body.style.margin="0px",document.body.style.overflow="hidden",this.resolution={width:t.innerWidth,height:t.innerHeight},this.viewport=this.resolution),this._contentArea=J.fromDimension(this.resolution.width,this.resolution.height,A.Zero),this.displayMode===Tt.FitScreen&&this._computeFit(),this.displayMode===Tt.FitContainer&&this._computeFitContainer(),this.displayMode===Tt.FitScreenAndFill&&this._computeFitScreenAndFill(),this.displayMode===Tt.FitContainerAndFill&&this._computeFitContainerAndFill(),this.displayMode===Tt.FitScreenAndZoom&&this._computeFitScreenAndZoom(),this.displayMode===Tt.FitContainerAndZoom&&this._computeFitContainerAndZoom()}}class hi{static create(){return this._INSTANCE||(window.AudioContext||window.webkitAudioContext)&&(this._INSTANCE=new AudioContext),this._INSTANCE}}hi._INSTANCE=null;function Ko(r){return!!r.playbackState}class We{static unlock(){return new Promise((e,i)=>{if(We._UNLOCKED||!hi.create())return e(!0);const s=setTimeout(()=>{j.getInstance().warn("Excalibur was unable to unlock the audio context, audio probably will not play in this browser."),e(!1)},200),n=hi.create();n.resume().then(()=>{const o=n.createBuffer(1,1,22050),h=n.createBufferSource();let l=!1;h.buffer=o,h.connect(n.destination),h.onended=()=>l=!0,h.start(0),setTimeout(()=>{Ko(h)?(h.playbackState===h.PLAYING_STATE||h.playbackState===h.FINISHED_STATE)&&(We._UNLOCKED=!0):(n.currentTime>0||l)&&(We._UNLOCKED=!0)},0),clearTimeout(s),e(!0)},()=>{i()})})}static isUnlocked(){return this._UNLOCKED}}We._UNLOCKED=!1;function Ys(r,t=L.Red,e,i,s,n,o=1,h="butt"){r.save(),r.beginPath(),r.lineWidth=o,r.lineCap=h,r.strokeStyle=t.toString(),r.moveTo(e,i),r.lineTo(s,n),r.closePath(),r.stroke(),r.restore()}function qo(r,t=L.Red,e){r.beginPath(),r.strokeStyle=t.toString(),r.arc(e.x,e.y,5,0,Math.PI*2),r.closePath(),r.stroke()}function $o(r,t,e,i,s=1){const n=t?t.toString():"blue",o=i.scale(s);r.beginPath(),r.strokeStyle=n,r.moveTo(e.x,e.y),r.lineTo(e.x+o.x,e.y+o.y),r.closePath(),r.stroke()}function Ws(r,t,e,i,s,n=5,o=L.White,h=null){let l;if(typeof n=="number")l={tl:n,tr:n,br:n,bl:n};else{const f={tl:0,tr:0,br:0,bl:0};for(const m in f)if(f.hasOwnProperty(m)){const v=m;l[v]=n[v]||f[v]}}r.beginPath(),r.moveTo(t+l.tl,e),r.lineTo(t+i-l.tr,e),r.quadraticCurveTo(t+i,e,t+i,e+l.tr),r.lineTo(t+i,e+s-l.br),r.quadraticCurveTo(t+i,e+s,t+i-l.br,e+s),r.lineTo(t+l.bl,e+s),r.quadraticCurveTo(t,e+s,t,e+s-l.bl),r.lineTo(t,e+l.tl),r.quadraticCurveTo(t,e,t+l.tl,e),r.closePath(),h&&(r.fillStyle=h.toString(),r.fill()),o&&(r.strokeStyle=o.toString(),r.stroke())}function ta(r,t,e,i,s=L.White,n=null){r.beginPath(),r.arc(t,e,i,0,Math.PI*2),r.closePath(),n&&(r.fillStyle=n.toString(),r.fill()),s&&(r.strokeStyle=s.toString(),r.stroke())}const ea="data:image/png;base64,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";var ia=pt(1388);class li extends Vt{constructor(t){var e,i,s,n,o,h,l,f,m,v;super(Tn(t,["width","height"])),this.filtering=null,this.lineCap="butt",this.quality=1,this._dirty=!0,this._smoothing=!1,this._color=He(L.Black,()=>this.flagDirty()),this._lineWidth=1,this._lineDash=[],this._padding=0,t&&(this.quality=(e=t.quality)!==null&&e!==void 0?e:this.quality,this.color=(i=t.color)!==null&&i!==void 0?i:L.Black,this.strokeColor=t==null?void 0:t.strokeColor,this.smoothing=(s=t.smoothing)!==null&&s!==void 0?s:this.smoothing,this.lineWidth=(n=t.lineWidth)!==null&&n!==void 0?n:this.lineWidth,this.lineDash=(o=t.lineDash)!==null&&o!==void 0?o:this.lineDash,this.lineCap=(h=t.lineCap)!==null&&h!==void 0?h:this.lineCap,this.padding=(l=t.padding)!==null&&l!==void 0?l:this.padding,this.filtering=(f=t.filtering)!==null&&f!==void 0?f:this.filtering),this._bitmap=document.createElement("canvas");const w=(m=t==null?void 0:t.width)!==null&&m!==void 0?m:this._bitmap.width,y=(v=t==null?void 0:t.height)!==null&&v!==void 0?v:this._bitmap.height;this.width=w,this.height=y;const b=this._bitmap.getContext("2d");if(b)this._ctx=b;else throw new Error("Browser does not support 2d canvas drawing, cannot create Raster graphic")}cloneRasterOptions(){return{color:this.color?this.color.clone():null,strokeColor:this.strokeColor?this.strokeColor.clone():null,smoothing:this.smoothing,lineWidth:this.lineWidth,lineDash:this.lineDash,lineCap:this.lineCap,quality:this.quality,padding:this.padding}}get dirty(){return this._dirty}flagDirty(){this._dirty=!0}get width(){return Math.abs(this._getTotalWidth()*this.scale.x)}set width(t){t/=Math.abs(this.scale.x),this._bitmap.width=t,this._originalWidth=t,this.flagDirty()}get height(){return Math.abs(this._getTotalHeight()*this.scale.y)}set height(t){t/=Math.abs(this.scale.y),this._bitmap.height=t,this._originalHeight=t,this.flagDirty()}_getTotalWidth(){var t;return(((t=this._originalWidth)!==null&&t!==void 0?t:this._bitmap.width)+this.padding*2)*1}_getTotalHeight(){var t;return(((t=this._originalHeight)!==null&&t!==void 0?t:this._bitmap.height)+this.padding*2)*1}get localBounds(){return J.fromDimension(this._getTotalWidth()*this.scale.x,this._getTotalHeight()*this.scale.y,A.Zero)}get smoothing(){return this._smoothing}set smoothing(t){this._smoothing=t,this.flagDirty()}get color(){return this._color}set color(t){this.flagDirty(),this._color=He(t,()=>this.flagDirty())}get strokeColor(){return this._strokeColor}set strokeColor(t){this.flagDirty(),this._strokeColor=He(t,()=>this.flagDirty())}get lineWidth(){return this._lineWidth}set lineWidth(t){this._lineWidth=t,this.flagDirty()}get lineDash(){return this._lineDash}set lineDash(t){this._lineDash=t,this.flagDirty()}get padding(){return this._padding}set padding(t){this._padding=t,this.flagDirty()}rasterize(){this._dirty=!1,this._ctx.clearRect(0,0,this._getTotalWidth(),this._getTotalHeight()),this._ctx.save(),this._applyRasterProperties(this._ctx),this.execute(this._ctx),this._ctx.restore()}_applyRasterProperties(t){var e,i,s;this._bitmap.width=this._getTotalWidth()*this.quality,this._bitmap.height=this._getTotalHeight()*this.quality,this._bitmap.setAttribute("filtering",this.filtering),this._bitmap.setAttribute("forceUpload","true"),t.scale(this.quality,this.quality),t.translate(this.padding,this.padding),t.imageSmoothingEnabled=this.smoothing,t.lineWidth=this.lineWidth,t.setLineDash((e=this.lineDash)!==null&&e!==void 0?e:t.getLineDash()),t.lineCap=this.lineCap,t.strokeStyle=(i=this.strokeColor)===null||i===void 0?void 0:i.toString(),t.fillStyle=(s=this.color)===null||s===void 0?void 0:s.toString()}_drawImage(t,e,i){this._dirty&&this.rasterize(),t.scale(1/this.quality,1/this.quality),t.drawImage(this._bitmap,e,i)}}class qi extends li{get ctx(){return this._ctx}constructor(t){super(t),this._options=t}clone(){return new qi({...this._options,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){var e,i;!((e=this._options)===null||e===void 0)&&e.draw&&((i=this._options)===null||i===void 0||i.draw(t)),this._options.cache||this.flagDirty()}}class Zs{}Zs.type={any:"",blob:"blob",json:"json",text:"text",document:"document",arraybuffer:"arraybuffer"};class $i{constructor(){this.states=new Map}get currentState(){return this._currentState}set currentState(t){this._currentState=t}static create(t,e){const i=new $i;i.data=e;for(const s in t.states)i.states.set(s,{name:s,...t.states[s]});for(const s of i.states.values())for(const n of s.transitions)if(n!=="*"&&!i.states.has(n))throw Error(`Invalid state machine, state [${s.name}] has a transition to another state that doesn't exist [${n}]`);return i.currentState=i.startState=i.states.get(t.start),i}in(t){return this.currentState.name===t}go(t,e){var i,s;if(this.currentState.transitions.includes(t)||this.currentState.transitions.includes("*")){const n=this.states.get(t);return this.currentState.onExit&&((i=this.currentState)===null||i===void 0?void 0:i.onExit({to:n.name,data:this.data}))===!1||n!=null&&n.onEnter&&(n==null?void 0:n.onEnter({from:this.currentState.name,eventData:e,data:this.data}))===!1?!1:(this.currentState=n,!((s=this.currentState)===null||s===void 0)&&s.onState&&this.currentState.onState(),!0)}return!1}update(t){this.currentState.onUpdate&&this.currentState.onUpdate(this.data,t)}save(t){localStorage.setItem(t,JSON.stringify({currentState:this.currentState.name,data:this.data}))}restore(t){const e=JSON.parse(localStorage.getItem(t));this.currentState=this.states.get(e.currentState),this.data=e.data}}class On{_createNewBufferSource(){this._instance=this._audioContext.createBufferSource(),this._instance.buffer=this._src,this._instance.loop=this.loop,this._instance.playbackRate.value=this._playbackRate,this._instance.connect(this._volumeNode),this._volumeNode.connect(this._audioContext.destination)}_handleEnd(){this.loop||(this._instance.onended=()=>{this._playingFuture.resolve(!0)})}set loop(t){this._loop=t,this._instance&&(this._instance.loop=t,this.loop||(this._instance.onended=()=>{this._playingFuture.resolve(!0)}))}get loop(){return this._loop}set volume(t){t=Gt(t,0,1),this._volume=t,this._stateMachine.in("PLAYING")&&this._volumeNode.gain.setTargetAtTime?this._volumeNode.gain.setTargetAtTime(t,this._audioContext.currentTime,.1):this._volumeNode.gain.value=t}get volume(){return this._volume}get duration(){var t;return(t=this._duration)!==null&&t!==void 0?t:this.getTotalPlaybackDuration()}set duration(t){this._duration=t}constructor(t){this._src=t,this._audioContext=hi.create(),this._volumeNode=this._audioContext.createGain(),this._playingFuture=new Ne,this._stateMachine=$i.create({start:"STOPPED",states:{PLAYING:{onEnter:({data:e})=>{this._createNewBufferSource(),this._handleEnd(),this.loop?this._instance.start(0,e.pausedAt*this._playbackRate):this._instance.start(0,e.pausedAt*this._playbackRate,this.duration),e.startedAt=this._audioContext.currentTime-e.pausedAt,e.pausedAt=0},onState:()=>this._playStarted(),onExit:({to:e})=>{e==="STOPPED"&&this._playingFuture.resolve(!0),this._instance.onended=null,this._instance.disconnect(),this._instance.stop(0),this._instance=null},transitions:["STOPPED","PAUSED","SEEK"]},SEEK:{onEnter:({eventData:e,data:i})=>{i.pausedAt=(e??0)/this._playbackRate,i.startedAt=0},transitions:["*"]},STOPPED:{onEnter:({data:e})=>{e.pausedAt=0,e.startedAt=0,this._playingFuture.resolve(!0)},transitions:["PLAYING","PAUSED","SEEK"]},PAUSED:{onEnter:({data:e})=>{e.pausedAt=this._audioContext.currentTime-e.startedAt},transitions:["PLAYING","STOPPED","SEEK"]}}},{startedAt:0,pausedAt:0}),this._volume=1,this._loop=!1,this._playStarted=()=>{},this._playbackRate=1,this._createNewBufferSource()}isPlaying(){return this._stateMachine.in("PLAYING")}isPaused(){return this._stateMachine.in("PAUSED")||this._stateMachine.in("SEEK")}isStopped(){return this._stateMachine.in("STOPPED")}play(t=()=>{}){return this._playStarted=t,this._stateMachine.go("PLAYING"),this._playingFuture.promise}pause(){this._stateMachine.go("PAUSED")}stop(){this._stateMachine.go("STOPPED")}seek(t){this._stateMachine.go("PAUSED"),this._stateMachine.go("SEEK",t)}getTotalPlaybackDuration(){return this._src.duration}getPlaybackPosition(){const{pausedAt:t,startedAt:e}=this._stateMachine.data;return t?t*this._playbackRate:e?(this._audioContext.currentTime-e)*this._playbackRate:0}set playbackRate(t){this._instance.playbackRate.value=this._playbackRate=t}get playbackRate(){return this._instance.playbackRate.value}}class Js extends P{set bubbles(t){}get bubbles(){return!1}get _path(){return null}set _path(t){}constructor(t,e="MediaEvent"){super(),this.target=t,this._name=e}stopPropagation(){}action(){}propagate(){}layPath(t){}}class ke extends Js{constructor(t,e){super(t,"NativeSoundEvent"),this.track=e}}class Un extends Js{constructor(t,e){super(t,"NativeSoundProcessedEvent"),this._processedData=e,this.data=this._processedData}}function sa(r){try{const t=new Audio,e=/.*\.([A-Za-z0-9]+)(?:(?:\?|\#).*)*$/,i=r.match(e)[1];return!!t.canPlayType("audio/"+i)}catch(t){return j.getInstance().warn("Cannot determine audio support, assuming no support for the Audio Tag",t),!1}}const na={VolumeChange:"volumechange",Processed:"processed",Pause:"pause",Stop:"stop",PlaybackEnd:"playbackend",Resume:"resume",PlaybackStart:"playbackstart"};class Ln{set loop(t){this._loop=t;for(const e of this._tracks)e.loop=this._loop;this.logger.debug("Set loop for all instances of sound",this.path,"to",this._loop)}get loop(){return this._loop}set volume(t){this._volume=t;for(const e of this._tracks)e.volume=this._volume;this.events.emit("volumechange",new ke(this)),this.logger.debug("Set loop for all instances of sound",this.path,"to",this._volume)}get volume(){return this._volume}get duration(){return this._duration}set duration(t){this._duration=t}get instances(){return this._tracks}get path(){return this._resource.path}set path(t){this._resource.path=t}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}constructor(...t){this.events=new T,this.logger=j.getInstance(),this._loop=!1,this._volume=1,this._isStopped=!1,this._tracks=[],this._wasPlayingOnHidden=!1,this._playbackRate=1,this._audioContext=hi.create(),this._resource=new ji("",Zs.type.arraybuffer);for(const e of t)if(sa(e)){this.path=e;break}this.path||(this.logger.warn("This browser does not support any of the audio files specified:",t.join(", ")),this.logger.warn("Attempting to use",t[0]),this.path=t[0])}isLoaded(){return!!this.data}async load(){var t,e;if(this.data)return this.data;const i=await this._resource.load(),s=await this.decodeAudio(i.slice(0));return this._duration=(e=(t=this._duration)!==null&&t!==void 0?t:s==null?void 0:s.duration)!==null&&e!==void 0?e:void 0,this.events.emit("processed",new Un(this,s)),this.data=s}async decodeAudio(t){try{return await this._audioContext.decodeAudioData(t.slice(0))}catch{return this.logger.error("Unable to decode this browser may not fully support this format, or the file may be corrupt, if this is an mp3 try removing id3 tags and album art from the file."),await Promise.reject()}}wireEngine(t){t&&(this._engine=t,this._engine.on("hidden",()=>{t.pauseAudioWhenHidden&&this.isPlaying()&&(this._wasPlayingOnHidden=!0,this.pause())}),this._engine.on("visible",()=>{t.pauseAudioWhenHidden&&this._wasPlayingOnHidden&&(this.play(),this._wasPlayingOnHidden=!1)}),this._engine.on("start",()=>{this._isStopped=!1}),this._engine.on("stop",()=>{this.stop(),this._isStopped=!0}))}instanceCount(){return this._tracks.length}isPlaying(){return this._tracks.some(t=>t.isPlaying())}isPaused(){return this._tracks.some(t=>t.isPaused())}isStopped(){return this._tracks.some(t=>t.isStopped())}play(t){return this.isLoaded()?this._isStopped?(this.logger.warn("Cannot start playing. Engine is in a stopped state."),Promise.resolve(!1)):(this.volume=t||this.volume,this.isPaused()?this._resumePlayback():this._startPlayback()):(this.logger.warn("Cannot start playing. Resource",this.path,"is not loaded yet"),Promise.resolve(!0))}pause(){if(this.isPlaying()){for(const t of this._tracks)t.pause();this.events.emit("pause",new ke(this)),this.logger.debug("Paused all instances of sound",this.path)}}stop(){for(const t of this._tracks)t.stop();this.events.emit("stop",new ke(this)),this._tracks.length=0,this.logger.debug("Stopped all instances of sound",this.path)}get playbackRate(){return this._playbackRate}set playbackRate(t){this._playbackRate=t,this._tracks.forEach(e=>{e.playbackRate=this._playbackRate})}seek(t,e=0){this._tracks.length===0&&this._getTrackInstance(this.data),this._tracks[e].seek(t)}getTotalPlaybackDuration(){return this.data.duration}getPlaybackPosition(t=0){return this._tracks.length?this._tracks[t].getPlaybackPosition():0}getTrackId(t){return this._tracks.indexOf(t)}async _resumePlayback(){if(this.isPaused){const t=[];for(const e of this._tracks)t.push(e.play().then(()=>(this.events.emit("playbackend",new ke(this,e)),this._tracks.splice(this.getTrackId(e),1),!0)));this.events.emit("resume",new ke(this)),this.logger.debug("Resuming paused instances for sound",this.path,this._tracks),await Promise.all(t)}return!0}async _startPlayback(){const t=this._getTrackInstance(this.data),e=await t.play(()=>{this.events.emit("playbackstart",new ke(this,t)),this.logger.debug("Playing new instance for sound",this.path)});this.events.emit("playbackend",new ke(this,t));const i=this.getTrackId(t);return i!==-1&&this._tracks.splice(i,1),e}_getTrackInstance(t){const e=new On(t);return e.loop=this.loop,e.volume=this.volume,e.duration=this.duration,e.playbackRate=this._playbackRate,this._tracks.push(e),e}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}const ra={};class zn{get _image(){return this._imageElement||(this._imageElement=new Image,this._imageElement.src=this.logo),this._imageElement}_getScreenParent(){return this._engine?this._engine.screen.canvas.parentElement:document.body}get playButtonRootElement(){return this._playButtonRootElement}get playButtonElement(){return this._playButtonElement}get _playButton(){const t=document.getElementById("excalibur-play-root");return t&&(this._playButtonRootElement=t),this._playButtonRootElement||(this._playButtonRootElement=document.createElement("div"),this._playButtonRootElement.id="excalibur-play-root",this._playButtonRootElement.style.position="absolute",this._getScreenParent().appendChild(this._playButtonRootElement)),this._styleBlock||(this._styleBlock=document.createElement("style"),this._styleBlock.textContent=this._playButtonStyles,document.head.appendChild(this._styleBlock)),this._playButtonElement||(this._playButtonElement=this.startButtonFactory(),this._playButtonRootElement.appendChild(this._playButtonElement)),this._playButtonElement}constructor(t){this.events=new T,this.canvas=new qi({filtering:Ot.Blended,smoothing:!0,cache:!0,draw:this.draw.bind(this)}),this._resourceList=[],this._index=0,this._playButtonShown=!1,this._resourceCount=0,this._numLoaded=0,this._progressCounts={},this._totalCounts={},this.logo=ea,this.logoWidth=468,this.logoHeight=118,this.loadingBarColor=L.White,this.backgroundColor="#176BAA",this.suppressPlayButton=!1,this._playButtonStyles=ia.Z.toString(),this.playButtonText="Play game",this.startButtonFactory=()=>{let e=document.getElementById("excalibur-play");return e||(e=document.createElement("button")),e.id="excalibur-play",e.textContent=this.playButtonText,e.style.display="none",e},this._loaderResizeHandler=e=>{this._engine.screen.resolution=this._engine.screen.viewport,this._engine.screen.applyResolutionAndViewport(),this.canvas.width=e.viewport.width,this.canvas.height=e.viewport.height,this.canvas.flagDirty()},this._loadingFuture=new Ne,t&&this.addResources(t)}wireEngine(t){this._engine||(this._engine=t,this.canvas.width=this._engine.canvas.width,this.canvas.height=this._engine.canvas.height)}addResource(t){const e=this._index++;this._resourceList.push(t),this._progressCounts[e]=0,this._totalCounts[e]=1,this._resourceCount++}addResources(t){let e=0;const i=t.length;for(e;e{this._positionPlayButton()};return!((e=this._engine)===null||e===void 0)&&e.browser&&this._engine.browser.window.on("resize",i),this._playButtonShown=!0,this._playButton.style.display="block",document.body.addEventListener("keyup",n=>{n.key==="Enter"&&this._playButton.click()}),this._positionPlayButton(),await new Promise(n=>{const o=h=>{var l;h.stopPropagation(),this.hidePlayButton(),!((l=this._engine)===null||l===void 0)&&l.browser&&this._engine.browser.window.off("resize",i),n()};this._playButton.addEventListener("click",o),this._playButton.addEventListener("touchend",o),this._playButton.addEventListener("pointerup",o)})}}hidePlayButton(){this._playButtonShown=!1,this._playButton.style.display="none"}dispose(){this._playButtonRootElement.parentElement&&(this._playButtonRootElement.removeChild(this._playButtonElement),document.body.removeChild(this._playButtonRootElement),document.head.removeChild(this._styleBlock),this._playButtonRootElement=null,this._playButtonElement=null,this._styleBlock=null)}update(t,e){}areResourcesLoaded(){return this._loadingFuture.promise}async load(){var t,e;this._engine.screen.events.on("resize",this._loaderResizeHandler),await((t=this._image)===null||t===void 0?void 0:t.decode()),this.canvas.flagDirty(),await Promise.all(this._resourceList.map(async i=>{await i.load().finally(()=>{this._numLoaded++,this.canvas.flagDirty()})}));for(const i of this._resourceList)i instanceof Ln&&i.wireEngine(this._engine);return this._loadingFuture.resolve(),await Os(200,(e=this._engine)===null||e===void 0?void 0:e.clock),this.canvas.flagDirty(),await this.showPlayButton(),await We.unlock(),this._engine.screen.events.off("resize",this._loaderResizeHandler),this.data=this._resourceList}markResourceComplete(){this._numLoaded++}get progress(){return this._resourceCount>0?Gt(this._numLoaded,0,this._resourceCount)/this._resourceCount:1}_positionPlayButton(){if(this._engine){const t=this._engine.screen.viewport.height,e=this._engine.screen.viewport.width;if(this._playButtonRootElement){const i=this._engine.canvas.offsetLeft,s=this._engine.canvas.offsetTop,n=this._playButton.clientWidth,o=this._playButton.clientHeight;this.playButtonPosition?(this._playButtonRootElement.style.left=`${this.playButtonPosition.x}px`,this._playButtonRootElement.style.top=`${this.playButtonPosition.y}px`):(this._playButtonRootElement.style.left=`${i+e/2-n/2}px`,this._playButtonRootElement.style.top=`${s+t/2-o/2+100}px`)}}}draw(t){const e=this._engine.canvasHeight/this._engine.pixelRatio,i=this._engine.canvasWidth/this._engine.pixelRatio;this._positionPlayButton(),t.fillStyle=this.backgroundColor,t.fillRect(0,0,i,e);let s=e/2;const n=Math.min(this.logoWidth,i*.75);let o=i/2-n/2;this.logoPosition&&(o=this.logoPosition.x,s=this.logoPosition.y);const h=Math.floor(n*(this.logoHeight/this.logoWidth)),l=this._engine.getAntialiasing();if(this._engine.setAntialiasing(!0),this.logoPosition?t.drawImage(this._image,0,0,this.logoWidth,this.logoHeight,o,s,n,h):t.drawImage(this._image,0,0,this.logoWidth,this.logoHeight,o,s-h-20,n,h),!this.suppressPlayButton&&this._playButtonShown){this._engine.setAntialiasing(l);return}let f=o,m=s;this.loadingBarPosition&&(f=this.loadingBarPosition.x,m=this.loadingBarPosition.y),t.lineWidth=2,Ws(t,f,m,n,20,10,this.loadingBarColor);const v=n*this.progress,w=5,y=v-w*2,b=20-w*2;Ws(t,f+w,m+w,y>10?y:10,b,5,null,this.loadingBarColor),this._engine.setAntialiasing(l)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}const Gn={webgl:"WebGL",webaudio:"WebAudio",gamepadapi:"Gamepad API"};class Nn{constructor(){this._features=null,this.failedTests=[],this._criticalTests={canvasSupport:function(){const t=document.createElement("canvas");return!!(t.getContext&&t.getContext("2d"))},arrayBufferSupport:function(){const t=new XMLHttpRequest;t.open("GET","/");try{t.responseType="arraybuffer"}catch{return!1}return t.responseType==="arraybuffer"},dataUrlSupport:function(){return document.createElement("canvas").toDataURL("image/png").indexOf("data:image/png")===0},objectUrlSupport:function(){return"URL"in window&&"revokeObjectURL"in URL&&"createObjectURL"in URL},rgbaSupport:function(){const t=document.createElement("a").style;return t.cssText="background-color:rgba(150,255,150,.5)",(""+t.backgroundColor).indexOf("rgba")>-1}},this._warningTest={webAudioSupport:function(){return!!(window.AudioContext||window.webkitAudioContext||window.mozAudioContext||window.msAudioContext||window.oAudioContext)},webglSupport:function(){const t=document.createElement("canvas");return!!(t.getContext&&t.getContext("webgl"))}},this._features=this._loadBrowserFeatures()}getBrowserFeatures(){return this._features===null&&(this._features=this._loadBrowserFeatures()),this._features}logBrowserFeatures(){let t=`%cSUPPORTED BROWSER FEATURES ==========================%c -`;const e=["font-weight: bold; color: navy","font-weight: normal; color: inherit"],i=this.getBrowserFeatures();for(const s of Object.keys(zn))i[s]?(t+="(%c✓%c)",e.push("font-weight: bold; color: green"),e.push("font-weight: normal; color: inherit")):(t+="(%c✗%c)",e.push("font-weight: bold; color: red"),e.push("font-weight: normal; color: inherit")),t+=" "+zn[s]+` -`;e.unshift(t),console.log.apply(console,e)}_loadBrowserFeatures(){return{canvas:this._criticalTests.canvasSupport(),arraybuffer:this._criticalTests.arrayBufferSupport(),dataurl:this._criticalTests.dataUrlSupport(),objecturl:this._criticalTests.objectUrlSupport(),rgba:this._criticalTests.rgbaSupport(),webaudio:this._warningTest.webAudioSupport(),webgl:this._warningTest.webglSupport(),gamepadapi:!!navigator.getGamepads}}test(){let t=!1;for(const e in this._criticalTests)this._criticalTests[e].call(this)||(this.failedTests.push(e),V.getInstance().error("Critical browser feature missing, Excalibur requires:",e),t=!0);if(t)return!1;for(const e in this._warningTest)this._warningTest[e]()||V.getInstance().warn("Warning browser feature missing, Excalibur will have reduced performance:",e);return!0}}var q;(function(r){r.PreventCollision="PreventCollision",r.Passive="Passive",r.Active="Active",r.Fixed="Fixed"})(q||(q={}));const Nn=5,ci={},ra=()=>{for(const r in ci)ci[r]=0},ts=(r,t)=>{const e=x.isEnabled("suppress-obsolete-message");ci[r]=0;h--)(o=r[h])&&(n=(s<3?o(n):s>3?o(t,e,n):o(t,e))||n);return s>3&&n&&Object.defineProperty(t,e,n),n},Ze;(function(r){r.Arcade="arcade",r.Realistic="realistic"})(Ze||(Ze={}));var es;(function(r){r[r.DynamicAABBTree=0]="DynamicAABBTree"})(es||(es={}));var is;(function(r){r[r.Euler=0]="Euler"})(is||(is={}));class Z{static get gravity(){return Z.acc}static set gravity(t){Z.acc=t}static useArcadePhysics(){Z.collisionResolutionStrategy=Ze.Arcade}static useRealisticPhysics(){Z.collisionResolutionStrategy=Ze.Realistic}static get dynamicTreeVelocityMultiplyer(){return Z.dynamicTreeVelocityMultiplier}static set dynamicTreeVelocityMultiplyer(t){Z.dynamicTreeVelocityMultiplier=t}}Z.acc=new A(0,0),Z.enabled=!0,Z.broadphaseStrategy=es.DynamicAABBTree,Z.collisionResolutionStrategy=Ze.Arcade,Z.defaultMass=10,Z.integrator=is.Euler,Z.dynamicTreeVelocityMultiplier=2,Z.boundsPadding=5,Z.positionIterations=3,Z.velocityIterations=8,Z.slop=1,Z.steeringFactor=.2,Z.warmStart=!0,Z.bodiesCanSleepByDefault=!1,Z.surfaceEpsilon=.1,Z.sleepEpsilon=.07,Z.wakeThreshold=Z.sleepEpsilon*3,Z.sleepBias=.9,Z.checkForFastBodies=!0,Z.disableMinimumSpeedForFastBody=!1,oa([Qn({message:"Alias for incorrect spelling used in older versions, will be removed in v0.25.0",alternateMethod:"dynamicTreeVelocityMultiplier"})],Z,"dynamicTreeVelocityMultiplyer",null);var Nt;(function(r){r.World="world",r.Screen="screen"})(Nt||(Nt={}));class Js extends A{constructor(t){super(0,0),this._getX=t.getX,this._getY=t.getY,this._setX=t.setX,this._setY=t.setY}get x(){return this._x=this._getX()}set x(t){this._setX(t),this._x=t}get y(){return this._y=this._getY()}set y(t){this._setY(t),this._y=t}}class Hn extends A{constructor(t,e){super(t.x,t.y),this.original=t,this.change=e}get x(){return this._x=this.original.x}set x(t){this.change(t,this._y),this._x=this.original.x=t}get y(){return this._y=this.original.y}set y(t){this.change(this._x,t),this._y=this.original.y=t}}class Je{constructor(){this._parent=null,this._children=[],this._pos=R(0,0),this._rotation=0,this._scale=R(1,1),this._isDirty=!1,this._isInverseDirty=!1,this._matrix=Et.identity(),this._inverse=Et.identity()}get parent(){return this._parent}set parent(t){if(this._parent){const e=this._parent._children.indexOf(this);e>-1&&this._parent._children.splice(e,1)}this._parent=t,this._parent&&this._parent._children.push(this),this.flagDirty()}get children(){return this._children}set pos(t){t.equals(this._pos)||(this._pos.x=t.x,this._pos.y=t.y,this.flagDirty())}get pos(){return new Hn(this._pos,(t,e)=>{(t!==this._pos.x||e!==this._pos.y)&&this.flagDirty()})}set globalPos(t){let e=t.clone();this.parent&&(e=this.parent.inverse.multiply(t)),e.equals(this._pos)||(this._pos=e,this.flagDirty())}get globalPos(){return new Js({getX:()=>this.matrix.data[4],getY:()=>this.matrix.data[5],setX:t=>{if(this.parent){const{x:e}=this.parent.inverse.multiply(R(t,this.pos.y));this.pos.x=e}else this.pos.x=t;t!==this.matrix.data[4]&&this.flagDirty()},setY:t=>{if(this.parent){const{y:e}=this.parent.inverse.multiply(R(this.pos.x,t));this.pos.y=e}else this.pos.y=t;t!==this.matrix.data[5]&&this.flagDirty()}})}set rotation(t){const e=ai(t);e!==this._rotation&&this.flagDirty(),this._rotation=e}get rotation(){return this._rotation}set globalRotation(t){let e=0;this.parent&&(e=this.parent.globalRotation);const i=ai(t+e);i!==this._rotation&&this.flagDirty(),this._rotation=i}get globalRotation(){return this.parent?this.matrix.getRotation():this.rotation}set scale(t){t.equals(this._scale)||(this._scale.x=t.x,this._scale.y=t.y,this.flagDirty())}get scale(){return new Hn(this._scale,(t,e)=>{(t!==this._scale.x||e!==this._scale.y)&&this.flagDirty()})}set globalScale(t){let e=R(1,1);this.parent&&(e=this.parent.globalScale),this.scale=t.scale(R(1/e.x,1/e.y))}get globalScale(){return new Js({getX:()=>this.parent?this.matrix.getScaleX():this.scale.x,getY:()=>this.parent?this.matrix.getScaleY():this.scale.y,setX:t=>{if(this.parent){const e=this.parent.globalScale.x;this.scale.x=t/e}else this.scale.x=t},setY:t=>{if(this.parent){const e=this.parent.globalScale.y;this.scale.y=t/e}else this.scale.y=t}})}get matrix(){return this._isDirty&&(this.parent===null?this._matrix=this._calculateMatrix():this._matrix=this.parent.matrix.multiply(this._calculateMatrix()),this._isDirty=!1),this._matrix}get inverse(){return this._isInverseDirty&&(this._inverse=this.matrix.inverse(),this._isInverseDirty=!1),this._inverse}_calculateMatrix(){return Et.identity().translate(this.pos.x,this.pos.y).rotate(this.rotation).scale(this.scale.x,this.scale.y)}flagDirty(){this._isDirty=!0,this._isInverseDirty=!0;for(let t=0;t{const e=t.get(H);e&&(e._transform.parent=this._transform)},this.zIndexChanged$=new fe,this._z=0,this.coordPlane=Nt.World}get(){return this._transform}onAdd(t){for(const e of t.children)this._addChildTransform(e);t.childrenAdded$.subscribe(e=>this._addChildTransform(e)),t.childrenRemoved$.subscribe(e=>{const i=e.get(H);i&&(i._transform.parent=null)})}onRemove(t){this._transform.parent=null}get z(){return this._z}set z(t){const e=this._z;this._z=t,e!==t&&this.zIndexChanged$.notifyAll(t)}get pos(){return this._transform.pos}set pos(t){this._transform.pos=t}get globalPos(){return this._transform.globalPos}set globalPos(t){this._transform.globalPos=t}get rotation(){return this._transform.rotation}set rotation(t){this._transform.rotation=t}get globalRotation(){return this._transform.globalRotation}set globalRotation(t){this._transform.globalRotation=t}get scale(){return this._transform.scale}set scale(t){this._transform.scale=t}get globalScale(){return this._transform.globalScale}set globalScale(t){this._transform.globalScale=t}applyInverse(t){return this._transform.applyInverse(t)}apply(t){return this._transform.apply(t)}clone(){const t=new H;return t._transform=this._transform.clone(),t._z=this._z,t}}class yt extends ie{constructor(){super(...arguments),this.type="ex.motion",this.vel=A.Zero,this.acc=A.Zero,this.scaleFactor=A.Zero,this.angularVelocity=0,this.torque=0,this.inertia=1}}class ge{static create(t,e){if(this._CURRENT_GROUP>this._MAX_GROUPS)throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);if(this._GROUPS.get(t)){const s=this._GROUPS.get(t);if(s.mask===e)return s;throw new Error(`Collision group ${t} already exists with a different mask!`)}const i=new di(t,this._CURRENT_BIT,e!==void 0?e:~this._CURRENT_BIT);return this._CURRENT_BIT=this._CURRENT_BIT<<1|0,this._CURRENT_GROUP++,this._GROUPS.set(t,i),i}static get groups(){return Array.from(this._GROUPS.values())}static groupByName(t){return this._GROUPS.get(t)}static reset(){this._GROUPS=new Map,this._CURRENT_BIT=this._STARTING_BIT,this._CURRENT_GROUP=1}}ge._STARTING_BIT=1,ge._MAX_GROUPS=32,ge._CURRENT_GROUP=1,ge._CURRENT_BIT=ge._STARTING_BIT,ge._GROUPS=new Map;class di{constructor(t,e,i){this._name=t,this._category=e,this._mask=i}get name(){return this._name}get category(){return this._category}get mask(){return this._mask}canCollide(t){const e=this.category&t.mask,i=this.mask&t.category;return e!==0&&i!==0}invert(){const t=ge.create("~("+this.name+")",~this.mask|0);return t._category=~this.category,t}static combine(t){const e=t.map(n=>n.name).join("+"),s=~t.reduce((n,o)=>o.category|n,0);return ge.create(e,s)}static collidesWith(t){const e=`collidesWith(${t.map(s=>s.name).join("+")})`,i=t.reduce((s,n)=>n.category|s,0);return ge.create(e,i)}toString(){return` +`;const e=["font-weight: bold; color: navy","font-weight: normal; color: inherit"],i=this.getBrowserFeatures();for(const s of Object.keys(Gn))i[s]?(t+="(%c✓%c)",e.push("font-weight: bold; color: green"),e.push("font-weight: normal; color: inherit")):(t+="(%c✗%c)",e.push("font-weight: bold; color: red"),e.push("font-weight: normal; color: inherit")),t+=" "+Gn[s]+` +`;e.unshift(t),console.log.apply(console,e)}_loadBrowserFeatures(){return{canvas:this._criticalTests.canvasSupport(),arraybuffer:this._criticalTests.arrayBufferSupport(),dataurl:this._criticalTests.dataUrlSupport(),objecturl:this._criticalTests.objectUrlSupport(),rgba:this._criticalTests.rgbaSupport(),webaudio:this._warningTest.webAudioSupport(),webgl:this._warningTest.webglSupport(),gamepadapi:!!navigator.getGamepads}}test(){let t=!1;for(const e in this._criticalTests)this._criticalTests[e].call(this)||(this.failedTests.push(e),j.getInstance().error("Critical browser feature missing, Excalibur requires:",e),t=!0);if(t)return!1;for(const e in this._warningTest)this._warningTest[e]()||j.getInstance().warn("Warning browser feature missing, Excalibur will have reduced performance:",e);return!0}}var q;(function(r){r.PreventCollision="PreventCollision",r.Passive="Passive",r.Active="Active",r.Fixed="Fixed"})(q||(q={}));const Hn=5,ci={},oa=()=>{for(const r in ci)ci[r]=0},ts=(r,t)=>{const e=x.isEnabled("suppress-obsolete-message");ci[r]=0;h--)(o=r[h])&&(n=(s<3?o(n):s>3?o(t,e,n):o(t,e))||n);return s>3&&n&&Object.defineProperty(t,e,n),n},Ze;(function(r){r.Arcade="arcade",r.Realistic="realistic"})(Ze||(Ze={}));var es;(function(r){r[r.DynamicAABBTree=0]="DynamicAABBTree"})(es||(es={}));var is;(function(r){r[r.Euler=0]="Euler"})(is||(is={}));class Z{static get gravity(){return Z.acc}static set gravity(t){Z.acc=t}static useArcadePhysics(){Z.collisionResolutionStrategy=Ze.Arcade}static useRealisticPhysics(){Z.collisionResolutionStrategy=Ze.Realistic}static get dynamicTreeVelocityMultiplyer(){return Z.dynamicTreeVelocityMultiplier}static set dynamicTreeVelocityMultiplyer(t){Z.dynamicTreeVelocityMultiplier=t}}Z.acc=new A(0,0),Z.enabled=!0,Z.broadphaseStrategy=es.DynamicAABBTree,Z.collisionResolutionStrategy=Ze.Arcade,Z.defaultMass=10,Z.integrator=is.Euler,Z.dynamicTreeVelocityMultiplier=2,Z.boundsPadding=5,Z.positionIterations=3,Z.velocityIterations=8,Z.slop=1,Z.steeringFactor=.2,Z.warmStart=!0,Z.bodiesCanSleepByDefault=!1,Z.surfaceEpsilon=.1,Z.sleepEpsilon=.07,Z.wakeThreshold=Z.sleepEpsilon*3,Z.sleepBias=.9,Z.checkForFastBodies=!0,Z.disableMinimumSpeedForFastBody=!1,aa([Qn({message:"Alias for incorrect spelling used in older versions, will be removed in v0.25.0",alternateMethod:"dynamicTreeVelocityMultiplier"})],Z,"dynamicTreeVelocityMultiplyer",null);var Nt;(function(r){r.World="world",r.Screen="screen"})(Nt||(Nt={}));class Vs extends A{constructor(t){super(0,0),this._getX=t.getX,this._getY=t.getY,this._setX=t.setX,this._setY=t.setY}get x(){return this._x=this._getX()}set x(t){this._setX(t),this._x=t}get y(){return this._y=this._getY()}set y(t){this._setY(t),this._y=t}}class Yn extends A{constructor(t,e){super(t.x,t.y),this.original=t,this.change=e}get x(){return this._x=this.original.x}set x(t){this.change(t,this._y),this._x=this.original.x=t}get y(){return this._y=this.original.y}set y(t){this.change(this._x,t),this._y=this.original.y=t}}class Je{constructor(){this._parent=null,this._children=[],this._pos=R(0,0),this._rotation=0,this._scale=R(1,1),this._isDirty=!1,this._isInverseDirty=!1,this._matrix=Et.identity(),this._inverse=Et.identity()}get parent(){return this._parent}set parent(t){if(this._parent){const e=this._parent._children.indexOf(this);e>-1&&this._parent._children.splice(e,1)}this._parent=t,this._parent&&this._parent._children.push(this),this.flagDirty()}get children(){return this._children}set pos(t){t.equals(this._pos)||(this._pos.x=t.x,this._pos.y=t.y,this.flagDirty())}get pos(){return new Yn(this._pos,(t,e)=>{(t!==this._pos.x||e!==this._pos.y)&&this.flagDirty()})}set globalPos(t){let e=t.clone();this.parent&&(e=this.parent.inverse.multiply(t)),e.equals(this._pos)||(this._pos=e,this.flagDirty())}get globalPos(){return new Vs({getX:()=>this.matrix.data[4],getY:()=>this.matrix.data[5],setX:t=>{if(this.parent){const{x:e}=this.parent.inverse.multiply(R(t,this.pos.y));this.pos.x=e}else this.pos.x=t;t!==this.matrix.data[4]&&this.flagDirty()},setY:t=>{if(this.parent){const{y:e}=this.parent.inverse.multiply(R(this.pos.x,t));this.pos.y=e}else this.pos.y=t;t!==this.matrix.data[5]&&this.flagDirty()}})}set rotation(t){const e=ai(t);e!==this._rotation&&this.flagDirty(),this._rotation=e}get rotation(){return this._rotation}set globalRotation(t){let e=0;this.parent&&(e=this.parent.globalRotation);const i=ai(t+e);i!==this._rotation&&this.flagDirty(),this._rotation=i}get globalRotation(){return this.parent?this.matrix.getRotation():this.rotation}set scale(t){t.equals(this._scale)||(this._scale.x=t.x,this._scale.y=t.y,this.flagDirty())}get scale(){return new Yn(this._scale,(t,e)=>{(t!==this._scale.x||e!==this._scale.y)&&this.flagDirty()})}set globalScale(t){let e=R(1,1);this.parent&&(e=this.parent.globalScale),this.scale=t.scale(R(1/e.x,1/e.y))}get globalScale(){return new Vs({getX:()=>this.parent?this.matrix.getScaleX():this.scale.x,getY:()=>this.parent?this.matrix.getScaleY():this.scale.y,setX:t=>{if(this.parent){const e=this.parent.globalScale.x;this.scale.x=t/e}else this.scale.x=t},setY:t=>{if(this.parent){const e=this.parent.globalScale.y;this.scale.y=t/e}else this.scale.y=t}})}get matrix(){return this._isDirty&&(this.parent===null?this._matrix=this._calculateMatrix():this._matrix=this.parent.matrix.multiply(this._calculateMatrix()),this._isDirty=!1),this._matrix}get inverse(){return this._isInverseDirty&&(this._inverse=this.matrix.inverse(),this._isInverseDirty=!1),this._inverse}_calculateMatrix(){return Et.identity().translate(this.pos.x,this.pos.y).rotate(this.rotation).scale(this.scale.x,this.scale.y)}flagDirty(){this._isDirty=!0,this._isInverseDirty=!0;for(let t=0;t{const e=t.get(Y);e&&(e._transform.parent=this._transform)},this.zIndexChanged$=new ge,this._z=0,this.coordPlane=Nt.World}get(){return this._transform}onAdd(t){for(const e of t.children)this._addChildTransform(e);t.childrenAdded$.subscribe(e=>this._addChildTransform(e)),t.childrenRemoved$.subscribe(e=>{const i=e.get(Y);i&&(i._transform.parent=null)})}onRemove(t){this._transform.parent=null}get z(){return this._z}set z(t){const e=this._z;this._z=t,e!==t&&this.zIndexChanged$.notifyAll(t)}get pos(){return this._transform.pos}set pos(t){this._transform.pos=t}get globalPos(){return this._transform.globalPos}set globalPos(t){this._transform.globalPos=t}get rotation(){return this._transform.rotation}set rotation(t){this._transform.rotation=t}get globalRotation(){return this._transform.globalRotation}set globalRotation(t){this._transform.globalRotation=t}get scale(){return this._transform.scale}set scale(t){this._transform.scale=t}get globalScale(){return this._transform.globalScale}set globalScale(t){this._transform.globalScale=t}applyInverse(t){return this._transform.applyInverse(t)}apply(t){return this._transform.apply(t)}clone(){const t=new Y;return t._transform=this._transform.clone(),t._z=this._z,t}}class yt extends ie{constructor(){super(...arguments),this.type="ex.motion",this.vel=A.Zero,this.acc=A.Zero,this.scaleFactor=A.Zero,this.angularVelocity=0,this.torque=0,this.inertia=1}}class pe{static create(t,e){if(this._CURRENT_GROUP>this._MAX_GROUPS)throw new Error(`Cannot have more than ${this._MAX_GROUPS} collision groups`);if(this._GROUPS.get(t)){const s=this._GROUPS.get(t);if(s.mask===e)return s;throw new Error(`Collision group ${t} already exists with a different mask!`)}const i=new di(t,this._CURRENT_BIT,e!==void 0?e:~this._CURRENT_BIT);return this._CURRENT_BIT=this._CURRENT_BIT<<1|0,this._CURRENT_GROUP++,this._GROUPS.set(t,i),i}static get groups(){return Array.from(this._GROUPS.values())}static groupByName(t){return this._GROUPS.get(t)}static reset(){this._GROUPS=new Map,this._CURRENT_BIT=this._STARTING_BIT,this._CURRENT_GROUP=1}}pe._STARTING_BIT=1,pe._MAX_GROUPS=32,pe._CURRENT_GROUP=1,pe._CURRENT_BIT=pe._STARTING_BIT,pe._GROUPS=new Map;class di{constructor(t,e,i){this._name=t,this._category=e,this._mask=i}get name(){return this._name}get category(){return this._category}get mask(){return this._mask}canCollide(t){const e=this.category&t.mask,i=this.mask&t.category;return e!==0&&i!==0}invert(){const t=pe.create("~("+this.name+")",~this.mask|0);return t._category=~this.category,t}static combine(t){const e=t.map(n=>n.name).join("+"),s=~t.reduce((n,o)=>o.category|n,0);return pe.create(e,s)}static collidesWith(t){const e=`collidesWith(${t.map(s=>s.name).join("+")})`,i=t.reduce((s,n)=>n.category|s,0);return pe.create(e,i)}toString(){return` category: ${this.category.toString(2).padStart(32,"0")} mask: ${(this.mask>>>0).toString(2).padStart(32,"0")} - `}}di.All=new di("Collide with all groups",-1,-1);class se{constructor(t,e){this.colliderA=t,this.colliderB=e,this.id=null,this.id=se.calculatePairHash(t.id,e.id)}static canCollide(t,e){var i,s;const n=(i=t==null?void 0:t.owner)===null||i===void 0?void 0:i.get(it),o=(s=e==null?void 0:e.owner)===null||s===void 0?void 0:s.get(it);return!(t.id===e.id||t.owner&&e.owner&&t.owner.id===e.owner.id||t.localBounds.hasZeroDimensions()||e.localBounds.hasZeroDimensions()||!n||!o||!n.group.canCollide(o.group)||n.collisionType===q.Fixed&&o.collisionType===q.Fixed||o.collisionType===q.PreventCollision||n.collisionType===q.PreventCollision||!n.active||!o.active)}get canCollide(){const t=this.colliderA,e=this.colliderB;return se.canCollide(t,e)}collide(){return this.colliderA.collide(this.colliderB)}hasCollider(t){return t===this.colliderA||t===this.colliderB}static calculatePairHash(t,e){return t.valuet.min&&t.max>this.min}getOverlap(t){return this.overlaps(t)?this.max>t.max?t.max-this.min:this.max-t.min:0}}class Vs{constructor(t){this.parent=t,this.parent=t||null,this.data=null,this.bounds=new J,this.left=null,this.right=null,this.height=0}isLeaf(){return!this.left&&!this.right}}class Ks{constructor(t=new J(-Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE)){this.worldBounds=t,this.root=null,this.nodes={}}_insert(t){if(this.root===null){this.root=t,this.root.parent=null;return}const e=t.bounds;let i=this.root;for(;!i.isLeaf();){const h=i.left,l=i.right,f=i.bounds.getPerimeter(),v=i.bounds.combine(e).getPerimeter(),w=2*v,y=2*(v-f);let b=0;const k=e.combine(h.bounds);let D,C;h.isLeaf()?b=k.getPerimeter()+y:(C=h.bounds.getPerimeter(),D=k.getPerimeter(),b=D-C+y);let E=0;const F=e.combine(l.bounds);if(l.isLeaf()?E=F.getPerimeter()+y:(C=l.bounds.getPerimeter(),D=F.getPerimeter(),E=D-C+y),w1)return o.left=s,o.parent=s.parent,s.parent=o,o.parent?o.parent.left===s?o.parent.left=o:o.parent.right=o:this.root=o,f.height>p.height?(o.right=f,s.right=p,p.parent=s,s.bounds=n.bounds.combine(p.bounds),o.bounds=s.bounds.combine(f.bounds),s.height=1+Math.max(n.height,p.height),o.height=1+Math.max(s.height,f.height)):(o.right=p,s.right=f,f.parent=s,s.bounds=n.bounds.combine(f.bounds),o.bounds=s.bounds.combine(p.bounds),s.height=1+Math.max(n.height,f.height),o.height=1+Math.max(s.height,p.height)),o;if(v<-1){if(n.left=s,n.parent=s.parent,s.parent=n,n.parent)if(n.parent.left===s)n.parent.left=n;else{if(n.parent.right!==s)throw"Error rotating Dynamic Tree";n.parent.right=n}else this.root=n;return h.height>l.height?(n.right=h,s.left=l,l.parent=s,s.bounds=o.bounds.combine(l.bounds),n.bounds=s.bounds.combine(h.bounds),s.height=1+Math.max(o.height,l.height),n.height=1+Math.max(s.height,h.height)):(n.right=l,s.left=h,h.parent=s,s.bounds=o.bounds.combine(h.bounds),n.bounds=s.bounds.combine(l.bounds),s.height=1+Math.max(o.height,h.height),n.height=1+Math.max(s.height,l.height)),n}return t}getHeight(){return this.root===null?0:this.root.height}query(t,e){const i=t.bounds,s=n=>{if(n&&n.bounds.overlaps(i))if(n.isLeaf()&&n.data!==t){if(e.call(t,n.data))return!0}else return s(n.left)||s(n.right);return!1};s(this.root)}rayCastQuery(t,e=1/0,i){const s=n=>{if(n&&n.bounds.rayCast(t,e))if(n.isLeaf()){if(i.call(t,n.data))return!0}else return s(n.left)||s(n.right);return!1};s(this.root)}getNodes(){const t=e=>e?[e].concat(t(e.left),t(e.right)):[];return t(this.root)}debug(t){const e=i=>{i&&(i.isLeaf()?i.bounds.draw(t,L.Green):i.bounds.draw(t,L.White),i.left&&e(i.left),i.right&&e(i.right))};e(this.root)}}class Se{constructor(t,e){this.pos=t,this.dir=e.normalize()}intersect(t){const e=t.begin.sub(this.pos);if(this.dir.cross(t.getSlope())===0&&e.cross(this.dir)!==0)return-1;const i=this.dir.cross(t.getSlope());if(i===0)return-1;const s=e.cross(t.getSlope())/i;if(s>=0){const n=e.cross(this.dir)/i/t.getLength();if(n>=0&&n<=1)return s}return-1}intersectPoint(t){const e=this.intersect(t);return e<0?null:this.getPoint(e)}getPoint(t){return this.pos.add(this.dir.scale(t))}}class Xs{constructor(){this._dynamicCollisionTree=new Ks,this._pairs=new Set,this._collisionPairCache=[],this._colliders=[]}getColliders(){return this._colliders}rayCast(t,e){var i,s,n;const o=[],h=(i=e==null?void 0:e.maxDistance)!==null&&i!==void 0?i:1/0,l=e==null?void 0:e.collisionGroup,f=l?l.category:(s=e==null?void 0:e.collisionMask)!==null&&s!==void 0?s:di.All.category,p=(n=e==null?void 0:e.searchAllColliders)!==null&&n!==void 0?n:!1;return this._dynamicCollisionTree.rayCastQuery(t,h,v=>{const y=v.owner.get(it),b=(f&y.group.category)!==0;if(y!=null&&y.group&&!b)return!1;const k=v.rayCast(t,h);return!!(k&&(o.push({distance:k.sub(t.pos).distance(),point:k,collider:v,body:y}),!p))}),o}track(t){if(!t){V.getInstance().warn("Cannot track null collider");return}if(t instanceof Mt){const e=t.getColliders();for(const i of e)i.owner=t.owner,this._colliders.push(i),this._dynamicCollisionTree.trackCollider(i)}else this._colliders.push(t),this._dynamicCollisionTree.trackCollider(t)}untrack(t){if(!t){V.getInstance().warn("Cannot untrack a null collider");return}if(t instanceof Mt){const e=t.getColliders();for(const i of e){const s=this._colliders.indexOf(i);s!==-1&&this._colliders.splice(s,1),this._dynamicCollisionTree.untrackCollider(i)}}else{const e=this._colliders.indexOf(t);e!==-1&&this._colliders.splice(e,1),this._dynamicCollisionTree.untrackCollider(t)}}_pairExists(t,e){const i=se.calculatePairHash(t.id,e.id);return this._pairs.has(i)}broadphase(t,e,i){const s=e/1e3,n=t.filter(h=>{var l,f;const p=(l=h.owner)===null||l===void 0?void 0:l.get(it);return((f=h.owner)===null||f===void 0?void 0:f.active)&&p.collisionType!==q.PreventCollision});this._collisionPairCache=[],this._pairs.clear();let o;for(let h=0,l=n.length;h{if(!this._pairExists(o,f)&&se.canCollide(o,f)){const p=new se(o,f);this._pairs.add(p.id),this._collisionPairCache.push(p)}return!1});if(i&&(i.physics.pairs=this._collisionPairCache.length),Z.checkForFastBodies)for(const h of n){const l=h.owner.get(it);if(l.collisionType!==q.Active)continue;const f=l.vel.size*s+l.acc.size*.5*s*s,p=Math.min(h.bounds.height,h.bounds.width);if(Z.disableMinimumSpeedForFastBody||f>p/2){i&&i.physics.fastBodies++;const v=l.globalPos.sub(l.oldPos),w=h.center,y=h.getFurthestPoint(l.vel),b=y.sub(v),k=new Se(b,l.vel);k.pos=k.pos.add(k.dir.scale(-2*Z.surfaceEpsilon));let D,C=new A(1/0,1/0);if(this._dynamicCollisionTree.rayCastQuery(k,f+Z.surfaceEpsilon*2,E=>{if(!this._pairExists(h,E)&&se.canCollide(h,E)){const F=E.rayCast(k,f+Z.surfaceEpsilon*10);if(F){const U=F.sub(b);U.size0)for(const o of n)e.physics.contacts.set(o.id,o)}return e&&(e.physics.collisions+=i.length),i}update(t){let e=0;const i=t.length;for(let s=0;si.offset.addEqual(t.offset))):e=[t];for(const i of e)i.events.pipe(this.events),i.__compositeColliderId=this.id,this._colliders.push(i),this._collisionProcessor.track(i),this._dynamicAABBTree.trackCollider(i)}removeCollider(t){t.events.pipe(this.events),t.__compositeColliderId=null,Be(t,this._colliders),this._collisionProcessor.untrack(t),this._dynamicAABBTree.untrackCollider(t)}getColliders(){return this._colliders}get worldPos(){var t,e;return((e=(t=this._transform)===null||t===void 0?void 0:t.pos)!==null&&e!==void 0?e:A.Zero).add(this.offset)}get center(){var t,e;return((e=(t=this._transform)===null||t===void 0?void 0:t.pos)!==null&&e!==void 0?e:A.Zero).add(this.offset)}get bounds(){var t,e;const i=this.getColliders();return i.reduce((n,o)=>n.combine(o.bounds),(e=(t=i[0])===null||t===void 0?void 0:t.bounds)!==null&&e!==void 0?e:new J().translate(this.worldPos)).translate(this.offset)}get localBounds(){var t,e;const i=this.getColliders();return i.reduce((n,o)=>n.combine(o.localBounds),(e=(t=i[0])===null||t===void 0?void 0:t.localBounds)!==null&&e!==void 0?e:new J)}get axes(){const t=this.getColliders();let e=[];for(const i of t)e=e.concat(i.axes);return e}getFurthestPoint(t){const e=this.getColliders(),i=[];for(const o of e)i.push(o.getFurthestPoint(t));let s=i[0],n=-Number.MAX_VALUE;for(const o of i){const h=o.dot(t);h>n&&(s=o,n=h)}return s}getInertia(t){const e=this.getColliders();let i=0;for(const s of e)i+=s.getInertia(t);return i}collide(t){let e=[t];t instanceof Mt&&(e=t.getColliders());const i=[];for(const n of e)this._dynamicAABBTree.query(n,o=>(i.push(new se(n,o)),!1));let s=[];for(const n of i)s=s.concat(n.collide());return s}getClosestLineBetween(t){const e=this.getColliders(),i=[];if(t instanceof Mt){const s=t.getColliders();for(const n of e)for(const o of s){const h=n.getClosestLineBetween(o);h&&i.push(h)}}else for(const s of e){const n=t.getClosestLineBetween(s);n&&i.push(n)}if(i.length){let s=i[0].getLength(),n=i[0];for(const o of i){const h=o.getLength();he.clone()));return t.offset=this.offset.clone(),t}}class Qt{constructor(t,e){this.begin=t,this.end=e}get slope(){return(this.end.y-this.begin.y)/(this.end.x-this.begin.x)}get intercept(){return this.begin.y-this.slope*this.begin.x}normal(){return this._normal?this._normal:this._normal=this.end.sub(this.begin).normal()}dir(){return this._dir?this._dir:this._dir=this.end.sub(this.begin)}getPoints(){return[this.begin,this.end]}getSlope(){if(this._slope)return this._slope;const t=this.begin,e=this.end,i=t.distance(e);return this._slope=e.sub(t).scale(1/i)}getEdge(){const t=this.begin;return this.end.sub(t)}getLength(){if(this._length)return this._length;const t=this.begin,e=this.end,i=t.distance(e);return this._length=i}get midpoint(){return this.begin.add(this.end).scale(.5)}flip(){return new Qt(this.end,this.begin)}below(t){return(this.end.x-this.begin.x)*(t.y-this.begin.y)-(this.end.y-this.begin.y)*(t.x-this.begin.x)>=0}clip(t,e){let i=t;i=i.normalize();const s=i.dot(this.begin)-e,n=i.dot(this.end)-e,o=[];if(s<=0&&o.push(this.begin),n<=0&&o.push(this.end),s*n<0){const h=s/(s-n);o.push(this.begin.add(this.end.sub(this.begin).scale(h)))}return o.length!==2?null:new Qt(o[0],o[1])}distanceToPoint(t,e=!1){const i=t.x,s=t.y,n=this.getLength(),o=this.end.y-this.begin.y,h=this.end.x-this.begin.x,l=(o*i-h*s+this.end.x*this.begin.y-this.end.y*this.begin.x)/n;return e?l:Math.abs(l)}findVectorToPoint(t){const e=this.begin.sub(t),i=this.getSlope();return e.sub(i.scale(e.dot(i)))}findPoint(t=null,e=null){const i=this.slope,s=this.intercept;if(t!==null)return new A(t,i*t+s);if(e!==null)return new A((e-s)/i,e);throw new Error("You must provide an X or a Y value")}hasPoint(){let t,e=0;if(typeof arguments[0]=="number"&&typeof arguments[1]=="number")t=new A(arguments[0],arguments[1]),e=arguments[2]||0;else if(arguments[0]instanceof A)t=arguments[0],e=arguments[1]||0;else throw"Could not determine the arguments for Vector.hasPoint";const i=t.x-this.begin.x,s=t.y-this.begin.y,n=this.end.x-this.begin.x,o=this.end.y-this.begin.y,h=i*o-s*n;return Math.abs(h)>e?!1:Math.abs(n)>=Math.abs(o)?n>0?this.begin.x<=t.x&&t.x<=this.end.x:this.end.x<=t.x&&t.x<=this.begin.x:o>0?this.begin.y<=t.y&&t.y<=this.end.y:this.end.y<=t.y&&t.y<=this.begin.y}}function ss(r,t,e,i){const s=r.sub(e),n=t.dot(t),o=t.dot(i),h=i.dot(i),l=t.dot(s),f=i.dot(s),p=n*h-o*o;let v=p,w=p;if(p===0||p<=.01){const k=l/o;return new Qt(r,e.add(i.scale(k)))}let y=o*f-h*l,b=n*f-o*l;return y<0?(y=0,b=f,w=h):y>v&&(y=v,b=f+o,w=h),b<0?(b=0,-l<0?y=0:-l>n?y=v:(y=-l,v=n)):b>w&&(b=w,-l+o<0?y=0:-l+o>n?y=v:(y=-l+o,v=n)),y=Math.abs(y)<.001?0:y/v,b=Math.abs(b)<.001?0:b/w,new Qt(r.add(t.scale(y)),e.add(i.scale(b)))}const pe={PolygonPolygonClosestLine(r,t){const e=t.worldPos,i=e.sub(r.worldPos),s=i.negate(),n=new Se(r.worldPos,i),o=new Se(e,s),h=r.rayCast(n).add(n.dir.scale(.1)),l=t.rayCast(o).add(o.dir.scale(.1)),f=r.getClosestFace(h),p=t.getClosestFace(l),v=f.face.begin,w=f.face.getEdge(),y=p.face.begin,b=p.face.getEdge();return ss(v,w,y,b)},PolygonEdgeClosestLine(r,t){const i=t.worldPos.sub(r.worldPos),s=new Se(r.worldPos,i),n=r.rayCast(s).add(s.dir.scale(.1)),o=r.getClosestFace(n),h=o.face.begin,l=o.face.getEdge(),f=t.asLine(),p=f.begin,v=f.getEdge();return ss(h,l,p,v)},PolygonCircleClosestLine(r,t){const e=t.worldPos,i=e.sub(r.worldPos),s=new Se(r.worldPos,i.normalize()),n=r.rayCast(s).add(s.dir.scale(.1)),o=r.getClosestFace(n),h=o.face.begin,l=o.face.getEdge();let f=(l.x*(e.x-h.x)+l.y*(e.y-h.y))/(l.x*l.x+l.y*l.y);f>1?f=1:f<0&&(f=0);const p=Math.sqrt(Math.pow(h.x+l.x*f-e.x,2)+Math.pow(h.y+l.y*f-e.y,2))-t.radius,v=(h.x+l.x*f-e.x)*t.radius/(t.radius+p),w=(h.y+l.y*f-e.y)*t.radius/(t.radius+p);return new Qt(l.scale(f).add(h),new A(e.x+v,e.y+w))},CircleCircleClosestLine(r,t){const i=t.worldPos.sub(r.worldPos),n=r.worldPos.sub(t.worldPos),o=new Se(r.worldPos,i),h=new Se(t.worldPos,n),l=r.rayCast(o),f=t.rayCast(h);return new Qt(l,f)},CircleEdgeClosestLine(r,t){const e=r.worldPos,i=t.asLine(),s=i.begin,n=i.getEdge(),o=s,h=n;let l=(h.x*(e.x-o.x)+h.y*(e.y-o.y))/(h.x*h.x+h.y*h.y);l>1?l=1:l<0&&(l=0);const f=Math.sqrt(Math.pow(o.x+h.x*l-e.x,2)+Math.pow(o.y+h.y*l-e.y,2))-r.radius,p=(o.x+h.x*l-e.x)*r.radius/(r.radius+f),v=(o.y+h.y*l-e.y)*r.radius/(r.radius+f);return new Qt(h.scale(l).add(o),new A(e.x+p,e.y+v))},EdgeEdgeClosestLine(r,t){const e=r.asLine(),i=e.begin,s=e.getEdge(),n=i,o=s,h=t.asLine(),l=h.begin,f=h.getEdge();return ss(n,o,l,f)}};class kt extends De{get worldPos(){return this._globalMatrix.getPosition()}get radius(){var t;const e=this._transform,i=(t=e==null?void 0:e.globalScale)!==null&&t!==void 0?t:A.One;return this._naturalRadius*Math.min(i.x,i.y)}set radius(t){var e;const i=this._transform,s=(e=i==null?void 0:i.globalScale)!==null&&e!==void 0?e:A.One;this._naturalRadius=t/Math.min(s.x,s.y)}constructor(t){super(),this.offset=A.Zero,this._globalMatrix=Et.identity(),this.offset=t.offset||A.Zero,this.radius=t.radius||0,this._globalMatrix.translate(this.offset.x,this.offset.y)}clone(){return new kt({offset:this.offset.clone(),radius:this.radius})}get center(){return this._globalMatrix.getPosition()}contains(t){var e,i;return((i=(e=this._transform)===null||e===void 0?void 0:e.pos)!==null&&i!==void 0?i:this.offset).distance(t)<=this.radius}rayCast(t,e=1/0){const i=this.center,s=t.dir,n=t.pos,o=Math.sqrt(Math.pow(s.dot(n.sub(i)),2)-Math.pow(n.sub(i).distance(),2)+Math.pow(this.radius,2));if(o<0)return null;{let h=0;if(o===0)return h=-s.dot(n.sub(i)),h>0&&h=0&&p.push(l),f>=0&&p.push(f);const v=Math.min(...p);return v<=e?t.getPoint(v):null}}}getClosestLineBetween(t){if(t instanceof kt)return pe.CircleCircleClosestLine(this,t);if(t instanceof Pt)return pe.PolygonCircleClosestLine(t,this).flip();if(t instanceof Vt)return pe.CircleEdgeClosestLine(this,t).flip();throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCircleCircle(this,t);if(t instanceof Pt)return le.CollideCirclePolygon(this,t);if(t instanceof Vt)return le.CollideCircleEdge(this,t);throw new Error(`Circle could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){return this.center.add(t.normalize().scale(this.radius))}getFurthestLocalPoint(t){return t.normalize().scale(this.radius)}get bounds(){var t,e,i;const s=this._transform,n=(t=s==null?void 0:s.globalScale)!==null&&t!==void 0?t:A.One,o=(e=s==null?void 0:s.globalRotation)!==null&&e!==void 0?e:0,h=(i=s==null?void 0:s.globalPos)!==null&&i!==void 0?i:A.Zero;return new J(this.offset.x-this._naturalRadius,this.offset.y-this._naturalRadius,this.offset.x+this._naturalRadius,this.offset.y+this._naturalRadius).rotate(o).scale(n).translate(h)}get localBounds(){return new J(this.offset.x-this._naturalRadius,this.offset.y-this._naturalRadius,this.offset.x+this._naturalRadius,this.offset.y+this._naturalRadius)}get axes(){return[]}getInertia(t){return t*this.radius*this.radius/2}update(t){var e;this._transform=t,((e=t.matrix)!==null&&e!==void 0?e:this._globalMatrix).clone(this._globalMatrix),this._globalMatrix.translate(this.offset.x,this.offset.y)}project(t){const e=[],s=this.center.dot(t);return e.push(s),e.push(s+this.radius),e.push(s-this.radius),new Pi(Math.min.apply(Math,e),Math.max.apply(Math,e))}debug(t,e,i){var s,n,o,h;const{lineWidth:l}={lineWidth:1,...i},f=this._transform,p=(s=f==null?void 0:f.globalScale)!==null&&s!==void 0?s:A.One,v=(n=f==null?void 0:f.globalRotation)!==null&&n!==void 0?n:0,w=(o=f==null?void 0:f.globalPos)!==null&&o!==void 0?o:A.Zero;t.save(),t.translate(w.x,w.y),t.rotate(v),t.scale(p.x,p.y),t.drawCircle((h=this.offset)!==null&&h!==void 0?h:A.Zero,this._naturalRadius,L.Transparent,e,l),t.restore()}}class je{constructor(t,e,i,s,n,o,h,l){var f,p;this._canceled=!1,this.colliderA=t,this.colliderB=e,this.mtv=i,this.normal=s,this.tangent=n,this.points=o,this.localPoints=h,this.info=l,this.id=se.calculatePairHash(t.id,e.id),(t.__compositeColliderId||e.__compositeColliderId)&&(this.id+="|"+se.calculatePairHash((f=t.__compositeColliderId)!==null&&f!==void 0?f:t.id,(p=e.__compositeColliderId)!==null&&p!==void 0?p:e.id))}matchAwake(){const t=this.colliderA.owner.get(it),e=this.colliderB.owner.get(it);t&&e&&t.sleeping!==e.sleeping&&(t.sleeping&&t.collisionType!==q.Fixed&&e.sleepMotion>=Z.wakeThreshold&&t.setSleeping(!1),e.sleeping&&e.collisionType!==q.Fixed&&t.sleepMotion>=Z.wakeThreshold&&e.setSleeping(!1))}isCanceled(){return this._canceled}cancel(){this._canceled=!0}}class qs{static findPolygonPolygonSeparation(t,e){let i=-Number.MAX_VALUE,s=null,n=null,o=-1,h=null;const l=t.getSides(),f=t.getLocalSides();for(let p=0;pi&&(i=b,s=v,n=w,o=p,h=y)}return{collider:t,separation:n?i:99,axis:n,side:s,localSide:f[o],sideId:o,point:h,localPoint:n?e.getFurthestLocalPoint(n.negate()):null}}static findCirclePolygonSeparation(t,e){const i=e.axes,n=e.center.sub(t.worldPos),o=e.getFurthestPoint(n.negate());i.push(o.sub(t.worldPos).normalize());let h=Number.MAX_VALUE,l=null,f=-1;for(let p=0;ps)return[];const o=s-n,h=i.sub(e).normalize(),l=h.perpendicular(),f=h.scale(o),p=r.getFurthestPoint(h),v=r.getFurthestLocalPoint(h),w={collider:r,separation:o,axis:h,point:p};return[new je(r,t,f,h,l,[p],[v],w)]},CollideCirclePolygon(r,t){var e,i;let s=qs.findCirclePolygonSeparation(r,t);if(!s)return[];s=s.dot(t.center.sub(r.center))<0?s.negate():s;const o=r.getFurthestPoint(s),l=((i=(e=r.owner)===null||e===void 0?void 0:e.get(H))!==null&&i!==void 0?i:new H).applyInverse(o),f=s.normalize(),p={collider:r,separation:-s.size,axis:f,point:o,localPoint:l,side:t.findSide(f.negate()),localSide:t.findLocalSide(f.negate())};return[new je(r,t,s,f,f.perpendicular(),[o],[l],p)]},CollideCircleEdge(r,t){const e=r.center,i=t.asLine(),s=i.end.sub(i.begin),n=s.dot(i.end.sub(e)),o=s.dot(e.sub(i.begin)),h=t.asLine(),l=t.asLocalLine();if(o<=0){const C=i.begin.sub(e),E=C.dot(C);if(E>r.radius*r.radius)return[];const F=C.normalize(),U=r.radius-Math.sqrt(E),j={collider:r,separation:U,axis:F,point:h.begin,side:h,localSide:l};return[new je(r,t,F.scale(U),F,F.perpendicular(),[h.begin],[l.begin],j)]}if(n<=0){const C=i.end.sub(e),E=C.dot(C);if(E>r.radius*r.radius)return[];const F=C.normalize(),U=r.radius-Math.sqrt(E),j={collider:r,separation:U,axis:F,point:h.end,side:h,localSide:l};return[new je(r,t,F.scale(U),F,F.perpendicular(),[h.end],[l.end],j)]}const f=s.dot(s),p=i.begin.scale(n).add(i.end.scale(o)).scale(1/f),v=e.sub(p),w=v.dot(v);if(w>r.radius*r.radius)return[];let y=s.perpendicular();y.dot(e.sub(i.begin))<0&&(y.x=-y.x,y.y=-y.y),y=y.normalize();const b=r.radius-Math.sqrt(w),k=y.scale(b),D={collider:r,separation:b,axis:y,point:p,side:h,localSide:l};return[new je(r,t,k,y.negate(),y.negate().perpendicular(),[p],[p.sub(t.worldPos)],D)]},CollideEdgeEdge(){return[]},CollidePolygonEdge(r,t){var e;const i=r.center,n=t.center.sub(i).normalize(),o=new Pt({points:[t.begin,t.end,t.end.add(n.scale(100)),t.begin.add(n.scale(100))],offset:t.offset});o.owner=t.owner,((e=t.owner)===null||e===void 0?void 0:e.get(H))&&o.update(t.owner.get(H).get());const l=this.CollidePolygonPolygon(r,o);return l.length&&(l[0].colliderB=t,l[0].id=se.calculatePairHash(r.id,t.id)),l},CollidePolygonPolygon(r,t){var e,i,s,n;const o=qs.findPolygonPolygonSeparation(r,t);if(o.separation>0)return[];const h=qs.findPolygonPolygonSeparation(t,r);if(h.separation>0)return[];const l=o.separation>h.separation?o:h,p=(l.collider===r?t:r).findSide(l.axis.negate()),v=l.side,w=v.dir().normalize(),y=p.clip(w.negate(),-w.dot(v.begin));let b=null;if(y&&(b=y.clip(w,w.dot(v.end))),b){const k=b.getPoints().filter(F=>v.below(F));let D=l.axis,C=D.perpendicular();t.center.sub(r.center).dot(D)<0&&(D=D.negate(),C=D.perpendicular());let E=[];if(l.collider===r){const F=(i=(e=t.owner)===null||e===void 0?void 0:e.get(H))!==null&&i!==void 0?i:new H;E=k.map(U=>F.applyInverse(U))}else{const F=(n=(s=r.owner)===null||s===void 0?void 0:s.get(H))!==null&&n!==void 0?n:new H;E=k.map(U=>F.applyInverse(U))}return[new je(r,t,D.scale(-l.separation),D,C,k,E,l)]}return[]},FindContactSeparation(r,t){var e,i,s,n;const o=r.colliderA,h=(i=(e=r.colliderA.owner)===null||e===void 0?void 0:e.get(H))!==null&&i!==void 0?i:new H,l=r.colliderB,f=(n=(s=r.colliderB.owner)===null||s===void 0?void 0:s.get(H))!==null&&n!==void 0?n:new H;if(o instanceof kt&&l instanceof kt){const p=o.radius+l.radius,v=h.pos.distance(f.pos);return-(p-v)}if(o instanceof Pt&&l instanceof Pt&&r.info.localSide){let p,v;return r.info.collider===o?(p=new Qt(h.apply(r.info.localSide.begin),h.apply(r.info.localSide.end)),v=f.apply(t)):(p=new Qt(f.apply(r.info.localSide.begin),f.apply(r.info.localSide.end)),v=h.apply(t)),p.distanceToPoint(v,!0)}if(o instanceof Pt&&l instanceof kt||l instanceof Pt&&o instanceof kt){const p=h.apply(t);if(r.info.side)return r.info.side.distanceToPoint(p,!0)}if(o instanceof Vt&&l instanceof Pt||l instanceof Vt&&o instanceof Pt){let p;if(r.info.collider===o?p=f.apply(t):p=h.apply(t),r.info.side)return r.info.side.distanceToPoint(p,!0)}if(o instanceof kt&&l instanceof Vt||l instanceof kt&&o instanceof Vt){const p=f.apply(t);let v;o instanceof kt&&(v=o.getFurthestPoint(r.normal));const w=p.distance(v);if(r.info.side)return w>0?-w:0}return 0}};class Vt extends De{constructor(t){var e;super(),this._globalMatrix=Et.identity(),this.begin=t.begin||A.Zero,this.end=t.end||A.Zero,this.offset=(e=t.offset)!==null&&e!==void 0?e:A.Zero}clone(){return new Vt({begin:this.begin.clone(),end:this.end.clone()})}get worldPos(){var t;const e=this._transform;return(t=e==null?void 0:e.globalPos.add(this.offset))!==null&&t!==void 0?t:this.offset}get center(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return t.average(e)}_getTransformedBegin(){return this._globalMatrix.multiply(this.begin)}_getTransformedEnd(){return this._globalMatrix.multiply(this.end)}getSlope(){const t=this._getTransformedBegin(),e=this._getTransformedEnd(),i=t.distance(e);return e.sub(t).scale(1/i)}getLength(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return t.distance(e)}contains(){return!1}rayCast(t,e=1/0){const i=this._getTransformedBegin().sub(t.pos);if(t.dir.cross(this.getSlope())===0&&i.cross(t.dir)!==0)return null;const s=t.dir.cross(this.getSlope());if(s===0)return null;const n=i.cross(this.getSlope())/s;if(n>=0&&n<=e){const o=i.cross(t.dir)/s/this.getLength();if(o>=0&&o<=1)return t.getPoint(n)}return null}getClosestLineBetween(t){if(t instanceof kt)return pe.CircleEdgeClosestLine(t,this);if(t instanceof Pt)return pe.PolygonEdgeClosestLine(t,this).flip();if(t instanceof Vt)return pe.EdgeEdgeClosestLine(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCircleEdge(t,this);if(t instanceof Pt)return le.CollidePolygonEdge(t,this);if(t instanceof Vt)return le.CollideEdgeEdge();throw new Error(`Edge could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){const e=this._getTransformedBegin(),i=this._getTransformedEnd();return t.dot(e)>0?e:i}_boundsFromBeginEnd(t,e,i=10){return new J(Math.min(t.x,e.x)-i,Math.min(t.y,e.y)-i,Math.max(t.x,e.x)+i,Math.max(t.y,e.y)+i)}get bounds(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return this._boundsFromBeginEnd(t,e)}get localBounds(){return this._boundsFromBeginEnd(this.begin,this.end)}asLine(){return new Qt(this._getTransformedBegin(),this._getTransformedEnd())}asLocalLine(){return new Qt(this.begin,this.end)}get axes(){const e=this._getTransformedEnd().sub(this._getTransformedBegin()).normal(),i=[];return i.push(e),i.push(e.negate()),i.push(e.normal()),i.push(e.normal().negate()),i}getInertia(t){const e=this.end.sub(this.begin).distance()/2;return t*e*e}update(t){var e;this._transform=t,((e=t.matrix)!==null&&e!==void 0?e:this._globalMatrix).clone(this._globalMatrix),this._globalMatrix.translate(this.offset.x,this.offset.y)}project(t){const e=[],i=[this._getTransformedBegin(),this._getTransformedEnd()],s=i.length;for(let n=0;nMath.PI&&(f-=Math.PI*2),h===0){if(f===0)return!1;n=f>0?1:-1}else if(n*f<=0)return!1;o+=f}return Math.abs(Math.round(o/(Math.PI*2)))===1}tessellate(){const t=[];for(let e=1;eDt.Polygon(e)))}triangulate(){if(this.points.length<3)throw Error("Invalid polygon");const t=[],e=[...this.points].reverse();let i=e.length;function s(v){return v===0?i-1:v-1}function n(v){return v===i-1?0:v+1}function o(v){const w=s(v),y=n(v),b=e[w],k=e[v],D=e[y],C=b.sub(k),E=D.sub(k);return!(C.cross(E)<0)}const h=e.map((v,w)=>o(w));function l(v,w,y,b){const k=y.sub(w),D=b.sub(y),C=w.sub(b),E=v.sub(w),F=v.sub(y),U=v.sub(b),j=k.cross(E),Y=D.cross(F),M=C.cross(U);return!(j>0||Y>0||M>0)}function f(){for(let v=0;v3;){const v=f();p(v);for(let w=0;wDt.Polygon(v,A.Zero,!0)))}clone(){return new Pt({offset:this.offset.clone(),points:this.points.map(t=>t.clone())})}get worldPos(){return this._transform?this._transform.pos.add(this.offset):this.offset}get center(){return this.bounds.center}_calculateTransformation(){const t=this.points,e=t.length;this._transformedPoints.length=0;for(let i=0;is&&(i=o,s=l)}return i}findLocalSide(t){const e=this.getLocalSides();let i=e[0],s=-Number.MAX_VALUE;for(let n=0;ns&&(i=o,s=l)}return i}get axes(){const t=[],e=this.getSides();for(let i=0;i=0?s+1:s},0)%2!==0}getClosestLineBetween(t){if(t instanceof kt)return pe.PolygonCircleClosestLine(this,t);if(t instanceof Pt)return pe.PolygonPolygonClosestLine(this,t);if(t instanceof Vt)return pe.PolygonEdgeClosestLine(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCirclePolygon(t,this);if(t instanceof Pt)return le.CollidePolygonPolygon(this,t);if(t instanceof Vt)return le.CollidePolygonEdge(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){const e=this.getTransformedPoints();let i=null,s=-Number.MAX_VALUE;for(let n=0;ns&&(s=o,i=e[n])}return i}getFurthestLocalPoint(t){const e=this.points;let i=e[0],s=-Number.MAX_VALUE;for(let n=0;ns&&(s=o,i=e[n])}return i}getClosestFace(t){const e=this.getSides();let i=Number.POSITIVE_INFINITY,s=-1,n=-1;for(let o=0;o=0&&l=0?t.getPoint(n):null}project(t){const e=this.getTransformedPoints(),i=e.length;let s=Number.MAX_VALUE,n=-Number.MAX_VALUE;for(let o=0;o=t?new Mt([Dt.Circle(t/2,R(0,-e/2+t/2).add(i)),Dt.Box(t,e-t,A.Half,i),Dt.Circle(t/2,R(0,e/2-t/2).add(i))]):new Mt([Dt.Circle(e/2,R(-t/2+e/2,0).add(i)),Dt.Box(t-e,e,A.Half,i),Dt.Circle(e/2,R(t/2-e/2,0).add(i))])}}class Ct extends ie{constructor(t){super(),this.type="ex.collider",this.events=new P,this.$colliderAdded=new fe,this.$colliderRemoved=new fe,this.set(t)}get(){return this._collider}set(t){return this.clear(),t&&(this._collider=t,this._collider.owner=this.owner,t.events.pipe(this.events),this.$colliderAdded.notifyAll(t),this.update()),t}clear(){this._collider&&(this._collider.events.unpipe(this.events),this.$colliderRemoved.notifyAll(this._collider),this._collider.owner=null,this._collider=null)}clone(){return new Ct(this._collider.clone())}get bounds(){var t,e;return(e=(t=this._collider)===null||t===void 0?void 0:t.bounds)!==null&&e!==void 0?e:new J}get localBounds(){var t,e;return(e=(t=this._collider)===null||t===void 0?void 0:t.localBounds)!==null&&e!==void 0?e:new J}update(){var t;const e=(t=this.owner)===null||t===void 0?void 0:t.get(H);this._collider&&(this._collider.owner=this.owner,e&&this._collider.update(e.get()))}collide(t){let e=this._collider,i=t._collider;if(!e||!i)return[];let s=!1;if(i instanceof Mt&&(e=i,i=this._collider,s=!0),this._collider){const n=e.collide(i);return n?(s&&n.forEach(o=>{o.mtv=o.mtv.negate(),o.normal=o.normal.negate(),o.tangent=o.normal.perpendicular(),o.colliderA=this._collider,o.colliderB=t._collider}),n):[]}return[]}onAdd(t){this._collider&&this.update(),this.events.on("precollision",e=>{const i=e;t.events.emit("precollision",new bt(i.target.owner,i.other.owner,i.side,i.intersection,i.contact)),t instanceof Kt&&t.onPreCollisionResolve(i.target,i.other,i.side,i.contact)}),this.events.on("postcollision",e=>{const i=e;t.events.emit("postcollision",new ze(i.target.owner,i.other.owner,i.side,i.intersection,i.contact)),t instanceof Kt&&t.onPostCollisionResolve(i.target,i.other,i.side,i.contact)}),this.events.on("collisionstart",e=>{const i=e;t.events.emit("collisionstart",new yi(i.target.owner,i.other.owner,i.side,i.contact)),t instanceof Kt&&t.onCollisionStart(i.target,i.other,i.side,i.contact)}),this.events.on("collisionend",e=>{const i=e;t.events.emit("collisionend",new bi(i.target.owner,i.other.owner)),t instanceof Kt&&t.onCollisionEnd(i.target,i.other)})}onRemove(){this.events.clear(),this.$colliderRemoved.notifyAll(this._collider)}useBoxCollider(t,e,i=A.Half,s=A.Zero){const n=Dt.Box(t,e,i,s);return this.set(n)}usePolygonCollider(t,e=A.Zero){const i=Dt.Polygon(t,e);return this.set(i)}useCircleCollider(t,e=A.Zero){const i=Dt.Circle(t,e);return this.set(i)}useEdgeCollider(t,e){const i=Dt.Edge(t,e);return this.set(i)}useCompositeCollider(t){return this.set(new Mt(t))}}var Ht;(function(r){r.Rotation="rotation",r.X="x",r.Y="y"})(Ht||(Ht={}));class it extends ie{constructor(t){var e,i,s;super(),this.type="ex.body",this.dependencies=[H,yt],this.id=I("body",it._ID++),this.events=new P,this.oldTransform=new Je,this.__oldTransformCaptured=!1,this.enableFixedUpdateInterpolate=!0,this.collisionType=q.PreventCollision,this.group=di.All,this._mass=Z.defaultMass,this.sleepMotion=Z.sleepEpsilon*5,this.canSleep=Z.bodiesCanSleepByDefault,this._sleeping=!1,this.bounciness=.2,this.friction=.99,this.useGravity=!0,this.limitDegreeOfFreedom=[],this.oldVel=new A(0,0),this.oldAcc=A.Zero,t&&(this.collisionType=(e=t.type)!==null&&e!==void 0?e:this.collisionType,this.group=(i=t.group)!==null&&i!==void 0?i:this.group,this.useGravity=(s=t.useGravity)!==null&&s!==void 0?s:this.useGravity)}get matrix(){return this.transform.get().matrix}get mass(){return this._mass}set mass(t){this._mass=t,this._cachedInertia=void 0,this._cachedInverseInertia=void 0}get inverseMass(){return this.collisionType===q.Fixed?0:1/this.mass}get sleeping(){return this._sleeping}setSleeping(t){this._sleeping=t,t?(this.vel=A.Zero,this.acc=A.Zero,this.angularVelocity=0,this.sleepMotion=0):this.sleepMotion=Z.sleepEpsilon*5}updateMotion(){this._sleeping&&this.setSleeping(!0);const t=this.vel.size*this.vel.size+Math.abs(this.angularVelocity*this.angularVelocity),e=Z.sleepBias;this.sleepMotion=e*this.sleepMotion+(1-e)*t,this.sleepMotion=Gt(this.sleepMotion,0,10*Z.sleepEpsilon),this.canSleep&&this.sleepMotion{this._cachedInertia=null}),t.$colliderRemoved.subscribe(()=>{this._cachedInertia=null});const e=t.get();if(e)return this._cachedInertia=e.getInertia(this.mass)}return 0}get inverseInertia(){return this._cachedInverseInertia?this._cachedInverseInertia:this._cachedInverseInertia=this.collisionType===q.Fixed?0:1/this.inertia}get active(){var t;return!!(!((t=this.owner)===null||t===void 0)&&t.active)}get center(){return this.globalPos}get transform(){var t;return(t=this.owner)===null||t===void 0?void 0:t.get(H)}get motion(){var t;return(t=this.owner)===null||t===void 0?void 0:t.get(yt)}get pos(){return this.transform.pos}set pos(t){this.transform.pos=t}get globalPos(){return this.transform.globalPos}set globalPos(t){this.transform.globalPos=t}get oldPos(){return this.oldTransform.pos}get vel(){return this.motion.vel}set vel(t){this.motion.vel=t}get acc(){return this.motion.acc}set acc(t){this.motion.acc=t}get torque(){return this.motion.torque}set torque(t){this.motion.torque=t}get oldRotation(){return this.oldTransform.rotation}get rotation(){return this.transform.globalRotation}set rotation(t){this.transform.globalRotation=t}get scale(){return this.transform.globalScale}set scale(t){this.transform.globalScale=t}get oldScale(){return this.oldTransform.scale}get scaleFactor(){return this.motion.scaleFactor}set scaleFactor(t){this.motion.scaleFactor=t}get angularVelocity(){return this.motion.angularVelocity}set angularVelocity(t){this.motion.angularVelocity=t}applyImpulse(t,e){if(this.collisionType!==q.Active)return;const i=e.scale(this.inverseMass);if(this.limitDegreeOfFreedom.includes(Ht.X)&&(i.x=0),this.limitDegreeOfFreedom.includes(Ht.Y)&&(i.y=0),this.vel.addEqual(i),!this.limitDegreeOfFreedom.includes(Ht.Rotation)){const s=t.sub(this.globalPos);this.angularVelocity+=this.inverseInertia*s.cross(e)}}applyLinearImpulse(t){if(this.collisionType!==q.Active)return;const e=t.scale(this.inverseMass);this.limitDegreeOfFreedom.includes(Ht.X)&&(e.x=0),this.limitDegreeOfFreedom.includes(Ht.Y)&&(e.y=0),this.vel=this.vel.add(e)}applyAngularImpulse(t,e){if(this.collisionType===q.Active&&!this.limitDegreeOfFreedom.includes(Ht.Rotation)){const i=t.sub(this.globalPos);this.angularVelocity+=this.inverseInertia*i.cross(e)}}captureOldTransform(){this.__oldTransformCaptured=!0;const t=this.transform.get();t.clone(this.oldTransform),this.oldTransform.parent=t.parent,this.oldVel.setTo(this.vel.x,this.vel.y),this.oldAcc.setTo(this.acc.x,this.acc.y)}clone(){return super.clone()}}it._ID=0;class Yn{constructor(t){this.data=t,this.type="Component Added"}}function Wn(r){return!!r&&r.type==="Component Added"}class Zn{constructor(t){this.data=t,this.type="Component Removed"}}function Jn(r){return!!r&&r.type==="Component Removed"}const ha={Initialize:"initialize",PreUpdate:"preupdate",PostUpdate:"postupdate"};class Rt{constructor(t,e){if(this.events=new P,this.id=Rt._ID++,this.scene=null,this._name="anonymous",this.active=!0,this._componentsToRemove=[],this._componentTypeToInstance=new Map,this._componentStringToInstance=new Map,this._tagsMemo=[],this._typesMemo=[],this.componentAdded$=new fe,this.componentRemoved$=new fe,this._parent=null,this.childrenAdded$=new fe,this.childrenRemoved$=new fe,this._children=[],this._isInitialized=!1,this._setName(e),t)for(const i of t)this.addComponent(i)}_setName(t){t?this._name=t:this._name=`Entity#${this.id}`}get name(){return this._name}set name(t){this._setName(t)}kill(){this.active&&(this.active=!1,this.unparent())}isKilled(){return!this.active}get tags(){return this._tagsMemo}hasTag(t){return this.tags.includes(t)}addTag(t){return this.addComponent(new js(t))}removeTag(t,e=!1){return this.removeComponent(t,e)}get types(){return this._typesMemo}_rebuildMemos(){this._tagsMemo=Array.from(this._componentStringToInstance.values()).filter(t=>t instanceof js).map(t=>t.type),this._typesMemo=Array.from(this._componentStringToInstance.keys())}getComponents(){return Array.from(this._componentStringToInstance.values())}_notifyAddComponent(t){this._rebuildMemos();const e=new Yn({component:t,entity:this});this.componentAdded$.notifyAll(e)}_notifyRemoveComponent(t){const e=new Zn({component:t,entity:this});this.componentRemoved$.notifyAll(e),this._rebuildMemos()}get parent(){return this._parent}get children(){return this._children}unparent(){this._parent&&(this._parent.removeChild(this),this._parent=null)}addChild(t){if(t.parent===null){if(this.getAncestors().includes(t))throw new Error("Cycle detected, cannot add entity");this._children.push(t),t._parent=this,this.childrenAdded$.notifyAll(t)}else throw new Error("Entity already has a parent, cannot add without unparenting");return this}removeChild(t){return t.parent===this&&(Be(t,this._children),t._parent=null,this.childrenRemoved$.notifyAll(t)),this}removeAllChildren(){for(let t=this.children.length-1;t>=0;t--)this.removeChild(this.children[t]);return this}getAncestors(){const t=[this];let e=this.parent;for(;e;)t.push(e),e=e.parent;return t.reverse()}getDescendants(){let t=[this],e=[this];for(;e.length>0;){const i=e.pop();e=e.concat(i.children),t=t.concat(i.children)}return t}clone(){const t=new Rt;for(const e of this.types)t.addComponent(this.get(e).clone());for(const e of this.children)t.addChild(e.clone());return t}addTemplate(t,e=!1){for(const i of t.getComponents())this.addComponent(i.clone(),e);for(const i of t.children)this.addChild(i.clone().addTemplate(i));return this}addComponent(t,e=!1){if(this.has(t.type))if(e)this.removeComponent(t,!0);else return this;if(t.dependencies&&t.dependencies.length)for(const s of t.dependencies)this.addComponent(new s);t.owner=this;const i=t.constructor;return this._componentTypeToInstance.set(i,t),this._componentStringToInstance.set(t.type,t),t.onAdd&&t.onAdd(this),this._notifyAddComponent(t),this}removeComponent(t,e=!1){return e?typeof t=="string"?this._removeComponentByType(t):t instanceof ie&&this._removeComponentByType(t.type):this._componentsToRemove.push(t),this}clearComponents(){const t=this.getComponents();for(const e of t)this.removeComponent(e)}_removeComponentByType(t){if(this.has(t)){const e=this.get(t);e.owner=null,e.onRemove&&e.onRemove(this);const i=e.constructor;this._componentTypeToInstance.delete(i),this._componentStringToInstance.delete(e.type),this._notifyRemoveComponent(e)}}processComponentRemoval(){for(const t of this._componentsToRemove){const e=typeof t=="string"?t:t.type;this._removeComponentByType(e)}this._componentsToRemove.length=0}has(t){return typeof t=="string"?this._componentStringToInstance.has(t):this._componentTypeToInstance.has(t)}get(t){return typeof t=="string"?this._componentStringToInstance.get(t):this._componentTypeToInstance.get(t)}get isInitialized(){return this._isInitialized}_initialize(t){this.isInitialized||(this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0)}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}onInitialize(t){}onPreUpdate(t,e){}onPostUpdate(t,e){}update(t,e){this._initialize(t),this._preupdate(t,e);for(const i of this.children)i.update(t,e);this._postupdate(t,e)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}Rt._ID=0;function $s(r){return!!r.tick}class Ri{constructor(t,e){this._options=t,this._graphics=e,this.graphics=[]}get name(){return this._options.name}hide(t){if(!t)this.graphics.length=0;else{let e=null;t instanceof jt?e=t:e=this._graphics.getGraphic(t),this.graphics=this.graphics.filter(i=>i.graphic!==e),this._graphics.recalculateBounds()}}show(t,e){e={...e};let i;return t instanceof jt?i=this._graphics.copyGraphics?t.clone():t:(i=this._graphics.getGraphic(t),i||V.getInstance().error(`No such graphic added to component named ${t}. These named graphics are available: `,this._graphics.getNames())),i?(this.graphics.push({graphic:i,options:e}),this._graphics.recalculateBounds(),i):null}use(t,e){return e={...e},this.hide(),this.show(t,e)}get order(){return this._options.order}set order(t){this._options.order=t}get offset(){var t;return(t=this._options.offset)!==null&&t!==void 0?t:A.Zero}set offset(t){this._options.offset=t}get currentKeys(){var t;return(t=this.name)!==null&&t!==void 0?t:"anonymous"}clone(t){const e=new Ri({...this._options},t);return e.graphics=[...this.graphics.map(i=>({graphic:i.graphic.clone(),options:{...i.options}}))],e}}class ns{constructor(t){this._component=t,this._layers=[],this._layerMap={},this.default=new Ri({name:"default",order:0},t),this._maybeAddLayer(this.default)}create(t){const e=new Ri(t,this._component);return this._maybeAddLayer(e)}get(t){return t?this._getLayer(t):this._layers}currentKeys(){const t=[];for(const e of this._layers)t.push(e.currentKeys);return t}has(t){return t in this._layerMap}_maybeAddLayer(t){return this._layerMap[t.name]?this._layerMap[t.name]:(this._layerMap[t.name]=t,this._layers.push(t),this._layers.sort((e,i)=>e.order-i.order),t)}_getLayer(t){return this._layerMap[t]}clone(t){const e=new ns(t);return e._layerMap={},e._layers=[],e.default=this.default.clone(t),e._maybeAddLayer(e.default),this._layers.filter(s=>s.name!=="default").map(s=>s.clone(t)).forEach(s=>e._maybeAddLayer(s)),e}}class Ft extends ie{getGraphic(t){return this._graphics[t]}getNames(){return Object.keys(this._graphics)}constructor(t){super(),this.type="ex.graphics",this._graphics={},this.material=null,this.visible=!0,this.opacity=1,this.offset=A.Zero,this.anchor=A.Half,this.flipHorizontal=!1,this.flipVertical=!1,this.copyGraphics=!1,this._localBounds=null,t={visible:this.visible,...t};const{current:e,anchor:i,opacity:s,visible:n,graphics:o,offset:h,copyGraphics:l,onPreDraw:f,onPostDraw:p}=t;this._graphics=o||{},this.offset=h??this.offset,this.opacity=s??this.opacity,this.anchor=i??this.anchor,this.copyGraphics=l??this.copyGraphics,this.onPreDraw=f??this.onPreDraw,this.onPostDraw=p??this.onPostDraw,this.visible=!!n,this.layers=new ns(this),e&&this._graphics[e]&&this.show(this._graphics[e])}get current(){return this.layers.default.graphics}get graphics(){return this._graphics}add(t,e){let i="default",s=null;return typeof t=="string"?(i=t,s=e):s=t,this._graphics[i]=this.copyGraphics?s.clone():s,i==="default"&&this.show("default"),s}show(t,e){const i=this.layers.default.show(t,e);return this.recalculateBounds(),i}use(t,e){const i=this.layers.default.use(t,e);return this.recalculateBounds(),i}hide(t){this.layers.default.hide(t)}set localBounds(t){this._localBounds=t}recalculateBounds(){let t=new J;for(const e of this.layers.get())for(const{graphic:i,options:s}of e.graphics){let n=this.anchor,o=this.offset;s!=null&&s.anchor&&(n=s.anchor),s!=null&&s.offset&&(o=s.offset);const h=i.localBounds,l=-h.width*n.x+o.x,f=-h.height*n.y+o.y;t=i==null?void 0:i.localBounds.translate(R(l+e.offset.x,f+e.offset.y)).combine(t)}this._localBounds=t}get localBounds(){return(!this._localBounds||this._localBounds.hasZeroDimensions())&&this.recalculateBounds(),this._localBounds}update(t,e=0){for(const i of this.layers.get())for(const{graphic:s}of i.graphics)$s(s)&&(s==null||s.tick(t,e))}clone(){const t=new Ft;return t._graphics={...this._graphics},t.offset=this.offset.clone(),t.opacity=this.opacity,t.anchor=this.anchor.clone(),t.copyGraphics=this.copyGraphics,t.onPreDraw=this.onPreDraw,t.onPostDraw=this.onPostDraw,t.visible=this.visible,t.layers=this.layers.clone(t),t}}class rs extends li{constructor(t){super(t),this.width=t.width,this.height=t.height,this.rasterize()}clone(){return new rs({width:this.width,height:this.height,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){this.color&&t.fillRect(0,0,this.width,this.height),this.strokeColor&&t.strokeRect(0,0,this.width,this.height)}}class os extends li{get radius(){return this._radius}set radius(t){this._radius=t,this.width=this._radius*2,this.height=this._radius*2,this.flagDirty()}constructor(t){var e,i,s;super(t),this._radius=0;const n=(e=t.lineWidth)!==null&&e!==void 0?e:t.strokeColor?1:0;this.padding=(i=t.padding)!==null&&i!==void 0?i:2+n/2,this.radius=t.radius,this.filtering=(s=t.filtering)!==null&&s!==void 0?s:Ot.Blended,this.rasterize()}clone(){return new os({radius:this.radius,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){this.radius>0&&(t.beginPath(),t.arc(this.radius,this.radius,this.radius,0,Math.PI*2),this.color&&t.fill(),this.strokeColor&&t.stroke())}}class ui extends ie{constructor(){super(...arguments),this.type="ex.pointer",this.useColliderShape=!0,this.useGraphicsBounds=!1}}class xt{static CreateReversibleEasingFunction(t){return(e,i,s,n)=>snew A(t(e,i.x,s.x,n),t(e,i.y,s.y,n))}}xt.Linear=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,e*r/i+t)),xt.EaseInQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,e*r*r+t)),xt.EaseOutQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,-e*r*(r-2)+t)),xt.EaseInOutQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i/2,r<1?e/2*r*r+t:(r--,-e/2*(r*(r-2)-1)+t))),xt.EaseInCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,e*r*r*r+t)),xt.EaseOutCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,r--,e*(r*r*r+1)+t)),xt.EaseInOutCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i/2,r<1?e/2*r*r*r+t:(r-=2,e/2*(r*r*r+2)+t)));class jn{constructor(t){this._actions=[],this._completedActions=[],this._entity=t}add(t){this._actions.push(t)}remove(t){const e=this._actions.indexOf(t);this._actions.splice(e,1)}clearActions(){this._actions.length=0,this._completedActions.length=0,this._currentAction&&this._currentAction.stop()}getActions(){return this._actions.concat(this._completedActions)}hasNext(){return this._actions.length>0}isComplete(){return this._actions.length===0}reset(){this._actions=this.getActions();const t=this._actions.length;for(let e=0;e0&&(this._currentAction!==this._actions[0]&&(this._currentAction=this._actions[0],this._entity.emit("actionstart",new Ps(this._currentAction,this._entity))),this._currentAction.update(t),this._currentAction.isComplete(this._entity)&&(this._entity.emit("actioncomplete",new Rs(this._currentAction,this._entity)),this._completedActions.push(this._actions.shift())))}}class Vn{constructor(t,e,i){this._stopped=!1,this._repeatBuilder=e,this._repeatContext=new Bi(t),this._actionQueue=this._repeatContext.getQueue(),this._repeat=i,this._originalRepeat=i,this._repeatBuilder(this._repeatContext),this._repeat--}update(t){this._actionQueue.isComplete()&&(this._actionQueue.clearActions(),this._repeatBuilder(this._repeatContext),this._repeat--),this._actionQueue.update(t)}isComplete(){return this._stopped||this._repeat<=0&&this._actionQueue.isComplete()}stop(){this._stopped=!0}reset(){this._repeat=this._originalRepeat}}class Kn{constructor(t,e){this._stopped=!1,this._repeatBuilder=e,this._repeatContext=new Bi(t),this._actionQueue=this._repeatContext.getQueue(),this._repeatBuilder(this._repeatContext)}update(t){this._stopped||(this._actionQueue.isComplete()&&(this._actionQueue.clearActions(),this._repeatBuilder(this._repeatContext)),this._actionQueue.update(t))}isComplete(){return this._stopped}stop(){this._stopped=!0,this._actionQueue.clearActions()}reset(){}}class Xn{constructor(t,e,i,s){if(this._started=!1,this._stopped=!1,this._entity=t,this._tx=t.get(H),this._motion=t.get(yt),this._speed=s,this._offset=new A(e,i),s<=0)throw V.getInstance().error("Attempted to moveBy with speed less than or equal to zero : "+s),new Error("Speed must be greater than 0 pixels per second")}update(t){this._started||(this._started=!0,this._start=new A(this._tx.pos.x,this._tx.pos.y),this._end=this._start.add(this._offset),this._distance=this._offset.size,this._dir=this._end.sub(this._start).normalize()),this.isComplete(this._entity)?(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0)):this._motion.vel=this._dir.scale(this._speed)}isComplete(t){const e=t.get(H);return this._stopped||e.pos.distance(this._start)>=this._distance}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class qn{constructor(t,e,i,s){this.entity=t,this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._end=new A(e,i),this._speed=s}update(t){this._started||(this._started=!0,this._start=new A(this._tx.pos.x,this._tx.pos.y),this._distance=this._start.distance(this._end),this._dir=this._end.sub(this._start).normalize());const e=this._dir.scale(this._speed);this._motion.vel=R(e.x,e.y),this.isComplete(this.entity)&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}isComplete(t){const e=t.get(H);return this._stopped||new A(e.pos.x,e.pos.y).distance(this._start)>=this._distance}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}var ne;(function(r){r[r.ShortestPath=0]="ShortestPath",r[r.LongestPath=1]="LongestPath",r[r.Clockwise=2]="Clockwise",r[r.CounterClockwise=3]="CounterClockwise"})(ne||(ne={}));class $n{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._end=e,this._speed=i,this._rotationType=s||ne.ShortestPath}update(t){if(!this._started){this._started=!0,this._start=this._tx.rotation,this._currentNonCannonAngle=this._tx.rotation;const e=Math.abs(this._end-this._start),i=ae-e;switch(e>i?(this._shortDistance=i,this._longDistance=e):(this._shortDistance=e,this._longDistance=i),this._shortestPathIsPositive=(this._start-this._end+ae)%ae>=Math.PI,this._rotationType){case ne.ShortestPath:this._distance=this._shortDistance,this._shortestPathIsPositive?this._direction=1:this._direction=-1;break;case ne.LongestPath:this._distance=this._longDistance,this._shortestPathIsPositive?this._direction=-1:this._direction=1;break;case ne.Clockwise:this._direction=1,this._shortestPathIsPositive?this._distance=this._shortDistance:this._distance=this._longDistance;break;case ne.CounterClockwise:this._direction=-1,this._shortestPathIsPositive?this._distance=this._longDistance:this._distance=this._shortDistance;break}}this._motion.angularVelocity=this._direction*this._speed,this._currentNonCannonAngle+=this._direction*this._speed*(t/1e3),this.isComplete()&&(this._tx.rotation=this._end,this._motion.angularVelocity=0,this._stopped=!0)}isComplete(){const t=Math.abs(this._currentNonCannonAngle-this._start);return this._stopped||t>=Math.abs(this._distance)}stop(){this._motion.angularVelocity=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class tr{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._speed=i,this._offset=e,this._rotationType=s||ne.ShortestPath}update(t){if(!this._started){this._started=!0,this._start=this._tx.rotation,this._currentNonCannonAngle=this._tx.rotation,this._end=this._start+this._offset;const e=Math.abs(this._end-this._start),i=ae-e;switch(e>i?(this._shortDistance=i,this._longDistance=e):(this._shortDistance=e,this._longDistance=i),this._shortestPathIsPositive=(this._start-this._end+ae)%ae>=Math.PI,this._rotationType){case ne.ShortestPath:this._distance=this._shortDistance,this._shortestPathIsPositive?this._direction=1:this._direction=-1;break;case ne.LongestPath:this._distance=this._longDistance,this._shortestPathIsPositive?this._direction=-1:this._direction=1;break;case ne.Clockwise:this._direction=1,this._shortDistance>=0?this._distance=this._shortDistance:this._distance=this._longDistance;break;case ne.CounterClockwise:this._direction=-1,this._shortDistance<=0?this._distance=this._shortDistance:this._distance=this._longDistance;break}}this._motion.angularVelocity=this._direction*this._speed,this._currentNonCannonAngle+=this._direction*this._speed*(t/1e3),this.isComplete()&&(this._tx.rotation=this._end,this._motion.angularVelocity=0,this._stopped=!0)}isComplete(){const t=Math.abs(this._currentNonCannonAngle-this._start);return this._stopped||t>=Math.abs(this._distance)}stop(){this._motion.angularVelocity=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._start=void 0,this._currentNonCannonAngle=void 0,this._distance=void 0}}class er{constructor(t,e,i,s,n){this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._endX=e,this._endY=i,this._speedX=s,this._speedY=n}update(t){if(this._started||(this._started=!0,this._startX=this._tx.scale.x,this._startY=this._tx.scale.y,this._distanceX=Math.abs(this._endX-this._startX),this._distanceY=Math.abs(this._endY-this._startY)),Math.abs(this._tx.scale.x-this._startX)>=this._distanceX)this._motion.scaleFactor.x=0;else{const e=this._endY=this._distanceY)this._motion.scaleFactor.y=0;else{const e=this._endY=this._distanceX-.01&&Math.abs(this._tx.scale.y-this._startY)>=this._distanceY-.01}stop(){this._motion.scaleFactor.x=0,this._motion.scaleFactor.y=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class ir{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._offset=new A(e,i),this._speedX=this._speedY=s}update(t){this._started||(this._started=!0,this._startScale=this._tx.scale.clone(),this._endScale=this._startScale.add(this._offset),this._distanceX=Math.abs(this._endScale.x-this._startScale.x),this._distanceY=Math.abs(this._endScale.y-this._startScale.y),this._directionX=this._endScale.x=this._distanceX-.01&&Math.abs(this._tx.scale.y-this._startScale.y)>=this._distanceY-.01}stop(){this._motion.scaleFactor.x=0,this._motion.scaleFactor.y=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class sr{constructor(t){this._method=null,this._hasBeenCalled=!1,this._method=t}update(t){this._method(),this._hasBeenCalled=!0}isComplete(){return this._hasBeenCalled}reset(){this._hasBeenCalled=!1}stop(){this._hasBeenCalled=!0}}class nr{constructor(t,e,i,s,n){this.easingFcn=n,this._currentLerpTime=0,this._lerpDuration=1*1e3,this._lerpStart=new A(0,0),this._lerpEnd=new A(0,0),this._initialized=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._lerpDuration=s,this._lerpEnd=new A(e,i)}_initialize(){this._lerpStart=new A(this._tx.pos.x,this._tx.pos.y),this._currentLerpTime=0}update(t){this._initialized||(this._initialize(),this._initialized=!0),this._currentLerpTime+=t;let e=this._tx.pos.x,i=this._tx.pos.y;this._currentLerpTime=this._lerpDuration}reset(){this._initialized=!1,this._stopped=!1,this._currentLerpTime=0}stop(){this._motion.vel=R(0,0),this._stopped=!0}}class rr{constructor(t,e,i,s,n){this.easingFcn=n,this._currentLerpTime=0,this._lerpDuration=1*1e3,this._lerpStart=new A(0,0),this._lerpEnd=new A(0,0),this._initialized=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._lerpDuration=s,this._offset=new A(e,i)}_initialize(){this._lerpStart=new A(this._tx.pos.x,this._tx.pos.y),this._currentLerpTime=0,this._lerpEnd=this._lerpStart.add(this._offset)}update(t){this._initialized||(this._initialize(),this._initialized=!0),this._currentLerpTime+=t;let e=this._tx.pos.x,i=this._tx.pos.y;this._currentLerpTime=this._lerpDuration}reset(){this._initialized=!1,this._stopped=!1,this._currentLerpTime=0}stop(){this._motion.vel=R(0,0),this._stopped=!0}}class or{constructor(t,e,i,s=1){this._timeVisible=0,this._timeNotVisible=0,this._elapsedTime=0,this._totalTime=0,this._stopped=!1,this._started=!1,this._graphics=t.get(Ft),this._timeVisible=e,this._timeNotVisible=i,this._duration=(e+i)*s}update(t){this._started||(this._started=!0,this._elapsedTime=0,this._totalTime=0),this._graphics&&(this._elapsedTime+=t,this._totalTime+=t,this._graphics.visible&&this._elapsedTime>=this._timeVisible&&(this._graphics.visible=!1,this._elapsedTime=0),!this._graphics.visible&&this._elapsedTime>=this._timeNotVisible&&(this._graphics.visible=!0,this._elapsedTime=0),this.isComplete()&&(this._graphics.visible=!0))}isComplete(){return this._stopped||this._totalTime>=this._duration}stop(){this._graphics&&(this._graphics.visible=!0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._elapsedTime=0,this._totalTime=0}}class ar{constructor(t,e,i){this._multiplier=1,this._started=!1,this._stopped=!1,this._graphics=t.get(Ft),this._endOpacity=e,this._speed=this._ogspeed=i}update(t){this._graphics&&(this._started||(this._started=!0,this._speed=this._ogspeed,this._endOpacity0&&(this._graphics.opacity+=this._multiplier*(Math.abs(this._graphics.opacity-this._endOpacity)*t)/this._speed),this._speed-=t,this.isComplete()&&(this._graphics.opacity=this._endOpacity),V.getInstance().debug("[Action fade] Actor opacity:",this._graphics.opacity))}isComplete(){return this._stopped||Math.abs(this._graphics.opacity-this._endOpacity)<.05}stop(){this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class hr{constructor(t){this._elapsedTime=0,this._started=!1,this._stopped=!1,this._delay=t}update(t){this._started||(this._started=!0),this._elapsedTime+=t}isComplete(){return this._stopped||this._elapsedTime>=this._delay}stop(){this._stopped=!0}reset(){this._elapsedTime=0,this._started=!1,this._stopped=!1}}class lr{constructor(t){this._stopped=!1,this._entity=t}update(t){this._entity.get(fi).clearActions(),this._entity.kill(),this._stopped=!0}isComplete(){return this._stopped}stop(){}reset(){}}class tn{constructor(t,e,i){this._started=!1,this._stopped=!1,this._tx=t.get(H),this._motion=t.get(yt),this._followTx=e.get(H),this._followMotion=e.get(yt),this._current=new A(this._tx.pos.x,this._tx.pos.y),this._end=new A(this._followTx.pos.x,this._followTx.pos.y),this._maximumDistance=i!==void 0?i:this._current.distance(this._end),this._speed=0}update(t){this._started||(this._started=!0,this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize());const e=Math.sqrt(Math.pow(this._followMotion.vel.x,2)+Math.pow(this._followMotion.vel.y,2));if(e!==0&&(this._speed=e),this._current=R(this._tx.pos.x,this._tx.pos.y),this._end=R(this._followTx.pos.x,this._followTx.pos.y),this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize(),this._distanceBetween>=this._maximumDistance){const i=this._dir.scale(this._speed);this._motion.vel=R(i.x,i.y)}else this._motion.vel=R(0,0);this.isComplete()&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}stop(){this._motion.vel=R(0,0),this._stopped=!0}isComplete(){return this._stopped}reset(){this._started=!1,this._stopped=!1}}class en{constructor(t,e,i){this._started=!1,this._stopped=!1,this._speedWasSpecified=!1,this._tx=t.get(H),this._motion=t.get(yt),this._meetTx=e.get(H),this._meetMotion=e.get(yt),this._current=new A(this._tx.pos.x,this._tx.pos.y),this._end=new A(this._meetTx.pos.x,this._meetTx.pos.y),this._speed=i||0,i!==void 0&&(this._speedWasSpecified=!0)}update(t){this._started||(this._started=!0,this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize());const e=Math.sqrt(Math.pow(this._meetMotion.vel.x,2)+Math.pow(this._meetMotion.vel.y,2));e!==0&&!this._speedWasSpecified&&(this._speed=e),this._current=R(this._tx.pos.x,this._tx.pos.y),this._end=R(this._meetTx.pos.x,this._meetTx.pos.y),this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize();const i=this._dir.scale(this._speed);this._motion.vel=R(i.x,i.y),this.isComplete()&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}isComplete(){return this._stopped||this._distanceBetween<=1}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._distanceBetween=void 0}}class Bi{constructor(t){this._entity=t,this._queue=new jn(t)}getQueue(){return this._queue}update(t){this._queue.update(t)}clearActions(){this._queue.clearActions()}runAction(t){return t.reset(),this._queue.add(t),this}easeTo(...t){var e,i;let s=0,n=0,o=0,h=xt.Linear;return t[0]instanceof A?(s=t[0].x,n=t[0].y,o=t[1],h=(e=t[2])!==null&&e!==void 0?e:h):(s=t[0],n=t[1],o=t[2],h=(i=t[3])!==null&&i!==void 0?i:h),this._queue.add(new nr(this._entity,s,n,o,h)),this}easeBy(...t){var e,i;let s=0,n=0,o=0,h=xt.Linear;return t[0]instanceof A?(s=t[0].x,n=t[0].y,o=t[1],h=(e=t[2])!==null&&e!==void 0?e:h):(s=t[0],n=t[1],o=t[2],h=(i=t[3])!==null&&i!==void 0?i:h),this._queue.add(new rr(this._entity,s,n,o,h)),this}moveTo(t,e,i){let s=0,n=0,o=0;return t instanceof A?(s=t.x,n=t.y,o=e):(s=t,n=e,o=i),this._queue.add(new qn(this._entity,s,n,o)),this}moveBy(t,e,i){let s=0,n=0,o=0;return t instanceof A?(s=t.x,n=t.y,o=e):(s=t,n=e,o=i),this._queue.add(new Xn(this._entity,s,n,o)),this}rotateTo(t,e,i){return this._queue.add(new $n(this._entity,t,e,i)),this}rotateBy(t,e,i){return this._queue.add(new tr(this._entity,t,e,i)),this}scaleTo(t,e,i,s){let n=1,o=1,h=0,l=0;return t instanceof A&&e instanceof A&&(n=t.x,o=t.y,h=e.x,l=e.y),typeof t=="number"&&typeof e=="number"&&(n=t,o=e,h=i,l=s),this._queue.add(new er(this._entity,n,o,h,l)),this}scaleBy(t,e,i){let s=1,n=1;return t instanceof A&&(s=t.x,n=t.y,i=e),typeof t=="number"&&typeof e=="number"&&(s=t,n=e),this._queue.add(new ir(this._entity,s,n,i)),this}blink(t,e,i=1){return this._queue.add(new or(this._entity,t,e,i)),this}fade(t,e){return this._queue.add(new ar(this._entity,t,e)),this}delay(t){return this._queue.add(new hr(t)),this}die(){return this._queue.add(new lr(this._entity)),this}callMethod(t){return this._queue.add(new sr(t)),this}repeat(t,e){return e?(this._queue.add(new Vn(this._entity,t,e)),this):(this.repeatForever(t),this)}repeatForever(t){return this._queue.add(new Kn(this._entity,t)),this}follow(t,e){return e===void 0?this._queue.add(new tn(this._entity,t)):this._queue.add(new tn(this._entity,t,e)),this}meet(t,e){return e===void 0?this._queue.add(new en(this._entity,t)):this._queue.add(new en(this._entity,t,e)),this}toPromise(){return new Promise(e=>{this._queue.add(new sr(()=>{e()}))})}}class fi extends ie{constructor(){super(...arguments),this.type="ex.actions",this.dependencies=[H,yt]}onAdd(t){this._ctx=new Bi(t)}onRemove(){this._ctx=null}getQueue(){var t;return(t=this._ctx)===null||t===void 0?void 0:t.getQueue()}runAction(t){var e;return(e=this._ctx)===null||e===void 0?void 0:e.runAction(t)}update(t){var e;return(e=this._ctx)===null||e===void 0?void 0:e.update(t)}clearActions(){var t;(t=this._ctx)===null||t===void 0||t.clearActions()}easeTo(...t){return this._ctx.easeTo.apply(this._ctx,t)}easeBy(...t){return this._ctx.easeBy.apply(this._ctx,t)}moveTo(t,e,i){return this._ctx.moveTo.apply(this._ctx,[t,e,i])}moveBy(t,e,i){return this._ctx.moveBy.apply(this._ctx,[t,e,i])}rotateTo(t,e,i){return this._ctx.rotateTo(t,e,i)}rotateBy(t,e,i){return this._ctx.rotateBy(t,e,i)}scaleTo(t,e,i,s){return this._ctx.scaleTo.apply(this._ctx,[t,e,i,s])}scaleBy(t,e,i){return this._ctx.scaleBy.apply(this._ctx,[t,e,i])}blink(t,e,i){return this._ctx.blink(t,e,i)}fade(t,e){return this._ctx.fade(t,e)}delay(t){return this._ctx.delay(t)}die(){return this._ctx.die()}callMethod(t){return this._ctx.callMethod(t)}repeat(t,e){return this._ctx.repeat(t,e)}repeatForever(t){return this._ctx.repeatForever(t)}follow(t,e){return this._ctx.follow(t,e)}meet(t,e){return this._ctx.meet(t,e)}toPromise(){return this._ctx.toPromise()}}var as;(function(r){r.Em="em",r.Rem="rem",r.Px="px",r.Pt="pt",r.Percent="%"})(as||(as={}));var hs;(function(r){r.Left="left",r.Right="right",r.Center="center",r.Start="start",r.End="end"})(hs||(hs={}));var ls;(function(r){r.Top="top",r.Hanging="hanging",r.Middle="middle",r.Alphabetic="alphabetic",r.Ideographic="ideographic",r.Bottom="bottom"})(ls||(ls={}));var cs;(function(r){r.Normal="normal",r.Italic="italic",r.Oblique="oblique"})(cs||(cs={}));var ds;(function(r){r.LeftToRight="ltr",r.RightToLeft="rtl"})(ds||(ds={}));class gi{constructor(t,e,i,s){this.font=t,this.text=e,this.color=i,this.maxWidth=s,this._textFragments=[],this.disposed=!1,this._dirty=!0,this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.dimensions=this.measureText(e),this._setDimension(this.dimensions,this.ctx),this._lastHashCode=this.getHashCode()}measureText(t,e){if(this.disposed)throw Error("Accessing disposed text instance! "+this.text);let i=null;e!=null?i=this._getLinesFromText(t,e):i=t.split(` -`);const s=i.reduce((w,y)=>w.length>y.length?w:y);this._applyFont(this.ctx);const n=this.ctx.measureText(s);let o=Math.abs(n.actualBoundingBoxAscent)+Math.abs(n.actualBoundingBoxDescent);const h=o*i.length;o=h;const l=h-Math.abs(n.actualBoundingBoxAscent),f=0,p=0;return new J({left:f-Math.abs(n.actualBoundingBoxLeft)-this.font.padding,top:p-Math.abs(n.actualBoundingBoxAscent)-this.font.padding,bottom:p+l+this.font.padding,right:f+Math.abs(n.actualBoundingBoxRight)+this.font.padding})}_setDimension(t,e){e.canvas.width=(t.width+this.font.padding*2)*2*this.font.quality,e.canvas.height=(t.height+this.font.padding*2)*2*this.font.quality}static getHashCode(t,e,i){var s;return e+"__hashcode__"+t.fontString+t.showDebug+t.textAlign+t.baseAlign+t.direction+JSON.stringify(t.shadow)+(t.padding.toString()+t.smoothing.toString()+t.lineWidth.toString()+t.lineDash.toString()+((s=t.strokeColor)===null||s===void 0?void 0:s.toString())+(i?i.toString():t.color.toString()))}getHashCode(t=!0){return gi.getHashCode(this.font,this.text,t?this.color:void 0)}_applyRasterProperties(t){var e,i;t.translate(this.font.padding,this.font.padding),t.imageSmoothingEnabled=this.font.smoothing,t.lineWidth=this.font.lineWidth,t.setLineDash((e=this.font.lineDash)!==null&&e!==void 0?e:t.getLineDash()),t.strokeStyle=(i=this.font.strokeColor)===null||i===void 0?void 0:i.toString(),t.fillStyle=this.color.toString()}_applyFont(t){t.resetTransform(),t.translate(this.font.padding+t.canvas.width/2,this.font.padding+t.canvas.height/2),t.scale(this.font.quality,this.font.quality),t.textAlign=this.font.textAlign,t.textBaseline=this.font.baseAlign,t.font=this.font.fontString,t.direction=this.font.direction,this.font.shadow&&(t.shadowColor=this.font.shadow.color.toString(),t.shadowBlur=this.font.shadow.blur,t.shadowOffsetX=this.font.shadow.offset.x,t.shadowOffsetY=this.font.shadow.offset.y)}_drawText(t,e,i){this._applyRasterProperties(t),this._applyFont(t);for(let s=0;se){for(;this.measureText(n).width>e;)o=n[n.length-1]+o,n=n.slice(0,-1);i[s]=n,i[s+1]=o}}return this._chachedText=t,this._chachedLines=i,this._cachedRenderWidth=e,i}}class dt{static measureText(t,e,i){const s=gi.getHashCode(e,t);if(dt._MEASURE_CACHE.has(s))return dt._MEASURE_CACHE.get(s);dt._LOGGER.debug("Font text measurement cache miss");const n=e.measureTextWithoutCache(t,i);return dt._MEASURE_CACHE.set(s,n),n}static getTextInstance(t,e,i){const s=gi.getHashCode(e,t,i);let n=dt._TEXT_CACHE.get(s);return n||(n=new gi(e,t,i),dt._TEXT_CACHE.set(s,n),dt._LOGGER.debug("Font text instance cache miss")),dt._TEXT_USAGE.set(n,performance.now()),n}static checkAndClearCache(){const t=[],e=new Set;for(const[s,n]of dt._TEXT_USAGE.entries())if(n+dt.FONT_TIMEOUT{dt._TEXT_USAGE.delete(s)}),this._TEXT_CACHE.clear();for(const[s]of this._TEXT_USAGE.entries())this._TEXT_CACHE.set(s.getHashCode(),s);const i=new Map;for(const s of e)dt._MEASURE_CACHE.has(s)&&i.set(s,dt._MEASURE_CACHE.get(s));this._MEASURE_CACHE.clear(),this._MEASURE_CACHE=i}static get cacheSize(){return dt._TEXT_USAGE.size}static clearCache(){for(const[t]of dt._TEXT_USAGE.entries())t.dispose();dt._TEXT_USAGE.clear(),dt._TEXT_CACHE.clear(),dt._MEASURE_CACHE.clear()}}dt.FONT_TIMEOUT=500,dt._LOGGER=V.getInstance(),dt._TEXT_USAGE=new Map,dt._TEXT_CACHE=new Map,dt._MEASURE_CACHE=new Map;class pi extends jt{constructor(t={}){var e,i,s,n,o,h,l,f,p,v,w,y,b,k,D,C,E,F,U;super(t),this.filtering=Ot.Blended,this.quality=2,this.padding=2,this.smoothing=!1,this.lineWidth=1,this.lineDash=[],this.color=L.Black,this.family="sans-serif",this.style=cs.Normal,this.bold=!1,this.unit=as.Px,this.textAlign=hs.Left,this.baseAlign=ls.Alphabetic,this.direction=ds.LeftToRight,this.size=10,this.shadow=null,this._textBounds=new J,this._textMeasurement=new gi(this,"",L.Black),this.smoothing=(e=t==null?void 0:t.smoothing)!==null&&e!==void 0?e:this.smoothing,this.padding=(i=t==null?void 0:t.padding)!==null&&i!==void 0?i:this.padding,this.color=(s=t==null?void 0:t.color)!==null&&s!==void 0?s:this.color,this.strokeColor=(n=t==null?void 0:t.strokeColor)!==null&&n!==void 0?n:this.strokeColor,this.lineDash=(o=t==null?void 0:t.lineDash)!==null&&o!==void 0?o:this.lineDash,this.lineWidth=(h=t==null?void 0:t.lineWidth)!==null&&h!==void 0?h:this.lineWidth,this.filtering=(l=t==null?void 0:t.filtering)!==null&&l!==void 0?l:this.filtering,this.family=(f=t==null?void 0:t.family)!==null&&f!==void 0?f:this.family,this.style=(p=t==null?void 0:t.style)!==null&&p!==void 0?p:this.style,this.bold=(v=t==null?void 0:t.bold)!==null&&v!==void 0?v:this.bold,this.size=(w=t==null?void 0:t.size)!==null&&w!==void 0?w:this.size,this.unit=(y=t==null?void 0:t.unit)!==null&&y!==void 0?y:this.unit,this.textAlign=(b=t==null?void 0:t.textAlign)!==null&&b!==void 0?b:this.textAlign,this.baseAlign=(k=t==null?void 0:t.baseAlign)!==null&&k!==void 0?k:this.baseAlign,this.direction=(D=t==null?void 0:t.direction)!==null&&D!==void 0?D:this.direction,this.quality=(C=t==null?void 0:t.quality)!==null&&C!==void 0?C:this.quality,t!=null&&t.shadow&&(this.shadow={},this.shadow.blur=(E=t.shadow.blur)!==null&&E!==void 0?E:this.shadow.blur,this.shadow.offset=(F=t.shadow.offset)!==null&&F!==void 0?F:this.shadow.offset,this.shadow.color=(U=t.shadow.color)!==null&&U!==void 0?U:this.shadow.color)}clone(){return new pi({...this.cloneGraphicOptions(),size:this.size,unit:this.unit,family:this.family,style:this.style,bold:this.bold,textAlign:this.textAlign,baseAlign:this.baseAlign,direction:this.direction,shadow:this.shadow?{blur:this.shadow.blur,offset:this.shadow.offset,color:this.shadow.color}:null})}get fontString(){return`${this.style} ${this.bold?"bold":""} ${this.size}${this.unit} ${this.family}`}get localBounds(){return this._textBounds}_drawImage(t,e,i){}_rotate(t){var e;const i=(e=this.origin)!==null&&e!==void 0?e:this._textBounds.center;t.translate(i.x,i.y),t.rotate(this.rotation),t.translate(-i.x,-i.y)}_flip(t){this.flipHorizontal&&(t.translate(this._textBounds.width/this.scale.x,0),t.scale(-1,1)),this.flipVertical&&(t.translate(0,-this._textBounds.height/2/this.scale.y),t.scale(1,-1))}measureTextWithoutCache(t,e){return this._textMeasurement.measureText(t,e)}measureText(t,e){return dt.measureText(t,this,e)}_postDraw(t){t.restore()}render(t,e,i,s,n,o){const h=dt.getTextInstance(e,this,i);this._textBounds=h.dimensions,this._preDraw(t,s,n),h.render(t,s,n,o),this._postDraw(t)}}class Mi extends jt{constructor(t){var e,i;super(t),this._text="",this._textWidth=0,this._textHeight=0,this.font=(e=t.font)!==null&&e!==void 0?e:new pi,this.color=(i=t.color)!==null&&i!==void 0?i:this.color,this.text=t.text,this.maxWidth=t.maxWidth}clone(){var t,e;return new Mi({text:this.text.slice(),color:(e=(t=this.color)===null||t===void 0?void 0:t.clone())!==null&&e!==void 0?e:L.Black,font:this.font.clone(),maxWidth:this.maxWidth})}get text(){return this._text}set text(t){this._text=t,this._calculateDimension()}get font(){return this._font}set font(t){this._font=t}get width(){return this._textWidth===0&&this._calculateDimension(),this._textWidth*this.scale.x}get height(){return this._textHeight===0&&this._calculateDimension(),this._textHeight*this.scale.y}_calculateDimension(){const{width:t,height:e}=this.font.measureText(this._text,this.maxWidth);this._textWidth=t,this._textHeight=e}get localBounds(){return this.font.measureText(this._text,this.maxWidth).scale(this.scale)}_rotate(t){}_flip(t){}_preDraw(t,e,i){(this.isStale()||this.font.isStale())&&(this.font.flipHorizontal=this.flipHorizontal,this.font.flipVertical=this.flipVertical,this.font.rotation=this.rotation,this.font.origin=this.origin,this.font.opacity=this.opacity),this.font.tint=this.tint,super._preDraw(t,e,i)}_drawImage(t,e,i){var s;let n=L.Black;this.font instanceof pi&&(n=(s=this.color)!==null&&s!==void 0?s:this.font.color);const{width:o,height:h}=this.font.measureText(this._text,this.maxWidth);this._textWidth=o,this._textHeight=h,this.font.render(t,this._text,n,e,i,this.maxWidth),this.font.showDebug&&(t.debug.drawRect(e-o,i-h,o*2,h*2),this.maxWidth!=null&&t.debug.drawRect(e,i,this.maxWidth,this.height,{color:L.Yellow}))}}class Kt extends Rt{get body(){return this.get(it)}get transform(){return this.get(H)}get motion(){return this.get(yt)}get graphics(){return this.get(Ft)}get collider(){return this.get(Ct)}get pointer(){return this.get(ui)}get actions(){return this.get(fi)}get pos(){return this.transform.pos}set pos(t){this.transform.pos=t.clone()}get oldPos(){return this.body.oldPos}set oldPos(t){this.body.oldPos.setTo(t.x,t.y)}get vel(){return this.motion.vel}set vel(t){this.motion.vel=t.clone()}get oldVel(){return this.body.oldVel}set oldVel(t){this.body.oldVel.setTo(t.x,t.y)}get acc(){return this.motion.acc}set acc(t){this.motion.acc=t.clone()}set oldAcc(t){this.body.oldAcc.setTo(t.x,t.y)}get oldAcc(){return this.body.oldAcc}get rotation(){return this.transform.rotation}set rotation(t){this.transform.rotation=t}get angularVelocity(){return this.motion.angularVelocity}set angularVelocity(t){this.motion.angularVelocity=t}get scale(){return this.get(H).scale}set scale(t){this.get(H).scale=t}get anchor(){return this._anchor}set anchor(t){this._anchor=Qe(t,e=>this._handleAnchorChange(e)),this._handleAnchorChange(t)}_handleAnchorChange(t){this.graphics&&(this.graphics.anchor=t)}get isOffScreen(){return this.hasTag("ex.offscreen")}get draggable(){return this._draggable}set draggable(t){t&&(t&&!this._draggable?(this.events.on("pointerdragstart",this._pointerDragStartHandler),this.events.on("pointerdragend",this._pointerDragEndHandler),this.events.on("pointerdragmove",this._pointerDragMoveHandler),this.events.on("pointerdragleave",this._pointerDragLeaveHandler)):!t&&this._draggable&&(this.events.off("pointerdragstart",this._pointerDragStartHandler),this.events.off("pointerdragend",this._pointerDragEndHandler),this.events.off("pointerdragmove",this._pointerDragMoveHandler),this.events.off("pointerdragleave",this._pointerDragLeaveHandler)),this._draggable=t)}get color(){return this._color}set color(t){var e;this._color=t.clone();const s=(e=this.graphics.layers.default.graphics[0])===null||e===void 0?void 0:e.graphic;(s instanceof li||s instanceof Mi)&&(s.color=this._color)}constructor(t){super(),this.events=new P,this._anchor=Qe(A.Half,M=>this._handleAnchorChange(M)),this.logger=V.getInstance(),this._draggable=!1,this._dragging=!1,this._pointerDragStartHandler=()=>{this._dragging=!0},this._pointerDragEndHandler=()=>{this._dragging=!1},this._pointerDragMoveHandler=M=>{this._dragging&&(this.pos=M.worldPos)},this._pointerDragLeaveHandler=M=>{this._dragging&&(this.pos=M.worldPos)};const{name:e,x:i,y:s,pos:n,coordPlane:o,scale:h,width:l,height:f,radius:p,collider:v,vel:w,acc:y,rotation:b,angularVelocity:k,z:D,color:C,visible:E,anchor:F,collisionType:U,collisionGroup:j}={...t};this._setName(e),this.anchor=F??Kt.defaults.anchor.clone();const Y=new H;this.addComponent(Y),this.pos=n??R(i??0,s??0),this.rotation=b??0,this.scale=h??R(1,1),this.z=D??0,Y.coordPlane=o??Nt.World,this.addComponent(new ui),this.addComponent(new Ft({anchor:this.anchor})),this.addComponent(new yt),this.vel=w??A.Zero,this.acc=y??A.Zero,this.angularVelocity=k??0,this.addComponent(new fi),this.addComponent(new it),this.body.collisionType=U??q.Passive,j&&(this.body.group=j),v?this.addComponent(new Ct(v)):p?this.addComponent(new Ct(Dt.Circle(p))):l>0&&f>0?this.addComponent(new Ct(Dt.Box(l,f,this.anchor))):this.addComponent(new Ct),this.graphics.visible=E??!0,C&&(this.color=C,l&&f?this.graphics.add(new rs({color:C,width:l,height:f})):p&&this.graphics.add(new os({color:C,radius:p})))}clone(){const t=new Kt({color:this.color.clone(),anchor:this.anchor.clone()});t.clearComponents(),t.processComponentRemoval();const e=this.getComponents();for(const i of e)t.addComponent(i.clone(),!0);return t}onInitialize(t){}_initialize(t){super._initialize(t);for(const e of this.children)e._initialize(t)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}_prekill(t){this.events.emit("prekill",new G(this)),this.onPreKill(t)}onPreKill(t){}_postkill(t){this.events.emit("postkill",new O(this)),this.onPostKill(t)}onPostKill(t){}kill(){this.scene?(this._prekill(this.scene),this.events.emit("kill",new z(this)),super.kill(),this._postkill(this.scene)):this.logger.warn(`Cannot kill actor named "${this.name}", it was never added to the Scene`)}unkill(){this.active=!0}isKilled(){return!this.active}get z(){return this.get(H).z}set z(t){this.get(H).z=t}get center(){const t=this.getGlobalPos();return new A(t.x+this.width/2-this.anchor.x*this.width,t.y+this.height/2-this.anchor.y*this.height)}get localCenter(){return new A(this.pos.x+this.width/2-this.anchor.x*this.width,this.pos.y+this.height/2-this.anchor.y*this.height)}get width(){return this.collider.localBounds.width*this.getGlobalScale().x}get height(){return this.collider.localBounds.height*this.getGlobalScale().y}getGlobalRotation(){return this.get(H).globalRotation}getGlobalPos(){return this.get(H).globalPos}getGlobalScale(){return this.get(H).globalScale}contains(t,e,i=!1){const s=R(t,e),n=this.get(Ct);n.update();const o=n.get();if(!o)return!1;const h=o.contains(s);return i?h||this.children.some(l=>l.contains(t,e,!0)):h}within(t,e){const i=this.get(Ct),s=t.get(Ct),n=i.get(),o=s.get();return n&&o?n.getClosestLineBetween(o).getLength()<=e:!1}update(t,e){this._initialize(t),this._preupdate(t,e),this._postupdate(t,e)}onPreUpdate(t,e){}onPostUpdate(t,e){}onPreCollisionResolve(t,e,i,s){}onPostCollisionResolve(t,e,i,s){}onCollisionStart(t,e,i,s){}onCollisionEnd(t,e){}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}}Kt.defaults={anchor:A.Half};function cr(r){return r instanceof sn}class sn extends Kt{constructor(t){var e,i;super({...t}),this.get(H).coordPlane=Nt.Screen,this.anchor=(e=t==null?void 0:t.anchor)!==null&&e!==void 0?e:R(0,0),this.body.collisionType=(i=t==null?void 0:t.collisionType)!==null&&i!==void 0?i:q.PreventCollision,this.pointer.useGraphicsBounds=!0,this.pointer.useColliderShape=!1,!(t!=null&&t.collider)&&(t==null?void 0:t.width)>0&&(t==null?void 0:t.height)>0&&this.collider.useBoxCollider(this.width,this.height,this.anchor)}_initialize(t){this._engine=t,super._initialize(t)}contains(t,e,i=!0){if(i)return super.contains(t,e);const s=this._engine.worldToScreenCoordinates(new A(t,e));return super.contains(s.x,s.y)}}class Ve{get complete(){return this._complete}constructor(t,e,i,s,n,o){if(this._logger=V.getInstance(),this.id=0,this._elapsedTime=0,this._totalTimeAlive=0,this._running=!1,this._numberOfTicks=0,this.interval=10,this.repeats=!1,this.maxNumberOfRepeats=-1,this.randomRange=[0,0],this._baseInterval=10,this._generateRandomInterval=()=>this._baseInterval+this.random.integer(this.randomRange[0],this.randomRange[1]),this._complete=!1,this.scene=null,typeof t!="function"){const h=t;t=h.fcn,e=h.interval,i=h.repeats,s=h.numberOfRepeats,n=h.randomRange,o=h.random}if(s&&s>=0&&(this.maxNumberOfRepeats=s,!i))throw new Error("repeats must be set to true if numberOfRepeats is set");if(this.id=Ve._MAX_ID++,this._callbacks=[],this._baseInterval=this.interval=e,n){if(n[0]>n[1])throw new Error("min value must be lower than max value for range");this.random=o??new Ii,this.randomRange=n,this.interval=this._generateRandomInterval(),this.on(()=>{this.interval=this._generateRandomInterval()})}this.repeats=i||this.repeats,t&&this.on(t)}on(t){this._callbacks.push(t)}off(t){const e=this._callbacks.indexOf(t);this._callbacks.splice(e,1)}update(t){this._running&&(this._totalTimeAlive+=t,this._elapsedTime+=t,this.maxNumberOfRepeats>-1&&this._numberOfTicks>=this.maxNumberOfRepeats&&(this._complete=!0,this._running=!1,this._elapsedTime=0),!this.complete&&this._elapsedTime>=this.interval&&(this._callbacks.forEach(e=>{e.call(this)}),this._numberOfTicks++,this.repeats?this._elapsedTime=0:(this._complete=!0,this._running=!1,this._elapsedTime=0)))}reset(t,e){if(t&&t>=0&&(this._baseInterval=this.interval=t),this.maxNumberOfRepeats&&this.maxNumberOfRepeats>=0&&(this.maxNumberOfRepeats=e,!this.repeats))throw new Error("repeats must be set to true if numberOfRepeats is set");this._complete=!1,this._elapsedTime=0,this._numberOfTicks=0}get timesRepeated(){return this._numberOfTicks}getTimeRunning(){return this._totalTimeAlive}get timeToNextAction(){return this.complete?0:this.interval-this._elapsedTime}get timeElapsedTowardNextAction(){return this._elapsedTime}get isRunning(){return this._running}pause(){return this._running=!1,this}resume(){return this._running=!0,this}start(){return this.scene||this._logger.warn("Cannot start a timer not part of a scene, timer wont start until added"),this._running=!0,this.complete&&(this._complete=!1,this._elapsedTime=0,this._numberOfTicks=0),this}stop(){return this._running=!1,this._elapsedTime=0,this._numberOfTicks=0,this}cancel(){this.pause(),this.scene&&this.scene.cancelTimer(this)}}Ve._MAX_ID=0;class us extends ie{constructor(t){super(),this.type="ex.parallax",this.parallaxFactor=R(1,1),this.parallaxFactor=t??this.parallaxFactor}}class fs extends ie{constructor(t,e=!0){super(),this.draw=t,this.useTransform=e,this.type="ex.debuggraphics"}}class Fe{constructor(t,e){this.bounds=t,this.options=e,this._defaultOptions={maxDepth:10,capacity:10,level:0},this.items=[],this._isDivided=!1,this.topLeft=null,this.topRight=null,this.bottomLeft=null,this.bottomRight=null,this.options={...this._defaultOptions,...e},this.halfWidth=t.width/2,this.halfHeight=t.height/2}_split(){this._isDivided=!0;const t={maxDepth:this.options.maxDepth,capacity:this.options.capacity,level:this.options.level+1};this.topLeft=new Fe(new J({left:this.bounds.left,top:this.bounds.top,right:this.bounds.left+this.halfWidth,bottom:this.bounds.top+this.halfHeight}),t),this.topRight=new Fe(new J({left:this.bounds.left+this.halfWidth,top:this.bounds.top,right:this.bounds.right,bottom:this.bounds.top+this.halfHeight}),t),this.bottomLeft=new Fe(new J({left:this.bounds.left,top:this.bounds.top+this.halfHeight,right:this.bounds.left+this.halfWidth,bottom:this.bounds.bottom}),t),this.bottomRight=new Fe(new J({left:this.bounds.left+this.halfWidth,top:this.bounds.top+this.halfHeight,right:this.bounds.right,bottom:this.bounds.bottom}),t)}_insertIntoSubNodes(t){var e,i,s,n;!((e=this.topLeft)===null||e===void 0)&&e.bounds.overlaps(t.bounds)&&this.topLeft.insert(t),!((i=this.topRight)===null||i===void 0)&&i.bounds.overlaps(t.bounds)&&this.topRight.insert(t),!((s=this.bottomLeft)===null||s===void 0)&&s.bounds.overlaps(t.bounds)&&this.bottomLeft.insert(t),!((n=this.bottomRight)===null||n===void 0)&&n.bounds.overlaps(t.bounds)&&this.bottomRight.insert(t)}insert(t){if(this._isDivided){this._insertIntoSubNodes(t);return}if(this.items.push(t),this.items.length>this.options.capacity&&this.options.level-1&&this.items.splice(o,1);return}!((e=this.topLeft)===null||e===void 0)&&e.bounds.overlaps(t.bounds)&&this.topLeft.remove(t),!((i=this.topRight)===null||i===void 0)&&i.bounds.overlaps(t.bounds)&&this.topRight.remove(t),!((s=this.bottomLeft)===null||s===void 0)&&s.bounds.overlaps(t.bounds)&&this.bottomLeft.remove(t),!((n=this.bottomRight)===null||n===void 0)&&n.bounds.overlaps(t.bounds)&&this.bottomRight.remove(t)}}query(t){let e=this.items;return this._isDivided&&(this.topLeft.bounds.overlaps(t)&&(e=e.concat(this.topLeft.query(t))),this.topRight.bounds.overlaps(t)&&(e=e.concat(this.topRight.query(t))),this.bottomLeft.bounds.overlaps(t)&&(e=e.concat(this.bottomLeft.query(t))),this.bottomRight.bounds.overlaps(t)&&(e=e.concat(this.bottomRight.query(t)))),e=e.filter((i,s)=>e.indexOf(i)>=s),e}clear(){this.items=[],this._isDivided=!1,this.topLeft=null,this.topRight=null,this.bottomLeft=null,this.bottomRight=null}getAllItems(){let t=this.items;return this._isDivided&&(t=t.concat(this.topLeft.getAllItems()),t=t.concat(this.topRight.getAllItems()),t=t.concat(this.bottomLeft.getAllItems()),t=t.concat(this.bottomRight.getAllItems())),t=t.filter((e,i)=>t.indexOf(e)>=i),t}getTreeDepth(){return this._isDivided?1+Math.max(this.topLeft.getTreeDepth(),this.topRight.getTreeDepth(),this.bottomLeft.getTreeDepth(),this.bottomRight.getTreeDepth()):0}debug(t){this.bounds.draw(t,L.Yellow),this._isDivided&&(this.topLeft.bounds.draw(t,L.Yellow),this.topRight.bounds.draw(t,L.Yellow),this.bottomLeft.bounds.draw(t,L.Yellow),this.bottomRight.bounds.draw(t,L.Yellow))}}const la={PreUpdate:"preupdate",PostUpdate:"postupdate",PreDraw:"predraw",PostDraw:"postdraw"};class dr extends Rt{flagCollidersDirty(){this._collidersDirty=!0}flagTilesDirty(){for(let t=0;tthis.draw(n,o)})),this.addComponent(new fs((n,o)=>this.debug(n,o),!1)),this.addComponent(new Ct),this._graphics=this.get(Ft),this._transform=this.get(H),this._motion=this.get(yt),this._collider=this.get(Ct),this._composite=this._collider.useCompositeCollider([]),this._transform.pos=(e=t.pos)!==null&&e!==void 0?e:A.Zero,this._oldPos=this._transform.pos.clone(),this._oldScale=this._transform.scale.clone(),this.renderFromTopOfGraphic=(i=t.renderFromTopOfGraphic)!==null&&i!==void 0?i:this.renderFromTopOfGraphic,this.tileWidth=t.tileWidth,this.tileHeight=t.tileHeight,this.rows=t.rows,this.columns=t.columns,this._quadTree=new Fe(J.fromDimension(this.columns*this.tileWidth,this.rows*this.tileHeight,A.Zero,this.pos)),this.tiles=new Array(this.rows*this.columns),this._rows=new Array(this.rows),this._cols=new Array(this.columns);let s=[];for(let n=0;nn&&o?n.top===o.top&&n.bottom===o.bottom&&n.right===o.left:!1,s=(n,o,h=10)=>{if(!n)return!1;for(let l=o.length-1;l>=0;l--){if(h--<0)return!1;const f=o[l];if(i(f,n))return o[l]=f.combine(n),!0}return!1};for(let n=0;n0){for(const l of h.getColliders()){const f=this._getOrSetColliderOriginalOffset(l);l.offset=R(h.x*this.tileWidth*this.scale.x,h.y*this.tileHeight*this.scale.y).add(f),l.owner=this,this._composite.addCollider(l)}e&&!s(e,t)&&t.push(e),e=null}else e?e=e.combine(h.defaultGeometry):e=h.defaultGeometry;else e&&!s(e,t)&&t.push(e),e=null}e&&!s(e,t)&&t.push(e),e=null}for(const n of t){const o=Dt.Box(n.width,n.height,A.Zero,R(n.left-this.pos.x,n.top-this.pos.y));o.owner=this,this._composite.addCollider(o)}this._collider.update(),this._collider.$colliderAdded.notifyAll(this._composite)}getTileByIndex(t){return this.tiles[t]}getTile(t,e){return t<0||e<0||t>=this.columns||e>=this.rows?null:this.tiles[t+e*this.columns]}getTileByPoint(t){const e=Math.floor((t.x-this.pos.x)/(this.tileWidth*this.scale.x)),i=Math.floor((t.y-this.pos.y)/(this.tileHeight*this.scale.y)),s=this.getTile(e,i);return e>=0&&i>=0&&e-1&&(this._graphics.splice(e,1),this._offsets.splice(e,1))}clearGraphics(){this._graphics.length=0,this._offsets.length=0}getColliders(){return this._colliders}addCollider(t){this._colliders.push(t),this.map.flagCollidersDirty()}removeCollider(t){const e=this._colliders.indexOf(t);e>-1&&this._colliders.splice(e,1),this.map.flagCollidersDirty()}clearColliders(){this._colliders.length=0,this.map.flagCollidersDirty()}constructor(t){var e,i;super(),this._posDirty=!1,this._solid=!1,this._graphics=[],this._offsets=[],this._colliders=[],this.data=new Map,this.x=t.x,this.y=t.y,this.map=t.map,this._width=t.map.tileWidth*this.map.scale.x,this._height=t.map.tileHeight*this.map.scale.y,this.solid=(e=t.solid)!==null&&e!==void 0?e:this.solid,this._graphics=(i=t.graphics)!==null&&i!==void 0?i:[],this._recalculate()}flagDirty(){return this._posDirty=!0}_recalculate(){const t=this.map.pos.add(R(this.x*this.map.tileWidth,this.y*this.map.tileHeight));this._geometry=new J(t.x,t.y,t.x+this.map.tileWidth,t.y+this.map.tileHeight),this._width=this.map.tileWidth*this.map.scale.x,this._height=this.map.tileHeight*this.map.scale.y,this._pos=this.map.pos.add(R(this.x*this._width,this.y*this._height)),this._bounds=new J(this._pos.x,this._pos.y,this._pos.x+this._width,this._pos.y+this._height),this.map.rotation&&(this._bounds=this._bounds.rotate(this.map.rotation,this.map.pos)),this._posDirty=!1}get bounds(){return this._posDirty&&this._recalculate(),this._bounds}get defaultGeometry(){return this._geometry}get center(){return this._posDirty&&this._recalculate(),new A(this._pos.x+this._width/2,this._pos.y+this._height/2)}}class fr{constructor(t){this.camera=t}lockToActor(t){this.camera.addStrategy(new gr(t))}lockToActorAxis(t,e){this.camera.addStrategy(new pr(t,e))}elasticToActor(t,e,i){this.camera.addStrategy(new mr(t,e,i))}radiusAroundActor(t,e){this.camera.addStrategy(new _r(t,e))}limitCameraBounds(t){this.camera.addStrategy(new vr(t))}}var gs;(function(r){r[r.X=0]="X",r[r.Y=1]="Y"})(gs||(gs={}));class gr{constructor(t){this.target=t,this.action=(e,i,s,n)=>e.center}}class pr{constructor(t,e){this.target=t,this.axis=e,this.action=(i,s,n,o)=>{const h=i.center,l=s.getFocus();return this.axis===gs.X?new A(h.x,l.y):new A(l.x,h.y)}}}class mr{constructor(t,e,i){this.target=t,this.cameraElasticity=e,this.cameraFriction=i,this.action=(s,n,o,h)=>{const l=s.center;let f=n.getFocus(),p=n.vel.clone();const v=l.sub(f).scale(this.cameraElasticity);p=p.add(v);const w=p.scale(-1).scale(this.cameraFriction);return p=p.add(w),f=f.add(p),f}}}class _r{constructor(t,e){this.target=t,this.radius=e,this.action=(i,s,n,o)=>{const h=i.center,l=s.getFocus(),f=h.sub(l),p=f.size;if(p>=this.radius){const v=p-this.radius;return l.add(f.normalize().scale(v))}return l}}}class vr{constructor(t){this.target=t,this.boundSizeChecked=!1,this.action=(e,i,s,n)=>{const o=i.getFocus();this.boundSizeChecked||((e.bottom-e.tope.right-s.halfDrawWidth&&(h=e.right-s.halfDrawWidth),o.ye.bottom-s.halfDrawHeight&&(l=e.bottom-s.halfDrawHeight),R(h,l)}}}const ca={Initialize:"initialize",PreUpdate:"preupdate",PostUpdate:"postupdate"};class xr{constructor(){this.events=new P,this.transform=Et.identity(),this.inverse=Et.identity(),this._cameraStrategies=[],this.strategy=new fr(this),this._z=1,this.dz=0,this.az=0,this.rotation=0,this._angularVelocity=0,this._posChanged=!1,this._pos=Pn(A.Zero,()=>this._posChanged=!0),this.drawPos=this.pos.clone(),this._oldPos=this.pos.clone(),this.vel=A.Zero,this.acc=A.Zero,this._cameraMoving=!1,this._currentLerpTime=0,this._lerpDuration=1e3,this._lerpStart=null,this._lerpEnd=null,this._isShaking=!1,this._shakeMagnitudeX=0,this._shakeMagnitudeY=0,this._shakeDuration=0,this._elapsedShakeTime=0,this._xShake=0,this._yShake=0,this._isZooming=!1,this._zoomStart=1,this._zoomEnd=1,this._currentZoomTime=0,this._zoomDuration=0,this._zoomEasing=xt.EaseInOutCubic,this._easing=xt.EaseInOutCubic,this._halfWidth=0,this._halfHeight=0,this._viewport=null,this._isInitialized=!1}get zoom(){return this._z}set zoom(t){this._z=t,this._engine&&(this._halfWidth=this._engine.halfDrawWidth,this._halfHeight=this._engine.halfDrawHeight)}get angularVelocity(){return this._angularVelocity}set angularVelocity(t){this._angularVelocity=t}get pos(){return this._pos}set pos(t){this._pos=Pn(t,()=>this._posChanged=!0),this._posChanged=!0}get x(){return this.pos.x}set x(t){!this._follow&&!this._cameraMoving&&(this.pos=R(t,this.pos.y))}get y(){return this.pos.y}set y(t){!this._follow&&!this._cameraMoving&&(this.pos=R(this.pos.x,t))}get dx(){return this.vel.x}set dx(t){this.vel=R(t,this.vel.y)}get dy(){return this.vel.y}set dy(t){this.vel=R(this.vel.x,t)}get ax(){return this.acc.x}set ax(t){this.acc=R(t,this.acc.y)}get ay(){return this.acc.y}set ay(t){this.acc=R(this.acc.x,t)}getFocus(){return this.pos}move(t,e,i=xt.EaseInOutCubic){if(typeof i!="function")throw"Please specify an EasingFunction";return this._follow?Promise.reject(t):(this._lerpPromise&&this._lerpResolve&&this._lerpResolve(t),this._lerpPromise=new Promise(s=>{this._lerpResolve=s}),this._lerpStart=this.getFocus().clone(),this._lerpDuration=e,this._lerpEnd=t,this._currentLerpTime=0,this._cameraMoving=!0,this._easing=i,this._lerpPromise)}shake(t,e,i){this._isShaking=!0,this._shakeMagnitudeX=t,this._shakeMagnitudeY=e,this._shakeDuration=i}zoomOverTime(t,e=0,i=xt.EaseInOutCubic){if(this._zoomPromise=new Promise(s=>{this._zoomResolve=s}),e)this._isZooming=!0,this._zoomEasing=i,this._currentZoomTime=0,this._zoomDuration=e,this._zoomStart=this.zoom,this._zoomEnd=t;else return this._isZooming=!1,this.zoom=t,Promise.resolve(!0);return this._zoomPromise}get viewport(){return this._viewport?this._viewport:new J(0,0,0,0)}addStrategy(t){this._cameraStrategies.push(t)}removeStrategy(t){Be(t,this._cameraStrategies)}clearAllStrategies(){this._cameraStrategies.length=0}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}onPreUpdate(t,e){}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}onPostUpdate(t,e){}get isInitialized(){return this._isInitialized}_initialize(t){if(!this.isInitialized){this._engine=t,this._screen=t.screen;const e=this._screen.contentArea;let i=R(e.width/2,e.height/2);if(!this._engine.loadingComplete){const s=this._screen.peekResolution();s&&(i=R(s.width/2,s.height/2))}this._halfWidth=i.x,this._halfHeight=i.y,this._posChanged||(this.pos=i),this.pos.clone(this.drawPos),this.updateTransform(this.pos),this.runStrategies(t,t.clock.elapsed()),this.updateViewport(),this.updateTransform(this.pos),this.pos.clone(this._oldPos),this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0}}onInitialize(t){}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}runStrategies(t,e){for(const i of this._cameraStrategies)this.pos=i.action.call(i,i.target,this,t,e)}updateViewport(){this._viewport=new J(this.x-this._halfWidth,this.y-this._halfHeight,this.x+this._halfWidth,this.y+this._halfHeight)}update(t,e){if(this._initialize(t),this._preupdate(t,e),this.pos.clone(this._oldPos),this.pos=this.pos.add(this.vel.scale(e/1e3)),this.zoom+=this.dz*e/1e3,this.vel=this.vel.add(this.acc.scale(e/1e3)),this.dz+=this.az*e/1e3,this.rotation+=this.angularVelocity*e/1e3,this._isZooming)if(this._currentZoomTime=this._shakeDuration}}const da={ExitTrigger:"exit",EnterTrigger:"enter"},ua={pos:A.Zero,width:10,height:10,visible:!1,action:()=>{},filter:()=>!0,repeat:-1};class wr extends Kt{constructor(t){super({x:t.pos.x,y:t.pos.y,width:t.width,height:t.height}),this.events=new P,this.action=()=>{},this.filter=()=>!0,this.repeat=-1,t={...ua,...t},this.filter=t.filter||this.filter,this.repeat=t.repeat||this.repeat,this.action=t.action||this.action,t.target&&(this.target=t.target),this.graphics.visible=t.visible,this.body.collisionType=q.Passive,this.events.on("collisionstart",e=>{this.filter(e.other)&&(this.events.emit("enter",new Ss(this,e.other)),this._dispatchAction(),this.repeat===0&&this.kill())}),this.events.on("collisionend",e=>{this.filter(e.other)&&this.events.emit("exit",new Ts(this,e.other))})}set target(t){this._target=t,this.filter=e=>e===t}get target(){return this._target}_initialize(t){super._initialize(t)}_dispatchAction(){this.repeat!==0&&(this.action.call(this),this.repeat--)}}var Xt;(function(r){r.Update="update",r.Draw="draw"})(Xt||(Xt={}));class ce{constructor(){this.priority=0}notify(t){}}class Ar{constructor(t){this.data=t,this.type="Entity Added"}}function ki(r){return!!r&&r.type==="Entity Added"}class yr{constructor(t){this.data=t,this.type="Entity Removed"}}function fa(r){return!!r&&r.type==="Entity Removed"}class br{constructor(t){this._world=t,this.entities=[],this._entityIndex={},this._entitiesToRemove=[]}updateEntities(t,e){for(const i of this.entities)i.update(t.engine,e),i.active||this.removeEntity(i)}findEntitiesForRemoval(){for(const t of this.entities)t.active||this.removeEntity(t)}notify(t){Wn(t)&&this._world.queryManager.addEntity(t.data.entity),Jn(t)&&this._world.queryManager.removeComponent(t.data.entity,t.data.component)}addEntity(t){t.active=!0,t.scene=this._world.context,t&&!this._entityIndex[t.id]&&(this._entityIndex[t.id]=t,this.entities.push(t),this._world.queryManager.addEntity(t),t.componentAdded$.register(this),t.componentRemoved$.register(this),t.children.forEach(e=>{e.scene=t.scene,this.addEntity(e)}),t.childrenAdded$.register({notify:e=>{this.addEntity(e)}}),t.childrenRemoved$.register({notify:e=>{this.removeEntity(e,!1)}}))}removeEntity(t,e=!0){var i;let s=0;t instanceof Rt?s=t.id:s=t;const n=this._entityIndex[s];if(n&&n.active&&(n.active=!1),n&&e){this._entitiesToRemove.push(n);return}delete this._entityIndex[s],n&&(n.scene=null,Be(n,this.entities),this._world.queryManager.removeEntity(n),n.componentAdded$.unregister(this),n.componentRemoved$.unregister(this),n.children.forEach(o=>{o.scene=null,this.removeEntity(o,e)}),n.childrenAdded$.clear(),n.childrenRemoved$.clear(),!((i=this._world.context)===null||i===void 0)&&i.engine&&this._world.context.engine.stats.currFrame.actors.killed++)}processEntityRemovals(){for(const t of this._entitiesToRemove)t.active||this.removeEntity(t,!1);this._entitiesToRemove.length=0}processComponentRemovals(){for(const t of this.entities)t.processComponentRemoval()}getById(t){return this._entityIndex[t]}getByName(t){return this.entities.filter(e=>e.name===t)}clear(){for(let t=this.entities.length-1;t>=0;t--)this.removeEntity(this.entities[t])}}const ps=r=>[...r].sort((e,i)=>e.localeCompare(i)).join("+");class Er extends fe{get key(){return this._key?this._key:this._key=ps(this.types)}constructor(t){super(),this._entities=[],t[0]instanceof Function?this.types=t.map(e=>new e().type):this.types=t}getEntities(t){return t&&this._entities.sort(t),this._entities}addEntity(t){!Ds(this._entities,t)&&this.matches(t)&&(this._entities.push(t),this.notifyAll(new Ar(t)))}removeEntity(t){Be(t,this._entities)&&this.notifyAll(new yr(t))}clear(){this._entities.length=0;for(let t=this.observers.length-1;t>=0;t--)this.unregister(this.observers[t])}matches(t){let e=[];t instanceof Rt?e=t.types:e=t;let i=!0;for(const s of this.types)if(i=i&&e.indexOf(s)>-1,!i)return!1;return i}contain(t){return this.types.indexOf(t)>-1}}class Cr{constructor(t){this._world=t,this._queries={}}_addQuery(t){this._queries[ps(t.types)]=t;for(const e of this._world.entityManager.entities)t.addEntity(e)}maybeRemoveQuery(t){t.observers.length===0&&(t.clear(),delete this._queries[ps(t.types)])}addEntity(t){for(const e in this._queries)this._queries[e]&&this._queries[e].addEntity(t)}removeComponent(t,e){for(const i in this._queries)this._queries[i].contain(e.type)&&this._queries[i].removeEntity(t)}removeEntity(t){for(const e in this._queries)this._queries[e].removeEntity(t)}createQuery(t){const e=this.getQuery(t);if(e)return e;const i=new Er(t);return this._addQuery(i),i}getQuery(t){const e=ps(t);return this._queries[e]?this._queries[e]:null}}class Ir{constructor(t){this._world=t,this.systems=[],this.initialized=!1}get(t){return this.systems.find(e=>e instanceof t)}addSystem(t){if(!t.types||t.types.length===0)throw new Error("Attempted to add a System without any types");const e=this._world.queryManager.createQuery(t.types);this.systems.push(t),this.systems.sort((i,s)=>i.priority-s.priority),e.register(t),this.initialized&&t.initialize&&t.initialize(this._world.context)}removeSystem(t){Be(t,this.systems);const e=this._world.queryManager.getQuery(t.types);e&&(e.unregister(t),this._world.queryManager.maybeRemoveQuery(e))}initialize(){if(!this.initialized){this.initialized=!0;for(const t of this.systems)t.initialize&&t.initialize(this._world.context)}}updateSystems(t,e,i){const s=this.systems.filter(n=>n.systemType===t);for(const n of s)n.preupdate&&n.preupdate(e,i);for(const n of s){const o=this._world.queryManager.getQuery(n.types).getEntities(n.sort);if(e instanceof Oi)for(const h of o)h._initialize(e==null?void 0:e.engine);n.update(o,i)}for(const n of s)n.postupdate&&n.postupdate(e,i)}clear(){for(let t=this.systems.length-1;t>=0;t--)this.removeSystem(this.systems[t])}}class Sr{constructor(t){this.context=t,this.queryManager=new Cr(this),this.entityManager=new br(this),this.systemManager=new Ir(this)}update(t,e){t===Xt.Update&&this.entityManager.updateEntities(this.context,e),this.systemManager.updateSystems(t,this.context,e),this.entityManager.findEntitiesForRemoval(),this.entityManager.processComponentRemovals(),this.entityManager.processEntityRemovals()}add(t){t instanceof Rt&&this.entityManager.addEntity(t),t instanceof ce&&this.systemManager.addSystem(t)}remove(t,e=!0){t instanceof Rt&&this.entityManager.removeEntity(t,e),t instanceof ce&&this.systemManager.removeSystem(t)}clearEntities(){this.entityManager.clear()}clearSystems(){this.systemManager.clear()}}class Yt{static integrate(t,e,i,s){const n=s/1e3;e.vel.addEqual(i.scale(n,Yt._ACC)),t.pos.add(e.vel.scale(n,Yt._VEL),Yt._POS).addEqual(i.scale(.5*n*n,Yt._VEL_ACC)),e.angularVelocity+=e.torque*(1/e.inertia)*n;const o=t.rotation+e.angularVelocity*n;t.scale.add(e.scaleFactor.scale(n,this._SCALE_FACTOR),Yt._SCALE),t.get().setTransform(Yt._POS,o,Yt._SCALE)}}Yt._POS=new A(0,0),Yt._SCALE=new A(1,1),Yt._ACC=new A(0,0),Yt._VEL=new A(0,0),Yt._VEL_ACC=new A(0,0),Yt._SCALE_FACTOR=new A(0,0);class Tr extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.motion"],this.systemType=Xt.Update,this.priority=-1}update(t,e){let i,s;for(let n=0;n!e.isCanceled()),t.sort((e,i)=>{const s=this.distanceMap.get(e.id),n=this.distanceMap.get(i.id);return s-n});for(const e of t)this.solvePosition(e),this.solveVelocity(e);return this.postSolve(t),t}preSolve(t){for(const i of t){if(Math.abs(i.mtv.x)<1e-4&&Math.abs(i.mtv.y)<1e-4){i.cancel();continue}const s=_t.fromDirection(i.mtv),n=i.mtv.negate(),o=i.colliderA.worldPos.squareDistance(i.colliderB.worldPos);this.distanceMap.set(i.id,o),i.colliderA.events.emit("precollision",new bt(i.colliderA,i.colliderB,s,n,i)),i.colliderB.events.emit("precollision",new bt(i.colliderB,i.colliderA,_t.getOpposite(s),n.negate(),i))}}postSolve(t){var e,i;for(const s of t){if(s.isCanceled())continue;const n=s.colliderA,o=s.colliderB,h=(e=n.owner)===null||e===void 0?void 0:e.get(it),l=(i=o.owner)===null||i===void 0?void 0:i.get(it);if(h&&l&&(h.collisionType===q.Passive||l.collisionType===q.Passive))continue;const f=_t.fromDirection(s.mtv),p=s.mtv.negate();s.colliderA.events.emit("postcollision",new ze(s.colliderA,s.colliderB,f,p,s)),s.colliderB.events.emit("postcollision",new ze(s.colliderB,s.colliderA,_t.getOpposite(f),p.negate(),s))}}solvePosition(t){var e,i;if(!t.colliderA.bounds.overlaps(t.colliderB.bounds,1e-4)){t.cancel();return}if(Math.abs(t.mtv.x)<1e-4&&Math.abs(t.mtv.y)<1e-4){t.cancel();return}let n=t.mtv;const o=t.colliderA,h=t.colliderB,l=(e=o.owner)===null||e===void 0?void 0:e.get(it),f=(i=h.owner)===null||i===void 0?void 0:i.get(it);if(l&&f){if(l.collisionType===q.Passive||f.collisionType===q.Passive)return;l.collisionType===q.Active&&f.collisionType===q.Active&&(n=n.scale(.5)),l.collisionType===q.Active&&(l.globalPos.x-=n.x,l.globalPos.y-=n.y,o.update(l.transform.get())),f.collisionType===q.Active&&(f.globalPos.x+=n.x,f.globalPos.y+=n.y,h.update(f.transform.get()))}}solveVelocity(t){var e,i;if(t.isCanceled())return;const s=t.colliderA,n=t.colliderB,o=(e=s.owner)===null||e===void 0?void 0:e.get(it),h=(i=n.owner)===null||i===void 0?void 0:i.get(it);if(o&&h){if(o.collisionType===q.Passive||h.collisionType===q.Passive)return;const l=t.normal,f=l.negate();if(o.collisionType===q.Active&&o.vel.normalize().dot(f)<0){const p=l.scale(l.dot(o.vel.negate()));o.vel=o.vel.add(p)}if(h.collisionType===q.Active&&h.vel.normalize().dot(l)<0){const p=f.scale(f.dot(h.vel.negate()));h.vel=h.vel.add(p)}}}}class Rr{constructor(t,e,i){this.point=t,this.local=e,this.contact=i,this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.aToContact=new A(0,0),this.bToContact=new A(0,0),this.originalVelocityAndRestitution=0,this.update()}update(){var t,e;const i=(t=this.contact.colliderA.owner)===null||t===void 0?void 0:t.get(it),s=(e=this.contact.colliderB.owner)===null||e===void 0?void 0:e.get(it);if(i&&s){const n=this.contact.normal,o=this.contact.tangent;this.aToContact=this.point.sub(i.globalPos),this.bToContact=this.point.sub(s.globalPos);const h=this.aToContact.cross(n),l=this.bToContact.cross(n);this.normalMass=i.inverseMass+s.inverseMass+i.inverseInertia*h*h+s.inverseInertia*l*l;const f=this.aToContact.cross(o),p=this.bToContact.cross(o);this.tangentMass=i.inverseMass+s.inverseMass+i.inverseInertia*f*f+s.inverseInertia*p*p}return this}getRelativeVelocity(){var t,e;const i=(t=this.contact.colliderA.owner)===null||t===void 0?void 0:t.get(it),s=(e=this.contact.colliderB.owner)===null||e===void 0?void 0:e.get(it);if(i&&s){const n=i.vel.add(A.cross(i.angularVelocity,this.aToContact));return s.vel.add(A.cross(s.angularVelocity,this.bToContact)).sub(n)}return A.Zero}}class Br{constructor(){this.lastFrameContacts=new Map,this.idToContactConstraint=new Map}getContactConstraints(t){var e;return(e=this.idToContactConstraint.get(t))!==null&&e!==void 0?e:[]}solve(t){return this.preSolve(t),t=t.filter(e=>!e.isCanceled()),this.solveVelocity(t),this.solvePosition(t),this.postSolve(t),t}preSolve(t){var e,i,s;for(const h of t){if(Math.abs(h.mtv.x)<1e-4&&Math.abs(h.mtv.y)<1e-4){h.cancel();continue}const l=_t.fromDirection(h.mtv);h.colliderA.events.emit("precollision",new bt(h.colliderA,h.colliderB,l,h.mtv,h)),h.colliderA.events.emit("beforecollisionresolve",new Ji(h.colliderA,h.colliderB,l,h.mtv,h)),h.colliderB.events.emit("precollision",new bt(h.colliderB,h.colliderA,_t.getOpposite(l),h.mtv.negate(),h)),h.colliderB.events.emit("beforecollisionresolve",new Ji(h.colliderB,h.colliderA,_t.getOpposite(l),h.mtv.negate(),h)),h.matchAwake()}const o=Array.from(this.idToContactConstraint.keys());for(const h of t){const l=o.indexOf(h.id);l>-1&&o.splice(l,1);const f=(e=this.idToContactConstraint.get(h.id))!==null&&e!==void 0?e:[];let p=0;const v=h.colliderA.owner.get(it),w=h.colliderB.owner.get(it);if(v&&w)for(const y of h.points){const b=h.normal,k=h.tangent,D=y.sub(v.globalPos),C=y.sub(w.globalPos),E=D.cross(b),F=C.cross(b),U=v.inverseMass+w.inverseMass+v.inverseInertia*E*E+w.inverseInertia*F*F,j=D.cross(k),Y=C.cross(k),M=v.inverseMass+w.inverseMass+v.inverseInertia*j*j+w.inverseInertia*Y*Y;f[p]&&((s=(i=f[p])===null||i===void 0?void 0:i.point)===null||s===void 0?void 0:s.squareDistance(y))<4?(f[p].point=y,f[p].local=h.localPoints[p]):f[p]=new Rr(y,h.localPoints[p],h),f[p].aToContact=D,f[p].bToContact=C,f[p].normalMass=1/U,f[p].tangentMass=1/M;const rt=v.bounciness>w.bounciness?v.bounciness:w.bounciness,ct=h.normal.dot(f[p].getRelativeVelocity());f[p].originalVelocityAndRestitution=0,ct<-.1&&(f[p].originalVelocityAndRestitution=-rt*ct),p++}this.idToContactConstraint.set(h.id,f)}for(const h of o)this.idToContactConstraint.delete(h);if(Z.warmStart)this.warmStart(t);else for(const h of t){const l=this.getContactConstraints(h.id);for(const f of l)f.normalImpulse=0,f.tangentImpulse=0}}postSolve(t){for(const e of t){const i=e.colliderA.owner.get(it),s=e.colliderB.owner.get(it);if(i&&s){if(i.collisionType===q.Passive||s.collisionType===q.Passive)continue;i.updateMotion(),s.updateMotion()}const n=_t.fromDirection(e.mtv);e.colliderA.events.emit("postcollision",new ze(e.colliderA,e.colliderB,n,e.mtv,e)),e.colliderA.events.emit("aftercollisionresolve",new ji(e.colliderA,e.colliderB,n,e.mtv,e)),e.colliderB.events.emit("postcollision",new ze(e.colliderB,e.colliderA,_t.getOpposite(n),e.mtv.negate(),e)),e.colliderB.events.emit("aftercollisionresolve",new ji(e.colliderB,e.colliderA,_t.getOpposite(n),e.mtv.negate(),e))}this.lastFrameContacts.clear();for(const e of t)this.lastFrameContacts.set(e.id,e)}warmStart(t){var e,i,s;for(const n of t){const o=(e=n.colliderA.owner)===null||e===void 0?void 0:e.get(it),h=(i=n.colliderB.owner)===null||i===void 0?void 0:i.get(it);if(o&&h){const l=(s=this.idToContactConstraint.get(n.id))!==null&&s!==void 0?s:[];for(const f of l)if(Z.warmStart){const p=n.normal.scale(f.normalImpulse),v=n.tangent.scale(f.tangentImpulse),w=p.add(v);o.applyImpulse(f.point,w.negate()),h.applyImpulse(f.point,w)}else f.normalImpulse=0,f.tangentImpulse=0}}}solvePosition(t){var e,i,s;for(let n=0;nthis._processor.track(e),this._untrackCollider=e=>this._processor.untrack(e)}notify(t){if(ki(t)){const e=t.data.get(Ct);e.$colliderAdded.subscribe(this._trackCollider),e.$colliderRemoved.subscribe(this._untrackCollider);const i=e.get();i&&this._processor.track(i)}else{const e=t.data.get(Ct),i=e.get();e&&i&&this._processor.untrack(i)}}initialize(t){this._engine=t.engine}update(t,e){var i,s,n,o;if(!Z.enabled)return;let h=[];for(const v of t){const w=v.get(Ct),y=w==null?void 0:w.get();if(w&&(!((i=w.owner)===null||i===void 0)&&i.active)&&y)if(w.update(),y instanceof Mt){const b=y.getColliders();h=h.concat(b)}else h.push(y)}this._processor.update(h);const l=this._processor.broadphase(h,e);this._currentFrameContacts.clear();let f=this._processor.narrowphase(l,(o=(n=(s=this._engine)===null||s===void 0?void 0:s.debug)===null||n===void 0?void 0:n.stats)===null||o===void 0?void 0:o.currFrame);f=this.getSolver().solve(f);for(const v of f){const w=v.id.indexOf("|");if(w>0){const y=v.id.substring(w+1);this._currentFrameContacts.set(y,v)}else this._currentFrameContacts.set(v.id,v)}this.runContactStartEnd(),this._lastFrameContacts.clear(),this._lastFrameContacts=new Map(this._currentFrameContacts)}getSolver(){return Z.collisionResolutionStrategy===Ze.Realistic?this._realisticSolver:this._arcadeSolver}debug(t){this._processor.debug(t)}runContactStartEnd(){for(const[t,e]of this._currentFrameContacts)if(!this._lastFrameContacts.has(t)){const i=e.colliderA,s=e.colliderB,n=_t.fromDirection(e.mtv),o=_t.getOpposite(n);i.events.emit("collisionstart",new yi(i,s,n,e)),i.events.emit("contactstart",new Wi(i,s,n,e)),s.events.emit("collisionstart",new yi(s,i,o,e)),s.events.emit("contactstart",new Wi(s,i,o,e))}for(const[t,e]of this._lastFrameContacts)if(!this._currentFrameContacts.has(t)){const i=e.colliderA,s=e.colliderB;i.events.emit("collisionend",new bi(i,s)),i.events.emit("contactend",new Zi(i,s)),s.events.emit("collisionend",new bi(s,i)),s.events.emit("contactend",new Zi(s,i))}}}var Di;(function(r){r.Forward="forward",r.Backward="backward"})(Di||(Di={}));var de;(function(r){r.End="end",r.Loop="loop",r.PingPong="pingpong",r.Freeze="freeze"})(de||(de={}));const ga={Frame:"frame",Loop:"loop",End:"end"};class me extends jt{constructor(t){var e,i,s;super(t),this.events=new P,this.frames=[],this.strategy=de.Loop,this.frameDuration=100,this._idempotencyToken=-1,this._firstTick=!0,this._currentFrame=0,this._timeLeftInFrame=0,this._pingPongDirection=1,this._done=!1,this._playing=!0,this._speed=1,this._reversed=!1,this.frames=t.frames,this.speed=(e=t.speed)!==null&&e!==void 0?e:this.speed,this.strategy=(i=t.strategy)!==null&&i!==void 0?i:this.strategy,this.frameDuration=t.totalDuration?t.totalDuration/this.frames.length:(s=t.frameDuration)!==null&&s!==void 0?s:this.frameDuration,t.reverse&&this.reverse(),this.goToFrame(0)}clone(){return new me({frames:this.frames.map(t=>({...t})),frameDuration:this.frameDuration,speed:this.speed,reverse:this._reversed,strategy:this.strategy,...this.cloneGraphicOptions()})}get width(){const t=this.currentFrame;return t?Math.abs(t.graphic.width*this.scale.x):0}get height(){const t=this.currentFrame;return t?Math.abs(t.graphic.height*this.scale.y):0}static fromSpriteSheet(t,e,i,s=de.Loop){const n=t.sprites.length-1,o=e.filter(h=>h<0||h>n);return o.length&&me._LOGGER.warn(`Indices into SpriteSheet were provided that don't exist: ${o.join(",")} no frame will be shown`),new me({frames:t.sprites.filter((h,l)=>e.indexOf(l)>-1).map(h=>({graphic:h,duration:i})),strategy:s})}static fromSpriteSheetCoordinates(t){const{spriteSheet:e,frameCoordinates:i,durationPerFrameMs:s,speed:n,strategy:o,reverse:h}=t,l=s??100,f=[];for(const p of i){const{x:v,y:w,duration:y}=p,b=e.getSprite(v,w);b?f.push({graphic:b,duration:y??l}):me._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${v}, ${w}), please check your SpriteSheet to confirm that sprite exists`)}return new me({frames:f,strategy:o,speed:n,reverse:h})}get speed(){return this._speed}set speed(t){this._speed=Gt(Math.abs(t),0,1/0)}get currentFrame(){return this._currentFrame>=0&&this._currentFrame=this.frames.length&&(this._done=!0,this._currentFrame=this.frames.length,this.events.emit("end",this));break}case de.Freeze:{e=Gt(t+1,0,this.frames.length-1),e>=this.frames.length-1&&(this._done=!0,this.events.emit("end",this));break}case de.PingPong:{t+this._pingPongDirection>=this.frames.length&&(this._pingPongDirection=-1,this.events.emit("loop",this)),t+this._pingPongDirection<0&&(this._pingPongDirection=1,this.events.emit("loop",this)),e=t+this._pingPongDirection%this.frames.length;break}}return e}tick(t,e=0){this._idempotencyToken!==e&&(this._idempotencyToken=e,this._playing&&(this._firstTick&&(this._firstTick=!1,this.events.emit("frame",{...this.currentFrame,frameIndex:this.currentFrameIndex})),this._timeLeftInFrame-=t*this._speed,this._timeLeftInFrame<=0&&this.goToFrame(this._nextFrame())))}_drawImage(t,e,i){this.currentFrame&&this.currentFrame.graphic.draw(t,e,i)}}me._LOGGER=V.getInstance();class Fi extends jt{constructor(t){super(t),this.members=[],this.members=t.members,this._updateDimensions()}clone(){return new Fi({members:[...this.members],...this.cloneGraphicOptions()})}_updateDimensions(){let t=new J;for(const{graphic:e,pos:i}of this.members)t=e.localBounds.translate(i).combine(t);return this.width=t.width,this.height=t.height,t}get localBounds(){let t=new J;for(const{graphic:e,pos:i}of this.members)t=e.localBounds.translate(i).combine(t);return t}_isAnimationOrGroup(t){return t instanceof me||t instanceof Fi}tick(t,e){for(const i of this.members){const s=i.graphic;this._isAnimationOrGroup(s)&&s.tick(t,e)}}reset(){for(const t of this.members){const e=t.graphic;this._isAnimationOrGroup(e)&&e.reset()}}_preDraw(t,e,i){this._updateDimensions(),super._preDraw(t,e,i)}_drawImage(t,e,i){for(const s of this.members)t.save(),t.translate(e,i),s.graphic.draw(t,s.pos.x,s.pos.y),this.showDebug&&t.debug.drawRect(0,0,this.width,this.height),t.restore()}}function Mr(r){return class extends r{assign(t){for(const e in t)typeof this[e]!="function"&&(this[e]=t[e])}constructor(...t){super(...t),t.filter(function(i){return i!==void 0}).length===1&&t[0]&&typeof t[0]=="object"&&!(t[0]instanceof Array)&&this.assign(t[0])}}}var mi;(function(r){r[r.Circle=0]="Circle",r[r.Rectangle=1]="Rectangle"})(mi||(mi={}));class pa extends Rt{constructor(t,e,i,s,n,o,h,l,f,p){super(),this.position=new A(0,0),this.velocity=new A(0,0),this.acceleration=new A(0,0),this.particleRotationalVelocity=0,this.currentRotation=0,this.focus=null,this.focusAccel=0,this.opacity=1,this.beginColor=L.White,this.endColor=L.White,this.life=300,this.fadeFlag=!1,this._rRate=1,this._gRate=1,this._bRate=1,this._aRate=0,this._currentColor=L.White,this.emitter=null,this.particleSize=5,this.particleSprite=null,this.sizeRate=0,this.elapsedMultiplier=0,this.visible=!0,this.isOffscreen=!1;let v=t;if(v&&!(t instanceof kr)){const w=t;v=w.emitter,e=w.life,i=w.opacity,n=w.endColor,s=w.beginColor,o=w.position,h=w.velocity,l=w.acceleration,f=w.startSize,p=w.endSize}if(this.emitter=v,this.life=e||this.life,this.opacity=i||this.opacity,this.endColor=n||this.endColor.clone(),this.beginColor=s||this.beginColor.clone(),this._currentColor=this.beginColor.clone(),this.emitter.particleTransform===_i.Global){const w=this.emitter.transform.globalPos;this.position=(o||this.position).add(w),this.velocity=(h||this.velocity).rotate(this.emitter.transform.globalRotation)}else this.velocity=h||this.velocity,this.position=o||this.position;this.acceleration=l||this.acceleration,this._rRate=(this.endColor.r-this.beginColor.r)/this.life,this._gRate=(this.endColor.g-this.beginColor.g)/this.life,this._bRate=(this.endColor.b-this.beginColor.b)/this.life,this._aRate=this.opacity/this.life,this.startSize=f||0,this.endSize=p||0,this.endSize>0&&this.startSize>0&&(this.sizeRate=(this.endSize-this.startSize)/this.life,this.particleSize=this.startSize),this.addComponent(this.transform=new H),this.addComponent(this.graphics=new Ft),this.transform.pos=this.position,this.transform.rotation=this.currentRotation,this.transform.scale=R(1,1),this.particleSprite?(this.graphics.opacity=this.opacity,this.graphics.use(this.particleSprite)):(this.graphics.localBounds=J.fromDimension(this.particleSize,this.particleSize,A.Half),this.graphics.onPostDraw=w=>{w.save(),this.graphics.opacity=this.opacity;const y=this._currentColor.clone();y.a=1,w.debug.drawPoint(R(0,0),{color:y,size:this.particleSize}),w.restore()})}kill(){this.emitter.removeParticle(this)}update(t,e){if(this.life=this.life-e,this.elapsedMultiplier=this.elapsedMultiplier+e,this.life<0&&this.kill(),this.fadeFlag&&(this.opacity=Gt(this._aRate*this.life,1e-4,1)),this.startSize>0&&this.endSize>0&&(this.particleSize=Gt(this.sizeRate*e+this.particleSize,Math.min(this.startSize,this.endSize),Math.max(this.startSize,this.endSize))),this._currentColor.r=Gt(this._currentColor.r+this._rRate*e,0,255),this._currentColor.g=Gt(this._currentColor.g+this._gRate*e,0,255),this._currentColor.b=Gt(this._currentColor.b+this._bRate*e,0,255),this._currentColor.a=Gt(this.opacity,1e-4,1),this.focus){const i=this.focus.sub(this.position).normalize().scale(this.focusAccel).scale(e/1e3);this.velocity=this.velocity.add(i)}else this.velocity=this.velocity.add(this.acceleration.scale(e/1e3));this.position=this.position.add(this.velocity.scale(e/1e3)),this.particleRotationalVelocity&&(this.currentRotation=(this.currentRotation+this.particleRotationalVelocity*e/1e3)%(2*Math.PI)),this.transform.pos=this.position,this.transform.rotation=this.currentRotation,this.transform.scale=R(1,1),this.graphics.opacity=this.opacity}}class ms extends Mr(pa){constructor(t,e,i,s,n,o,h,l,f,p){super(t,e,i,s,n,o,h,l,f,p)}}var _i;(function(r){r.Global="global",r.Local="local"})(_i||(_i={}));class kr extends Kt{get opacity(){return super.graphics.opacity}set opacity(t){super.graphics.opacity=t}get particleSprite(){return this._sprite}set particleSprite(t){t&&(this._sprite=t)}constructor(t){var e,i;super({width:(e=t.width)!==null&&e!==void 0?e:0,height:(i=t.height)!==null&&i!==void 0?i:0}),this._particlesToEmit=0,this.numParticles=0,this.isEmitting=!0,this.particles=[],this.deadParticles=[],this.minVel=0,this.maxVel=0,this.acceleration=new A(0,0),this.minAngle=0,this.maxAngle=0,this.emitRate=1,this.particleLife=2e3,this.fadeFlag=!1,this.focus=null,this.focusAccel=null,this.startSize=null,this.endSize=null,this.minSize=5,this.maxSize=5,this.beginColor=L.White,this.endColor=L.White,this._sprite=null,this.emitterType=mi.Rectangle,this.radius=0,this.particleRotationalVelocity=0,this.randomRotation=!1,this.particleTransform=_i.Global;const{x:s,y:n,pos:o,isEmitting:h,minVel:l,maxVel:f,acceleration:p,minAngle:v,maxAngle:w,emitRate:y,particleLife:b,opacity:k,fadeFlag:D,focus:C,focusAccel:E,startSize:F,endSize:U,minSize:j,maxSize:Y,beginColor:M,endColor:rt,particleSprite:ct,emitterType:ft,radius:at,particleRotationalVelocity:It,particleTransform:qt,randomRotation:Wt,random:Zt}={...t};this.pos=o??R(s??0,n??0),this.isEmitting=h??this.isEmitting,this.minVel=l??this.minVel,this.maxVel=f??this.maxVel,this.acceleration=p??this.acceleration,this.minAngle=v??this.minAngle,this.maxAngle=w??this.maxAngle,this.emitRate=y??this.emitRate,this.particleLife=b??this.particleLife,this.opacity=k??this.opacity,this.fadeFlag=D??this.fadeFlag,this.focus=C??this.focus,this.focusAccel=E??this.focusAccel,this.startSize=F??this.startSize,this.endSize=U??this.endSize,this.minSize=j??this.minSize,this.maxSize=Y??this.maxSize,this.beginColor=M??this.beginColor,this.endColor=rt??this.endColor,this.particleSprite=ct??this.particleSprite,this.emitterType=ft??this.emitterType,this.radius=at??this.radius,this.particleRotationalVelocity=It??this.particleRotationalVelocity,this.randomRotation=Wt??this.randomRotation,this.particleTransform=qt??this.particleTransform,this.body.collisionType=q.PreventCollision,this.random=Zt??new Ii}removeParticle(t){this.deadParticles.push(t)}emitParticles(t){var e;for(let i=0;i1&&(this.emitParticles(Math.floor(this._particlesToEmit)),this._particlesToEmit=this._particlesToEmit-Math.floor(this._particlesToEmit)));for(let s=0;s{this._zHasChanged=!0},this._targetInterpolationTransform=new Je}get sortedTransforms(){return this._sortedTransforms}initialize(t){this._camera=t.camera,this._engine=t.engine}preupdate(){this._graphicsContext=this._engine.graphicsContext,this._zHasChanged&&(this._sortedTransforms.sort((t,e)=>t.z-e.z),this._zHasChanged=!1)}notify(t){if(ki(t)){const e=t.data.get(H);this._sortedTransforms.push(e),e.zIndexChanged$.subscribe(this._zIndexUpdate),this._zHasChanged=!0}else{const e=t.data.get(H);e.zIndexChanged$.unsubscribe(this._zIndexUpdate);const i=this._sortedTransforms.indexOf(e);i>-1&&this._sortedTransforms.splice(i,1)}}update(t,e){this._token++;let i;dt.checkAndClearCache(),this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext);for(const s of this._sortedTransforms){const n=s.owner;if(n.hasTag("ex.offscreen")||(i=n.get(Ft),!i.visible))continue;i.onPreTransformDraw&&i.onPreTransformDraw(this._graphicsContext,e),n.events.emit("pretransformdraw",new st(this._graphicsContext,e,n)),s.coordPlane===Nt.Screen&&this._graphicsContext.restore(),this._graphicsContext.save(),s.coordPlane===Nt.Screen&&this._graphicsContext.translate(this._engine.screen.contentArea.left,this._engine.screen.contentArea.top),i.update(e,this._token);const o=n.get(us);if(o){const l=A.One.sub(o.parallaxFactor),f=this._camera.drawPos.scale(l);this._graphicsContext.translate(f.x,f.y)}this._applyTransform(n),i.material&&(this._graphicsContext.material=i.material),i.onPreDraw&&i.onPreDraw(this._graphicsContext,e),n.events.emit("predraw",new et(this._graphicsContext,e,n));const h=n instanceof ms?n.opacity:1;this._graphicsContext.opacity*=i.opacity*h,this._drawGraphicsComponent(i),i.onPostDraw&&i.onPostDraw(this._graphicsContext,e),n.events.emit("postdraw",new K(this._graphicsContext,e,n)),this._graphicsContext.restore(),s.coordPlane===Nt.Screen&&(this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext)),i.onPostTransformDraw&&i.onPostTransformDraw(this._graphicsContext,e),n.events.emit("posttransformdraw",new ht(this._graphicsContext,e,n))}this._graphicsContext.restore()}_drawGraphicsComponent(t){var e,i;if(t.visible){const s=t.flipHorizontal,n=t.flipVertical;for(const o of t.layers.get())for(const{graphic:h,options:l}of o.graphics){let f=t.anchor,p=t.offset;l!=null&&l.anchor&&(f=l.anchor),l!=null&&l.offset&&(p=l.offset);const v=-h.width*f.x+p.x,w=-h.height*f.y+p.y,y=h.flipHorizontal,b=h.flipVertical;if((s||n)&&(h.flipHorizontal=s?!y:y,h.flipVertical=n?!b:b),h==null||h.draw(this._graphicsContext,v+o.offset.x,w+o.offset.y),(s||n)&&(h.flipHorizontal=y,h.flipVertical=b),!((e=this._engine)===null||e===void 0)&&e.isDebug&&this._engine.debug.graphics.showBounds){const k=R(v+o.offset.x,w+o.offset.y);if(h instanceof Fi)for(const D of h.members)(i=D.graphic)===null||i===void 0||i.localBounds.translate(k.add(D.pos)).draw(this._graphicsContext,this._engine.debug.graphics.boundsColor);else h==null||h.localBounds.translate(k).draw(this._graphicsContext,this._engine.debug.graphics.boundsColor)}}}}_applyTransform(t){const e=t.getAncestors();for(const i of e){const s=i==null?void 0:i.get(H),n=i==null?void 0:i.get(it);let o=s.get();if(n&&this._engine.fixedUpdateFps&&n.__oldTransformCaptured&&n.enableFixedUpdateInterpolate){const h=this._engine.currentFrameLagMs/(1e3/this._engine.fixedUpdateFps);o=ma(n.oldTransform,s.get(),h,this._targetInterpolationTransform)}s&&(this._graphicsContext.z=s.z,this._graphicsContext.translate(o.pos.x,o.pos.y),this._graphicsContext.scale(o.scale.x,o.scale.y),this._graphicsContext.rotate(o.rotation))}}}class Fr extends ce{constructor(){super(...arguments),this.types=["ex.transform"],this.systemType=Xt.Draw,this.priority=999}initialize(t){this._graphicsContext=t.engine.graphicsContext,this._camera=t.camera,this._engine=t.engine,this._collisionSystem=t.world.systemManager.get(nn)}update(t,e){var i;if(!this._engine.isDebug)return;const s=this._engine.debug.filter;let n,o;const h=this._engine.debug.entity;let l;const f=this._engine.debug.transform;let p;const v=this._engine.debug.motion;let w;const y=this._engine.debug.collider,b=this._engine.debug.physics;let k;const D=this._engine.debug.graphics;let C,E;const F=this._engine.debug.body,U=this._engine.debug.camera;for(const j of t){if(j.hasTag("offscreen")||j instanceof ms||s.useFilter&&(!(s.ids.length===0||s.ids.includes(j.id))||!(s.nameQuery===""||j.name.includes(s.nameQuery))))continue;let Y=A.Zero;const M=R(0,16);if(n=j.id,o=j.name,l=j.get(H),this._pushCameraTransform(l),this._graphicsContext.save(),this._graphicsContext.z=f.debugZIndex,this._applyTransform(j),l&&((f.showAll||f.showPosition)&&this._graphicsContext.debug.drawPoint(A.Zero,{size:4,color:f.positionColor}),(f.showAll||f.showPositionLabel)&&(this._graphicsContext.debug.drawText(`pos${l.pos.toString(2)}`,Y),Y=Y.add(M)),(f.showAll||f.showZIndex)&&(this._graphicsContext.debug.drawText(`z(${l.z.toFixed(1)})`,Y),Y=Y.add(M)),(h.showAll||h.showId)&&(this._graphicsContext.debug.drawText(`id(${n}) ${j.parent?"child of id("+((i=j.parent)===null||i===void 0?void 0:i.id)+")":""}`,Y),Y=Y.add(M)),(h.showAll||h.showName)&&(this._graphicsContext.debug.drawText(`name(${o})`,Y),Y=Y.add(M)),(f.showAll||f.showRotation)&&(this._graphicsContext.drawLine(A.Zero,A.fromAngle(l.rotation).scale(50).add(A.Zero),f.rotationColor,2),this._graphicsContext.debug.drawText(`rot deg(${En(l.rotation).toFixed(2)})`,Y),Y=Y.add(M)),(f.showAll||f.showScale)&&this._graphicsContext.drawLine(A.Zero,l.scale.add(A.Zero),f.scaleColor,2)),k=j.get(Ft),k&&(D.showAll||D.showBounds)&&k.localBounds.draw(this._graphicsContext,D.boundsColor),C=j.get(fs),C&&(C.useTransform||this._graphicsContext.restore(),C.draw(this._graphicsContext,this._engine.debug),C.useTransform||(this._graphicsContext.save(),this._applyTransform(j))),E=j.get(it),E&&((F.showAll||F.showCollisionGroup)&&(this._graphicsContext.debug.drawText(`collision group(${E.group.name})`,Y),Y=Y.add(M)),(F.showAll||F.showCollisionType)&&(this._graphicsContext.debug.drawText(`collision type(${E.collisionType})`,Y),Y=Y.add(M)),(F.showAll||F.showMass)&&(this._graphicsContext.debug.drawText(`mass(${E.mass})`,Y),Y=Y.add(M)),(F.showAll||F.showMotion)&&(this._graphicsContext.debug.drawText(`motion(${E.sleepMotion})`,Y),Y=Y.add(M)),(F.showAll||F.showSleeping)&&(this._graphicsContext.debug.drawText(`sleeping(${E.canSleep?E.sleeping:"cant sleep"})`,Y),Y=Y.add(M))),this._graphicsContext.restore(),this._graphicsContext.save(),this._graphicsContext.z=f.debugZIndex,p=j.get(yt),p&&((v.showAll||v.showVelocity)&&(this._graphicsContext.debug.drawText(`vel${p.vel.toString(2)}`,Y.add(l.globalPos)),this._graphicsContext.drawLine(l.globalPos,l.globalPos.add(p.vel),v.velocityColor,2),Y=Y.add(M)),(v.showAll||v.showAcceleration)&&this._graphicsContext.drawLine(l.globalPos,l.globalPos.add(p.acc),v.accelerationColor,2)),w=j.get(Ct),w){const rt=w.get();if((y.showAll||y.showGeometry)&&rt&&rt.debug(this._graphicsContext,y.geometryColor,{lineWidth:y.geometryLineWidth,pointSize:y.geometryPointSize}),y.showAll||y.showBounds){if(rt instanceof Mt){const ct=rt.getColliders();for(const ft of ct){const at=ft.bounds,It=R(at.left,at.top);this._graphicsContext.debug.drawRect(It.x,It.y,at.width,at.height,{color:y.boundsColor}),(y.showAll||y.showOwner)&&this._graphicsContext.debug.drawText(`owner id(${ft.owner.id})`,It)}w.bounds.draw(this._graphicsContext,y.boundsColor)}else if(rt){const ct=w.bounds,ft=R(ct.left,ct.top);this._graphicsContext.debug.drawRect(ft.x,ft.y,ct.width,ct.height,{color:y.boundsColor}),(y.showAll||y.showOwner)&&this._graphicsContext.debug.drawText(`owner id(${w.owner.id})`,ft)}}}this._graphicsContext.restore(),this._popCameraTransform(l)}if(this._graphicsContext.save(),this._camera.draw(this._graphicsContext),(b.showAll||b.showBroadphaseSpacePartitionDebug)&&this._collisionSystem.debug(this._graphicsContext),b.showAll||b.showCollisionContacts||b.showCollisionNormals)for(const[j,Y]of this._engine.debug.stats.currFrame.physics.contacts){if(b.showAll||b.showCollisionContacts)for(const M of Y.points)this._graphicsContext.debug.drawPoint(M,{size:5,color:b.collisionContactColor});if(b.showAll||b.showCollisionNormals)for(const M of Y.points)this._graphicsContext.debug.drawLine(M,Y.normal.scale(30).add(M),{color:b.collisionNormalColor})}this._graphicsContext.restore(),U&&(this._graphicsContext.save(),this._camera.draw(this._graphicsContext),(U.showAll||U.showFocus)&&this._graphicsContext.drawCircle(this._camera.pos,4,U.focusColor),(U.showAll||U.showZoom)&&this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`,this._camera.pos),this._graphicsContext.restore()),this._graphicsContext.flush()}_applyTransform(t){const e=t.getAncestors();for(const i of e){const s=i==null?void 0:i.get(H);s&&(this._graphicsContext.translate(s.pos.x,s.pos.y),this._graphicsContext.scale(s.scale.x,s.scale.y),this._graphicsContext.rotate(s.rotation))}}_pushCameraTransform(t){t.coordPlane===Nt.World&&(this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext))}_popCameraTransform(t){t.coordPlane===Nt.World&&this._graphicsContext.restore()}}class _s extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.pointer"],this.systemType=Xt.Update,this.priority=-1,this.overrideUseColliderShape=!1,this.overrideUseGraphicsBounds=!1,this.lastFrameEntityToPointers=new Map,this.currentFrameEntityToPointers=new Map,this._sortedTransforms=[],this._sortedEntities=[],this._zHasChanged=!1,this._zIndexUpdate=()=>{this._zHasChanged=!0}}initialize(t){this._engine=t.engine}preupdate(){this._receiver=this._engine.input.pointers,this._zHasChanged&&(this._sortedTransforms.sort((t,e)=>e.z-t.z),this._sortedEntities=this._sortedTransforms.map(t=>t.owner),this._zHasChanged=!1)}notify(t){if(ki(t)){const e=t.data.get(H);this._sortedTransforms.push(e),this._sortedEntities.push(e.owner),e.zIndexChanged$.subscribe(this._zIndexUpdate),this._zHasChanged=!0}else{const e=t.data.get(H);e.zIndexChanged$.unsubscribe(this._zIndexUpdate);const i=this._sortedTransforms.indexOf(e);i>-1&&(this._sortedTransforms.splice(i,1),this._sortedEntities.splice(i,1))}}entityCurrentlyUnderPointer(t,e){return this.currentFrameEntityToPointers.has(t.id)&&this.currentFrameEntityToPointers.get(t.id).includes(e)}entityWasUnderPointer(t,e){return this.lastFrameEntityToPointers.has(t.id)&&this.lastFrameEntityToPointers.get(t.id).includes(e)}entered(t,e){return this.entityCurrentlyUnderPointer(t,e)&&!this.lastFrameEntityToPointers.has(t.id)}left(t,e){return!this.currentFrameEntityToPointers.has(t.id)&&this.entityWasUnderPointer(t,e)}addPointerToEntity(t,e){if(!this.currentFrameEntityToPointers.has(t.id)){this.currentFrameEntityToPointers.set(t.id,[e]);return}const i=this.currentFrameEntityToPointers.get(t.id);this.currentFrameEntityToPointers.set(t.id,i.concat(e))}update(t){this._processPointerToEntity(this._sortedEntities),this._dispatchEvents(this._sortedEntities),this._receiver.update(),this.lastFrameEntityToPointers.clear(),this.lastFrameEntityToPointers=new Map(this.currentFrameEntityToPointers),this.currentFrameEntityToPointers.clear(),this._receiver.clear()}_processPointerToEntity(t){var e;let i,s,n,o;for(const h of t){if(i=h.get(H),o=(e=h.get(ui))!==null&&e!==void 0?e:new ui,s=h.get(Ct),s&&(o.useColliderShape||this.overrideUseColliderShape)){s.update();const l=s.get();if(l)for(const[f,p]of this._receiver.currentFramePointerCoords.entries())l.contains(i.coordPlane===Nt.World?p.worldPos:p.screenPos)&&this.addPointerToEntity(h,f)}if(n=h.get(Ft),n&&(o.useGraphicsBounds||this.overrideUseGraphicsBounds)){const l=n.localBounds.transform(i.get().matrix);for(const[f,p]of this._receiver.currentFramePointerCoords.entries())l.contains(i.coordPlane===Nt.World?p.worldPos:p.screenPos)&&this.addPointerToEntity(h,f)}}}_processDownAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameDown)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointerdown",i),this._receiver.isDragStart(i.pointerId)&&t.events.emit("pointerdragstart",i)),e.set(i.pointerId,i);return e}_processUpAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameUp)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointerup",i),this._receiver.isDragEnd(i.pointerId)&&t.events.emit("pointerdragend",i)),e.set(i.pointerId,i);return e}_processMoveAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameMove)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointermove",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragmove",i)),e.set(i.pointerId,i);return e}_processEnterLeaveAndEmit(t,e){for(const i of e){if(i.active&&t.active&&this.entered(t,i.pointerId)){t.events.emit("pointerenter",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragenter",i);break}if(i.active&&t.active&&(this.left(t,i.pointerId)||this.entityCurrentlyUnderPointer(t,i.pointerId)&&i.type==="up")){t.events.emit("pointerleave",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragleave",i);break}}}_processCancelAndEmit(t){for(const e of this._receiver.currentFrameCancel)e.active&&t.active&&this.entityCurrentlyUnderPointer(t,e.pointerId)&&t.events.emit("pointercancel",e)}_processWheelAndEmit(t){for(const e of this._receiver.currentFrameWheel)e.active&&t.active&&this.entityCurrentlyUnderPointer(t,0)&&t.events.emit("pointerwheel",e)}_dispatchEvents(t){const e=new Set(this.lastFrameEntityToPointers.keys()),i=new Set(this.currentFrameEntityToPointers.keys()),s=t.filter(l=>e.has(l.id)||i.has(l.id));let n,o,h;for(const l of s){h=this._processDownAndEmit(l),o=this._processUpAndEmit(l),n=this._processMoveAndEmit(l);const f=[...n.values(),...h.values(),...o.values()];this._processEnterLeaveAndEmit(l,f),this._processCancelAndEmit(l),this._processWheelAndEmit(l)}}}class Or extends ce{constructor(){super(...arguments),this.types=["ex.actions"],this.systemType=Xt.Update,this.priority=-1,this._actions=[]}notify(t){if(ki(t)){const e=t.data.get(fi);this._actions.push(e)}else{const e=t.data.get(fi),i=this._actions.indexOf(e);i>-1&&this._actions.splice(i,1)}}update(t,e){for(const i of this._actions)i.update(e)}}class vs extends ie{constructor(t){super(),this.type="ex.isometricentity",this.elevation=0,this.columns=t.columns,this.rows=t.rows,this.tileWidth=t.tileWidth,this.tileHeight=t.tileHeight}}class Ur extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.isometricentity"],this.systemType=Xt.Update,this.priority=99}update(t,e){let i,s;for(const n of t){i=n.get(H),s=n.get(vs);const h=Math.max(s.columns*s.tileWidth,s.rows*s.tileHeight)*s.elevation+i.pos.y;i.z=h}}}class Lr extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.graphics"],this.systemType=Xt.Draw,this.priority=-1}initialize(t){this._camera=t.camera,this._screen=t.engine.screen}update(t){this._worldBounds=this._screen.getWorldBounds();let e,i,s;for(const n of t){i=n.get(Ft),e=n.get(H),s=n.get(us);let o;if(s){const l=A.One.sub(s.parallaxFactor);o=this._camera.pos.scale(l)}const h=this._isOffscreen(e,i,o);h&&!n.hasTag("ex.offscreen")&&(n.events.emit("exitviewport",new Cs(n)),n.addTag("ex.offscreen")),!h&&n.hasTag("ex.offscreen")&&(n.events.emit("enterviewport",new Is(n)),n.removeTag("ex.offscreen"))}}_isOffscreen(t,e,i){if(t.coordPlane===Nt.World){let s=e.localBounds;i&&(s=s.translate(i));const n=s.transform(t.get().matrix);return!this._worldBounds.overlaps(n)}else return!1}}class zr{constructor(){this.collisionProcessor=new Xs}rayCast(t,e){return this.collisionProcessor.rayCast(t,e)}}const _a={Initialize:"initialize",Activate:"activate",Deactivate:"deactivate",PreUpdate:"preupdate",PostUpdate:"postupdate",PreDraw:"predraw",PostDraw:"postdraw",PreDebugDraw:"predebugdraw",PostDebugDraw:"postdebugdraw"};class Oi{get actors(){return this.world.entityManager.entities.filter(t=>t instanceof Kt)}get entities(){return this.world.entityManager.entities}get triggers(){return this.world.entityManager.entities.filter(t=>t instanceof wr)}get tileMaps(){return this.world.entityManager.entities.filter(t=>t instanceof dr)}get timers(){return this._timers}constructor(){this._logger=V.getInstance(),this.events=new P,this.camera=new xr,this.world=new Sr(this),this.physics=new zr,this._isInitialized=!1,this._timers=[],this._cancelQueue=[],this.world.add(new Or),this.world.add(new Tr),this.world.add(new nn(this.physics)),this.world.add(new _s),this.world.add(new Ur),this.world.add(new Lr),this.world.add(new Dr),this.world.add(new Fr)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}onInitialize(t){}onActivate(t){}onDeactivate(t){}onPreUpdate(t,e){}onPostUpdate(t,e){}onPreDraw(t,e){}onPostDraw(t,e){}_initializeChildren(){for(const t of this.entities)t._initialize(this.engine)}get isInitialized(){return this._isInitialized}_initialize(t){this.isInitialized||(this.engine=t,this.camera._initialize(t),this.world.systemManager.initialize(),this.onInitialize.call(this,t),this._initializeChildren(),this._logger.debug("Scene.onInitialize",this,t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0)}_activate(t){this._logger.debug("Scene.onActivate",this),this.onActivate(t)}_deactivate(t){this._logger.debug("Scene.onDeactivate",this),this.onDeactivate(t)}_preupdate(t,e){this.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}_predraw(t,e){this.emit("predraw",new et(t,e,this)),this.onPreDraw(t,e)}_postdraw(t,e){this.emit("postdraw",new K(t,e,this)),this.onPostDraw(t,e)}update(t,e){this._preupdate(t,e);let i,s;for(i=0,s=this._cancelQueue.length;i-1}add(t){if(this.emit("entityadded",{target:t}),this.world.add(t),t.scene=this,t instanceof Ve){Ds(this._timers,t)||this.addTimer(t);return}}transfer(t){let e;t instanceof Rt&&t.scene&&t.scene!==this&&(e=t.scene,t.scene.world.remove(t,!1)),t instanceof Ve&&t.scene&&(e=t.scene,t.scene.removeTimer(t)),e==null||e.emit("entityremoved",{target:t}),this.add(t)}remove(t){t instanceof Rt&&(this.emit("entityremoved",{target:t}),t.active&&t.kill(),this.world.remove(t)),t instanceof Ve&&this.removeTimer(t)}clear(t=!0){for(let e=this.entities.length-1;e>=0;e--)this.world.remove(this.entities[e],t);for(let e=this.timers.length-1;e>=0;e--)this.removeTimer(this.timers[e])}addTimer(t){return this._timers.push(t),t.scene=this,t}removeTimer(t){const e=this._timers.indexOf(t);return e!==-1&&this._timers.splice(e,1),t}cancelTimer(t){return this._cancelQueue.push(t),t}isTimerActive(t){return this._timers.indexOf(t)>-1&&!t.complete}isCurrentScene(){return this.engine?this.engine.currentScene===this:!1}_collectActorStats(t){const e=this.actors.filter(i=>i instanceof sn);for(const i of e)t.stats.currFrame.actors.ui++;for(const i of this.actors){t.stats.currFrame.actors.alive++;for(const s of i.children)cr(s)?t.stats.currFrame.actors.ui++:t.stats.currFrame.actors.alive++}}}var Ke;(function(r){r.Protanope="Protanope",r.Deuteranope="Deuteranope",r.Tritanope="Tritanope"})(Ke||(Ke={}));const va=`#version 300 es + `}}di.All=new di("Collide with all groups",-1,-1);class se{constructor(t,e){this.colliderA=t,this.colliderB=e,this.id=null,this.id=se.calculatePairHash(t.id,e.id)}static canCollide(t,e){var i,s;const n=(i=t==null?void 0:t.owner)===null||i===void 0?void 0:i.get(it),o=(s=e==null?void 0:e.owner)===null||s===void 0?void 0:s.get(it);return!(t.id===e.id||t.owner&&e.owner&&t.owner.id===e.owner.id||t.localBounds.hasZeroDimensions()||e.localBounds.hasZeroDimensions()||!n||!o||!n.group.canCollide(o.group)||n.collisionType===q.Fixed&&o.collisionType===q.Fixed||o.collisionType===q.PreventCollision||n.collisionType===q.PreventCollision||!n.active||!o.active)}get canCollide(){const t=this.colliderA,e=this.colliderB;return se.canCollide(t,e)}collide(){return this.colliderA.collide(this.colliderB)}hasCollider(t){return t===this.colliderA||t===this.colliderB}static calculatePairHash(t,e){return t.valuet.min&&t.max>this.min}getOverlap(t){return this.overlaps(t)?this.max>t.max?t.max-this.min:this.max-t.min:0}}class Xs{constructor(t){this.parent=t,this.parent=t||null,this.data=null,this.bounds=new J,this.left=null,this.right=null,this.height=0}isLeaf(){return!this.left&&!this.right}}class Ks{constructor(t=new J(-Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE)){this.worldBounds=t,this.root=null,this.nodes={}}_insert(t){if(this.root===null){this.root=t,this.root.parent=null;return}const e=t.bounds;let i=this.root;for(;!i.isLeaf();){const h=i.left,l=i.right,f=i.bounds.getPerimeter(),v=i.bounds.combine(e).getPerimeter(),w=2*v,y=2*(v-f);let b=0;const k=e.combine(h.bounds);let D,I;h.isLeaf()?b=k.getPerimeter()+y:(I=h.bounds.getPerimeter(),D=k.getPerimeter(),b=D-I+y);let E=0;const F=e.combine(l.bounds);if(l.isLeaf()?E=F.getPerimeter()+y:(I=l.bounds.getPerimeter(),D=F.getPerimeter(),E=D-I+y),w1)return o.left=s,o.parent=s.parent,s.parent=o,o.parent?o.parent.left===s?o.parent.left=o:o.parent.right=o:this.root=o,f.height>m.height?(o.right=f,s.right=m,m.parent=s,s.bounds=n.bounds.combine(m.bounds),o.bounds=s.bounds.combine(f.bounds),s.height=1+Math.max(n.height,m.height),o.height=1+Math.max(s.height,f.height)):(o.right=m,s.right=f,f.parent=s,s.bounds=n.bounds.combine(f.bounds),o.bounds=s.bounds.combine(m.bounds),s.height=1+Math.max(n.height,f.height),o.height=1+Math.max(s.height,m.height)),o;if(v<-1){if(n.left=s,n.parent=s.parent,s.parent=n,n.parent)if(n.parent.left===s)n.parent.left=n;else{if(n.parent.right!==s)throw"Error rotating Dynamic Tree";n.parent.right=n}else this.root=n;return h.height>l.height?(n.right=h,s.left=l,l.parent=s,s.bounds=o.bounds.combine(l.bounds),n.bounds=s.bounds.combine(h.bounds),s.height=1+Math.max(o.height,l.height),n.height=1+Math.max(s.height,h.height)):(n.right=l,s.left=h,h.parent=s,s.bounds=o.bounds.combine(h.bounds),n.bounds=s.bounds.combine(l.bounds),s.height=1+Math.max(o.height,h.height),n.height=1+Math.max(s.height,l.height)),n}return t}getHeight(){return this.root===null?0:this.root.height}query(t,e){const i=t.bounds,s=n=>{if(n&&n.bounds.overlaps(i))if(n.isLeaf()&&n.data!==t){if(e.call(t,n.data))return!0}else return s(n.left)||s(n.right);return!1};s(this.root)}rayCastQuery(t,e=1/0,i){const s=n=>{if(n&&n.bounds.rayCast(t,e))if(n.isLeaf()){if(i.call(t,n.data))return!0}else return s(n.left)||s(n.right);return!1};s(this.root)}getNodes(){const t=e=>e?[e].concat(t(e.left),t(e.right)):[];return t(this.root)}debug(t){const e=i=>{i&&(i.isLeaf()?i.bounds.draw(t,L.Green):i.bounds.draw(t,L.White),i.left&&e(i.left),i.right&&e(i.right))};e(this.root)}}class Se{constructor(t,e){this.pos=t,this.dir=e.normalize()}intersect(t){const e=t.begin.sub(this.pos);if(this.dir.cross(t.getSlope())===0&&e.cross(this.dir)!==0)return-1;const i=this.dir.cross(t.getSlope());if(i===0)return-1;const s=e.cross(t.getSlope())/i;if(s>=0){const n=e.cross(this.dir)/i/t.getLength();if(n>=0&&n<=1)return s}return-1}intersectPoint(t){const e=this.intersect(t);return e<0?null:this.getPoint(e)}getPoint(t){return this.pos.add(this.dir.scale(t))}}class qs{constructor(){this._dynamicCollisionTree=new Ks,this._pairs=new Set,this._collisionPairCache=[],this._colliders=[]}getColliders(){return this._colliders}rayCast(t,e){var i,s,n;const o=[],h=(i=e==null?void 0:e.maxDistance)!==null&&i!==void 0?i:1/0,l=e==null?void 0:e.collisionGroup,f=l?l.category:(s=e==null?void 0:e.collisionMask)!==null&&s!==void 0?s:di.All.category,m=(n=e==null?void 0:e.searchAllColliders)!==null&&n!==void 0?n:!1;return this._dynamicCollisionTree.rayCastQuery(t,h,v=>{const y=v.owner.get(it),b=(f&y.group.category)!==0;if(y!=null&&y.group&&!b)return!1;const k=v.rayCast(t,h);return!!(k&&(o.push({distance:k.sub(t.pos).distance(),point:k,collider:v,body:y}),!m))}),o}track(t){if(!t){j.getInstance().warn("Cannot track null collider");return}if(t instanceof Bt){const e=t.getColliders();for(const i of e)i.owner=t.owner,this._colliders.push(i),this._dynamicCollisionTree.trackCollider(i)}else this._colliders.push(t),this._dynamicCollisionTree.trackCollider(t)}untrack(t){if(!t){j.getInstance().warn("Cannot untrack a null collider");return}if(t instanceof Bt){const e=t.getColliders();for(const i of e){const s=this._colliders.indexOf(i);s!==-1&&this._colliders.splice(s,1),this._dynamicCollisionTree.untrackCollider(i)}}else{const e=this._colliders.indexOf(t);e!==-1&&this._colliders.splice(e,1),this._dynamicCollisionTree.untrackCollider(t)}}_pairExists(t,e){const i=se.calculatePairHash(t.id,e.id);return this._pairs.has(i)}broadphase(t,e,i){const s=e/1e3,n=t.filter(h=>{var l,f;const m=(l=h.owner)===null||l===void 0?void 0:l.get(it);return((f=h.owner)===null||f===void 0?void 0:f.active)&&m.collisionType!==q.PreventCollision});this._collisionPairCache=[],this._pairs.clear();let o;for(let h=0,l=n.length;h{if(!this._pairExists(o,f)&&se.canCollide(o,f)){const m=new se(o,f);this._pairs.add(m.id),this._collisionPairCache.push(m)}return!1});if(i&&(i.physics.pairs=this._collisionPairCache.length),Z.checkForFastBodies)for(const h of n){const l=h.owner.get(it);if(l.collisionType!==q.Active)continue;const f=l.vel.size*s+l.acc.size*.5*s*s,m=Math.min(h.bounds.height,h.bounds.width);if(Z.disableMinimumSpeedForFastBody||f>m/2){i&&i.physics.fastBodies++;const v=l.globalPos.sub(l.oldPos),w=h.center,y=h.getFurthestPoint(l.vel),b=y.sub(v),k=new Se(b,l.vel);k.pos=k.pos.add(k.dir.scale(-2*Z.surfaceEpsilon));let D,I=new A(1/0,1/0);if(this._dynamicCollisionTree.rayCastQuery(k,f+Z.surfaceEpsilon*2,E=>{if(!this._pairExists(h,E)&&se.canCollide(h,E)){const F=E.rayCast(k,f+Z.surfaceEpsilon*10);if(F){const U=F.sub(b);U.size0)for(const o of n)e.physics.contacts.set(o.id,o)}return e&&(e.physics.collisions+=i.length),i}update(t){let e=0;const i=t.length;for(let s=0;si.offset.addEqual(t.offset))):e=[t];for(const i of e)i.events.pipe(this.events),i.__compositeColliderId=this.id,this._colliders.push(i),this._collisionProcessor.track(i),this._dynamicAABBTree.trackCollider(i)}removeCollider(t){t.events.pipe(this.events),t.__compositeColliderId=null,Me(t,this._colliders),this._collisionProcessor.untrack(t),this._dynamicAABBTree.untrackCollider(t)}getColliders(){return this._colliders}get worldPos(){var t,e;return((e=(t=this._transform)===null||t===void 0?void 0:t.pos)!==null&&e!==void 0?e:A.Zero).add(this.offset)}get center(){var t,e;return((e=(t=this._transform)===null||t===void 0?void 0:t.pos)!==null&&e!==void 0?e:A.Zero).add(this.offset)}get bounds(){var t,e;const i=this.getColliders();return i.reduce((n,o)=>n.combine(o.bounds),(e=(t=i[0])===null||t===void 0?void 0:t.bounds)!==null&&e!==void 0?e:new J().translate(this.worldPos)).translate(this.offset)}get localBounds(){var t,e;const i=this.getColliders();return i.reduce((n,o)=>n.combine(o.localBounds),(e=(t=i[0])===null||t===void 0?void 0:t.localBounds)!==null&&e!==void 0?e:new J)}get axes(){const t=this.getColliders();let e=[];for(const i of t)e=e.concat(i.axes);return e}getFurthestPoint(t){const e=this.getColliders(),i=[];for(const o of e)i.push(o.getFurthestPoint(t));let s=i[0],n=-Number.MAX_VALUE;for(const o of i){const h=o.dot(t);h>n&&(s=o,n=h)}return s}getInertia(t){const e=this.getColliders();let i=0;for(const s of e)i+=s.getInertia(t);return i}collide(t){let e=[t];t instanceof Bt&&(e=t.getColliders());const i=[];for(const n of e)this._dynamicAABBTree.query(n,o=>(i.push(new se(n,o)),!1));let s=[];for(const n of i)s=s.concat(n.collide());return s}getClosestLineBetween(t){const e=this.getColliders(),i=[];if(t instanceof Bt){const s=t.getColliders();for(const n of e)for(const o of s){const h=n.getClosestLineBetween(o);h&&i.push(h)}}else for(const s of e){const n=t.getClosestLineBetween(s);n&&i.push(n)}if(i.length){let s=i[0].getLength(),n=i[0];for(const o of i){const h=o.getLength();he.clone()));return t.offset=this.offset.clone(),t}}class Ht{constructor(t,e){this.begin=t,this.end=e}get slope(){return(this.end.y-this.begin.y)/(this.end.x-this.begin.x)}get intercept(){return this.begin.y-this.slope*this.begin.x}normal(){return this._normal?this._normal:this._normal=this.end.sub(this.begin).normal()}dir(){return this._dir?this._dir:this._dir=this.end.sub(this.begin)}getPoints(){return[this.begin,this.end]}getSlope(){if(this._slope)return this._slope;const t=this.begin,e=this.end,i=t.distance(e);return this._slope=e.sub(t).scale(1/i)}getEdge(){const t=this.begin;return this.end.sub(t)}getLength(){if(this._length)return this._length;const t=this.begin,e=this.end,i=t.distance(e);return this._length=i}get midpoint(){return this.begin.add(this.end).scale(.5)}flip(){return new Ht(this.end,this.begin)}below(t){return(this.end.x-this.begin.x)*(t.y-this.begin.y)-(this.end.y-this.begin.y)*(t.x-this.begin.x)>=0}clip(t,e){let i=t;i=i.normalize();const s=i.dot(this.begin)-e,n=i.dot(this.end)-e,o=[];if(s<=0&&o.push(this.begin),n<=0&&o.push(this.end),s*n<0){const h=s/(s-n);o.push(this.begin.add(this.end.sub(this.begin).scale(h)))}return o.length!==2?null:new Ht(o[0],o[1])}distanceToPoint(t,e=!1){const i=t.x,s=t.y,n=this.getLength(),o=this.end.y-this.begin.y,h=this.end.x-this.begin.x,l=(o*i-h*s+this.end.x*this.begin.y-this.end.y*this.begin.x)/n;return e?l:Math.abs(l)}findVectorToPoint(t){const e=this.begin.sub(t),i=this.getSlope();return e.sub(i.scale(e.dot(i)))}findPoint(t=null,e=null){const i=this.slope,s=this.intercept;if(t!==null)return new A(t,i*t+s);if(e!==null)return new A((e-s)/i,e);throw new Error("You must provide an X or a Y value")}hasPoint(){let t,e=0;if(typeof arguments[0]=="number"&&typeof arguments[1]=="number")t=new A(arguments[0],arguments[1]),e=arguments[2]||0;else if(arguments[0]instanceof A)t=arguments[0],e=arguments[1]||0;else throw"Could not determine the arguments for Vector.hasPoint";const i=t.x-this.begin.x,s=t.y-this.begin.y,n=this.end.x-this.begin.x,o=this.end.y-this.begin.y,h=i*o-s*n;return Math.abs(h)>e?!1:Math.abs(n)>=Math.abs(o)?n>0?this.begin.x<=t.x&&t.x<=this.end.x:this.end.x<=t.x&&t.x<=this.begin.x:o>0?this.begin.y<=t.y&&t.y<=this.end.y:this.end.y<=t.y&&t.y<=this.begin.y}}function ss(r,t,e,i){const s=r.sub(e),n=t.dot(t),o=t.dot(i),h=i.dot(i),l=t.dot(s),f=i.dot(s),m=n*h-o*o;let v=m,w=m;if(m===0||m<=.01){const k=l/o;return new Ht(r,e.add(i.scale(k)))}let y=o*f-h*l,b=n*f-o*l;return y<0?(y=0,b=f,w=h):y>v&&(y=v,b=f+o,w=h),b<0?(b=0,-l<0?y=0:-l>n?y=v:(y=-l,v=n)):b>w&&(b=w,-l+o<0?y=0:-l+o>n?y=v:(y=-l+o,v=n)),y=Math.abs(y)<.001?0:y/v,b=Math.abs(b)<.001?0:b/w,new Ht(r.add(t.scale(y)),e.add(i.scale(b)))}const me={PolygonPolygonClosestLine(r,t){const e=t.worldPos,i=e.sub(r.worldPos),s=i.negate(),n=new Se(r.worldPos,i),o=new Se(e,s),h=r.rayCast(n).add(n.dir.scale(.1)),l=t.rayCast(o).add(o.dir.scale(.1)),f=r.getClosestFace(h),m=t.getClosestFace(l),v=f.face.begin,w=f.face.getEdge(),y=m.face.begin,b=m.face.getEdge();return ss(v,w,y,b)},PolygonEdgeClosestLine(r,t){const i=t.worldPos.sub(r.worldPos),s=new Se(r.worldPos,i),n=r.rayCast(s).add(s.dir.scale(.1)),o=r.getClosestFace(n),h=o.face.begin,l=o.face.getEdge(),f=t.asLine(),m=f.begin,v=f.getEdge();return ss(h,l,m,v)},PolygonCircleClosestLine(r,t){const e=t.worldPos,i=e.sub(r.worldPos),s=new Se(r.worldPos,i.normalize()),n=r.rayCast(s).add(s.dir.scale(.1)),o=r.getClosestFace(n),h=o.face.begin,l=o.face.getEdge();let f=(l.x*(e.x-h.x)+l.y*(e.y-h.y))/(l.x*l.x+l.y*l.y);f>1?f=1:f<0&&(f=0);const m=Math.sqrt(Math.pow(h.x+l.x*f-e.x,2)+Math.pow(h.y+l.y*f-e.y,2))-t.radius,v=(h.x+l.x*f-e.x)*t.radius/(t.radius+m),w=(h.y+l.y*f-e.y)*t.radius/(t.radius+m);return new Ht(l.scale(f).add(h),new A(e.x+v,e.y+w))},CircleCircleClosestLine(r,t){const i=t.worldPos.sub(r.worldPos),n=r.worldPos.sub(t.worldPos),o=new Se(r.worldPos,i),h=new Se(t.worldPos,n),l=r.rayCast(o),f=t.rayCast(h);return new Ht(l,f)},CircleEdgeClosestLine(r,t){const e=r.worldPos,i=t.asLine(),s=i.begin,n=i.getEdge(),o=s,h=n;let l=(h.x*(e.x-o.x)+h.y*(e.y-o.y))/(h.x*h.x+h.y*h.y);l>1?l=1:l<0&&(l=0);const f=Math.sqrt(Math.pow(o.x+h.x*l-e.x,2)+Math.pow(o.y+h.y*l-e.y,2))-r.radius,m=(o.x+h.x*l-e.x)*r.radius/(r.radius+f),v=(o.y+h.y*l-e.y)*r.radius/(r.radius+f);return new Ht(h.scale(l).add(o),new A(e.x+m,e.y+v))},EdgeEdgeClosestLine(r,t){const e=r.asLine(),i=e.begin,s=e.getEdge(),n=i,o=s,h=t.asLine(),l=h.begin,f=h.getEdge();return ss(n,o,l,f)}};class kt extends De{get worldPos(){return this._globalMatrix.getPosition()}get radius(){var t;const e=this._transform,i=(t=e==null?void 0:e.globalScale)!==null&&t!==void 0?t:A.One;return this._naturalRadius*Math.min(i.x,i.y)}set radius(t){var e;const i=this._transform,s=(e=i==null?void 0:i.globalScale)!==null&&e!==void 0?e:A.One;this._naturalRadius=t/Math.min(s.x,s.y)}constructor(t){super(),this.offset=A.Zero,this._globalMatrix=Et.identity(),this.offset=t.offset||A.Zero,this.radius=t.radius||0,this._globalMatrix.translate(this.offset.x,this.offset.y)}clone(){return new kt({offset:this.offset.clone(),radius:this.radius})}get center(){return this._globalMatrix.getPosition()}contains(t){var e,i;return((i=(e=this._transform)===null||e===void 0?void 0:e.pos)!==null&&i!==void 0?i:this.offset).distance(t)<=this.radius}rayCast(t,e=1/0){const i=this.center,s=t.dir,n=t.pos,o=Math.sqrt(Math.pow(s.dot(n.sub(i)),2)-Math.pow(n.sub(i).distance(),2)+Math.pow(this.radius,2));if(o<0)return null;{let h=0;if(o===0)return h=-s.dot(n.sub(i)),h>0&&h=0&&m.push(l),f>=0&&m.push(f);const v=Math.min(...m);return v<=e?t.getPoint(v):null}}}getClosestLineBetween(t){if(t instanceof kt)return me.CircleCircleClosestLine(this,t);if(t instanceof Pt)return me.PolygonCircleClosestLine(t,this).flip();if(t instanceof jt)return me.CircleEdgeClosestLine(this,t).flip();throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCircleCircle(this,t);if(t instanceof Pt)return le.CollideCirclePolygon(this,t);if(t instanceof jt)return le.CollideCircleEdge(this,t);throw new Error(`Circle could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){return this.center.add(t.normalize().scale(this.radius))}getFurthestLocalPoint(t){return t.normalize().scale(this.radius)}get bounds(){var t,e,i;const s=this._transform,n=(t=s==null?void 0:s.globalScale)!==null&&t!==void 0?t:A.One,o=(e=s==null?void 0:s.globalRotation)!==null&&e!==void 0?e:0,h=(i=s==null?void 0:s.globalPos)!==null&&i!==void 0?i:A.Zero;return new J(this.offset.x-this._naturalRadius,this.offset.y-this._naturalRadius,this.offset.x+this._naturalRadius,this.offset.y+this._naturalRadius).rotate(o).scale(n).translate(h)}get localBounds(){return new J(this.offset.x-this._naturalRadius,this.offset.y-this._naturalRadius,this.offset.x+this._naturalRadius,this.offset.y+this._naturalRadius)}get axes(){return[]}getInertia(t){return t*this.radius*this.radius/2}update(t){var e;this._transform=t,((e=t.matrix)!==null&&e!==void 0?e:this._globalMatrix).clone(this._globalMatrix),this._globalMatrix.translate(this.offset.x,this.offset.y)}project(t){const e=[],s=this.center.dot(t);return e.push(s),e.push(s+this.radius),e.push(s-this.radius),new Pi(Math.min.apply(Math,e),Math.max.apply(Math,e))}debug(t,e,i){var s,n,o,h;const{lineWidth:l}={lineWidth:1,...i},f=this._transform,m=(s=f==null?void 0:f.globalScale)!==null&&s!==void 0?s:A.One,v=(n=f==null?void 0:f.globalRotation)!==null&&n!==void 0?n:0,w=(o=f==null?void 0:f.globalPos)!==null&&o!==void 0?o:A.Zero;t.save(),t.translate(w.x,w.y),t.rotate(v),t.scale(m.x,m.y),t.drawCircle((h=this.offset)!==null&&h!==void 0?h:A.Zero,this._naturalRadius,L.Transparent,e,l),t.restore()}}class Ve{constructor(t,e,i,s,n,o,h,l){var f,m;this._canceled=!1,this.colliderA=t,this.colliderB=e,this.mtv=i,this.normal=s,this.tangent=n,this.points=o,this.localPoints=h,this.info=l,this.id=se.calculatePairHash(t.id,e.id),(t.__compositeColliderId||e.__compositeColliderId)&&(this.id+="|"+se.calculatePairHash((f=t.__compositeColliderId)!==null&&f!==void 0?f:t.id,(m=e.__compositeColliderId)!==null&&m!==void 0?m:e.id))}matchAwake(){const t=this.colliderA.owner.get(it),e=this.colliderB.owner.get(it);t&&e&&t.sleeping!==e.sleeping&&(t.sleeping&&t.collisionType!==q.Fixed&&e.sleepMotion>=Z.wakeThreshold&&t.setSleeping(!1),e.sleeping&&e.collisionType!==q.Fixed&&t.sleepMotion>=Z.wakeThreshold&&e.setSleeping(!1))}isCanceled(){return this._canceled}cancel(){this._canceled=!0}}class $s{static findPolygonPolygonSeparation(t,e){let i=-Number.MAX_VALUE,s=null,n=null,o=-1,h=null;const l=t.getSides(),f=t.getLocalSides();for(let m=0;mi&&(i=b,s=v,n=w,o=m,h=y)}return{collider:t,separation:n?i:99,axis:n,side:s,localSide:f[o],sideId:o,point:h,localPoint:n?e.getFurthestLocalPoint(n.negate()):null}}static findCirclePolygonSeparation(t,e){const i=e.axes,n=e.center.sub(t.worldPos),o=e.getFurthestPoint(n.negate());i.push(o.sub(t.worldPos).normalize());let h=Number.MAX_VALUE,l=null,f=-1;for(let m=0;ms)return[];const o=s-n,h=i.sub(e).normalize(),l=h.perpendicular(),f=h.scale(o),m=r.getFurthestPoint(h),v=r.getFurthestLocalPoint(h),w={collider:r,separation:o,axis:h,point:m};return[new Ve(r,t,f,h,l,[m],[v],w)]},CollideCirclePolygon(r,t){var e,i;let s=$s.findCirclePolygonSeparation(r,t);if(!s)return[];s=s.dot(t.center.sub(r.center))<0?s.negate():s;const o=r.getFurthestPoint(s),l=((i=(e=r.owner)===null||e===void 0?void 0:e.get(Y))!==null&&i!==void 0?i:new Y).applyInverse(o),f=s.normalize(),m={collider:r,separation:-s.size,axis:f,point:o,localPoint:l,side:t.findSide(f.negate()),localSide:t.findLocalSide(f.negate())};return[new Ve(r,t,s,f,f.perpendicular(),[o],[l],m)]},CollideCircleEdge(r,t){const e=r.center,i=t.asLine(),s=i.end.sub(i.begin),n=s.dot(i.end.sub(e)),o=s.dot(e.sub(i.begin)),h=t.asLine(),l=t.asLocalLine();if(o<=0){const I=i.begin.sub(e),E=I.dot(I);if(E>r.radius*r.radius)return[];const F=I.normalize(),U=r.radius-Math.sqrt(E),V={collider:r,separation:U,axis:F,point:h.begin,side:h,localSide:l};return[new Ve(r,t,F.scale(U),F,F.perpendicular(),[h.begin],[l.begin],V)]}if(n<=0){const I=i.end.sub(e),E=I.dot(I);if(E>r.radius*r.radius)return[];const F=I.normalize(),U=r.radius-Math.sqrt(E),V={collider:r,separation:U,axis:F,point:h.end,side:h,localSide:l};return[new Ve(r,t,F.scale(U),F,F.perpendicular(),[h.end],[l.end],V)]}const f=s.dot(s),m=i.begin.scale(n).add(i.end.scale(o)).scale(1/f),v=e.sub(m),w=v.dot(v);if(w>r.radius*r.radius)return[];let y=s.perpendicular();y.dot(e.sub(i.begin))<0&&(y.x=-y.x,y.y=-y.y),y=y.normalize();const b=r.radius-Math.sqrt(w),k=y.scale(b),D={collider:r,separation:b,axis:y,point:m,side:h,localSide:l};return[new Ve(r,t,k,y.negate(),y.negate().perpendicular(),[m],[m.sub(t.worldPos)],D)]},CollideEdgeEdge(){return[]},CollidePolygonEdge(r,t){var e;const i=r.center,n=t.center.sub(i).normalize(),o=new Pt({points:[t.begin,t.end,t.end.add(n.scale(100)),t.begin.add(n.scale(100))],offset:t.offset});o.owner=t.owner,((e=t.owner)===null||e===void 0?void 0:e.get(Y))&&o.update(t.owner.get(Y).get());const l=this.CollidePolygonPolygon(r,o);return l.length&&(l[0].colliderB=t,l[0].id=se.calculatePairHash(r.id,t.id)),l},CollidePolygonPolygon(r,t){var e,i,s,n;const o=$s.findPolygonPolygonSeparation(r,t);if(o.separation>0)return[];const h=$s.findPolygonPolygonSeparation(t,r);if(h.separation>0)return[];const l=o.separation>h.separation?o:h,m=(l.collider===r?t:r).findSide(l.axis.negate()),v=l.side,w=v.dir().normalize(),y=m.clip(w.negate(),-w.dot(v.begin));let b=null;if(y&&(b=y.clip(w,w.dot(v.end))),b){const k=b.getPoints().filter(F=>v.below(F));let D=l.axis,I=D.perpendicular();t.center.sub(r.center).dot(D)<0&&(D=D.negate(),I=D.perpendicular());let E=[];if(l.collider===r){const F=(i=(e=t.owner)===null||e===void 0?void 0:e.get(Y))!==null&&i!==void 0?i:new Y;E=k.map(U=>F.applyInverse(U))}else{const F=(n=(s=r.owner)===null||s===void 0?void 0:s.get(Y))!==null&&n!==void 0?n:new Y;E=k.map(U=>F.applyInverse(U))}return[new Ve(r,t,D.scale(-l.separation),D,I,k,E,l)]}return[]},FindContactSeparation(r,t){var e,i,s,n;const o=r.colliderA,h=(i=(e=r.colliderA.owner)===null||e===void 0?void 0:e.get(Y))!==null&&i!==void 0?i:new Y,l=r.colliderB,f=(n=(s=r.colliderB.owner)===null||s===void 0?void 0:s.get(Y))!==null&&n!==void 0?n:new Y;if(o instanceof kt&&l instanceof kt){const m=o.radius+l.radius,v=h.pos.distance(f.pos);return-(m-v)}if(o instanceof Pt&&l instanceof Pt&&r.info.localSide){let m,v;return r.info.collider===o?(m=new Ht(h.apply(r.info.localSide.begin),h.apply(r.info.localSide.end)),v=f.apply(t)):(m=new Ht(f.apply(r.info.localSide.begin),f.apply(r.info.localSide.end)),v=h.apply(t)),m.distanceToPoint(v,!0)}if(o instanceof Pt&&l instanceof kt||l instanceof Pt&&o instanceof kt){const m=h.apply(t);if(r.info.side)return r.info.side.distanceToPoint(m,!0)}if(o instanceof jt&&l instanceof Pt||l instanceof jt&&o instanceof Pt){let m;if(r.info.collider===o?m=f.apply(t):m=h.apply(t),r.info.side)return r.info.side.distanceToPoint(m,!0)}if(o instanceof kt&&l instanceof jt||l instanceof kt&&o instanceof jt){const m=f.apply(t);let v;o instanceof kt&&(v=o.getFurthestPoint(r.normal));const w=m.distance(v);if(r.info.side)return w>0?-w:0}return 0}};class jt extends De{constructor(t){var e;super(),this._globalMatrix=Et.identity(),this.begin=t.begin||A.Zero,this.end=t.end||A.Zero,this.offset=(e=t.offset)!==null&&e!==void 0?e:A.Zero}clone(){return new jt({begin:this.begin.clone(),end:this.end.clone()})}get worldPos(){var t;const e=this._transform;return(t=e==null?void 0:e.globalPos.add(this.offset))!==null&&t!==void 0?t:this.offset}get center(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return t.average(e)}_getTransformedBegin(){return this._globalMatrix.multiply(this.begin)}_getTransformedEnd(){return this._globalMatrix.multiply(this.end)}getSlope(){const t=this._getTransformedBegin(),e=this._getTransformedEnd(),i=t.distance(e);return e.sub(t).scale(1/i)}getLength(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return t.distance(e)}contains(){return!1}rayCast(t,e=1/0){const i=this._getTransformedBegin().sub(t.pos);if(t.dir.cross(this.getSlope())===0&&i.cross(t.dir)!==0)return null;const s=t.dir.cross(this.getSlope());if(s===0)return null;const n=i.cross(this.getSlope())/s;if(n>=0&&n<=e){const o=i.cross(t.dir)/s/this.getLength();if(o>=0&&o<=1)return t.getPoint(n)}return null}getClosestLineBetween(t){if(t instanceof kt)return me.CircleEdgeClosestLine(t,this);if(t instanceof Pt)return me.PolygonEdgeClosestLine(t,this).flip();if(t instanceof jt)return me.EdgeEdgeClosestLine(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCircleEdge(t,this);if(t instanceof Pt)return le.CollidePolygonEdge(t,this);if(t instanceof jt)return le.CollideEdgeEdge();throw new Error(`Edge could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){const e=this._getTransformedBegin(),i=this._getTransformedEnd();return t.dot(e)>0?e:i}_boundsFromBeginEnd(t,e,i=10){return new J(Math.min(t.x,e.x)-i,Math.min(t.y,e.y)-i,Math.max(t.x,e.x)+i,Math.max(t.y,e.y)+i)}get bounds(){const t=this._getTransformedBegin(),e=this._getTransformedEnd();return this._boundsFromBeginEnd(t,e)}get localBounds(){return this._boundsFromBeginEnd(this.begin,this.end)}asLine(){return new Ht(this._getTransformedBegin(),this._getTransformedEnd())}asLocalLine(){return new Ht(this.begin,this.end)}get axes(){const e=this._getTransformedEnd().sub(this._getTransformedBegin()).normal(),i=[];return i.push(e),i.push(e.negate()),i.push(e.normal()),i.push(e.normal().negate()),i}getInertia(t){const e=this.end.sub(this.begin).distance()/2;return t*e*e}update(t){var e;this._transform=t,((e=t.matrix)!==null&&e!==void 0?e:this._globalMatrix).clone(this._globalMatrix),this._globalMatrix.translate(this.offset.x,this.offset.y)}project(t){const e=[],i=[this._getTransformedBegin(),this._getTransformedEnd()],s=i.length;for(let n=0;nMath.PI&&(f-=Math.PI*2),h===0){if(f===0)return!1;n=f>0?1:-1}else if(n*f<=0)return!1;o+=f}return Math.abs(Math.round(o/(Math.PI*2)))===1}tessellate(){const t=[];for(let e=1;eDt.Polygon(e)))}triangulate(){if(this.points.length<3)throw Error("Invalid polygon");const t=[],e=[...this.points].reverse();let i=e.length;function s(v){return v===0?i-1:v-1}function n(v){return v===i-1?0:v+1}function o(v){const w=s(v),y=n(v),b=e[w],k=e[v],D=e[y],I=b.sub(k),E=D.sub(k);return!(I.cross(E)<0)}const h=e.map((v,w)=>o(w));function l(v,w,y,b){const k=y.sub(w),D=b.sub(y),I=w.sub(b),E=v.sub(w),F=v.sub(y),U=v.sub(b),V=k.cross(E),W=D.cross(F),M=I.cross(U);return!(V>0||W>0||M>0)}function f(){for(let v=0;v3;){const v=f();m(v);for(let w=0;wDt.Polygon(v,A.Zero,!0)))}clone(){return new Pt({offset:this.offset.clone(),points:this.points.map(t=>t.clone())})}get worldPos(){return this._transform?this._transform.pos.add(this.offset):this.offset}get center(){return this.bounds.center}_calculateTransformation(){const t=this.points,e=t.length;this._transformedPoints.length=0;for(let i=0;is&&(i=o,s=l)}return i}findLocalSide(t){const e=this.getLocalSides();let i=e[0],s=-Number.MAX_VALUE;for(let n=0;ns&&(i=o,s=l)}return i}get axes(){const t=[],e=this.getSides();for(let i=0;i=0?s+1:s},0)%2!==0}getClosestLineBetween(t){if(t instanceof kt)return me.PolygonCircleClosestLine(this,t);if(t instanceof Pt)return me.PolygonPolygonClosestLine(this,t);if(t instanceof jt)return me.PolygonEdgeClosestLine(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}collide(t){if(t instanceof kt)return le.CollideCirclePolygon(t,this);if(t instanceof Pt)return le.CollidePolygonPolygon(this,t);if(t instanceof jt)return le.CollidePolygonEdge(this,t);throw new Error(`Polygon could not collide with unknown CollisionShape ${typeof t}`)}getFurthestPoint(t){const e=this.getTransformedPoints();let i=null,s=-Number.MAX_VALUE;for(let n=0;ns&&(s=o,i=e[n])}return i}getFurthestLocalPoint(t){const e=this.points;let i=e[0],s=-Number.MAX_VALUE;for(let n=0;ns&&(s=o,i=e[n])}return i}getClosestFace(t){const e=this.getSides();let i=Number.POSITIVE_INFINITY,s=-1,n=-1;for(let o=0;o=0&&l=0?t.getPoint(n):null}project(t){const e=this.getTransformedPoints(),i=e.length;let s=Number.MAX_VALUE,n=-Number.MAX_VALUE;for(let o=0;o=t?new Bt([Dt.Circle(t/2,R(0,-e/2+t/2).add(i)),Dt.Box(t,e-t,A.Half,i),Dt.Circle(t/2,R(0,e/2-t/2).add(i))]):new Bt([Dt.Circle(e/2,R(-t/2+e/2,0).add(i)),Dt.Box(t-e,e,A.Half,i),Dt.Circle(e/2,R(t/2-e/2,0).add(i))])}}class Ct extends ie{constructor(t){super(),this.type="ex.collider",this.events=new T,this.$colliderAdded=new ge,this.$colliderRemoved=new ge,this.set(t)}get(){return this._collider}set(t){return this.clear(),t&&(this._collider=t,this._collider.owner=this.owner,t.events.pipe(this.events),this.$colliderAdded.notifyAll(t),this.update()),t}clear(){this._collider&&(this._collider.events.unpipe(this.events),this.$colliderRemoved.notifyAll(this._collider),this._collider.owner=null,this._collider=null)}clone(){return new Ct(this._collider.clone())}get bounds(){var t,e;return(e=(t=this._collider)===null||t===void 0?void 0:t.bounds)!==null&&e!==void 0?e:new J}get localBounds(){var t,e;return(e=(t=this._collider)===null||t===void 0?void 0:t.localBounds)!==null&&e!==void 0?e:new J}update(){var t;const e=(t=this.owner)===null||t===void 0?void 0:t.get(Y);this._collider&&(this._collider.owner=this.owner,e&&this._collider.update(e.get()))}collide(t){let e=this._collider,i=t._collider;if(!e||!i)return[];let s=!1;if(i instanceof Bt&&(e=i,i=this._collider,s=!0),this._collider){const n=e.collide(i);return n?(s&&n.forEach(o=>{o.mtv=o.mtv.negate(),o.normal=o.normal.negate(),o.tangent=o.normal.perpendicular(),o.colliderA=this._collider,o.colliderB=t._collider}),n):[]}return[]}onAdd(t){this._collider&&this.update(),this.events.on("precollision",e=>{const i=e;t.events.emit("precollision",new bt(i.target.owner,i.other.owner,i.side,i.intersection,i.contact)),t instanceof Xt&&t.onPreCollisionResolve(i.target,i.other,i.side,i.contact)}),this.events.on("postcollision",e=>{const i=e;t.events.emit("postcollision",new ze(i.target.owner,i.other.owner,i.side,i.intersection,i.contact)),t instanceof Xt&&t.onPostCollisionResolve(i.target,i.other,i.side,i.contact)}),this.events.on("collisionstart",e=>{const i=e;t.events.emit("collisionstart",new yi(i.target.owner,i.other.owner,i.side,i.contact)),t instanceof Xt&&t.onCollisionStart(i.target,i.other,i.side,i.contact)}),this.events.on("collisionend",e=>{const i=e;t.events.emit("collisionend",new bi(i.target.owner,i.other.owner)),t instanceof Xt&&t.onCollisionEnd(i.target,i.other)})}onRemove(){this.events.clear(),this.$colliderRemoved.notifyAll(this._collider)}useBoxCollider(t,e,i=A.Half,s=A.Zero){const n=Dt.Box(t,e,i,s);return this.set(n)}usePolygonCollider(t,e=A.Zero){const i=Dt.Polygon(t,e);return this.set(i)}useCircleCollider(t,e=A.Zero){const i=Dt.Circle(t,e);return this.set(i)}useEdgeCollider(t,e){const i=Dt.Edge(t,e);return this.set(i)}useCompositeCollider(t){return this.set(new Bt(t))}}var Qt;(function(r){r.Rotation="rotation",r.X="x",r.Y="y"})(Qt||(Qt={}));class it extends ie{constructor(t){var e,i,s;super(),this.type="ex.body",this.dependencies=[Y,yt],this.id=C("body",it._ID++),this.events=new T,this.oldTransform=new Je,this.__oldTransformCaptured=!1,this.enableFixedUpdateInterpolate=!0,this.collisionType=q.PreventCollision,this.group=di.All,this._mass=Z.defaultMass,this.sleepMotion=Z.sleepEpsilon*5,this.canSleep=Z.bodiesCanSleepByDefault,this._sleeping=!1,this.bounciness=.2,this.friction=.99,this.useGravity=!0,this.limitDegreeOfFreedom=[],this.oldVel=new A(0,0),this.oldAcc=A.Zero,t&&(this.collisionType=(e=t.type)!==null&&e!==void 0?e:this.collisionType,this.group=(i=t.group)!==null&&i!==void 0?i:this.group,this.useGravity=(s=t.useGravity)!==null&&s!==void 0?s:this.useGravity)}get matrix(){return this.transform.get().matrix}get mass(){return this._mass}set mass(t){this._mass=t,this._cachedInertia=void 0,this._cachedInverseInertia=void 0}get inverseMass(){return this.collisionType===q.Fixed?0:1/this.mass}get sleeping(){return this._sleeping}setSleeping(t){this._sleeping=t,t?(this.vel=A.Zero,this.acc=A.Zero,this.angularVelocity=0,this.sleepMotion=0):this.sleepMotion=Z.sleepEpsilon*5}updateMotion(){this._sleeping&&this.setSleeping(!0);const t=this.vel.size*this.vel.size+Math.abs(this.angularVelocity*this.angularVelocity),e=Z.sleepBias;this.sleepMotion=e*this.sleepMotion+(1-e)*t,this.sleepMotion=Gt(this.sleepMotion,0,10*Z.sleepEpsilon),this.canSleep&&this.sleepMotion{this._cachedInertia=null}),t.$colliderRemoved.subscribe(()=>{this._cachedInertia=null});const e=t.get();if(e)return this._cachedInertia=e.getInertia(this.mass)}return 0}get inverseInertia(){return this._cachedInverseInertia?this._cachedInverseInertia:this._cachedInverseInertia=this.collisionType===q.Fixed?0:1/this.inertia}get active(){var t;return!!(!((t=this.owner)===null||t===void 0)&&t.active)}get center(){return this.globalPos}get transform(){var t;return(t=this.owner)===null||t===void 0?void 0:t.get(Y)}get motion(){var t;return(t=this.owner)===null||t===void 0?void 0:t.get(yt)}get pos(){return this.transform.pos}set pos(t){this.transform.pos=t}get globalPos(){return this.transform.globalPos}set globalPos(t){this.transform.globalPos=t}get oldPos(){return this.oldTransform.pos}get vel(){return this.motion.vel}set vel(t){this.motion.vel=t}get acc(){return this.motion.acc}set acc(t){this.motion.acc=t}get torque(){return this.motion.torque}set torque(t){this.motion.torque=t}get oldRotation(){return this.oldTransform.rotation}get rotation(){return this.transform.globalRotation}set rotation(t){this.transform.globalRotation=t}get scale(){return this.transform.globalScale}set scale(t){this.transform.globalScale=t}get oldScale(){return this.oldTransform.scale}get scaleFactor(){return this.motion.scaleFactor}set scaleFactor(t){this.motion.scaleFactor=t}get angularVelocity(){return this.motion.angularVelocity}set angularVelocity(t){this.motion.angularVelocity=t}applyImpulse(t,e){if(this.collisionType!==q.Active)return;const i=e.scale(this.inverseMass);if(this.limitDegreeOfFreedom.includes(Qt.X)&&(i.x=0),this.limitDegreeOfFreedom.includes(Qt.Y)&&(i.y=0),this.vel.addEqual(i),!this.limitDegreeOfFreedom.includes(Qt.Rotation)){const s=t.sub(this.globalPos);this.angularVelocity+=this.inverseInertia*s.cross(e)}}applyLinearImpulse(t){if(this.collisionType!==q.Active)return;const e=t.scale(this.inverseMass);this.limitDegreeOfFreedom.includes(Qt.X)&&(e.x=0),this.limitDegreeOfFreedom.includes(Qt.Y)&&(e.y=0),this.vel=this.vel.add(e)}applyAngularImpulse(t,e){if(this.collisionType===q.Active&&!this.limitDegreeOfFreedom.includes(Qt.Rotation)){const i=t.sub(this.globalPos);this.angularVelocity+=this.inverseInertia*i.cross(e)}}captureOldTransform(){this.__oldTransformCaptured=!0;const t=this.transform.get();t.clone(this.oldTransform),this.oldTransform.parent=t.parent,this.oldVel.setTo(this.vel.x,this.vel.y),this.oldAcc.setTo(this.acc.x,this.acc.y)}clone(){return super.clone()}}it._ID=0;class Wn{constructor(t){this.data=t,this.type="Component Added"}}function Zn(r){return!!r&&r.type==="Component Added"}class Jn{constructor(t){this.data=t,this.type="Component Removed"}}function Vn(r){return!!r&&r.type==="Component Removed"}const la={Initialize:"initialize",PreUpdate:"preupdate",PostUpdate:"postupdate"};class Rt{constructor(t,e){if(this.events=new T,this.id=Rt._ID++,this.scene=null,this._name="anonymous",this.active=!0,this._componentsToRemove=[],this._componentTypeToInstance=new Map,this._componentStringToInstance=new Map,this._tagsMemo=[],this._typesMemo=[],this.componentAdded$=new ge,this.componentRemoved$=new ge,this._parent=null,this.childrenAdded$=new ge,this.childrenRemoved$=new ge,this._children=[],this._isInitialized=!1,this._setName(e),t)for(const i of t)this.addComponent(i)}_setName(t){t?this._name=t:this._name=`Entity#${this.id}`}get name(){return this._name}set name(t){this._setName(t)}kill(){this.active&&(this.active=!1,this.unparent())}isKilled(){return!this.active}get tags(){return this._tagsMemo}hasTag(t){return this.tags.includes(t)}addTag(t){return this.addComponent(new js(t))}removeTag(t,e=!1){return this.removeComponent(t,e)}get types(){return this._typesMemo}_rebuildMemos(){this._tagsMemo=Array.from(this._componentStringToInstance.values()).filter(t=>t instanceof js).map(t=>t.type),this._typesMemo=Array.from(this._componentStringToInstance.keys())}getComponents(){return Array.from(this._componentStringToInstance.values())}_notifyAddComponent(t){this._rebuildMemos();const e=new Wn({component:t,entity:this});this.componentAdded$.notifyAll(e)}_notifyRemoveComponent(t){const e=new Jn({component:t,entity:this});this.componentRemoved$.notifyAll(e),this._rebuildMemos()}get parent(){return this._parent}get children(){return this._children}unparent(){this._parent&&(this._parent.removeChild(this),this._parent=null)}addChild(t){if(t.parent===null){if(this.getAncestors().includes(t))throw new Error("Cycle detected, cannot add entity");this._children.push(t),t._parent=this,this.childrenAdded$.notifyAll(t)}else throw new Error("Entity already has a parent, cannot add without unparenting");return this}removeChild(t){return t.parent===this&&(Me(t,this._children),t._parent=null,this.childrenRemoved$.notifyAll(t)),this}removeAllChildren(){for(let t=this.children.length-1;t>=0;t--)this.removeChild(this.children[t]);return this}getAncestors(){const t=[this];let e=this.parent;for(;e;)t.push(e),e=e.parent;return t.reverse()}getDescendants(){let t=[this],e=[this];for(;e.length>0;){const i=e.pop();e=e.concat(i.children),t=t.concat(i.children)}return t}clone(){const t=new Rt;for(const e of this.types)t.addComponent(this.get(e).clone());for(const e of this.children)t.addChild(e.clone());return t}addTemplate(t,e=!1){for(const i of t.getComponents())this.addComponent(i.clone(),e);for(const i of t.children)this.addChild(i.clone().addTemplate(i));return this}addComponent(t,e=!1){if(this.has(t.type))if(e)this.removeComponent(t,!0);else return this;if(t.dependencies&&t.dependencies.length)for(const s of t.dependencies)this.addComponent(new s);t.owner=this;const i=t.constructor;return this._componentTypeToInstance.set(i,t),this._componentStringToInstance.set(t.type,t),t.onAdd&&t.onAdd(this),this._notifyAddComponent(t),this}removeComponent(t,e=!1){return e?typeof t=="string"?this._removeComponentByType(t):t instanceof ie&&this._removeComponentByType(t.type):this._componentsToRemove.push(t),this}clearComponents(){const t=this.getComponents();for(const e of t)this.removeComponent(e)}_removeComponentByType(t){if(this.has(t)){const e=this.get(t);e.owner=null,e.onRemove&&e.onRemove(this);const i=e.constructor;this._componentTypeToInstance.delete(i),this._componentStringToInstance.delete(e.type),this._notifyRemoveComponent(e)}}processComponentRemoval(){for(const t of this._componentsToRemove){const e=typeof t=="string"?t:t.type;this._removeComponentByType(e)}this._componentsToRemove.length=0}has(t){return typeof t=="string"?this._componentStringToInstance.has(t):this._componentTypeToInstance.has(t)}get(t){return typeof t=="string"?this._componentStringToInstance.get(t):this._componentTypeToInstance.get(t)}get isInitialized(){return this._isInitialized}_initialize(t){this.isInitialized||(this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0)}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}onInitialize(t){}onPreUpdate(t,e){}onPostUpdate(t,e){}update(t,e){this._initialize(t),this._preupdate(t,e);for(const i of this.children)i.update(t,e);this._postupdate(t,e)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}Rt._ID=0;function tn(r){return!!r.tick}class Ri{constructor(t,e){this._options=t,this._graphics=e,this.graphics=[]}get name(){return this._options.name}hide(t){if(!t)this.graphics.length=0;else{let e=null;t instanceof Vt?e=t:e=this._graphics.getGraphic(t),this.graphics=this.graphics.filter(i=>i.graphic!==e),this._graphics.recalculateBounds()}}show(t,e){e={...e};let i;return t instanceof Vt?i=this._graphics.copyGraphics?t.clone():t:(i=this._graphics.getGraphic(t),i||j.getInstance().error(`No such graphic added to component named ${t}. These named graphics are available: `,this._graphics.getNames())),i?(this.graphics.push({graphic:i,options:e}),this._graphics.recalculateBounds(),i):null}use(t,e){return e={...e},this.hide(),this.show(t,e)}get order(){return this._options.order}set order(t){this._options.order=t}get offset(){var t;return(t=this._options.offset)!==null&&t!==void 0?t:A.Zero}set offset(t){this._options.offset=t}get currentKeys(){var t;return(t=this.name)!==null&&t!==void 0?t:"anonymous"}clone(t){const e=new Ri({...this._options},t);return e.graphics=[...this.graphics.map(i=>({graphic:i.graphic.clone(),options:{...i.options}}))],e}}class ns{constructor(t){this._component=t,this._layers=[],this._layerMap={},this.default=new Ri({name:"default",order:0},t),this._maybeAddLayer(this.default)}create(t){const e=new Ri(t,this._component);return this._maybeAddLayer(e)}get(t){return t?this._getLayer(t):this._layers}currentKeys(){const t=[];for(const e of this._layers)t.push(e.currentKeys);return t}has(t){return t in this._layerMap}_maybeAddLayer(t){return this._layerMap[t.name]?this._layerMap[t.name]:(this._layerMap[t.name]=t,this._layers.push(t),this._layers.sort((e,i)=>e.order-i.order),t)}_getLayer(t){return this._layerMap[t]}clone(t){const e=new ns(t);return e._layerMap={},e._layers=[],e.default=this.default.clone(t),e._maybeAddLayer(e.default),this._layers.filter(s=>s.name!=="default").map(s=>s.clone(t)).forEach(s=>e._maybeAddLayer(s)),e}}class Ft extends ie{getGraphic(t){return this._graphics[t]}getNames(){return Object.keys(this._graphics)}constructor(t){super(),this.type="ex.graphics",this._graphics={},this.material=null,this.visible=!0,this.opacity=1,this.offset=A.Zero,this.anchor=A.Half,this.flipHorizontal=!1,this.flipVertical=!1,this.copyGraphics=!1,this._localBounds=null,t={visible:this.visible,...t};const{current:e,anchor:i,opacity:s,visible:n,graphics:o,offset:h,copyGraphics:l,onPreDraw:f,onPostDraw:m}=t;this._graphics=o||{},this.offset=h??this.offset,this.opacity=s??this.opacity,this.anchor=i??this.anchor,this.copyGraphics=l??this.copyGraphics,this.onPreDraw=f??this.onPreDraw,this.onPostDraw=m??this.onPostDraw,this.visible=!!n,this.layers=new ns(this),e&&this._graphics[e]&&this.show(this._graphics[e])}get current(){return this.layers.default.graphics}get graphics(){return this._graphics}add(t,e){let i="default",s=null;return typeof t=="string"?(i=t,s=e):s=t,this._graphics[i]=this.copyGraphics?s.clone():s,i==="default"&&this.show("default"),s}show(t,e){const i=this.layers.default.show(t,e);return this.recalculateBounds(),i}use(t,e){const i=this.layers.default.use(t,e);return this.recalculateBounds(),i}hide(t){this.layers.default.hide(t)}set localBounds(t){this._localBounds=t}recalculateBounds(){let t=new J;for(const e of this.layers.get())for(const{graphic:i,options:s}of e.graphics){let n=this.anchor,o=this.offset;s!=null&&s.anchor&&(n=s.anchor),s!=null&&s.offset&&(o=s.offset);const h=i.localBounds,l=-h.width*n.x+o.x,f=-h.height*n.y+o.y;t=i==null?void 0:i.localBounds.translate(R(l+e.offset.x,f+e.offset.y)).combine(t)}this._localBounds=t}get localBounds(){return(!this._localBounds||this._localBounds.hasZeroDimensions())&&this.recalculateBounds(),this._localBounds}update(t,e=0){for(const i of this.layers.get())for(const{graphic:s}of i.graphics)tn(s)&&(s==null||s.tick(t,e))}clone(){const t=new Ft;return t._graphics={...this._graphics},t.offset=this.offset.clone(),t.opacity=this.opacity,t.anchor=this.anchor.clone(),t.copyGraphics=this.copyGraphics,t.onPreDraw=this.onPreDraw,t.onPostDraw=this.onPostDraw,t.visible=this.visible,t.layers=this.layers.clone(t),t}}class rs extends li{constructor(t){super(t),this.width=t.width,this.height=t.height,this.rasterize()}clone(){return new rs({width:this.width,height:this.height,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){this.color&&t.fillRect(0,0,this.width,this.height),this.strokeColor&&t.strokeRect(0,0,this.width,this.height)}}class os extends li{get radius(){return this._radius}set radius(t){this._radius=t,this.width=this._radius*2,this.height=this._radius*2,this.flagDirty()}constructor(t){var e,i,s;super(t),this._radius=0;const n=(e=t.lineWidth)!==null&&e!==void 0?e:t.strokeColor?1:0;this.padding=(i=t.padding)!==null&&i!==void 0?i:2+n/2,this.radius=t.radius,this.filtering=(s=t.filtering)!==null&&s!==void 0?s:Ot.Blended,this.rasterize()}clone(){return new os({radius:this.radius,...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){this.radius>0&&(t.beginPath(),t.arc(this.radius,this.radius,this.radius,0,Math.PI*2),this.color&&t.fill(),this.strokeColor&&t.stroke())}}class ui extends ie{constructor(){super(...arguments),this.type="ex.pointer",this.useColliderShape=!0,this.useGraphicsBounds=!1}}class xt{static CreateReversibleEasingFunction(t){return(e,i,s,n)=>snew A(t(e,i.x,s.x,n),t(e,i.y,s.y,n))}}xt.Linear=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,e*r/i+t)),xt.EaseInQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,e*r*r+t)),xt.EaseOutQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,-e*r*(r-2)+t)),xt.EaseInOutQuad=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i/2,r<1?e/2*r*r+t:(r--,-e/2*(r*(r-2)-1)+t))),xt.EaseInCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,e*r*r*r+t)),xt.EaseOutCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i,r--,e*(r*r*r+1)+t)),xt.EaseInOutCubic=xt.CreateReversibleEasingFunction((r,t,e,i)=>(e=e-t,r/=i/2,r<1?e/2*r*r*r+t:(r-=2,e/2*(r*r*r+2)+t)));class jn{constructor(t){this._actions=[],this._completedActions=[],this._entity=t}add(t){this._actions.push(t)}remove(t){const e=this._actions.indexOf(t);this._actions.splice(e,1)}clearActions(){this._actions.length=0,this._completedActions.length=0,this._currentAction&&this._currentAction.stop()}getActions(){return this._actions.concat(this._completedActions)}hasNext(){return this._actions.length>0}isComplete(){return this._actions.length===0}reset(){this._actions=this.getActions();const t=this._actions.length;for(let e=0;e0&&(this._currentAction!==this._actions[0]&&(this._currentAction=this._actions[0],this._entity.emit("actionstart",new Rs(this._currentAction,this._entity))),this._currentAction.update(t),this._currentAction.isComplete(this._entity)&&(this._entity.emit("actioncomplete",new Ms(this._currentAction,this._entity)),this._completedActions.push(this._actions.shift())))}}class Xn{constructor(t,e,i){this._stopped=!1,this._repeatBuilder=e,this._repeatContext=new Mi(t),this._actionQueue=this._repeatContext.getQueue(),this._repeat=i,this._originalRepeat=i,this._repeatBuilder(this._repeatContext),this._repeat--}update(t){this._actionQueue.isComplete()&&(this._actionQueue.clearActions(),this._repeatBuilder(this._repeatContext),this._repeat--),this._actionQueue.update(t)}isComplete(){return this._stopped||this._repeat<=0&&this._actionQueue.isComplete()}stop(){this._stopped=!0}reset(){this._repeat=this._originalRepeat}}class Kn{constructor(t,e){this._stopped=!1,this._repeatBuilder=e,this._repeatContext=new Mi(t),this._actionQueue=this._repeatContext.getQueue(),this._repeatBuilder(this._repeatContext)}update(t){this._stopped||(this._actionQueue.isComplete()&&(this._actionQueue.clearActions(),this._repeatBuilder(this._repeatContext)),this._actionQueue.update(t))}isComplete(){return this._stopped}stop(){this._stopped=!0,this._actionQueue.clearActions()}reset(){}}class qn{constructor(t,e,i,s){if(this._started=!1,this._stopped=!1,this._entity=t,this._tx=t.get(Y),this._motion=t.get(yt),this._speed=s,this._offset=new A(e,i),s<=0)throw j.getInstance().error("Attempted to moveBy with speed less than or equal to zero : "+s),new Error("Speed must be greater than 0 pixels per second")}update(t){this._started||(this._started=!0,this._start=new A(this._tx.pos.x,this._tx.pos.y),this._end=this._start.add(this._offset),this._distance=this._offset.size,this._dir=this._end.sub(this._start).normalize()),this.isComplete(this._entity)?(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0)):this._motion.vel=this._dir.scale(this._speed)}isComplete(t){const e=t.get(Y);return this._stopped||e.pos.distance(this._start)>=this._distance}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class $n{constructor(t,e,i,s){this.entity=t,this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._end=new A(e,i),this._speed=s}update(t){this._started||(this._started=!0,this._start=new A(this._tx.pos.x,this._tx.pos.y),this._distance=this._start.distance(this._end),this._dir=this._end.sub(this._start).normalize());const e=this._dir.scale(this._speed);this._motion.vel=R(e.x,e.y),this.isComplete(this.entity)&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}isComplete(t){const e=t.get(Y);return this._stopped||new A(e.pos.x,e.pos.y).distance(this._start)>=this._distance}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}var ne;(function(r){r[r.ShortestPath=0]="ShortestPath",r[r.LongestPath=1]="LongestPath",r[r.Clockwise=2]="Clockwise",r[r.CounterClockwise=3]="CounterClockwise"})(ne||(ne={}));class tr{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._end=e,this._speed=i,this._rotationType=s||ne.ShortestPath}update(t){if(!this._started){this._started=!0,this._start=this._tx.rotation,this._currentNonCannonAngle=this._tx.rotation;const e=Math.abs(this._end-this._start),i=ae-e;switch(e>i?(this._shortDistance=i,this._longDistance=e):(this._shortDistance=e,this._longDistance=i),this._shortestPathIsPositive=(this._start-this._end+ae)%ae>=Math.PI,this._rotationType){case ne.ShortestPath:this._distance=this._shortDistance,this._shortestPathIsPositive?this._direction=1:this._direction=-1;break;case ne.LongestPath:this._distance=this._longDistance,this._shortestPathIsPositive?this._direction=-1:this._direction=1;break;case ne.Clockwise:this._direction=1,this._shortestPathIsPositive?this._distance=this._shortDistance:this._distance=this._longDistance;break;case ne.CounterClockwise:this._direction=-1,this._shortestPathIsPositive?this._distance=this._longDistance:this._distance=this._shortDistance;break}}this._motion.angularVelocity=this._direction*this._speed,this._currentNonCannonAngle+=this._direction*this._speed*(t/1e3),this.isComplete()&&(this._tx.rotation=this._end,this._motion.angularVelocity=0,this._stopped=!0)}isComplete(){const t=Math.abs(this._currentNonCannonAngle-this._start);return this._stopped||t>=Math.abs(this._distance)}stop(){this._motion.angularVelocity=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class er{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._speed=i,this._offset=e,this._rotationType=s||ne.ShortestPath}update(t){if(!this._started){this._started=!0,this._start=this._tx.rotation,this._currentNonCannonAngle=this._tx.rotation,this._end=this._start+this._offset;const e=Math.abs(this._end-this._start),i=ae-e;switch(e>i?(this._shortDistance=i,this._longDistance=e):(this._shortDistance=e,this._longDistance=i),this._shortestPathIsPositive=(this._start-this._end+ae)%ae>=Math.PI,this._rotationType){case ne.ShortestPath:this._distance=this._shortDistance,this._shortestPathIsPositive?this._direction=1:this._direction=-1;break;case ne.LongestPath:this._distance=this._longDistance,this._shortestPathIsPositive?this._direction=-1:this._direction=1;break;case ne.Clockwise:this._direction=1,this._shortDistance>=0?this._distance=this._shortDistance:this._distance=this._longDistance;break;case ne.CounterClockwise:this._direction=-1,this._shortDistance<=0?this._distance=this._shortDistance:this._distance=this._longDistance;break}}this._motion.angularVelocity=this._direction*this._speed,this._currentNonCannonAngle+=this._direction*this._speed*(t/1e3),this.isComplete()&&(this._tx.rotation=this._end,this._motion.angularVelocity=0,this._stopped=!0)}isComplete(){const t=Math.abs(this._currentNonCannonAngle-this._start);return this._stopped||t>=Math.abs(this._distance)}stop(){this._motion.angularVelocity=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._start=void 0,this._currentNonCannonAngle=void 0,this._distance=void 0}}class ir{constructor(t,e,i,s,n){this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._endX=e,this._endY=i,this._speedX=s,this._speedY=n}update(t){if(this._started||(this._started=!0,this._startX=this._tx.scale.x,this._startY=this._tx.scale.y,this._distanceX=Math.abs(this._endX-this._startX),this._distanceY=Math.abs(this._endY-this._startY)),Math.abs(this._tx.scale.x-this._startX)>=this._distanceX)this._motion.scaleFactor.x=0;else{const e=this._endY=this._distanceY)this._motion.scaleFactor.y=0;else{const e=this._endY=this._distanceX-.01&&Math.abs(this._tx.scale.y-this._startY)>=this._distanceY-.01}stop(){this._motion.scaleFactor.x=0,this._motion.scaleFactor.y=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class sr{constructor(t,e,i,s){this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._offset=new A(e,i),this._speedX=this._speedY=s}update(t){this._started||(this._started=!0,this._startScale=this._tx.scale.clone(),this._endScale=this._startScale.add(this._offset),this._distanceX=Math.abs(this._endScale.x-this._startScale.x),this._distanceY=Math.abs(this._endScale.y-this._startScale.y),this._directionX=this._endScale.x=this._distanceX-.01&&Math.abs(this._tx.scale.y-this._startScale.y)>=this._distanceY-.01}stop(){this._motion.scaleFactor.x=0,this._motion.scaleFactor.y=0,this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class nr{constructor(t){this._method=null,this._hasBeenCalled=!1,this._method=t}update(t){this._method(),this._hasBeenCalled=!0}isComplete(){return this._hasBeenCalled}reset(){this._hasBeenCalled=!1}stop(){this._hasBeenCalled=!0}}class rr{constructor(t,e,i,s,n){this.easingFcn=n,this._currentLerpTime=0,this._lerpDuration=1*1e3,this._lerpStart=new A(0,0),this._lerpEnd=new A(0,0),this._initialized=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._lerpDuration=s,this._lerpEnd=new A(e,i)}_initialize(){this._lerpStart=new A(this._tx.pos.x,this._tx.pos.y),this._currentLerpTime=0}update(t){this._initialized||(this._initialize(),this._initialized=!0),this._currentLerpTime+=t;let e=this._tx.pos.x,i=this._tx.pos.y;this._currentLerpTime=this._lerpDuration}reset(){this._initialized=!1,this._stopped=!1,this._currentLerpTime=0}stop(){this._motion.vel=R(0,0),this._stopped=!0}}class or{constructor(t,e,i,s,n){this.easingFcn=n,this._currentLerpTime=0,this._lerpDuration=1*1e3,this._lerpStart=new A(0,0),this._lerpEnd=new A(0,0),this._initialized=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._lerpDuration=s,this._offset=new A(e,i)}_initialize(){this._lerpStart=new A(this._tx.pos.x,this._tx.pos.y),this._currentLerpTime=0,this._lerpEnd=this._lerpStart.add(this._offset)}update(t){this._initialized||(this._initialize(),this._initialized=!0),this._currentLerpTime+=t;let e=this._tx.pos.x,i=this._tx.pos.y;this._currentLerpTime=this._lerpDuration}reset(){this._initialized=!1,this._stopped=!1,this._currentLerpTime=0}stop(){this._motion.vel=R(0,0),this._stopped=!0}}class ar{constructor(t,e,i,s=1){this._timeVisible=0,this._timeNotVisible=0,this._elapsedTime=0,this._totalTime=0,this._stopped=!1,this._started=!1,this._graphics=t.get(Ft),this._timeVisible=e,this._timeNotVisible=i,this._duration=(e+i)*s}update(t){this._started||(this._started=!0,this._elapsedTime=0,this._totalTime=0),this._graphics&&(this._elapsedTime+=t,this._totalTime+=t,this._graphics.visible&&this._elapsedTime>=this._timeVisible&&(this._graphics.visible=!1,this._elapsedTime=0),!this._graphics.visible&&this._elapsedTime>=this._timeNotVisible&&(this._graphics.visible=!0,this._elapsedTime=0),this.isComplete()&&(this._graphics.visible=!0))}isComplete(){return this._stopped||this._totalTime>=this._duration}stop(){this._graphics&&(this._graphics.visible=!0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._elapsedTime=0,this._totalTime=0}}class hr{constructor(t,e,i){this._multiplier=1,this._started=!1,this._stopped=!1,this._graphics=t.get(Ft),this._endOpacity=e,this._speed=this._ogspeed=i}update(t){this._graphics&&(this._started||(this._started=!0,this._speed=this._ogspeed,this._endOpacity0&&(this._graphics.opacity+=this._multiplier*(Math.abs(this._graphics.opacity-this._endOpacity)*t)/this._speed),this._speed-=t,this.isComplete()&&(this._graphics.opacity=this._endOpacity),j.getInstance().debug("[Action fade] Actor opacity:",this._graphics.opacity))}isComplete(){return this._stopped||Math.abs(this._graphics.opacity-this._endOpacity)<.05}stop(){this._stopped=!0}reset(){this._started=!1,this._stopped=!1}}class lr{constructor(t){this._elapsedTime=0,this._started=!1,this._stopped=!1,this._delay=t}update(t){this._started||(this._started=!0),this._elapsedTime+=t}isComplete(){return this._stopped||this._elapsedTime>=this._delay}stop(){this._stopped=!0}reset(){this._elapsedTime=0,this._started=!1,this._stopped=!1}}class cr{constructor(t){this._stopped=!1,this._entity=t}update(t){this._entity.get(fi).clearActions(),this._entity.kill(),this._stopped=!0}isComplete(){return this._stopped}stop(){}reset(){}}class en{constructor(t,e,i){this._started=!1,this._stopped=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._followTx=e.get(Y),this._followMotion=e.get(yt),this._current=new A(this._tx.pos.x,this._tx.pos.y),this._end=new A(this._followTx.pos.x,this._followTx.pos.y),this._maximumDistance=i!==void 0?i:this._current.distance(this._end),this._speed=0}update(t){this._started||(this._started=!0,this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize());const e=Math.sqrt(Math.pow(this._followMotion.vel.x,2)+Math.pow(this._followMotion.vel.y,2));if(e!==0&&(this._speed=e),this._current=R(this._tx.pos.x,this._tx.pos.y),this._end=R(this._followTx.pos.x,this._followTx.pos.y),this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize(),this._distanceBetween>=this._maximumDistance){const i=this._dir.scale(this._speed);this._motion.vel=R(i.x,i.y)}else this._motion.vel=R(0,0);this.isComplete()&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}stop(){this._motion.vel=R(0,0),this._stopped=!0}isComplete(){return this._stopped}reset(){this._started=!1,this._stopped=!1}}class sn{constructor(t,e,i){this._started=!1,this._stopped=!1,this._speedWasSpecified=!1,this._tx=t.get(Y),this._motion=t.get(yt),this._meetTx=e.get(Y),this._meetMotion=e.get(yt),this._current=new A(this._tx.pos.x,this._tx.pos.y),this._end=new A(this._meetTx.pos.x,this._meetTx.pos.y),this._speed=i||0,i!==void 0&&(this._speedWasSpecified=!0)}update(t){this._started||(this._started=!0,this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize());const e=Math.sqrt(Math.pow(this._meetMotion.vel.x,2)+Math.pow(this._meetMotion.vel.y,2));e!==0&&!this._speedWasSpecified&&(this._speed=e),this._current=R(this._tx.pos.x,this._tx.pos.y),this._end=R(this._meetTx.pos.x,this._meetTx.pos.y),this._distanceBetween=this._current.distance(this._end),this._dir=this._end.sub(this._current).normalize();const i=this._dir.scale(this._speed);this._motion.vel=R(i.x,i.y),this.isComplete()&&(this._tx.pos=R(this._end.x,this._end.y),this._motion.vel=R(0,0))}isComplete(){return this._stopped||this._distanceBetween<=1}stop(){this._motion.vel=R(0,0),this._stopped=!0}reset(){this._started=!1,this._stopped=!1,this._distanceBetween=void 0}}class Mi{constructor(t){this._entity=t,this._queue=new jn(t)}getQueue(){return this._queue}update(t){this._queue.update(t)}clearActions(){this._queue.clearActions()}runAction(t){return t.reset(),this._queue.add(t),this}easeTo(...t){var e,i;let s=0,n=0,o=0,h=xt.Linear;return t[0]instanceof A?(s=t[0].x,n=t[0].y,o=t[1],h=(e=t[2])!==null&&e!==void 0?e:h):(s=t[0],n=t[1],o=t[2],h=(i=t[3])!==null&&i!==void 0?i:h),this._queue.add(new rr(this._entity,s,n,o,h)),this}easeBy(...t){var e,i;let s=0,n=0,o=0,h=xt.Linear;return t[0]instanceof A?(s=t[0].x,n=t[0].y,o=t[1],h=(e=t[2])!==null&&e!==void 0?e:h):(s=t[0],n=t[1],o=t[2],h=(i=t[3])!==null&&i!==void 0?i:h),this._queue.add(new or(this._entity,s,n,o,h)),this}moveTo(t,e,i){let s=0,n=0,o=0;return t instanceof A?(s=t.x,n=t.y,o=e):(s=t,n=e,o=i),this._queue.add(new $n(this._entity,s,n,o)),this}moveBy(t,e,i){let s=0,n=0,o=0;return t instanceof A?(s=t.x,n=t.y,o=e):(s=t,n=e,o=i),this._queue.add(new qn(this._entity,s,n,o)),this}rotateTo(t,e,i){return this._queue.add(new tr(this._entity,t,e,i)),this}rotateBy(t,e,i){return this._queue.add(new er(this._entity,t,e,i)),this}scaleTo(t,e,i,s){let n=1,o=1,h=0,l=0;return t instanceof A&&e instanceof A&&(n=t.x,o=t.y,h=e.x,l=e.y),typeof t=="number"&&typeof e=="number"&&(n=t,o=e,h=i,l=s),this._queue.add(new ir(this._entity,n,o,h,l)),this}scaleBy(t,e,i){let s=1,n=1;return t instanceof A&&(s=t.x,n=t.y,i=e),typeof t=="number"&&typeof e=="number"&&(s=t,n=e),this._queue.add(new sr(this._entity,s,n,i)),this}blink(t,e,i=1){return this._queue.add(new ar(this._entity,t,e,i)),this}fade(t,e){return this._queue.add(new hr(this._entity,t,e)),this}delay(t){return this._queue.add(new lr(t)),this}die(){return this._queue.add(new cr(this._entity)),this}callMethod(t){return this._queue.add(new nr(t)),this}repeat(t,e){return e?(this._queue.add(new Xn(this._entity,t,e)),this):(this.repeatForever(t),this)}repeatForever(t){return this._queue.add(new Kn(this._entity,t)),this}follow(t,e){return e===void 0?this._queue.add(new en(this._entity,t)):this._queue.add(new en(this._entity,t,e)),this}meet(t,e){return e===void 0?this._queue.add(new sn(this._entity,t)):this._queue.add(new sn(this._entity,t,e)),this}toPromise(){return new Promise(e=>{this._queue.add(new nr(()=>{e()}))})}}class fi extends ie{constructor(){super(...arguments),this.type="ex.actions",this.dependencies=[Y,yt]}onAdd(t){this._ctx=new Mi(t)}onRemove(){this._ctx=null}getQueue(){var t;return(t=this._ctx)===null||t===void 0?void 0:t.getQueue()}runAction(t){var e;return(e=this._ctx)===null||e===void 0?void 0:e.runAction(t)}update(t){var e;return(e=this._ctx)===null||e===void 0?void 0:e.update(t)}clearActions(){var t;(t=this._ctx)===null||t===void 0||t.clearActions()}easeTo(...t){return this._ctx.easeTo.apply(this._ctx,t)}easeBy(...t){return this._ctx.easeBy.apply(this._ctx,t)}moveTo(t,e,i){return this._ctx.moveTo.apply(this._ctx,[t,e,i])}moveBy(t,e,i){return this._ctx.moveBy.apply(this._ctx,[t,e,i])}rotateTo(t,e,i){return this._ctx.rotateTo(t,e,i)}rotateBy(t,e,i){return this._ctx.rotateBy(t,e,i)}scaleTo(t,e,i,s){return this._ctx.scaleTo.apply(this._ctx,[t,e,i,s])}scaleBy(t,e,i){return this._ctx.scaleBy.apply(this._ctx,[t,e,i])}blink(t,e,i){return this._ctx.blink(t,e,i)}fade(t,e){return this._ctx.fade(t,e)}delay(t){return this._ctx.delay(t)}die(){return this._ctx.die()}callMethod(t){return this._ctx.callMethod(t)}repeat(t,e){return this._ctx.repeat(t,e)}repeatForever(t){return this._ctx.repeatForever(t)}follow(t,e){return this._ctx.follow(t,e)}meet(t,e){return this._ctx.meet(t,e)}toPromise(){return this._ctx.toPromise()}}var as;(function(r){r.Em="em",r.Rem="rem",r.Px="px",r.Pt="pt",r.Percent="%"})(as||(as={}));var hs;(function(r){r.Left="left",r.Right="right",r.Center="center",r.Start="start",r.End="end"})(hs||(hs={}));var ls;(function(r){r.Top="top",r.Hanging="hanging",r.Middle="middle",r.Alphabetic="alphabetic",r.Ideographic="ideographic",r.Bottom="bottom"})(ls||(ls={}));var cs;(function(r){r.Normal="normal",r.Italic="italic",r.Oblique="oblique"})(cs||(cs={}));var ds;(function(r){r.LeftToRight="ltr",r.RightToLeft="rtl"})(ds||(ds={}));class gi{constructor(t,e,i,s){this.font=t,this.text=e,this.color=i,this.maxWidth=s,this._textFragments=[],this.disposed=!1,this._dirty=!0,this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.dimensions=this.measureText(e),this._setDimension(this.dimensions,this.ctx),this._lastHashCode=this.getHashCode()}measureText(t,e){if(this.disposed)throw Error("Accessing disposed text instance! "+this.text);let i=null;e!=null?i=this._getLinesFromText(t,e):i=t.split(` +`);const s=i.reduce((w,y)=>w.length>y.length?w:y);this._applyFont(this.ctx);const n=this.ctx.measureText(s);let o=Math.abs(n.actualBoundingBoxAscent)+Math.abs(n.actualBoundingBoxDescent);const h=o*i.length;o=h;const l=h-Math.abs(n.actualBoundingBoxAscent),f=0,m=0;return new J({left:f-Math.abs(n.actualBoundingBoxLeft)-this.font.padding,top:m-Math.abs(n.actualBoundingBoxAscent)-this.font.padding,bottom:m+l+this.font.padding,right:f+Math.abs(n.actualBoundingBoxRight)+this.font.padding})}_setDimension(t,e){e.canvas.width=(t.width+this.font.padding*2)*2*this.font.quality,e.canvas.height=(t.height+this.font.padding*2)*2*this.font.quality}static getHashCode(t,e,i){var s;return e+"__hashcode__"+t.fontString+t.showDebug+t.textAlign+t.baseAlign+t.direction+JSON.stringify(t.shadow)+(t.padding.toString()+t.smoothing.toString()+t.lineWidth.toString()+t.lineDash.toString()+((s=t.strokeColor)===null||s===void 0?void 0:s.toString())+(i?i.toString():t.color.toString()))}getHashCode(t=!0){return gi.getHashCode(this.font,this.text,t?this.color:void 0)}_applyRasterProperties(t){var e,i;t.translate(this.font.padding,this.font.padding),t.imageSmoothingEnabled=this.font.smoothing,t.lineWidth=this.font.lineWidth,t.setLineDash((e=this.font.lineDash)!==null&&e!==void 0?e:t.getLineDash()),t.strokeStyle=(i=this.font.strokeColor)===null||i===void 0?void 0:i.toString(),t.fillStyle=this.color.toString()}_applyFont(t){t.resetTransform(),t.translate(this.font.padding+t.canvas.width/2,this.font.padding+t.canvas.height/2),t.scale(this.font.quality,this.font.quality),t.textAlign=this.font.textAlign,t.textBaseline=this.font.baseAlign,t.font=this.font.fontString,t.direction=this.font.direction,this.font.shadow&&(t.shadowColor=this.font.shadow.color.toString(),t.shadowBlur=this.font.shadow.blur,t.shadowOffsetX=this.font.shadow.offset.x,t.shadowOffsetY=this.font.shadow.offset.y)}_drawText(t,e,i){this._applyRasterProperties(t),this._applyFont(t);for(let s=0;se){for(;this.measureText(n).width>e;)o=n[n.length-1]+o,n=n.slice(0,-1);i[s]=n,i[s+1]=o}}return this._chachedText=t,this._chachedLines=i,this._cachedRenderWidth=e,i}}class dt{static measureText(t,e,i){const s=gi.getHashCode(e,t);if(dt._MEASURE_CACHE.has(s))return dt._MEASURE_CACHE.get(s);dt._LOGGER.debug("Font text measurement cache miss");const n=e.measureTextWithoutCache(t,i);return dt._MEASURE_CACHE.set(s,n),n}static getTextInstance(t,e,i){const s=gi.getHashCode(e,t,i);let n=dt._TEXT_CACHE.get(s);return n||(n=new gi(e,t,i),dt._TEXT_CACHE.set(s,n),dt._LOGGER.debug("Font text instance cache miss")),dt._TEXT_USAGE.set(n,performance.now()),n}static checkAndClearCache(){const t=[],e=new Set;for(const[s,n]of dt._TEXT_USAGE.entries())if(n+dt.FONT_TIMEOUT{dt._TEXT_USAGE.delete(s)}),this._TEXT_CACHE.clear();for(const[s]of this._TEXT_USAGE.entries())this._TEXT_CACHE.set(s.getHashCode(),s);const i=new Map;for(const s of e)dt._MEASURE_CACHE.has(s)&&i.set(s,dt._MEASURE_CACHE.get(s));this._MEASURE_CACHE.clear(),this._MEASURE_CACHE=i}static get cacheSize(){return dt._TEXT_USAGE.size}static clearCache(){for(const[t]of dt._TEXT_USAGE.entries())t.dispose();dt._TEXT_USAGE.clear(),dt._TEXT_CACHE.clear(),dt._MEASURE_CACHE.clear()}}dt.FONT_TIMEOUT=500,dt._LOGGER=j.getInstance(),dt._TEXT_USAGE=new Map,dt._TEXT_CACHE=new Map,dt._MEASURE_CACHE=new Map;class pi extends Vt{constructor(t={}){var e,i,s,n,o,h,l,f,m,v,w,y,b,k,D,I,E,F,U;super(t),this.filtering=Ot.Blended,this.quality=2,this.padding=2,this.smoothing=!1,this.lineWidth=1,this.lineDash=[],this.color=L.Black,this.family="sans-serif",this.style=cs.Normal,this.bold=!1,this.unit=as.Px,this.textAlign=hs.Left,this.baseAlign=ls.Alphabetic,this.direction=ds.LeftToRight,this.size=10,this.shadow=null,this._textBounds=new J,this._textMeasurement=new gi(this,"",L.Black),this.smoothing=(e=t==null?void 0:t.smoothing)!==null&&e!==void 0?e:this.smoothing,this.padding=(i=t==null?void 0:t.padding)!==null&&i!==void 0?i:this.padding,this.color=(s=t==null?void 0:t.color)!==null&&s!==void 0?s:this.color,this.strokeColor=(n=t==null?void 0:t.strokeColor)!==null&&n!==void 0?n:this.strokeColor,this.lineDash=(o=t==null?void 0:t.lineDash)!==null&&o!==void 0?o:this.lineDash,this.lineWidth=(h=t==null?void 0:t.lineWidth)!==null&&h!==void 0?h:this.lineWidth,this.filtering=(l=t==null?void 0:t.filtering)!==null&&l!==void 0?l:this.filtering,this.family=(f=t==null?void 0:t.family)!==null&&f!==void 0?f:this.family,this.style=(m=t==null?void 0:t.style)!==null&&m!==void 0?m:this.style,this.bold=(v=t==null?void 0:t.bold)!==null&&v!==void 0?v:this.bold,this.size=(w=t==null?void 0:t.size)!==null&&w!==void 0?w:this.size,this.unit=(y=t==null?void 0:t.unit)!==null&&y!==void 0?y:this.unit,this.textAlign=(b=t==null?void 0:t.textAlign)!==null&&b!==void 0?b:this.textAlign,this.baseAlign=(k=t==null?void 0:t.baseAlign)!==null&&k!==void 0?k:this.baseAlign,this.direction=(D=t==null?void 0:t.direction)!==null&&D!==void 0?D:this.direction,this.quality=(I=t==null?void 0:t.quality)!==null&&I!==void 0?I:this.quality,t!=null&&t.shadow&&(this.shadow={},this.shadow.blur=(E=t.shadow.blur)!==null&&E!==void 0?E:this.shadow.blur,this.shadow.offset=(F=t.shadow.offset)!==null&&F!==void 0?F:this.shadow.offset,this.shadow.color=(U=t.shadow.color)!==null&&U!==void 0?U:this.shadow.color)}clone(){return new pi({...this.cloneGraphicOptions(),size:this.size,unit:this.unit,family:this.family,style:this.style,bold:this.bold,textAlign:this.textAlign,baseAlign:this.baseAlign,direction:this.direction,shadow:this.shadow?{blur:this.shadow.blur,offset:this.shadow.offset,color:this.shadow.color}:null})}get fontString(){return`${this.style} ${this.bold?"bold":""} ${this.size}${this.unit} ${this.family}`}get localBounds(){return this._textBounds}_drawImage(t,e,i){}_rotate(t){var e;const i=(e=this.origin)!==null&&e!==void 0?e:this._textBounds.center;t.translate(i.x,i.y),t.rotate(this.rotation),t.translate(-i.x,-i.y)}_flip(t){this.flipHorizontal&&(t.translate(this._textBounds.width/this.scale.x,0),t.scale(-1,1)),this.flipVertical&&(t.translate(0,-this._textBounds.height/2/this.scale.y),t.scale(1,-1))}measureTextWithoutCache(t,e){return this._textMeasurement.measureText(t,e)}measureText(t,e){return dt.measureText(t,this,e)}_postDraw(t){t.restore()}render(t,e,i,s,n,o){const h=dt.getTextInstance(e,this,i);this._textBounds=h.dimensions,this._preDraw(t,s,n),h.render(t,s,n,o),this._postDraw(t)}}class Bi extends Vt{constructor(t){var e,i;super(t),this._text="",this._textWidth=0,this._textHeight=0,this.font=(e=t.font)!==null&&e!==void 0?e:new pi,this.color=(i=t.color)!==null&&i!==void 0?i:this.color,this.text=t.text,this.maxWidth=t.maxWidth}clone(){var t,e;return new Bi({text:this.text.slice(),color:(e=(t=this.color)===null||t===void 0?void 0:t.clone())!==null&&e!==void 0?e:L.Black,font:this.font.clone(),maxWidth:this.maxWidth})}get text(){return this._text}set text(t){this._text=t,this._calculateDimension()}get font(){return this._font}set font(t){this._font=t}get width(){return this._textWidth===0&&this._calculateDimension(),this._textWidth*this.scale.x}get height(){return this._textHeight===0&&this._calculateDimension(),this._textHeight*this.scale.y}_calculateDimension(){const{width:t,height:e}=this.font.measureText(this._text,this.maxWidth);this._textWidth=t,this._textHeight=e}get localBounds(){return this.font.measureText(this._text,this.maxWidth).scale(this.scale)}_rotate(t){}_flip(t){}_preDraw(t,e,i){(this.isStale()||this.font.isStale())&&(this.font.flipHorizontal=this.flipHorizontal,this.font.flipVertical=this.flipVertical,this.font.rotation=this.rotation,this.font.origin=this.origin,this.font.opacity=this.opacity),this.font.tint=this.tint,super._preDraw(t,e,i)}_drawImage(t,e,i){var s;let n=L.Black;this.font instanceof pi&&(n=(s=this.color)!==null&&s!==void 0?s:this.font.color);const{width:o,height:h}=this.font.measureText(this._text,this.maxWidth);this._textWidth=o,this._textHeight=h,this.font.render(t,this._text,n,e,i,this.maxWidth),this.font.showDebug&&(t.debug.drawRect(e-o,i-h,o*2,h*2),this.maxWidth!=null&&t.debug.drawRect(e,i,this.maxWidth,this.height,{color:L.Yellow}))}}class Xt extends Rt{get body(){return this.get(it)}get transform(){return this.get(Y)}get motion(){return this.get(yt)}get graphics(){return this.get(Ft)}get collider(){return this.get(Ct)}get pointer(){return this.get(ui)}get actions(){return this.get(fi)}get pos(){return this.transform.pos}set pos(t){this.transform.pos=t.clone()}get oldPos(){return this.body.oldPos}set oldPos(t){this.body.oldPos.setTo(t.x,t.y)}get vel(){return this.motion.vel}set vel(t){this.motion.vel=t.clone()}get oldVel(){return this.body.oldVel}set oldVel(t){this.body.oldVel.setTo(t.x,t.y)}get acc(){return this.motion.acc}set acc(t){this.motion.acc=t.clone()}set oldAcc(t){this.body.oldAcc.setTo(t.x,t.y)}get oldAcc(){return this.body.oldAcc}get rotation(){return this.transform.rotation}set rotation(t){this.transform.rotation=t}get angularVelocity(){return this.motion.angularVelocity}set angularVelocity(t){this.motion.angularVelocity=t}get scale(){return this.get(Y).scale}set scale(t){this.get(Y).scale=t}get anchor(){return this._anchor}set anchor(t){this._anchor=He(t,e=>this._handleAnchorChange(e)),this._handleAnchorChange(t)}_handleAnchorChange(t){this.graphics&&(this.graphics.anchor=t)}get isOffScreen(){return this.hasTag("ex.offscreen")}get draggable(){return this._draggable}set draggable(t){t&&(t&&!this._draggable?(this.events.on("pointerdragstart",this._pointerDragStartHandler),this.events.on("pointerdragend",this._pointerDragEndHandler),this.events.on("pointerdragmove",this._pointerDragMoveHandler),this.events.on("pointerdragleave",this._pointerDragLeaveHandler)):!t&&this._draggable&&(this.events.off("pointerdragstart",this._pointerDragStartHandler),this.events.off("pointerdragend",this._pointerDragEndHandler),this.events.off("pointerdragmove",this._pointerDragMoveHandler),this.events.off("pointerdragleave",this._pointerDragLeaveHandler)),this._draggable=t)}get color(){return this._color}set color(t){var e;this._color=t.clone();const s=(e=this.graphics.layers.default.graphics[0])===null||e===void 0?void 0:e.graphic;(s instanceof li||s instanceof Bi)&&(s.color=this._color)}constructor(t){super(),this.events=new T,this._anchor=He(A.Half,M=>this._handleAnchorChange(M)),this.logger=j.getInstance(),this._draggable=!1,this._dragging=!1,this._pointerDragStartHandler=()=>{this._dragging=!0},this._pointerDragEndHandler=()=>{this._dragging=!1},this._pointerDragMoveHandler=M=>{this._dragging&&(this.pos=M.worldPos)},this._pointerDragLeaveHandler=M=>{this._dragging&&(this.pos=M.worldPos)};const{name:e,x:i,y:s,pos:n,coordPlane:o,scale:h,width:l,height:f,radius:m,collider:v,vel:w,acc:y,rotation:b,angularVelocity:k,z:D,color:I,visible:E,anchor:F,collisionType:U,collisionGroup:V}={...t};this._setName(e),this.anchor=F??Xt.defaults.anchor.clone();const W=new Y;this.addComponent(W),this.pos=n??R(i??0,s??0),this.rotation=b??0,this.scale=h??R(1,1),this.z=D??0,W.coordPlane=o??Nt.World,this.addComponent(new ui),this.addComponent(new Ft({anchor:this.anchor})),this.addComponent(new yt),this.vel=w??A.Zero,this.acc=y??A.Zero,this.angularVelocity=k??0,this.addComponent(new fi),this.addComponent(new it),this.body.collisionType=U??q.Passive,V&&(this.body.group=V),v?this.addComponent(new Ct(v)):m?this.addComponent(new Ct(Dt.Circle(m))):l>0&&f>0?this.addComponent(new Ct(Dt.Box(l,f,this.anchor))):this.addComponent(new Ct),this.graphics.visible=E??!0,I&&(this.color=I,l&&f?this.graphics.add(new rs({color:I,width:l,height:f})):m&&this.graphics.add(new os({color:I,radius:m})))}clone(){const t=new Xt({color:this.color.clone(),anchor:this.anchor.clone()});t.clearComponents(),t.processComponentRemoval();const e=this.getComponents();for(const i of e)t.addComponent(i.clone(),!0);return t}onInitialize(t){}_initialize(t){super._initialize(t);for(const e of this.children)e._initialize(t)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}_prekill(t){this.events.emit("prekill",new G(this)),this.onPreKill(t)}onPreKill(t){}_postkill(t){this.events.emit("postkill",new O(this)),this.onPostKill(t)}onPostKill(t){}kill(){this.scene?(this._prekill(this.scene),this.events.emit("kill",new z(this)),super.kill(),this._postkill(this.scene)):this.logger.warn(`Cannot kill actor named "${this.name}", it was never added to the Scene`)}unkill(){this.active=!0}isKilled(){return!this.active}get z(){return this.get(Y).z}set z(t){this.get(Y).z=t}get center(){const t=this.getGlobalPos();return new A(t.x+this.width/2-this.anchor.x*this.width,t.y+this.height/2-this.anchor.y*this.height)}get localCenter(){return new A(this.pos.x+this.width/2-this.anchor.x*this.width,this.pos.y+this.height/2-this.anchor.y*this.height)}get width(){return this.collider.localBounds.width*this.getGlobalScale().x}get height(){return this.collider.localBounds.height*this.getGlobalScale().y}getGlobalRotation(){return this.get(Y).globalRotation}getGlobalPos(){return this.get(Y).globalPos}getGlobalScale(){return this.get(Y).globalScale}contains(t,e,i=!1){const s=R(t,e),n=this.get(Ct);n.update();const o=n.get();if(!o)return!1;const h=o.contains(s);return i?h||this.children.some(l=>l.contains(t,e,!0)):h}within(t,e){const i=this.get(Ct),s=t.get(Ct),n=i.get(),o=s.get();return n&&o?n.getClosestLineBetween(o).getLength()<=e:!1}update(t,e){this._initialize(t),this._preupdate(t,e),this._postupdate(t,e)}onPreUpdate(t,e){}onPostUpdate(t,e){}onPreCollisionResolve(t,e,i,s){}onPostCollisionResolve(t,e,i,s){}onCollisionStart(t,e,i,s){}onCollisionEnd(t,e){}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}}Xt.defaults={anchor:A.Half};function dr(r){return r instanceof nn}class nn extends Xt{constructor(t){var e,i;super({...t}),this.get(Y).coordPlane=Nt.Screen,this.anchor=(e=t==null?void 0:t.anchor)!==null&&e!==void 0?e:R(0,0),this.body.collisionType=(i=t==null?void 0:t.collisionType)!==null&&i!==void 0?i:q.PreventCollision,this.pointer.useGraphicsBounds=!0,this.pointer.useColliderShape=!1,!(t!=null&&t.collider)&&(t==null?void 0:t.width)>0&&(t==null?void 0:t.height)>0&&this.collider.useBoxCollider(this.width,this.height,this.anchor)}_initialize(t){this._engine=t,super._initialize(t)}contains(t,e,i=!0){if(i)return super.contains(t,e);const s=this._engine.worldToScreenCoordinates(new A(t,e));return super.contains(s.x,s.y)}}class je{get complete(){return this._complete}constructor(t,e,i,s,n,o){if(this._logger=j.getInstance(),this.id=0,this._elapsedTime=0,this._totalTimeAlive=0,this._running=!1,this._numberOfTicks=0,this.interval=10,this.repeats=!1,this.maxNumberOfRepeats=-1,this.randomRange=[0,0],this._baseInterval=10,this._generateRandomInterval=()=>this._baseInterval+this.random.integer(this.randomRange[0],this.randomRange[1]),this._complete=!1,this.scene=null,typeof t!="function"){const h=t;t=h.fcn,e=h.interval,i=h.repeats,s=h.numberOfRepeats,n=h.randomRange,o=h.random}if(s&&s>=0&&(this.maxNumberOfRepeats=s,!i))throw new Error("repeats must be set to true if numberOfRepeats is set");if(this.id=je._MAX_ID++,this._callbacks=[],this._baseInterval=this.interval=e,n){if(n[0]>n[1])throw new Error("min value must be lower than max value for range");this.random=o??new Ii,this.randomRange=n,this.interval=this._generateRandomInterval(),this.on(()=>{this.interval=this._generateRandomInterval()})}this.repeats=i||this.repeats,t&&this.on(t)}on(t){this._callbacks.push(t)}off(t){const e=this._callbacks.indexOf(t);this._callbacks.splice(e,1)}update(t){this._running&&(this._totalTimeAlive+=t,this._elapsedTime+=t,this.maxNumberOfRepeats>-1&&this._numberOfTicks>=this.maxNumberOfRepeats&&(this._complete=!0,this._running=!1,this._elapsedTime=0),!this.complete&&this._elapsedTime>=this.interval&&(this._callbacks.forEach(e=>{e.call(this)}),this._numberOfTicks++,this.repeats?this._elapsedTime=0:(this._complete=!0,this._running=!1,this._elapsedTime=0)))}reset(t,e){if(t&&t>=0&&(this._baseInterval=this.interval=t),this.maxNumberOfRepeats&&this.maxNumberOfRepeats>=0&&(this.maxNumberOfRepeats=e,!this.repeats))throw new Error("repeats must be set to true if numberOfRepeats is set");this._complete=!1,this._elapsedTime=0,this._numberOfTicks=0}get timesRepeated(){return this._numberOfTicks}getTimeRunning(){return this._totalTimeAlive}get timeToNextAction(){return this.complete?0:this.interval-this._elapsedTime}get timeElapsedTowardNextAction(){return this._elapsedTime}get isRunning(){return this._running}pause(){return this._running=!1,this}resume(){return this._running=!0,this}start(){return this.scene||this._logger.warn("Cannot start a timer not part of a scene, timer wont start until added"),this._running=!0,this.complete&&(this._complete=!1,this._elapsedTime=0,this._numberOfTicks=0),this}stop(){return this._running=!1,this._elapsedTime=0,this._numberOfTicks=0,this}cancel(){this.pause(),this.scene&&this.scene.cancelTimer(this)}}je._MAX_ID=0;class us extends ie{constructor(t){super(),this.type="ex.parallax",this.parallaxFactor=R(1,1),this.parallaxFactor=t??this.parallaxFactor}}class fs extends ie{constructor(t,e=!0){super(),this.draw=t,this.useTransform=e,this.type="ex.debuggraphics"}}class Fe{constructor(t,e){this.bounds=t,this.options=e,this._defaultOptions={maxDepth:10,capacity:10,level:0},this.items=[],this._isDivided=!1,this.topLeft=null,this.topRight=null,this.bottomLeft=null,this.bottomRight=null,this.options={...this._defaultOptions,...e},this.halfWidth=t.width/2,this.halfHeight=t.height/2}_split(){this._isDivided=!0;const t={maxDepth:this.options.maxDepth,capacity:this.options.capacity,level:this.options.level+1};this.topLeft=new Fe(new J({left:this.bounds.left,top:this.bounds.top,right:this.bounds.left+this.halfWidth,bottom:this.bounds.top+this.halfHeight}),t),this.topRight=new Fe(new J({left:this.bounds.left+this.halfWidth,top:this.bounds.top,right:this.bounds.right,bottom:this.bounds.top+this.halfHeight}),t),this.bottomLeft=new Fe(new J({left:this.bounds.left,top:this.bounds.top+this.halfHeight,right:this.bounds.left+this.halfWidth,bottom:this.bounds.bottom}),t),this.bottomRight=new Fe(new J({left:this.bounds.left+this.halfWidth,top:this.bounds.top+this.halfHeight,right:this.bounds.right,bottom:this.bounds.bottom}),t)}_insertIntoSubNodes(t){var e,i,s,n;!((e=this.topLeft)===null||e===void 0)&&e.bounds.overlaps(t.bounds)&&this.topLeft.insert(t),!((i=this.topRight)===null||i===void 0)&&i.bounds.overlaps(t.bounds)&&this.topRight.insert(t),!((s=this.bottomLeft)===null||s===void 0)&&s.bounds.overlaps(t.bounds)&&this.bottomLeft.insert(t),!((n=this.bottomRight)===null||n===void 0)&&n.bounds.overlaps(t.bounds)&&this.bottomRight.insert(t)}insert(t){if(this._isDivided){this._insertIntoSubNodes(t);return}if(this.items.push(t),this.items.length>this.options.capacity&&this.options.level-1&&this.items.splice(o,1);return}!((e=this.topLeft)===null||e===void 0)&&e.bounds.overlaps(t.bounds)&&this.topLeft.remove(t),!((i=this.topRight)===null||i===void 0)&&i.bounds.overlaps(t.bounds)&&this.topRight.remove(t),!((s=this.bottomLeft)===null||s===void 0)&&s.bounds.overlaps(t.bounds)&&this.bottomLeft.remove(t),!((n=this.bottomRight)===null||n===void 0)&&n.bounds.overlaps(t.bounds)&&this.bottomRight.remove(t)}}query(t){let e=this.items;return this._isDivided&&(this.topLeft.bounds.overlaps(t)&&(e=e.concat(this.topLeft.query(t))),this.topRight.bounds.overlaps(t)&&(e=e.concat(this.topRight.query(t))),this.bottomLeft.bounds.overlaps(t)&&(e=e.concat(this.bottomLeft.query(t))),this.bottomRight.bounds.overlaps(t)&&(e=e.concat(this.bottomRight.query(t)))),e=e.filter((i,s)=>e.indexOf(i)>=s),e}clear(){this.items=[],this._isDivided=!1,this.topLeft=null,this.topRight=null,this.bottomLeft=null,this.bottomRight=null}getAllItems(){let t=this.items;return this._isDivided&&(t=t.concat(this.topLeft.getAllItems()),t=t.concat(this.topRight.getAllItems()),t=t.concat(this.bottomLeft.getAllItems()),t=t.concat(this.bottomRight.getAllItems())),t=t.filter((e,i)=>t.indexOf(e)>=i),t}getTreeDepth(){return this._isDivided?1+Math.max(this.topLeft.getTreeDepth(),this.topRight.getTreeDepth(),this.bottomLeft.getTreeDepth(),this.bottomRight.getTreeDepth()):0}debug(t){this.bounds.draw(t,L.Yellow),this._isDivided&&(this.topLeft.bounds.draw(t,L.Yellow),this.topRight.bounds.draw(t,L.Yellow),this.bottomLeft.bounds.draw(t,L.Yellow),this.bottomRight.bounds.draw(t,L.Yellow))}}const ca={PreUpdate:"preupdate",PostUpdate:"postupdate",PreDraw:"predraw",PostDraw:"postdraw"};class ur extends Rt{flagCollidersDirty(){this._collidersDirty=!0}flagTilesDirty(){for(let t=0;tthis.draw(n,o)})),this.addComponent(new fs((n,o)=>this.debug(n,o),!1)),this.addComponent(new Ct),this._graphics=this.get(Ft),this._transform=this.get(Y),this._motion=this.get(yt),this._collider=this.get(Ct),this._composite=this._collider.useCompositeCollider([]),this._transform.pos=(e=t.pos)!==null&&e!==void 0?e:A.Zero,this._oldPos=this._transform.pos.clone(),this._oldScale=this._transform.scale.clone(),this.renderFromTopOfGraphic=(i=t.renderFromTopOfGraphic)!==null&&i!==void 0?i:this.renderFromTopOfGraphic,this.tileWidth=t.tileWidth,this.tileHeight=t.tileHeight,this.rows=t.rows,this.columns=t.columns,this._quadTree=new Fe(J.fromDimension(this.columns*this.tileWidth,this.rows*this.tileHeight,A.Zero,this.pos)),this.tiles=new Array(this.rows*this.columns),this._rows=new Array(this.rows),this._cols=new Array(this.columns);let s=[];for(let n=0;nn&&o?n.top===o.top&&n.bottom===o.bottom&&n.right===o.left:!1,s=(n,o,h=10)=>{if(!n)return!1;for(let l=o.length-1;l>=0;l--){if(h--<0)return!1;const f=o[l];if(i(f,n))return o[l]=f.combine(n),!0}return!1};for(let n=0;n0){for(const l of h.getColliders()){const f=this._getOrSetColliderOriginalOffset(l);l.offset=R(h.x*this.tileWidth*this.scale.x,h.y*this.tileHeight*this.scale.y).add(f),l.owner=this,this._composite.addCollider(l)}e&&!s(e,t)&&t.push(e),e=null}else e?e=e.combine(h.defaultGeometry):e=h.defaultGeometry;else e&&!s(e,t)&&t.push(e),e=null}e&&!s(e,t)&&t.push(e),e=null}for(const n of t){const o=Dt.Box(n.width,n.height,A.Zero,R(n.left-this.pos.x,n.top-this.pos.y));o.owner=this,this._composite.addCollider(o)}this._collider.update(),this._collider.$colliderAdded.notifyAll(this._composite)}getTileByIndex(t){return this.tiles[t]}getTile(t,e){return t<0||e<0||t>=this.columns||e>=this.rows?null:this.tiles[t+e*this.columns]}getTileByPoint(t){const e=Math.floor((t.x-this.pos.x)/(this.tileWidth*this.scale.x)),i=Math.floor((t.y-this.pos.y)/(this.tileHeight*this.scale.y)),s=this.getTile(e,i);return e>=0&&i>=0&&e-1&&(this._graphics.splice(e,1),this._offsets.splice(e,1))}clearGraphics(){this._graphics.length=0,this._offsets.length=0}getColliders(){return this._colliders}addCollider(t){this._colliders.push(t),this.map.flagCollidersDirty()}removeCollider(t){const e=this._colliders.indexOf(t);e>-1&&this._colliders.splice(e,1),this.map.flagCollidersDirty()}clearColliders(){this._colliders.length=0,this.map.flagCollidersDirty()}constructor(t){var e,i;super(),this._posDirty=!1,this._solid=!1,this._graphics=[],this._offsets=[],this._colliders=[],this.data=new Map,this.x=t.x,this.y=t.y,this.map=t.map,this._width=t.map.tileWidth*this.map.scale.x,this._height=t.map.tileHeight*this.map.scale.y,this.solid=(e=t.solid)!==null&&e!==void 0?e:this.solid,this._graphics=(i=t.graphics)!==null&&i!==void 0?i:[],this._recalculate()}flagDirty(){return this._posDirty=!0}_recalculate(){const t=this.map.pos.add(R(this.x*this.map.tileWidth,this.y*this.map.tileHeight));this._geometry=new J(t.x,t.y,t.x+this.map.tileWidth,t.y+this.map.tileHeight),this._width=this.map.tileWidth*this.map.scale.x,this._height=this.map.tileHeight*this.map.scale.y,this._pos=this.map.pos.add(R(this.x*this._width,this.y*this._height)),this._bounds=new J(this._pos.x,this._pos.y,this._pos.x+this._width,this._pos.y+this._height),this.map.rotation&&(this._bounds=this._bounds.rotate(this.map.rotation,this.map.pos)),this._posDirty=!1}get bounds(){return this._posDirty&&this._recalculate(),this._bounds}get defaultGeometry(){return this._geometry}get center(){return this._posDirty&&this._recalculate(),new A(this._pos.x+this._width/2,this._pos.y+this._height/2)}}class gr{constructor(t){this.camera=t}lockToActor(t){this.camera.addStrategy(new pr(t))}lockToActorAxis(t,e){this.camera.addStrategy(new mr(t,e))}elasticToActor(t,e,i){this.camera.addStrategy(new _r(t,e,i))}radiusAroundActor(t,e){this.camera.addStrategy(new vr(t,e))}limitCameraBounds(t){this.camera.addStrategy(new xr(t))}}var gs;(function(r){r[r.X=0]="X",r[r.Y=1]="Y"})(gs||(gs={}));class pr{constructor(t){this.target=t,this.action=(e,i,s,n)=>e.center}}class mr{constructor(t,e){this.target=t,this.axis=e,this.action=(i,s,n,o)=>{const h=i.center,l=s.getFocus();return this.axis===gs.X?new A(h.x,l.y):new A(l.x,h.y)}}}class _r{constructor(t,e,i){this.target=t,this.cameraElasticity=e,this.cameraFriction=i,this.action=(s,n,o,h)=>{const l=s.center;let f=n.getFocus(),m=n.vel.clone();const v=l.sub(f).scale(this.cameraElasticity);m=m.add(v);const w=m.scale(-1).scale(this.cameraFriction);return m=m.add(w),f=f.add(m),f}}}class vr{constructor(t,e){this.target=t,this.radius=e,this.action=(i,s,n,o)=>{const h=i.center,l=s.getFocus(),f=h.sub(l),m=f.size;if(m>=this.radius){const v=m-this.radius;return l.add(f.normalize().scale(v))}return l}}}class xr{constructor(t){this.target=t,this.boundSizeChecked=!1,this.action=(e,i,s,n)=>{const o=i.getFocus();this.boundSizeChecked||((e.bottom-e.tope.right-s.halfDrawWidth&&(h=e.right-s.halfDrawWidth),o.ye.bottom-s.halfDrawHeight&&(l=e.bottom-s.halfDrawHeight),R(h,l)}}}const da={Initialize:"initialize",PreUpdate:"preupdate",PostUpdate:"postupdate"};class wr{constructor(){this.events=new T,this.transform=Et.identity(),this.inverse=Et.identity(),this._cameraStrategies=[],this.strategy=new gr(this),this._z=1,this.dz=0,this.az=0,this.rotation=0,this._angularVelocity=0,this._posChanged=!1,this._pos=Rn(A.Zero,()=>this._posChanged=!0),this.drawPos=this.pos.clone(),this._oldPos=this.pos.clone(),this.vel=A.Zero,this.acc=A.Zero,this._cameraMoving=!1,this._currentLerpTime=0,this._lerpDuration=1e3,this._lerpStart=null,this._lerpEnd=null,this._isShaking=!1,this._shakeMagnitudeX=0,this._shakeMagnitudeY=0,this._shakeDuration=0,this._elapsedShakeTime=0,this._xShake=0,this._yShake=0,this._isZooming=!1,this._zoomStart=1,this._zoomEnd=1,this._currentZoomTime=0,this._zoomDuration=0,this._zoomEasing=xt.EaseInOutCubic,this._easing=xt.EaseInOutCubic,this._halfWidth=0,this._halfHeight=0,this._viewport=null,this._isInitialized=!1}get zoom(){return this._z}set zoom(t){this._z=t,this._engine&&(this._halfWidth=this._engine.halfDrawWidth,this._halfHeight=this._engine.halfDrawHeight)}get angularVelocity(){return this._angularVelocity}set angularVelocity(t){this._angularVelocity=t}get pos(){return this._pos}set pos(t){this._pos=Rn(t,()=>this._posChanged=!0),this._posChanged=!0}get x(){return this.pos.x}set x(t){!this._follow&&!this._cameraMoving&&(this.pos=R(t,this.pos.y))}get y(){return this.pos.y}set y(t){!this._follow&&!this._cameraMoving&&(this.pos=R(this.pos.x,t))}get dx(){return this.vel.x}set dx(t){this.vel=R(t,this.vel.y)}get dy(){return this.vel.y}set dy(t){this.vel=R(this.vel.x,t)}get ax(){return this.acc.x}set ax(t){this.acc=R(t,this.acc.y)}get ay(){return this.acc.y}set ay(t){this.acc=R(this.acc.x,t)}getFocus(){return this.pos}move(t,e,i=xt.EaseInOutCubic){if(typeof i!="function")throw"Please specify an EasingFunction";return this._follow?Promise.reject(t):(this._lerpPromise&&this._lerpResolve&&this._lerpResolve(t),this._lerpPromise=new Promise(s=>{this._lerpResolve=s}),this._lerpStart=this.getFocus().clone(),this._lerpDuration=e,this._lerpEnd=t,this._currentLerpTime=0,this._cameraMoving=!0,this._easing=i,this._lerpPromise)}shake(t,e,i){this._isShaking=!0,this._shakeMagnitudeX=t,this._shakeMagnitudeY=e,this._shakeDuration=i}zoomOverTime(t,e=0,i=xt.EaseInOutCubic){if(this._zoomPromise=new Promise(s=>{this._zoomResolve=s}),e)this._isZooming=!0,this._zoomEasing=i,this._currentZoomTime=0,this._zoomDuration=e,this._zoomStart=this.zoom,this._zoomEnd=t;else return this._isZooming=!1,this.zoom=t,Promise.resolve(!0);return this._zoomPromise}get viewport(){return this._viewport?this._viewport:new J(0,0,0,0)}addStrategy(t){this._cameraStrategies.push(t)}removeStrategy(t){Me(t,this._cameraStrategies)}clearAllStrategies(){this._cameraStrategies.length=0}_preupdate(t,e){this.events.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}onPreUpdate(t,e){}_postupdate(t,e){this.events.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}onPostUpdate(t,e){}get isInitialized(){return this._isInitialized}_initialize(t){if(!this.isInitialized){this._engine=t,this._screen=t.screen;const e=this._screen.contentArea;let i=R(e.width/2,e.height/2);if(!this._engine.loadingComplete){const s=this._screen.peekResolution();s&&(i=R(s.width/2,s.height/2))}this._halfWidth=i.x,this._halfHeight=i.y,this._posChanged||(this.pos=i),this.pos.clone(this.drawPos),this.updateTransform(this.pos),this.runStrategies(t,t.clock.elapsed()),this.updateViewport(),this.updateTransform(this.pos),this.pos.clone(this._oldPos),this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0}}onInitialize(t){}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}runStrategies(t,e){for(const i of this._cameraStrategies)this.pos=i.action.call(i,i.target,this,t,e)}updateViewport(){this._viewport=new J(this.x-this._halfWidth,this.y-this._halfHeight,this.x+this._halfWidth,this.y+this._halfHeight)}update(t,e){if(this._initialize(t),this._preupdate(t,e),this.pos.clone(this._oldPos),this.pos=this.pos.add(this.vel.scale(e/1e3)),this.zoom+=this.dz*e/1e3,this.vel=this.vel.add(this.acc.scale(e/1e3)),this.dz+=this.az*e/1e3,this.rotation+=this.angularVelocity*e/1e3,this._isZooming)if(this._currentZoomTime=this._shakeDuration}}const ua={ExitTrigger:"exit",EnterTrigger:"enter"},fa={pos:A.Zero,width:10,height:10,visible:!1,action:()=>{},filter:()=>!0,repeat:-1};class Ar extends Xt{constructor(t){super({x:t.pos.x,y:t.pos.y,width:t.width,height:t.height}),this.events=new T,this.action=()=>{},this.filter=()=>!0,this.repeat=-1,t={...fa,...t},this.filter=t.filter||this.filter,this.repeat=t.repeat||this.repeat,this.action=t.action||this.action,t.target&&(this.target=t.target),this.graphics.visible=t.visible,this.body.collisionType=q.Passive,this.events.on("collisionstart",e=>{this.filter(e.other)&&(this.events.emit("enter",new Ts(this,e.other)),this._dispatchAction(),this.repeat===0&&this.kill())}),this.events.on("collisionend",e=>{this.filter(e.other)&&this.events.emit("exit",new Ps(this,e.other))})}set target(t){this._target=t,this.filter=e=>e===t}get target(){return this._target}_initialize(t){super._initialize(t)}_dispatchAction(){this.repeat!==0&&(this.action.call(this),this.repeat--)}}var Kt;(function(r){r.Update="update",r.Draw="draw"})(Kt||(Kt={}));class ce{constructor(){this.priority=0}notify(t){}}class yr{constructor(t){this.data=t,this.type="Entity Added"}}function ki(r){return!!r&&r.type==="Entity Added"}class br{constructor(t){this.data=t,this.type="Entity Removed"}}function ga(r){return!!r&&r.type==="Entity Removed"}class Er{constructor(t){this._world=t,this.entities=[],this._entityIndex={},this._entitiesToRemove=[]}updateEntities(t,e){for(const i of this.entities)i.update(t.engine,e),i.active||this.removeEntity(i)}findEntitiesForRemoval(){for(const t of this.entities)t.active||this.removeEntity(t)}notify(t){Zn(t)&&this._world.queryManager.addEntity(t.data.entity),Vn(t)&&this._world.queryManager.removeComponent(t.data.entity,t.data.component)}addEntity(t){t.active=!0,t.scene=this._world.context,t&&!this._entityIndex[t.id]&&(this._entityIndex[t.id]=t,this.entities.push(t),this._world.queryManager.addEntity(t),t.componentAdded$.register(this),t.componentRemoved$.register(this),t.children.forEach(e=>{e.scene=t.scene,this.addEntity(e)}),t.childrenAdded$.register({notify:e=>{this.addEntity(e)}}),t.childrenRemoved$.register({notify:e=>{this.removeEntity(e,!1)}}))}removeEntity(t,e=!0){var i;let s=0;t instanceof Rt?s=t.id:s=t;const n=this._entityIndex[s];if(n&&n.active&&(n.active=!1),n&&e){this._entitiesToRemove.push(n);return}delete this._entityIndex[s],n&&(n.scene=null,Me(n,this.entities),this._world.queryManager.removeEntity(n),n.componentAdded$.unregister(this),n.componentRemoved$.unregister(this),n.children.forEach(o=>{o.scene=null,this.removeEntity(o,e)}),n.childrenAdded$.clear(),n.childrenRemoved$.clear(),!((i=this._world.context)===null||i===void 0)&&i.engine&&this._world.context.engine.stats.currFrame.actors.killed++)}processEntityRemovals(){for(const t of this._entitiesToRemove)t.active||this.removeEntity(t,!1);this._entitiesToRemove.length=0}processComponentRemovals(){for(const t of this.entities)t.processComponentRemoval()}getById(t){return this._entityIndex[t]}getByName(t){return this.entities.filter(e=>e.name===t)}clear(){for(let t=this.entities.length-1;t>=0;t--)this.removeEntity(this.entities[t])}}const ps=r=>[...r].sort((e,i)=>e.localeCompare(i)).join("+");class Cr extends ge{get key(){return this._key?this._key:this._key=ps(this.types)}constructor(t){super(),this._entities=[],t[0]instanceof Function?this.types=t.map(e=>new e().type):this.types=t}getEntities(t){return t&&this._entities.sort(t),this._entities}addEntity(t){!Fs(this._entities,t)&&this.matches(t)&&(this._entities.push(t),this.notifyAll(new yr(t)))}removeEntity(t){Me(t,this._entities)&&this.notifyAll(new br(t))}clear(){this._entities.length=0;for(let t=this.observers.length-1;t>=0;t--)this.unregister(this.observers[t])}matches(t){let e=[];t instanceof Rt?e=t.types:e=t;let i=!0;for(const s of this.types)if(i=i&&e.indexOf(s)>-1,!i)return!1;return i}contain(t){return this.types.indexOf(t)>-1}}class Ir{constructor(t){this._world=t,this._queries={}}_addQuery(t){this._queries[ps(t.types)]=t;for(const e of this._world.entityManager.entities)t.addEntity(e)}maybeRemoveQuery(t){t.observers.length===0&&(t.clear(),delete this._queries[ps(t.types)])}addEntity(t){for(const e in this._queries)this._queries[e]&&this._queries[e].addEntity(t)}removeComponent(t,e){for(const i in this._queries)this._queries[i].contain(e.type)&&this._queries[i].removeEntity(t)}removeEntity(t){for(const e in this._queries)this._queries[e].removeEntity(t)}createQuery(t){const e=this.getQuery(t);if(e)return e;const i=new Cr(t);return this._addQuery(i),i}getQuery(t){const e=ps(t);return this._queries[e]?this._queries[e]:null}}class Sr{constructor(t){this._world=t,this.systems=[],this.initialized=!1}get(t){return this.systems.find(e=>e instanceof t)}addSystem(t){if(!t.types||t.types.length===0)throw new Error("Attempted to add a System without any types");const e=this._world.queryManager.createQuery(t.types);this.systems.push(t),this.systems.sort((i,s)=>i.priority-s.priority),e.register(t),this.initialized&&t.initialize&&t.initialize(this._world.context)}removeSystem(t){Me(t,this.systems);const e=this._world.queryManager.getQuery(t.types);e&&(e.unregister(t),this._world.queryManager.maybeRemoveQuery(e))}initialize(){if(!this.initialized){this.initialized=!0;for(const t of this.systems)t.initialize&&t.initialize(this._world.context)}}updateSystems(t,e,i){const s=this.systems.filter(n=>n.systemType===t);for(const n of s)n.preupdate&&n.preupdate(e,i);for(const n of s){const o=this._world.queryManager.getQuery(n.types).getEntities(n.sort);if(e instanceof Oi)for(const h of o)h._initialize(e==null?void 0:e.engine);n.update(o,i)}for(const n of s)n.postupdate&&n.postupdate(e,i)}clear(){for(let t=this.systems.length-1;t>=0;t--)this.removeSystem(this.systems[t])}}class Tr{constructor(t){this.context=t,this.queryManager=new Ir(this),this.entityManager=new Er(this),this.systemManager=new Sr(this)}update(t,e){t===Kt.Update&&this.entityManager.updateEntities(this.context,e),this.systemManager.updateSystems(t,this.context,e),this.entityManager.findEntitiesForRemoval(),this.entityManager.processComponentRemovals(),this.entityManager.processEntityRemovals()}add(t){t instanceof Rt&&this.entityManager.addEntity(t),t instanceof ce&&this.systemManager.addSystem(t)}remove(t,e=!0){t instanceof Rt&&this.entityManager.removeEntity(t,e),t instanceof ce&&this.systemManager.removeSystem(t)}clearEntities(){this.entityManager.clear()}clearSystems(){this.systemManager.clear()}}class Yt{static integrate(t,e,i,s){const n=s/1e3;e.vel.addEqual(i.scale(n,Yt._ACC)),t.pos.add(e.vel.scale(n,Yt._VEL),Yt._POS).addEqual(i.scale(.5*n*n,Yt._VEL_ACC)),e.angularVelocity+=e.torque*(1/e.inertia)*n;const o=t.rotation+e.angularVelocity*n;t.scale.add(e.scaleFactor.scale(n,this._SCALE_FACTOR),Yt._SCALE),t.get().setTransform(Yt._POS,o,Yt._SCALE)}}Yt._POS=new A(0,0),Yt._SCALE=new A(1,1),Yt._ACC=new A(0,0),Yt._VEL=new A(0,0),Yt._VEL_ACC=new A(0,0),Yt._SCALE_FACTOR=new A(0,0);class Pr extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.motion"],this.systemType=Kt.Update,this.priority=-1}update(t,e){let i,s;for(let n=0;n!e.isCanceled()),t.sort((e,i)=>{const s=this.distanceMap.get(e.id),n=this.distanceMap.get(i.id);return s-n});for(const e of t)this.solvePosition(e),this.solveVelocity(e);return this.postSolve(t),t}preSolve(t){for(const i of t){if(Math.abs(i.mtv.x)<1e-4&&Math.abs(i.mtv.y)<1e-4){i.cancel();continue}const s=_t.fromDirection(i.mtv),n=i.mtv.negate(),o=i.colliderA.worldPos.squareDistance(i.colliderB.worldPos);this.distanceMap.set(i.id,o),i.colliderA.events.emit("precollision",new bt(i.colliderA,i.colliderB,s,n,i)),i.colliderB.events.emit("precollision",new bt(i.colliderB,i.colliderA,_t.getOpposite(s),n.negate(),i))}}postSolve(t){var e,i;for(const s of t){if(s.isCanceled())continue;const n=s.colliderA,o=s.colliderB,h=(e=n.owner)===null||e===void 0?void 0:e.get(it),l=(i=o.owner)===null||i===void 0?void 0:i.get(it);if(h&&l&&(h.collisionType===q.Passive||l.collisionType===q.Passive))continue;const f=_t.fromDirection(s.mtv),m=s.mtv.negate();s.colliderA.events.emit("postcollision",new ze(s.colliderA,s.colliderB,f,m,s)),s.colliderB.events.emit("postcollision",new ze(s.colliderB,s.colliderA,_t.getOpposite(f),m.negate(),s))}}solvePosition(t){var e,i;if(!t.colliderA.bounds.overlaps(t.colliderB.bounds,1e-4)){t.cancel();return}if(Math.abs(t.mtv.x)<1e-4&&Math.abs(t.mtv.y)<1e-4){t.cancel();return}let n=t.mtv;const o=t.colliderA,h=t.colliderB,l=(e=o.owner)===null||e===void 0?void 0:e.get(it),f=(i=h.owner)===null||i===void 0?void 0:i.get(it);if(l&&f){if(l.collisionType===q.Passive||f.collisionType===q.Passive)return;l.collisionType===q.Active&&f.collisionType===q.Active&&(n=n.scale(.5)),l.collisionType===q.Active&&(l.globalPos.x-=n.x,l.globalPos.y-=n.y,o.update(l.transform.get())),f.collisionType===q.Active&&(f.globalPos.x+=n.x,f.globalPos.y+=n.y,h.update(f.transform.get()))}}solveVelocity(t){var e,i;if(t.isCanceled())return;const s=t.colliderA,n=t.colliderB,o=(e=s.owner)===null||e===void 0?void 0:e.get(it),h=(i=n.owner)===null||i===void 0?void 0:i.get(it);if(o&&h){if(o.collisionType===q.Passive||h.collisionType===q.Passive)return;const l=t.normal,f=l.negate();if(o.collisionType===q.Active&&o.vel.normalize().dot(f)<0){const m=l.scale(l.dot(o.vel.negate()));o.vel=o.vel.add(m)}if(h.collisionType===q.Active&&h.vel.normalize().dot(l)<0){const m=f.scale(f.dot(h.vel.negate()));h.vel=h.vel.add(m)}}}}class Mr{constructor(t,e,i){this.point=t,this.local=e,this.contact=i,this.normalImpulse=0,this.tangentImpulse=0,this.normalMass=0,this.tangentMass=0,this.aToContact=new A(0,0),this.bToContact=new A(0,0),this.originalVelocityAndRestitution=0,this.update()}update(){var t,e;const i=(t=this.contact.colliderA.owner)===null||t===void 0?void 0:t.get(it),s=(e=this.contact.colliderB.owner)===null||e===void 0?void 0:e.get(it);if(i&&s){const n=this.contact.normal,o=this.contact.tangent;this.aToContact=this.point.sub(i.globalPos),this.bToContact=this.point.sub(s.globalPos);const h=this.aToContact.cross(n),l=this.bToContact.cross(n);this.normalMass=i.inverseMass+s.inverseMass+i.inverseInertia*h*h+s.inverseInertia*l*l;const f=this.aToContact.cross(o),m=this.bToContact.cross(o);this.tangentMass=i.inverseMass+s.inverseMass+i.inverseInertia*f*f+s.inverseInertia*m*m}return this}getRelativeVelocity(){var t,e;const i=(t=this.contact.colliderA.owner)===null||t===void 0?void 0:t.get(it),s=(e=this.contact.colliderB.owner)===null||e===void 0?void 0:e.get(it);if(i&&s){const n=i.vel.add(A.cross(i.angularVelocity,this.aToContact));return s.vel.add(A.cross(s.angularVelocity,this.bToContact)).sub(n)}return A.Zero}}class Br{constructor(){this.lastFrameContacts=new Map,this.idToContactConstraint=new Map}getContactConstraints(t){var e;return(e=this.idToContactConstraint.get(t))!==null&&e!==void 0?e:[]}solve(t){return this.preSolve(t),t=t.filter(e=>!e.isCanceled()),this.solveVelocity(t),this.solvePosition(t),this.postSolve(t),t}preSolve(t){var e,i,s;for(const h of t){if(Math.abs(h.mtv.x)<1e-4&&Math.abs(h.mtv.y)<1e-4){h.cancel();continue}const l=_t.fromDirection(h.mtv);h.colliderA.events.emit("precollision",new bt(h.colliderA,h.colliderB,l,h.mtv,h)),h.colliderA.events.emit("beforecollisionresolve",new Ji(h.colliderA,h.colliderB,l,h.mtv,h)),h.colliderB.events.emit("precollision",new bt(h.colliderB,h.colliderA,_t.getOpposite(l),h.mtv.negate(),h)),h.colliderB.events.emit("beforecollisionresolve",new Ji(h.colliderB,h.colliderA,_t.getOpposite(l),h.mtv.negate(),h)),h.matchAwake()}const o=Array.from(this.idToContactConstraint.keys());for(const h of t){const l=o.indexOf(h.id);l>-1&&o.splice(l,1);const f=(e=this.idToContactConstraint.get(h.id))!==null&&e!==void 0?e:[];let m=0;const v=h.colliderA.owner.get(it),w=h.colliderB.owner.get(it);if(v&&w)for(const y of h.points){const b=h.normal,k=h.tangent,D=y.sub(v.globalPos),I=y.sub(w.globalPos),E=D.cross(b),F=I.cross(b),U=v.inverseMass+w.inverseMass+v.inverseInertia*E*E+w.inverseInertia*F*F,V=D.cross(k),W=I.cross(k),M=v.inverseMass+w.inverseMass+v.inverseInertia*V*V+w.inverseInertia*W*W;f[m]&&((s=(i=f[m])===null||i===void 0?void 0:i.point)===null||s===void 0?void 0:s.squareDistance(y))<4?(f[m].point=y,f[m].local=h.localPoints[m]):f[m]=new Mr(y,h.localPoints[m],h),f[m].aToContact=D,f[m].bToContact=I,f[m].normalMass=1/U,f[m].tangentMass=1/M;const rt=v.bounciness>w.bounciness?v.bounciness:w.bounciness,ct=h.normal.dot(f[m].getRelativeVelocity());f[m].originalVelocityAndRestitution=0,ct<-.1&&(f[m].originalVelocityAndRestitution=-rt*ct),m++}this.idToContactConstraint.set(h.id,f)}for(const h of o)this.idToContactConstraint.delete(h);if(Z.warmStart)this.warmStart(t);else for(const h of t){const l=this.getContactConstraints(h.id);for(const f of l)f.normalImpulse=0,f.tangentImpulse=0}}postSolve(t){for(const e of t){const i=e.colliderA.owner.get(it),s=e.colliderB.owner.get(it);if(i&&s){if(i.collisionType===q.Passive||s.collisionType===q.Passive)continue;i.updateMotion(),s.updateMotion()}const n=_t.fromDirection(e.mtv);e.colliderA.events.emit("postcollision",new ze(e.colliderA,e.colliderB,n,e.mtv,e)),e.colliderA.events.emit("aftercollisionresolve",new Vi(e.colliderA,e.colliderB,n,e.mtv,e)),e.colliderB.events.emit("postcollision",new ze(e.colliderB,e.colliderA,_t.getOpposite(n),e.mtv.negate(),e)),e.colliderB.events.emit("aftercollisionresolve",new Vi(e.colliderB,e.colliderA,_t.getOpposite(n),e.mtv.negate(),e))}this.lastFrameContacts.clear();for(const e of t)this.lastFrameContacts.set(e.id,e)}warmStart(t){var e,i,s;for(const n of t){const o=(e=n.colliderA.owner)===null||e===void 0?void 0:e.get(it),h=(i=n.colliderB.owner)===null||i===void 0?void 0:i.get(it);if(o&&h){const l=(s=this.idToContactConstraint.get(n.id))!==null&&s!==void 0?s:[];for(const f of l)if(Z.warmStart){const m=n.normal.scale(f.normalImpulse),v=n.tangent.scale(f.tangentImpulse),w=m.add(v);o.applyImpulse(f.point,w.negate()),h.applyImpulse(f.point,w)}else f.normalImpulse=0,f.tangentImpulse=0}}}solvePosition(t){var e,i,s;for(let n=0;nthis._processor.track(e),this._untrackCollider=e=>this._processor.untrack(e)}notify(t){if(ki(t)){const e=t.data.get(Ct);e.$colliderAdded.subscribe(this._trackCollider),e.$colliderRemoved.subscribe(this._untrackCollider);const i=e.get();i&&this._processor.track(i)}else{const e=t.data.get(Ct),i=e.get();e&&i&&this._processor.untrack(i)}}initialize(t){this._engine=t.engine}update(t,e){var i,s,n,o;if(!Z.enabled)return;let h=[];for(const v of t){const w=v.get(Ct),y=w==null?void 0:w.get();if(w&&(!((i=w.owner)===null||i===void 0)&&i.active)&&y)if(w.update(),y instanceof Bt){const b=y.getColliders();h=h.concat(b)}else h.push(y)}this._processor.update(h);const l=this._processor.broadphase(h,e);this._currentFrameContacts.clear();let f=this._processor.narrowphase(l,(o=(n=(s=this._engine)===null||s===void 0?void 0:s.debug)===null||n===void 0?void 0:n.stats)===null||o===void 0?void 0:o.currFrame);f=this.getSolver().solve(f);for(const v of f){const w=v.id.indexOf("|");if(w>0){const y=v.id.substring(w+1);this._currentFrameContacts.set(y,v)}else this._currentFrameContacts.set(v.id,v)}this.runContactStartEnd(),this._lastFrameContacts.clear(),this._lastFrameContacts=new Map(this._currentFrameContacts)}getSolver(){return Z.collisionResolutionStrategy===Ze.Realistic?this._realisticSolver:this._arcadeSolver}debug(t){this._processor.debug(t)}runContactStartEnd(){for(const[t,e]of this._currentFrameContacts)if(!this._lastFrameContacts.has(t)){const i=e.colliderA,s=e.colliderB,n=_t.fromDirection(e.mtv),o=_t.getOpposite(n);i.events.emit("collisionstart",new yi(i,s,n,e)),i.events.emit("contactstart",new Wi(i,s,n,e)),s.events.emit("collisionstart",new yi(s,i,o,e)),s.events.emit("contactstart",new Wi(s,i,o,e))}for(const[t,e]of this._lastFrameContacts)if(!this._currentFrameContacts.has(t)){const i=e.colliderA,s=e.colliderB;i.events.emit("collisionend",new bi(i,s)),i.events.emit("contactend",new Zi(i,s)),s.events.emit("collisionend",new bi(s,i)),s.events.emit("contactend",new Zi(s,i))}}}var Di;(function(r){r.Forward="forward",r.Backward="backward"})(Di||(Di={}));var de;(function(r){r.End="end",r.Loop="loop",r.PingPong="pingpong",r.Freeze="freeze"})(de||(de={}));const pa={Frame:"frame",Loop:"loop",End:"end"};class _e extends Vt{constructor(t){var e,i,s;super(t),this.events=new T,this.frames=[],this.strategy=de.Loop,this.frameDuration=100,this._idempotencyToken=-1,this._firstTick=!0,this._currentFrame=0,this._timeLeftInFrame=0,this._pingPongDirection=1,this._done=!1,this._playing=!0,this._speed=1,this._reversed=!1,this.frames=t.frames,this.speed=(e=t.speed)!==null&&e!==void 0?e:this.speed,this.strategy=(i=t.strategy)!==null&&i!==void 0?i:this.strategy,this.frameDuration=t.totalDuration?t.totalDuration/this.frames.length:(s=t.frameDuration)!==null&&s!==void 0?s:this.frameDuration,t.reverse&&this.reverse(),this.goToFrame(0)}clone(){return new _e({frames:this.frames.map(t=>({...t})),frameDuration:this.frameDuration,speed:this.speed,reverse:this._reversed,strategy:this.strategy,...this.cloneGraphicOptions()})}get width(){const t=this.currentFrame;return t?Math.abs(t.graphic.width*this.scale.x):0}get height(){const t=this.currentFrame;return t?Math.abs(t.graphic.height*this.scale.y):0}static fromSpriteSheet(t,e,i,s=de.Loop){const n=t.sprites.length-1,o=e.filter(h=>h<0||h>n);return o.length&&_e._LOGGER.warn(`Indices into SpriteSheet were provided that don't exist: ${o.join(",")} no frame will be shown`),new _e({frames:t.sprites.filter((h,l)=>e.indexOf(l)>-1).map(h=>({graphic:h,duration:i})),strategy:s})}static fromSpriteSheetCoordinates(t){const{spriteSheet:e,frameCoordinates:i,durationPerFrameMs:s,speed:n,strategy:o,reverse:h}=t,l=s??100,f=[];for(const m of i){const{x:v,y:w,duration:y}=m,b=e.getSprite(v,w);b?f.push({graphic:b,duration:y??l}):_e._LOGGER.warn(`Skipping frame! SpriteSheet does not have coordinate (${v}, ${w}), please check your SpriteSheet to confirm that sprite exists`)}return new _e({frames:f,strategy:o,speed:n,reverse:h})}get speed(){return this._speed}set speed(t){this._speed=Gt(Math.abs(t),0,1/0)}get currentFrame(){return this._currentFrame>=0&&this._currentFrame=this.frames.length&&(this._done=!0,this._currentFrame=this.frames.length,this.events.emit("end",this));break}case de.Freeze:{e=Gt(t+1,0,this.frames.length-1),e>=this.frames.length-1&&(this._done=!0,this.events.emit("end",this));break}case de.PingPong:{t+this._pingPongDirection>=this.frames.length&&(this._pingPongDirection=-1,this.events.emit("loop",this)),t+this._pingPongDirection<0&&(this._pingPongDirection=1,this.events.emit("loop",this)),e=t+this._pingPongDirection%this.frames.length;break}}return e}tick(t,e=0){this._idempotencyToken!==e&&(this._idempotencyToken=e,this._playing&&(this._firstTick&&(this._firstTick=!1,this.events.emit("frame",{...this.currentFrame,frameIndex:this.currentFrameIndex})),this._timeLeftInFrame-=t*this._speed,this._timeLeftInFrame<=0&&this.goToFrame(this._nextFrame())))}_drawImage(t,e,i){this.currentFrame&&this.currentFrame.graphic.draw(t,e,i)}}_e._LOGGER=j.getInstance();class Fi extends Vt{constructor(t){super(t),this.members=[],this.members=t.members,this._updateDimensions()}clone(){return new Fi({members:[...this.members],...this.cloneGraphicOptions()})}_updateDimensions(){let t=new J;for(const{graphic:e,pos:i}of this.members)t=e.localBounds.translate(i).combine(t);return this.width=t.width,this.height=t.height,t}get localBounds(){let t=new J;for(const{graphic:e,pos:i}of this.members)t=e.localBounds.translate(i).combine(t);return t}_isAnimationOrGroup(t){return t instanceof _e||t instanceof Fi}tick(t,e){for(const i of this.members){const s=i.graphic;this._isAnimationOrGroup(s)&&s.tick(t,e)}}reset(){for(const t of this.members){const e=t.graphic;this._isAnimationOrGroup(e)&&e.reset()}}_preDraw(t,e,i){this._updateDimensions(),super._preDraw(t,e,i)}_drawImage(t,e,i){for(const s of this.members)t.save(),t.translate(e,i),s.graphic.draw(t,s.pos.x,s.pos.y),this.showDebug&&t.debug.drawRect(0,0,this.width,this.height),t.restore()}}function kr(r){return class extends r{assign(t){for(const e in t)typeof this[e]!="function"&&(this[e]=t[e])}constructor(...t){super(...t),t.filter(function(i){return i!==void 0}).length===1&&t[0]&&typeof t[0]=="object"&&!(t[0]instanceof Array)&&this.assign(t[0])}}}var mi;(function(r){r[r.Circle=0]="Circle",r[r.Rectangle=1]="Rectangle"})(mi||(mi={}));class ma extends Rt{constructor(t,e,i,s,n,o,h,l,f,m){super(),this.position=new A(0,0),this.velocity=new A(0,0),this.acceleration=new A(0,0),this.particleRotationalVelocity=0,this.currentRotation=0,this.focus=null,this.focusAccel=0,this.opacity=1,this.beginColor=L.White,this.endColor=L.White,this.life=300,this.fadeFlag=!1,this._rRate=1,this._gRate=1,this._bRate=1,this._aRate=0,this._currentColor=L.White,this.emitter=null,this.particleSize=5,this.particleSprite=null,this.sizeRate=0,this.elapsedMultiplier=0,this.visible=!0,this.isOffscreen=!1;let v=t;if(v&&!(t instanceof Dr)){const w=t;v=w.emitter,e=w.life,i=w.opacity,n=w.endColor,s=w.beginColor,o=w.position,h=w.velocity,l=w.acceleration,f=w.startSize,m=w.endSize}if(this.emitter=v,this.life=e||this.life,this.opacity=i||this.opacity,this.endColor=n||this.endColor.clone(),this.beginColor=s||this.beginColor.clone(),this._currentColor=this.beginColor.clone(),this.emitter.particleTransform===_i.Global){const w=this.emitter.transform.globalPos;this.position=(o||this.position).add(w),this.velocity=(h||this.velocity).rotate(this.emitter.transform.globalRotation)}else this.velocity=h||this.velocity,this.position=o||this.position;this.acceleration=l||this.acceleration,this._rRate=(this.endColor.r-this.beginColor.r)/this.life,this._gRate=(this.endColor.g-this.beginColor.g)/this.life,this._bRate=(this.endColor.b-this.beginColor.b)/this.life,this._aRate=this.opacity/this.life,this.startSize=f||0,this.endSize=m||0,this.endSize>0&&this.startSize>0&&(this.sizeRate=(this.endSize-this.startSize)/this.life,this.particleSize=this.startSize),this.addComponent(this.transform=new Y),this.addComponent(this.graphics=new Ft),this.transform.pos=this.position,this.transform.rotation=this.currentRotation,this.transform.scale=R(1,1),this.particleSprite?(this.graphics.opacity=this.opacity,this.graphics.use(this.particleSprite)):(this.graphics.localBounds=J.fromDimension(this.particleSize,this.particleSize,A.Half),this.graphics.onPostDraw=w=>{w.save(),this.graphics.opacity=this.opacity;const y=this._currentColor.clone();y.a=1,w.debug.drawPoint(R(0,0),{color:y,size:this.particleSize}),w.restore()})}kill(){this.emitter.removeParticle(this)}update(t,e){if(this.life=this.life-e,this.elapsedMultiplier=this.elapsedMultiplier+e,this.life<0&&this.kill(),this.fadeFlag&&(this.opacity=Gt(this._aRate*this.life,1e-4,1)),this.startSize>0&&this.endSize>0&&(this.particleSize=Gt(this.sizeRate*e+this.particleSize,Math.min(this.startSize,this.endSize),Math.max(this.startSize,this.endSize))),this._currentColor.r=Gt(this._currentColor.r+this._rRate*e,0,255),this._currentColor.g=Gt(this._currentColor.g+this._gRate*e,0,255),this._currentColor.b=Gt(this._currentColor.b+this._bRate*e,0,255),this._currentColor.a=Gt(this.opacity,1e-4,1),this.focus){const i=this.focus.sub(this.position).normalize().scale(this.focusAccel).scale(e/1e3);this.velocity=this.velocity.add(i)}else this.velocity=this.velocity.add(this.acceleration.scale(e/1e3));this.position=this.position.add(this.velocity.scale(e/1e3)),this.particleRotationalVelocity&&(this.currentRotation=(this.currentRotation+this.particleRotationalVelocity*e/1e3)%(2*Math.PI)),this.transform.pos=this.position,this.transform.rotation=this.currentRotation,this.transform.scale=R(1,1),this.graphics.opacity=this.opacity}}class ms extends kr(ma){constructor(t,e,i,s,n,o,h,l,f,m){super(t,e,i,s,n,o,h,l,f,m)}}var _i;(function(r){r.Global="global",r.Local="local"})(_i||(_i={}));class Dr extends Xt{get opacity(){return super.graphics.opacity}set opacity(t){super.graphics.opacity=t}get particleSprite(){return this._sprite}set particleSprite(t){t&&(this._sprite=t)}constructor(t){var e,i;super({width:(e=t.width)!==null&&e!==void 0?e:0,height:(i=t.height)!==null&&i!==void 0?i:0}),this._particlesToEmit=0,this.numParticles=0,this.isEmitting=!0,this.particles=[],this.deadParticles=[],this.minVel=0,this.maxVel=0,this.acceleration=new A(0,0),this.minAngle=0,this.maxAngle=0,this.emitRate=1,this.particleLife=2e3,this.fadeFlag=!1,this.focus=null,this.focusAccel=null,this.startSize=null,this.endSize=null,this.minSize=5,this.maxSize=5,this.beginColor=L.White,this.endColor=L.White,this._sprite=null,this.emitterType=mi.Rectangle,this.radius=0,this.particleRotationalVelocity=0,this.randomRotation=!1,this.particleTransform=_i.Global;const{x:s,y:n,pos:o,isEmitting:h,minVel:l,maxVel:f,acceleration:m,minAngle:v,maxAngle:w,emitRate:y,particleLife:b,opacity:k,fadeFlag:D,focus:I,focusAccel:E,startSize:F,endSize:U,minSize:V,maxSize:W,beginColor:M,endColor:rt,particleSprite:ct,emitterType:ft,radius:at,particleRotationalVelocity:It,particleTransform:qt,randomRotation:Wt,random:Zt}={...t};this.pos=o??R(s??0,n??0),this.isEmitting=h??this.isEmitting,this.minVel=l??this.minVel,this.maxVel=f??this.maxVel,this.acceleration=m??this.acceleration,this.minAngle=v??this.minAngle,this.maxAngle=w??this.maxAngle,this.emitRate=y??this.emitRate,this.particleLife=b??this.particleLife,this.opacity=k??this.opacity,this.fadeFlag=D??this.fadeFlag,this.focus=I??this.focus,this.focusAccel=E??this.focusAccel,this.startSize=F??this.startSize,this.endSize=U??this.endSize,this.minSize=V??this.minSize,this.maxSize=W??this.maxSize,this.beginColor=M??this.beginColor,this.endColor=rt??this.endColor,this.particleSprite=ct??this.particleSprite,this.emitterType=ft??this.emitterType,this.radius=at??this.radius,this.particleRotationalVelocity=It??this.particleRotationalVelocity,this.randomRotation=Wt??this.randomRotation,this.particleTransform=qt??this.particleTransform,this.body.collisionType=q.PreventCollision,this.random=Zt??new Ii}removeParticle(t){this.deadParticles.push(t)}emitParticles(t){var e;for(let i=0;i1&&(this.emitParticles(Math.floor(this._particlesToEmit)),this._particlesToEmit=this._particlesToEmit-Math.floor(this._particlesToEmit)));for(let s=0;s{this._zHasChanged=!0},this._targetInterpolationTransform=new Je}get sortedTransforms(){return this._sortedTransforms}initialize(t){this._camera=t.camera,this._engine=t.engine}preupdate(){this._graphicsContext=this._engine.graphicsContext,this._zHasChanged&&(this._sortedTransforms.sort((t,e)=>t.z-e.z),this._zHasChanged=!1)}notify(t){if(ki(t)){const e=t.data.get(Y);this._sortedTransforms.push(e),e.zIndexChanged$.subscribe(this._zIndexUpdate),this._zHasChanged=!0}else{const e=t.data.get(Y);e.zIndexChanged$.unsubscribe(this._zIndexUpdate);const i=this._sortedTransforms.indexOf(e);i>-1&&this._sortedTransforms.splice(i,1)}}update(t,e){this._token++;let i;dt.checkAndClearCache(),this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext);for(const s of this._sortedTransforms){const n=s.owner;if(n.hasTag("ex.offscreen")||(i=n.get(Ft),!i.visible))continue;i.onPreTransformDraw&&i.onPreTransformDraw(this._graphicsContext,e),n.events.emit("pretransformdraw",new st(this._graphicsContext,e,n)),s.coordPlane===Nt.Screen&&this._graphicsContext.restore(),this._graphicsContext.save(),s.coordPlane===Nt.Screen&&this._graphicsContext.translate(this._engine.screen.contentArea.left,this._engine.screen.contentArea.top),i.update(e,this._token);const o=n.get(us);if(o){const l=A.One.sub(o.parallaxFactor),f=this._camera.drawPos.scale(l);this._graphicsContext.translate(f.x,f.y)}this._applyTransform(n),i.material&&(this._graphicsContext.material=i.material),i.onPreDraw&&i.onPreDraw(this._graphicsContext,e),n.events.emit("predraw",new et(this._graphicsContext,e,n));const h=n instanceof ms?n.opacity:1;this._graphicsContext.opacity*=i.opacity*h,this._drawGraphicsComponent(i),i.onPostDraw&&i.onPostDraw(this._graphicsContext,e),n.events.emit("postdraw",new X(this._graphicsContext,e,n)),this._graphicsContext.restore(),s.coordPlane===Nt.Screen&&(this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext)),i.onPostTransformDraw&&i.onPostTransformDraw(this._graphicsContext,e),n.events.emit("posttransformdraw",new ht(this._graphicsContext,e,n))}this._graphicsContext.restore()}_drawGraphicsComponent(t){var e,i;if(t.visible){const s=t.flipHorizontal,n=t.flipVertical;for(const o of t.layers.get())for(const{graphic:h,options:l}of o.graphics){let f=t.anchor,m=t.offset;l!=null&&l.anchor&&(f=l.anchor),l!=null&&l.offset&&(m=l.offset);const v=-h.width*f.x+m.x,w=-h.height*f.y+m.y,y=h.flipHorizontal,b=h.flipVertical;if((s||n)&&(h.flipHorizontal=s?!y:y,h.flipVertical=n?!b:b),h==null||h.draw(this._graphicsContext,v+o.offset.x,w+o.offset.y),(s||n)&&(h.flipHorizontal=y,h.flipVertical=b),!((e=this._engine)===null||e===void 0)&&e.isDebug&&this._engine.debug.graphics.showBounds){const k=R(v+o.offset.x,w+o.offset.y);if(h instanceof Fi)for(const D of h.members)(i=D.graphic)===null||i===void 0||i.localBounds.translate(k.add(D.pos)).draw(this._graphicsContext,this._engine.debug.graphics.boundsColor);else h==null||h.localBounds.translate(k).draw(this._graphicsContext,this._engine.debug.graphics.boundsColor)}}}}_applyTransform(t){const e=t.getAncestors();for(const i of e){const s=i==null?void 0:i.get(Y),n=i==null?void 0:i.get(it);let o=s.get();if(n&&this._engine.fixedUpdateFps&&n.__oldTransformCaptured&&n.enableFixedUpdateInterpolate){const h=this._engine.currentFrameLagMs/(1e3/this._engine.fixedUpdateFps);o=_a(n.oldTransform,s.get(),h,this._targetInterpolationTransform)}s&&(this._graphicsContext.z=s.z,this._graphicsContext.translate(o.pos.x,o.pos.y),this._graphicsContext.scale(o.scale.x,o.scale.y),this._graphicsContext.rotate(o.rotation))}}}class Or extends ce{constructor(){super(...arguments),this.types=["ex.transform"],this.systemType=Kt.Draw,this.priority=999}initialize(t){this._graphicsContext=t.engine.graphicsContext,this._camera=t.camera,this._engine=t.engine,this._collisionSystem=t.world.systemManager.get(rn)}update(t,e){var i;if(!this._engine.isDebug)return;const s=this._engine.debug.filter;let n,o;const h=this._engine.debug.entity;let l;const f=this._engine.debug.transform;let m;const v=this._engine.debug.motion;let w;const y=this._engine.debug.collider,b=this._engine.debug.physics;let k;const D=this._engine.debug.graphics;let I,E;const F=this._engine.debug.body,U=this._engine.debug.camera;for(const V of t){if(V.hasTag("offscreen")||V instanceof ms||s.useFilter&&(!(s.ids.length===0||s.ids.includes(V.id))||!(s.nameQuery===""||V.name.includes(s.nameQuery))))continue;let W=A.Zero;const M=R(0,16);if(n=V.id,o=V.name,l=V.get(Y),this._pushCameraTransform(l),this._graphicsContext.save(),this._graphicsContext.z=f.debugZIndex,this._applyTransform(V),l&&((f.showAll||f.showPosition)&&this._graphicsContext.debug.drawPoint(A.Zero,{size:4,color:f.positionColor}),(f.showAll||f.showPositionLabel)&&(this._graphicsContext.debug.drawText(`pos${l.pos.toString(2)}`,W),W=W.add(M)),(f.showAll||f.showZIndex)&&(this._graphicsContext.debug.drawText(`z(${l.z.toFixed(1)})`,W),W=W.add(M)),(h.showAll||h.showId)&&(this._graphicsContext.debug.drawText(`id(${n}) ${V.parent?"child of id("+((i=V.parent)===null||i===void 0?void 0:i.id)+")":""}`,W),W=W.add(M)),(h.showAll||h.showName)&&(this._graphicsContext.debug.drawText(`name(${o})`,W),W=W.add(M)),(f.showAll||f.showRotation)&&(this._graphicsContext.drawLine(A.Zero,A.fromAngle(l.rotation).scale(50).add(A.Zero),f.rotationColor,2),this._graphicsContext.debug.drawText(`rot deg(${Cn(l.rotation).toFixed(2)})`,W),W=W.add(M)),(f.showAll||f.showScale)&&this._graphicsContext.drawLine(A.Zero,l.scale.add(A.Zero),f.scaleColor,2)),k=V.get(Ft),k&&(D.showAll||D.showBounds)&&k.localBounds.draw(this._graphicsContext,D.boundsColor),I=V.get(fs),I&&(I.useTransform||this._graphicsContext.restore(),I.draw(this._graphicsContext,this._engine.debug),I.useTransform||(this._graphicsContext.save(),this._applyTransform(V))),E=V.get(it),E&&((F.showAll||F.showCollisionGroup)&&(this._graphicsContext.debug.drawText(`collision group(${E.group.name})`,W),W=W.add(M)),(F.showAll||F.showCollisionType)&&(this._graphicsContext.debug.drawText(`collision type(${E.collisionType})`,W),W=W.add(M)),(F.showAll||F.showMass)&&(this._graphicsContext.debug.drawText(`mass(${E.mass})`,W),W=W.add(M)),(F.showAll||F.showMotion)&&(this._graphicsContext.debug.drawText(`motion(${E.sleepMotion})`,W),W=W.add(M)),(F.showAll||F.showSleeping)&&(this._graphicsContext.debug.drawText(`sleeping(${E.canSleep?E.sleeping:"cant sleep"})`,W),W=W.add(M))),this._graphicsContext.restore(),this._graphicsContext.save(),this._graphicsContext.z=f.debugZIndex,m=V.get(yt),m&&((v.showAll||v.showVelocity)&&(this._graphicsContext.debug.drawText(`vel${m.vel.toString(2)}`,W.add(l.globalPos)),this._graphicsContext.drawLine(l.globalPos,l.globalPos.add(m.vel),v.velocityColor,2),W=W.add(M)),(v.showAll||v.showAcceleration)&&this._graphicsContext.drawLine(l.globalPos,l.globalPos.add(m.acc),v.accelerationColor,2)),w=V.get(Ct),w){const rt=w.get();if((y.showAll||y.showGeometry)&&rt&&rt.debug(this._graphicsContext,y.geometryColor,{lineWidth:y.geometryLineWidth,pointSize:y.geometryPointSize}),y.showAll||y.showBounds){if(rt instanceof Bt){const ct=rt.getColliders();for(const ft of ct){const at=ft.bounds,It=R(at.left,at.top);this._graphicsContext.debug.drawRect(It.x,It.y,at.width,at.height,{color:y.boundsColor}),(y.showAll||y.showOwner)&&this._graphicsContext.debug.drawText(`owner id(${ft.owner.id})`,It)}w.bounds.draw(this._graphicsContext,y.boundsColor)}else if(rt){const ct=w.bounds,ft=R(ct.left,ct.top);this._graphicsContext.debug.drawRect(ft.x,ft.y,ct.width,ct.height,{color:y.boundsColor}),(y.showAll||y.showOwner)&&this._graphicsContext.debug.drawText(`owner id(${w.owner.id})`,ft)}}}this._graphicsContext.restore(),this._popCameraTransform(l)}if(this._graphicsContext.save(),this._camera.draw(this._graphicsContext),(b.showAll||b.showBroadphaseSpacePartitionDebug)&&this._collisionSystem.debug(this._graphicsContext),b.showAll||b.showCollisionContacts||b.showCollisionNormals)for(const[V,W]of this._engine.debug.stats.currFrame.physics.contacts){if(b.showAll||b.showCollisionContacts)for(const M of W.points)this._graphicsContext.debug.drawPoint(M,{size:5,color:b.collisionContactColor});if(b.showAll||b.showCollisionNormals)for(const M of W.points)this._graphicsContext.debug.drawLine(M,W.normal.scale(30).add(M),{color:b.collisionNormalColor})}this._graphicsContext.restore(),U&&(this._graphicsContext.save(),this._camera.draw(this._graphicsContext),(U.showAll||U.showFocus)&&this._graphicsContext.drawCircle(this._camera.pos,4,U.focusColor),(U.showAll||U.showZoom)&&this._graphicsContext.debug.drawText(`zoom(${this._camera.zoom})`,this._camera.pos),this._graphicsContext.restore()),this._graphicsContext.flush()}_applyTransform(t){const e=t.getAncestors();for(const i of e){const s=i==null?void 0:i.get(Y);s&&(this._graphicsContext.translate(s.pos.x,s.pos.y),this._graphicsContext.scale(s.scale.x,s.scale.y),this._graphicsContext.rotate(s.rotation))}}_pushCameraTransform(t){t.coordPlane===Nt.World&&(this._graphicsContext.save(),this._camera&&this._camera.draw(this._graphicsContext))}_popCameraTransform(t){t.coordPlane===Nt.World&&this._graphicsContext.restore()}}class _s extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.pointer"],this.systemType=Kt.Update,this.priority=-1,this.overrideUseColliderShape=!1,this.overrideUseGraphicsBounds=!1,this.lastFrameEntityToPointers=new Map,this.currentFrameEntityToPointers=new Map,this._sortedTransforms=[],this._sortedEntities=[],this._zHasChanged=!1,this._zIndexUpdate=()=>{this._zHasChanged=!0}}initialize(t){this._engine=t.engine}preupdate(){this._receiver=this._engine.input.pointers,this._zHasChanged&&(this._sortedTransforms.sort((t,e)=>e.z-t.z),this._sortedEntities=this._sortedTransforms.map(t=>t.owner),this._zHasChanged=!1)}notify(t){if(ki(t)){const e=t.data.get(Y);this._sortedTransforms.push(e),this._sortedEntities.push(e.owner),e.zIndexChanged$.subscribe(this._zIndexUpdate),this._zHasChanged=!0}else{const e=t.data.get(Y);e.zIndexChanged$.unsubscribe(this._zIndexUpdate);const i=this._sortedTransforms.indexOf(e);i>-1&&(this._sortedTransforms.splice(i,1),this._sortedEntities.splice(i,1))}}entityCurrentlyUnderPointer(t,e){return this.currentFrameEntityToPointers.has(t.id)&&this.currentFrameEntityToPointers.get(t.id).includes(e)}entityWasUnderPointer(t,e){return this.lastFrameEntityToPointers.has(t.id)&&this.lastFrameEntityToPointers.get(t.id).includes(e)}entered(t,e){return this.entityCurrentlyUnderPointer(t,e)&&!this.lastFrameEntityToPointers.has(t.id)}left(t,e){return!this.currentFrameEntityToPointers.has(t.id)&&this.entityWasUnderPointer(t,e)}addPointerToEntity(t,e){if(!this.currentFrameEntityToPointers.has(t.id)){this.currentFrameEntityToPointers.set(t.id,[e]);return}const i=this.currentFrameEntityToPointers.get(t.id);this.currentFrameEntityToPointers.set(t.id,i.concat(e))}update(t){this._processPointerToEntity(this._sortedEntities),this._dispatchEvents(this._sortedEntities),this._receiver.update(),this.lastFrameEntityToPointers.clear(),this.lastFrameEntityToPointers=new Map(this.currentFrameEntityToPointers),this.currentFrameEntityToPointers.clear(),this._receiver.clear()}_processPointerToEntity(t){var e;let i,s,n,o;for(const h of t){if(i=h.get(Y),o=(e=h.get(ui))!==null&&e!==void 0?e:new ui,s=h.get(Ct),s&&(o.useColliderShape||this.overrideUseColliderShape)){s.update();const l=s.get();if(l)for(const[f,m]of this._receiver.currentFramePointerCoords.entries())l.contains(i.coordPlane===Nt.World?m.worldPos:m.screenPos)&&this.addPointerToEntity(h,f)}if(n=h.get(Ft),n&&(o.useGraphicsBounds||this.overrideUseGraphicsBounds)){const l=n.localBounds.transform(i.get().matrix);for(const[f,m]of this._receiver.currentFramePointerCoords.entries())l.contains(i.coordPlane===Nt.World?m.worldPos:m.screenPos)&&this.addPointerToEntity(h,f)}}}_processDownAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameDown)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointerdown",i),this._receiver.isDragStart(i.pointerId)&&t.events.emit("pointerdragstart",i)),e.set(i.pointerId,i);return e}_processUpAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameUp)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointerup",i),this._receiver.isDragEnd(i.pointerId)&&t.events.emit("pointerdragend",i)),e.set(i.pointerId,i);return e}_processMoveAndEmit(t){const e=new Map;for(const i of this._receiver.currentFrameMove)i.active&&t.active&&this.entityCurrentlyUnderPointer(t,i.pointerId)&&(t.events.emit("pointermove",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragmove",i)),e.set(i.pointerId,i);return e}_processEnterLeaveAndEmit(t,e){for(const i of e){if(i.active&&t.active&&this.entered(t,i.pointerId)){t.events.emit("pointerenter",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragenter",i);break}if(i.active&&t.active&&(this.left(t,i.pointerId)||this.entityCurrentlyUnderPointer(t,i.pointerId)&&i.type==="up")){t.events.emit("pointerleave",i),this._receiver.isDragging(i.pointerId)&&t.events.emit("pointerdragleave",i);break}}}_processCancelAndEmit(t){for(const e of this._receiver.currentFrameCancel)e.active&&t.active&&this.entityCurrentlyUnderPointer(t,e.pointerId)&&t.events.emit("pointercancel",e)}_processWheelAndEmit(t){for(const e of this._receiver.currentFrameWheel)e.active&&t.active&&this.entityCurrentlyUnderPointer(t,0)&&t.events.emit("pointerwheel",e)}_dispatchEvents(t){const e=new Set(this.lastFrameEntityToPointers.keys()),i=new Set(this.currentFrameEntityToPointers.keys()),s=t.filter(l=>e.has(l.id)||i.has(l.id));let n,o,h;for(const l of s){h=this._processDownAndEmit(l),o=this._processUpAndEmit(l),n=this._processMoveAndEmit(l);const f=[...n.values(),...h.values(),...o.values()];this._processEnterLeaveAndEmit(l,f),this._processCancelAndEmit(l),this._processWheelAndEmit(l)}}}class Ur extends ce{constructor(){super(...arguments),this.types=["ex.actions"],this.systemType=Kt.Update,this.priority=-1,this._actions=[]}notify(t){if(ki(t)){const e=t.data.get(fi);this._actions.push(e)}else{const e=t.data.get(fi),i=this._actions.indexOf(e);i>-1&&this._actions.splice(i,1)}}update(t,e){for(const i of this._actions)i.update(e)}}class vs extends ie{constructor(t){super(),this.type="ex.isometricentity",this.elevation=0,this.columns=t.columns,this.rows=t.rows,this.tileWidth=t.tileWidth,this.tileHeight=t.tileHeight}}class Lr extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.isometricentity"],this.systemType=Kt.Update,this.priority=99}update(t,e){let i,s;for(const n of t){i=n.get(Y),s=n.get(vs);const h=Math.max(s.columns*s.tileWidth,s.rows*s.tileHeight)*s.elevation+i.pos.y;i.z=h}}}class zr extends ce{constructor(){super(...arguments),this.types=["ex.transform","ex.graphics"],this.systemType=Kt.Draw,this.priority=-1}initialize(t){this._camera=t.camera,this._screen=t.engine.screen}update(t){this._worldBounds=this._screen.getWorldBounds();let e,i,s;for(const n of t){i=n.get(Ft),e=n.get(Y),s=n.get(us);let o;if(s){const l=A.One.sub(s.parallaxFactor);o=this._camera.pos.scale(l)}const h=this._isOffscreen(e,i,o);h&&!n.hasTag("ex.offscreen")&&(n.events.emit("exitviewport",new Is(n)),n.addTag("ex.offscreen")),!h&&n.hasTag("ex.offscreen")&&(n.events.emit("enterviewport",new Ss(n)),n.removeTag("ex.offscreen"))}}_isOffscreen(t,e,i){if(t.coordPlane===Nt.World){let s=e.localBounds;i&&(s=s.translate(i));const n=s.transform(t.get().matrix);return!this._worldBounds.overlaps(n)}else return!1}}class Gr{constructor(){this.collisionProcessor=new qs}rayCast(t,e){return this.collisionProcessor.rayCast(t,e)}}const va={Initialize:"initialize",Activate:"activate",Deactivate:"deactivate",PreUpdate:"preupdate",PostUpdate:"postupdate",PreDraw:"predraw",PostDraw:"postdraw",PreDebugDraw:"predebugdraw",PostDebugDraw:"postdebugdraw"};class Oi{get actors(){return this.world.entityManager.entities.filter(t=>t instanceof Xt)}get entities(){return this.world.entityManager.entities}get triggers(){return this.world.entityManager.entities.filter(t=>t instanceof Ar)}get tileMaps(){return this.world.entityManager.entities.filter(t=>t instanceof ur)}get timers(){return this._timers}constructor(){this._logger=j.getInstance(),this.events=new T,this.camera=new wr,this.world=new Tr(this),this.physics=new Gr,this._isInitialized=!1,this._timers=[],this._cancelQueue=[],this.world.add(new Ur),this.world.add(new Pr),this.world.add(new rn(this.physics)),this.world.add(new _s),this.world.add(new Lr),this.world.add(new zr),this.world.add(new Fr),this.world.add(new Or)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}onInitialize(t){}onActivate(t){}onDeactivate(t){}onPreUpdate(t,e){}onPostUpdate(t,e){}onPreDraw(t,e){}onPostDraw(t,e){}_initializeChildren(){for(const t of this.entities)t._initialize(this.engine)}get isInitialized(){return this._isInitialized}_initialize(t){this.isInitialized||(this.engine=t,this.camera._initialize(t),this.world.systemManager.initialize(),this.onInitialize.call(this,t),this._initializeChildren(),this._logger.debug("Scene.onInitialize",this,t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0)}_activate(t){this._logger.debug("Scene.onActivate",this),this.onActivate(t)}_deactivate(t){this._logger.debug("Scene.onDeactivate",this),this.onDeactivate(t)}_preupdate(t,e){this.emit("preupdate",new ot(t,e,this)),this.onPreUpdate(t,e)}_postupdate(t,e){this.emit("postupdate",new gt(t,e,this)),this.onPostUpdate(t,e)}_predraw(t,e){this.emit("predraw",new et(t,e,this)),this.onPreDraw(t,e)}_postdraw(t,e){this.emit("postdraw",new X(t,e,this)),this.onPostDraw(t,e)}update(t,e){this._preupdate(t,e);let i,s;for(i=0,s=this._cancelQueue.length;i-1}add(t){if(this.emit("entityadded",{target:t}),this.world.add(t),t.scene=this,t instanceof je){Fs(this._timers,t)||this.addTimer(t);return}}transfer(t){let e;t instanceof Rt&&t.scene&&t.scene!==this&&(e=t.scene,t.scene.world.remove(t,!1)),t instanceof je&&t.scene&&(e=t.scene,t.scene.removeTimer(t)),e==null||e.emit("entityremoved",{target:t}),this.add(t)}remove(t){t instanceof Rt&&(this.emit("entityremoved",{target:t}),t.active&&t.kill(),this.world.remove(t)),t instanceof je&&this.removeTimer(t)}clear(t=!0){for(let e=this.entities.length-1;e>=0;e--)this.world.remove(this.entities[e],t);for(let e=this.timers.length-1;e>=0;e--)this.removeTimer(this.timers[e])}addTimer(t){return this._timers.push(t),t.scene=this,t}removeTimer(t){const e=this._timers.indexOf(t);return e!==-1&&this._timers.splice(e,1),t}cancelTimer(t){return this._cancelQueue.push(t),t}isTimerActive(t){return this._timers.indexOf(t)>-1&&!t.complete}isCurrentScene(){return this.engine?this.engine.currentScene===this:!1}_collectActorStats(t){const e=this.actors.filter(i=>i instanceof nn);for(const i of e)t.stats.currFrame.actors.ui++;for(const i of this.actors){t.stats.currFrame.actors.alive++;for(const s of i.children)dr(s)?t.stats.currFrame.actors.ui++:t.stats.currFrame.actors.alive++}}}var Xe;(function(r){r.Protanope="Protanope",r.Deuteranope="Deuteranope",r.Tritanope="Tritanope"})(Xe||(Xe={}));const xa=`#version 300 es precision mediump float; // our texture uniform sampler2D u_image; @@ -790,7 +790,7 @@ void main() { } else { fragColor = correction.rgba; } -}`;class Gr{constructor(t,e){this._shader=new ee({gl:t,vertexSource:`#version 300 es +}`;class Nr{constructor(t,e){this._shader=new ee({gl:t,vertexSource:`#version 300 es in vec2 a_position; in vec2 a_texcoord; out vec2 v_texcoord; @@ -799,12 +799,12 @@ void main() { gl_Position = vec4(a_position, 0.0, 1.0); // Pass the texcoord to the fragment shader. v_texcoord = a_texcoord; - }`,fragmentSource:e}),this._shader.compile(),this._buffer=new Ce({gl:t,type:"static",data:new Float32Array([-1,-1,0,0,-1,1,0,1,1,-1,1,0,1,-1,1,0,-1,1,0,1,1,1,1,1])}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_texcoord",2]]}),this._buffer.upload()}getShader(){return this._shader}getLayout(){return this._layout}}class Nr{constructor(t,e=!1){this._colorBlindnessMode=t,this._simulate=!1,this._simulate=e}initialize(t){this._shader=new Gr(t,va),this.simulate=this._simulate,this.colorBlindnessMode=this._colorBlindnessMode}getShader(){return this._shader.getShader()}getLayout(){return this._shader.getLayout()}set colorBlindnessMode(t){if(this._colorBlindnessMode=t,this._shader){const e=this._shader.getShader();e.use(),this._colorBlindnessMode===Ke.Protanope?e.setUniformInt("u_type",0):this._colorBlindnessMode===Ke.Deuteranope?e.setUniformInt("u_type",1):this._colorBlindnessMode===Ke.Tritanope&&e.setUniformInt("u_type",2)}}get colorBlindnessMode(){return this._colorBlindnessMode}set simulate(t){if(this._simulate=t,this._shader){const e=this._shader.getShader();e.use(),e.setUniformBoolean("u_simulate",t)}}get simulate(){return this._simulate}}class Qr{constructor(t){this._engine=t,this._colorBlindPostProcessor=new Nr(Ke.Protanope)}correct(t){this._engine.graphicsContext instanceof Me&&(this.clear(),this._colorBlindPostProcessor.colorBlindnessMode=t,this._colorBlindPostProcessor.simulate=!1,this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor))}simulate(t){this._engine.graphicsContext instanceof Me&&(this.clear(),this._colorBlindPostProcessor.colorBlindnessMode=t,this._colorBlindPostProcessor.simulate=!0,this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor))}clear(){this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor)}}class Hr{constructor(t){this.stats={currFrame:new Ui,prevFrame:new Ui},this.filter={useFilter:!1,nameQuery:"",ids:[]},this.entity={showAll:!1,showId:!1,showName:!1},this.transform={showAll:!1,debugZIndex:1e7,showPosition:!1,showPositionLabel:!1,positionColor:L.Yellow,showZIndex:!1,showScale:!1,scaleColor:L.Green,showRotation:!1,rotationColor:L.Blue},this.graphics={showAll:!1,showBounds:!1,boundsColor:L.Yellow},this.collider={showAll:!1,showBounds:!1,boundsColor:L.Blue,showOwner:!1,showGeometry:!0,geometryColor:L.Green,geometryLineWidth:1,geometryPointSize:.5},this.physics={showAll:!1,showBroadphaseSpacePartitionDebug:!1,showCollisionNormals:!1,collisionNormalColor:L.Cyan,showCollisionContacts:!0,collisionContactColor:L.Red},this.motion={showAll:!1,showVelocity:!1,velocityColor:L.Yellow,showAcceleration:!1,accelerationColor:L.Red},this.body={showAll:!1,showCollisionGroup:!1,showCollisionType:!1,showSleeping:!1,showMotion:!1,showMass:!1},this.camera={showAll:!1,showFocus:!1,focusColor:L.Red,showZoom:!1},this.tilemap={showAll:!1,showGrid:!1,gridColor:L.Red,gridWidth:.5,showSolidBounds:!1,solidBoundsColor:L.fromHex("#8080807F"),showColliderGeometry:!0,showQuadTree:!1},this.isometric={showAll:!1,showPosition:!1,positionColor:L.Yellow,positionSize:1,showGrid:!1,gridColor:L.Red,gridWidth:1,showColliderGeometry:!0},this._engine=t,this.colorBlindMode=new Qr(this._engine)}useTestClock(){const t=this._engine.clock,e=t.isRunning();t.stop();const i=t.toTestClock();return e&&i.start(),this._engine.clock=i,i}useStandardClock(){const t=this._engine.clock,e=t.isRunning();t.stop();const i=t.toStandardClock();return e&&i.start(),this._engine.clock=i,i}}class Ui{constructor(){this._id=0,this._delta=0,this._fps=0,this._actorStats={alive:0,killed:0,ui:0,get remaining(){return this.alive-this.killed},get total(){return this.remaining+this.ui}},this._durationStats={update:0,draw:0,get total(){return this.update+this.draw}},this._physicsStats=new xs,this._graphicsStats={drawCalls:0,drawnImages:0}}reset(t){t?(this.id=t.id,this.delta=t.delta,this.fps=t.fps,this.actors.alive=t.actors.alive,this.actors.killed=t.actors.killed,this.actors.ui=t.actors.ui,this.duration.update=t.duration.update,this.duration.draw=t.duration.draw,this._physicsStats.reset(t.physics),this.graphics.drawCalls=t.graphics.drawCalls,this.graphics.drawnImages=t.graphics.drawnImages):(this.id=this.delta=this.fps=0,this.actors.alive=this.actors.killed=this.actors.ui=0,this.duration.update=this.duration.draw=0,this._physicsStats.reset(),this.graphics.drawnImages=this.graphics.drawCalls=0)}clone(){const t=new Ui;return t.reset(this),t}get id(){return this._id}set id(t){this._id=t}get delta(){return this._delta}set delta(t){this._delta=t}get fps(){return this._fps}set fps(t){this._fps=t}get actors(){return this._actorStats}get duration(){return this._durationStats}get physics(){return this._physicsStats}get graphics(){return this._graphicsStats}}class xs{constructor(){this._pairs=0,this._collisions=0,this._contacts=new Map,this._fastBodies=0,this._fastBodyCollisions=0,this._broadphase=0,this._narrowphase=0}reset(t){t?(this.pairs=t.pairs,this.collisions=t.collisions,this.contacts=t.contacts,this.fastBodies=t.fastBodies,this.fastBodyCollisions=t.fastBodyCollisions,this.broadphase=t.broadphase,this.narrowphase=t.narrowphase):(this.pairs=this.collisions=this.fastBodies=0,this.fastBodyCollisions=this.broadphase=this.narrowphase=0,this.contacts.clear())}clone(){const t=new xs;return t.reset(this),t}get pairs(){return this._pairs}set pairs(t){this._pairs=t}get collisions(){return this._collisions}set collisions(t){this._collisions=t}get contacts(){return this._contacts}set contacts(t){this._contacts=t}get fastBodies(){return this._fastBodies}set fastBodies(t){this._fastBodies=t}get fastBodyCollisions(){return this._fastBodyCollisions}set fastBodyCollisions(t){this._fastBodyCollisions=t}get broadphase(){return this._broadphase}set broadphase(t){this._broadphase=t}get narrowphase(){return this._narrowphase}set narrowphase(t){this._narrowphase=t}}class rn{on(t,e){this._nativeHandlers[t]&&this.off(t,this._nativeHandlers[t]),this._nativeHandlers[t]=this._decorate(e),this.nativeComponent.addEventListener(t,this._nativeHandlers[t])}off(t,e){e||(e=this._nativeHandlers[t]),this.nativeComponent.removeEventListener(t,e),this._nativeHandlers[t]=null}_decorate(t){return e=>{this._paused||t(e)}}pause(){this._paused=!0}resume(){this._paused=!1}clear(){for(const t in this._nativeHandlers)this.off(t)}constructor(t){this.nativeComponent=t,this._paused=!1,this._nativeHandlers={}}}class Yr{constructor(t,e){this._windowGlobal=t,this._documentGlobal=e,this._windowComponent=new rn(this._windowGlobal),this._documentComponent=new rn(this._documentGlobal)}get window(){return this._windowComponent}get document(){return this._documentComponent}pause(){this.window.pause(),this.document.pause()}resume(){this.window.resume(),this.document.resume()}clear(){this.window.clear(),this.document.clear()}}class Li{static fromPagePosition(t,e,i){let s,n,o,h;arguments.length===3?(s=t,n=e,o=new A(s,n),h=i):(o=t,s=o.x,n=o.y,h=e);const l=h.screen.pageToScreenCoordinates(o),f=h.screen.screenToWorldCoordinates(l);return new Li(f,o,l)}constructor(t,e,i){this.worldPos=t,this.pagePos=e,this.screenPos=i}}class vi{cancel(){this.active=!1}get pagePos(){return this.coordinates.pagePos}get screenPos(){return this.coordinates.screenPos}get worldPos(){return this.coordinates.worldPos}constructor(t,e,i,s,n,o){this.type=t,this.pointerId=e,this.button=i,this.pointerType=s,this.coordinates=n,this.nativeEvent=o,this.active=!0}}class on{cancel(){this.active=!1}constructor(t,e,i,s,n,o,h,l,f,p,v,w){this.x=t,this.y=e,this.pageX=i,this.pageY=s,this.screenX=n,this.screenY=o,this.index=h,this.deltaX=l,this.deltaY=f,this.deltaZ=p,this.deltaMode=v,this.ev=w,this.active=!0}}class Wr{constructor(){this.events=new P,this.lastPagePos=A.Zero,this.lastScreenPos=A.Zero,this.lastWorldPos=A.Zero,this._onPointerMove=t=>{this.lastPagePos=new A(t.pagePos.x,t.pagePos.y),this.lastScreenPos=new A(t.screenPos.x,t.screenPos.y),this.lastWorldPos=new A(t.worldPos.x,t.worldPos.y)},this._onPointerDown=t=>{this.lastPagePos=new A(t.pagePos.x,t.pagePos.y),this.lastScreenPos=new A(t.screenPos.x,t.screenPos.y),this.lastWorldPos=new A(t.worldPos.x,t.worldPos.y)},this.on("move",this._onPointerMove),this.on("down",this._onPointerDown)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}var Xe;(function(r){r.Pixel="Pixel",r.Line="Line",r.Page="Page"})(Xe||(Xe={}));var Te;(function(r){r[r.NoButton=-1]="NoButton",r[r.Left=0]="Left",r[r.Middle=1]="Middle",r[r.Right=2]="Right",r[r.Unknown=3]="Unknown"})(Te||(Te={}));var _e;(function(r){r.Left="Left",r.Middle="Middle",r.Right="Right",r.Unknown="Unknown",r.NoButton="NoButton"})(_e||(_e={}));var ve;(function(r){r.Touch="Touch",r.Mouse="Mouse",r.Pen="Pen",r.Unknown="Unknown"})(ve||(ve={}));function xa(r){return globalThis.TouchEvent&&r instanceof globalThis.TouchEvent}function wa(r){return globalThis.PointerEvent&&r instanceof globalThis.PointerEvent}class zi{constructor(t,e){this.target=t,this.engine=e,this.events=new P,this.primary=new Wr,this._activeNativePointerIdsToNormalized=new Map,this.lastFramePointerCoords=new Map,this.currentFramePointerCoords=new Map,this.currentFramePointerDown=new Map,this.lastFramePointerDown=new Map,this.currentFrameDown=[],this.currentFrameUp=[],this.currentFrameMove=[],this.currentFrameCancel=[],this.currentFrameWheel=[],this._pointers=[this.primary],this._boundHandle=this._handle.bind(this),this._boundWheel=this._handleWheel.bind(this)}recreate(t,e){const i=new zi(t,e);return i.primary=this.primary,i._pointers=this._pointers,i}at(t){if(t>=this._pointers.length)for(let e=this._pointers.length-1,i=t;e{window.focus()};window.PointerEvent?this.target.addEventListener("pointerdown",n):(this.target.addEventListener("touchstart",n),this.target.addEventListener("mousedown",n))}}detach(){window.PointerEvent?(this.target.removeEventListener("pointerdown",this._boundHandle),this.target.removeEventListener("pointerup",this._boundHandle),this.target.removeEventListener("pointermove",this._boundHandle),this.target.removeEventListener("pointercancel",this._boundHandle)):(this.target.removeEventListener("touchstart",this._boundHandle),this.target.removeEventListener("touchend",this._boundHandle),this.target.removeEventListener("touchmove",this._boundHandle),this.target.removeEventListener("touchcancel",this._boundHandle),this.target.removeEventListener("mousedown",this._boundHandle),this.target.removeEventListener("mouseup",this._boundHandle),this.target.removeEventListener("mousemove",this._boundHandle)),"onwheel"in document.createElement("div")?this.target.removeEventListener("wheel",this._boundWheel):document.onmousewheel!==void 0?this.target.addEventListener("mousewheel",this._boundWheel):this.target.addEventListener("MozMousePixelScroll",this._boundWheel)}_normalizePointerId(t){this._activeNativePointerIdsToNormalized.set(t,-1);const i=Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((s,n)=>s-n).findIndex(s=>s===t);return this._activeNativePointerIdsToNormalized.set(t,i),i}_handle(t){t.preventDefault();const e=new Map;let i,s;if(xa(t)){i=_e.Unknown,s=ve.Touch;for(let n=0;n=this._previousSampleTime+this._samplePeriod&&(this._fps=this._frames*1e3/(t-this._previousSampleTime),this._previousSampleTime=t,this._frames=0)}get fps(){return this._fps}get instant(){return 1e3/this._currentFrameTime}}class an{constructor(t){var e,i,s;this._onFatalException=()=>{},this._maxFps=1/0,this._lastTime=0,this._elapsed=1,this._scheduledCbs=[],this._totalElapsed=0,this._options=t,this.tick=t.tick,this._lastTime=(e=this.now())!==null&&e!==void 0?e:0,this._maxFps=(i=t.maxFps)!==null&&i!==void 0?i:this._maxFps,this._onFatalException=(s=t.onFatalException)!==null&&s!==void 0?s:this._onFatalException,this.fpsSampler=new Zr({initialFps:60,nowFn:()=>this.now()})}elapsed(){return this._elapsed}now(){return performance.now()}toTestClock(){return new Jr({...this._options,defaultUpdateMs:16.6})}toStandardClock(){return new hn({...this._options})}setFatalExceptionHandler(t){this._onFatalException=t}schedule(t,e=0){const i=this._totalElapsed+e;this._scheduledCbs.push([t,i])}_runScheduledCbs(){for(let t=this._scheduledCbs.length-1;t>-1;t--)this._scheduledCbs[t][1]<=this._totalElapsed&&(this._scheduledCbs[t][0](),this._scheduledCbs.splice(t,1))}update(t){try{this.fpsSampler.start();const e=this.now();let i=e-this._lastTime||1;const s=1e3/this._maxFps;if(i>=s){let n=0;s!==0&&(n=i%s,i=i-n),i>200&&(i=1),this._elapsed=t||i,this._totalElapsed+=this._elapsed,this._runScheduledCbs(),this.tick(t||i),s!==0?this._lastTime=e-n:this._lastTime=e,this.fpsSampler.end()}}catch(e){this._onFatalException(e),this.stop()}}}class hn extends an{constructor(t){super(t),this._running=!1}isRunning(){return this._running}start(){if(this._running)return;this._running=!0;const t=()=>{if(this._running)try{this._requestId=window.requestAnimationFrame(t),this.update()}catch(e){throw window.cancelAnimationFrame(this._requestId),e}};t()}stop(){this._running=!1}}class Jr extends an{constructor(t){super({...t}),this._logger=V.getInstance(),this._running=!1,this._currentTime=0,this._updateMs=t.defaultUpdateMs}now(){var t;return(t=this._currentTime)!==null&&t!==void 0?t:0}isRunning(){return this._running}start(){this._running=!0}stop(){this._running=!1}step(t){const e=t??this._updateMs;this._running?(this.update(e),this._currentTime+=e):this._logger.warn("The clock is not running, no step will be performed")}run(t,e){for(let i=0;ithis._createFragment(p));if(e){const p=document.createElement("a");p.href=e,i?p.innerText=i:p.innerText=e,n.splice(1,0,p)}const o=document.createElement("div");n.forEach(p=>{o.appendChild(p)}),s.appendChild(o);const h=document.createElement("button");h.innerText="x",h.addEventListener("click",()=>{this._container.removeChild(s)}),s.appendChild(h);const l=p=>{if(p.key==="Escape")try{this._container.removeChild(s)}catch{}document.removeEventListener("keydown",l)};document.addEventListener("keydown",l);const f=this._container.firstChild;this._container.insertBefore(s,f)}}class Vr{constructor(t){this.inputs=t,this._handlers=new Map}execute(){for(const[t,e]of this._handlers.entries()){const i=t(this.inputs);i&&e(i)}}on(t,e){this._handlers.set(t,e)}}m();const ya={FallbackGraphicsContext:"fallbackgraphicscontext",Initialize:"initialize",Visible:"visible",Hidden:"hidden",Start:"start",Stop:"stop",PreUpdate:"preupdate",PostUpdate:"postupdate",PreFrame:"preframe",PostFrame:"postframe",PreDraw:"predraw",PostDraw:"postdraw"};var Oe;(function(r){r[r.None=0]="None",r[r.Canvas=1]="Canvas",r[r.All=2]="All"})(Oe||(Oe={}));class xi{get canvasWidth(){return this.screen.canvasWidth}get halfCanvasWidth(){return this.screen.halfCanvasWidth}get canvasHeight(){return this.screen.canvasHeight}get halfCanvasHeight(){return this.screen.halfCanvasHeight}get drawWidth(){return this.screen.drawWidth}get halfDrawWidth(){return this.screen.halfDrawWidth}get drawHeight(){return this.screen.drawHeight}get halfDrawHeight(){return this.screen.halfDrawHeight}get isHiDpi(){return this.screen.isHiDpi}get stats(){return this.debug.stats}get isFullscreen(){return this.screen.isFullScreen}get displayMode(){return this.screen.displayMode}get pixelRatio(){return this.screen.pixelRatio}get isDebug(){return this._isDebug}get snapToPixel(){return this.graphicsContext.snapToPixel}set snapToPixel(t){this.graphicsContext.snapToPixel=t}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}constructor(t){var e,i,s,n,o,h;this.version=fn,this.events=new P,this.maxFps=Number.POSITIVE_INFINITY,this.scenes={},this._suppressPlayButton=!1,this.pauseAudioWhenHidden=!0,this._isDebug=!1,this.enableCanvasTransparency=!0,this.onFatalException=v=>{V.getInstance().fatal(v)},this._toaster=new jr,this._timescale=1,this._isInitialized=!1,this._deferredGoTo=null,this._originalOptions={},this._performanceThresholdTriggered=!1,this._fpsSamples=[],this._loadingComplete=!1,this._isReady=!1,this._isReadyPromise=new Promise(v=>{this._isReadyResolve=v}),this.currentFrameElapsedMs=0,this.currentFrameLagMs=0,this._lagMs=0,this._screenShotRequests=[],t={...xi._DEFAULT_ENGINE_OPTIONS,...t},this._originalOptions=t,x.freeze(),this.browser=new Yr(window,document);const l=new Gn;if(!t.suppressMinimumBrowserFeatureDetection&&!(this._compatible=l.test())){const v=document.createElement("div");if(v.innerText="Sorry, your browser does not support all the features needed for Excalibur",document.body.appendChild(v),l.failedTests.forEach(function(w){const y=document.createElement("div");y.innerText="Browser feature missing "+w,document.body.appendChild(y)}),t.canvasElementId){const w=document.getElementById(t.canvasElementId);w&&w.parentElement.removeChild(w)}return}else this._compatible=!0;console.log&&!t.suppressConsoleBootMessage&&(console.log(`%cPowered by Excalibur.js (v${fn})`,"background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;"),console.log(` + }`,fragmentSource:e}),this._shader.compile(),this._buffer=new Ce({gl:t,type:"static",data:new Float32Array([-1,-1,0,0,-1,1,0,1,1,-1,1,0,1,-1,1,0,-1,1,0,1,1,1,1,1])}),this._layout=new Ie({gl:t,shader:this._shader,vertexBuffer:this._buffer,attributes:[["a_position",2],["a_texcoord",2]]}),this._buffer.upload()}getShader(){return this._shader}getLayout(){return this._layout}}class Hr{constructor(t,e=!1){this._colorBlindnessMode=t,this._simulate=!1,this._simulate=e}initialize(t){this._shader=new Nr(t,xa),this.simulate=this._simulate,this.colorBlindnessMode=this._colorBlindnessMode}getShader(){return this._shader.getShader()}getLayout(){return this._shader.getLayout()}set colorBlindnessMode(t){if(this._colorBlindnessMode=t,this._shader){const e=this._shader.getShader();e.use(),this._colorBlindnessMode===Xe.Protanope?e.setUniformInt("u_type",0):this._colorBlindnessMode===Xe.Deuteranope?e.setUniformInt("u_type",1):this._colorBlindnessMode===Xe.Tritanope&&e.setUniformInt("u_type",2)}}get colorBlindnessMode(){return this._colorBlindnessMode}set simulate(t){if(this._simulate=t,this._shader){const e=this._shader.getShader();e.use(),e.setUniformBoolean("u_simulate",t)}}get simulate(){return this._simulate}}class Qr{constructor(t){this._engine=t,this._colorBlindPostProcessor=new Hr(Xe.Protanope)}correct(t){this._engine.graphicsContext instanceof Be&&(this.clear(),this._colorBlindPostProcessor.colorBlindnessMode=t,this._colorBlindPostProcessor.simulate=!1,this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor))}simulate(t){this._engine.graphicsContext instanceof Be&&(this.clear(),this._colorBlindPostProcessor.colorBlindnessMode=t,this._colorBlindPostProcessor.simulate=!0,this._engine.graphicsContext.addPostProcessor(this._colorBlindPostProcessor))}clear(){this._engine.graphicsContext.removePostProcessor(this._colorBlindPostProcessor)}}class Yr{constructor(t){this.stats={currFrame:new Ui,prevFrame:new Ui},this.filter={useFilter:!1,nameQuery:"",ids:[]},this.entity={showAll:!1,showId:!1,showName:!1},this.transform={showAll:!1,debugZIndex:1e7,showPosition:!1,showPositionLabel:!1,positionColor:L.Yellow,showZIndex:!1,showScale:!1,scaleColor:L.Green,showRotation:!1,rotationColor:L.Blue},this.graphics={showAll:!1,showBounds:!1,boundsColor:L.Yellow},this.collider={showAll:!1,showBounds:!1,boundsColor:L.Blue,showOwner:!1,showGeometry:!0,geometryColor:L.Green,geometryLineWidth:1,geometryPointSize:.5},this.physics={showAll:!1,showBroadphaseSpacePartitionDebug:!1,showCollisionNormals:!1,collisionNormalColor:L.Cyan,showCollisionContacts:!0,collisionContactColor:L.Red},this.motion={showAll:!1,showVelocity:!1,velocityColor:L.Yellow,showAcceleration:!1,accelerationColor:L.Red},this.body={showAll:!1,showCollisionGroup:!1,showCollisionType:!1,showSleeping:!1,showMotion:!1,showMass:!1},this.camera={showAll:!1,showFocus:!1,focusColor:L.Red,showZoom:!1},this.tilemap={showAll:!1,showGrid:!1,gridColor:L.Red,gridWidth:.5,showSolidBounds:!1,solidBoundsColor:L.fromHex("#8080807F"),showColliderGeometry:!0,showQuadTree:!1},this.isometric={showAll:!1,showPosition:!1,positionColor:L.Yellow,positionSize:1,showGrid:!1,gridColor:L.Red,gridWidth:1,showColliderGeometry:!0},this._engine=t,this.colorBlindMode=new Qr(this._engine)}useTestClock(){const t=this._engine.clock,e=t.isRunning();t.stop();const i=t.toTestClock();return e&&i.start(),this._engine.clock=i,i}useStandardClock(){const t=this._engine.clock,e=t.isRunning();t.stop();const i=t.toStandardClock();return e&&i.start(),this._engine.clock=i,i}}class Ui{constructor(){this._id=0,this._delta=0,this._fps=0,this._actorStats={alive:0,killed:0,ui:0,get remaining(){return this.alive-this.killed},get total(){return this.remaining+this.ui}},this._durationStats={update:0,draw:0,get total(){return this.update+this.draw}},this._physicsStats=new xs,this._graphicsStats={drawCalls:0,drawnImages:0}}reset(t){t?(this.id=t.id,this.delta=t.delta,this.fps=t.fps,this.actors.alive=t.actors.alive,this.actors.killed=t.actors.killed,this.actors.ui=t.actors.ui,this.duration.update=t.duration.update,this.duration.draw=t.duration.draw,this._physicsStats.reset(t.physics),this.graphics.drawCalls=t.graphics.drawCalls,this.graphics.drawnImages=t.graphics.drawnImages):(this.id=this.delta=this.fps=0,this.actors.alive=this.actors.killed=this.actors.ui=0,this.duration.update=this.duration.draw=0,this._physicsStats.reset(),this.graphics.drawnImages=this.graphics.drawCalls=0)}clone(){const t=new Ui;return t.reset(this),t}get id(){return this._id}set id(t){this._id=t}get delta(){return this._delta}set delta(t){this._delta=t}get fps(){return this._fps}set fps(t){this._fps=t}get actors(){return this._actorStats}get duration(){return this._durationStats}get physics(){return this._physicsStats}get graphics(){return this._graphicsStats}}class xs{constructor(){this._pairs=0,this._collisions=0,this._contacts=new Map,this._fastBodies=0,this._fastBodyCollisions=0,this._broadphase=0,this._narrowphase=0}reset(t){t?(this.pairs=t.pairs,this.collisions=t.collisions,this.contacts=t.contacts,this.fastBodies=t.fastBodies,this.fastBodyCollisions=t.fastBodyCollisions,this.broadphase=t.broadphase,this.narrowphase=t.narrowphase):(this.pairs=this.collisions=this.fastBodies=0,this.fastBodyCollisions=this.broadphase=this.narrowphase=0,this.contacts.clear())}clone(){const t=new xs;return t.reset(this),t}get pairs(){return this._pairs}set pairs(t){this._pairs=t}get collisions(){return this._collisions}set collisions(t){this._collisions=t}get contacts(){return this._contacts}set contacts(t){this._contacts=t}get fastBodies(){return this._fastBodies}set fastBodies(t){this._fastBodies=t}get fastBodyCollisions(){return this._fastBodyCollisions}set fastBodyCollisions(t){this._fastBodyCollisions=t}get broadphase(){return this._broadphase}set broadphase(t){this._broadphase=t}get narrowphase(){return this._narrowphase}set narrowphase(t){this._narrowphase=t}}class on{on(t,e){this._nativeHandlers[t]&&this.off(t,this._nativeHandlers[t]),this._nativeHandlers[t]=this._decorate(e),this.nativeComponent.addEventListener(t,this._nativeHandlers[t])}off(t,e){e||(e=this._nativeHandlers[t]),this.nativeComponent.removeEventListener(t,e),this._nativeHandlers[t]=null}_decorate(t){return e=>{this._paused||t(e)}}pause(){this._paused=!0}resume(){this._paused=!1}clear(){for(const t in this._nativeHandlers)this.off(t)}constructor(t){this.nativeComponent=t,this._paused=!1,this._nativeHandlers={}}}class Wr{constructor(t,e){this._windowGlobal=t,this._documentGlobal=e,this._windowComponent=new on(this._windowGlobal),this._documentComponent=new on(this._documentGlobal)}get window(){return this._windowComponent}get document(){return this._documentComponent}pause(){this.window.pause(),this.document.pause()}resume(){this.window.resume(),this.document.resume()}clear(){this.window.clear(),this.document.clear()}}class Li{static fromPagePosition(t,e,i){let s,n,o,h;arguments.length===3?(s=t,n=e,o=new A(s,n),h=i):(o=t,s=o.x,n=o.y,h=e);const l=h.screen.pageToScreenCoordinates(o),f=h.screen.screenToWorldCoordinates(l);return new Li(f,o,l)}constructor(t,e,i){this.worldPos=t,this.pagePos=e,this.screenPos=i}}class vi{cancel(){this.active=!1}get pagePos(){return this.coordinates.pagePos}get screenPos(){return this.coordinates.screenPos}get worldPos(){return this.coordinates.worldPos}constructor(t,e,i,s,n,o){this.type=t,this.pointerId=e,this.button=i,this.pointerType=s,this.coordinates=n,this.nativeEvent=o,this.active=!0}}class an{cancel(){this.active=!1}constructor(t,e,i,s,n,o,h,l,f,m,v,w){this.x=t,this.y=e,this.pageX=i,this.pageY=s,this.screenX=n,this.screenY=o,this.index=h,this.deltaX=l,this.deltaY=f,this.deltaZ=m,this.deltaMode=v,this.ev=w,this.active=!0}}class Zr{constructor(){this.events=new T,this.lastPagePos=A.Zero,this.lastScreenPos=A.Zero,this.lastWorldPos=A.Zero,this._onPointerMove=t=>{this.lastPagePos=new A(t.pagePos.x,t.pagePos.y),this.lastScreenPos=new A(t.screenPos.x,t.screenPos.y),this.lastWorldPos=new A(t.worldPos.x,t.worldPos.y)},this._onPointerDown=t=>{this.lastPagePos=new A(t.pagePos.x,t.pagePos.y),this.lastScreenPos=new A(t.screenPos.x,t.screenPos.y),this.lastWorldPos=new A(t.worldPos.x,t.worldPos.y)},this.on("move",this._onPointerMove),this.on("down",this._onPointerDown)}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}}var Ke;(function(r){r.Pixel="Pixel",r.Line="Line",r.Page="Page"})(Ke||(Ke={}));var Te;(function(r){r[r.NoButton=-1]="NoButton",r[r.Left=0]="Left",r[r.Middle=1]="Middle",r[r.Right=2]="Right",r[r.Unknown=3]="Unknown"})(Te||(Te={}));var ve;(function(r){r.Left="Left",r.Middle="Middle",r.Right="Right",r.Unknown="Unknown",r.NoButton="NoButton"})(ve||(ve={}));var xe;(function(r){r.Touch="Touch",r.Mouse="Mouse",r.Pen="Pen",r.Unknown="Unknown"})(xe||(xe={}));function wa(r){return globalThis.TouchEvent&&r instanceof globalThis.TouchEvent}function Aa(r){return globalThis.PointerEvent&&r instanceof globalThis.PointerEvent}class zi{constructor(t,e){this.target=t,this.engine=e,this.events=new T,this.primary=new Zr,this._activeNativePointerIdsToNormalized=new Map,this.lastFramePointerCoords=new Map,this.currentFramePointerCoords=new Map,this.currentFramePointerDown=new Map,this.lastFramePointerDown=new Map,this.currentFrameDown=[],this.currentFrameUp=[],this.currentFrameMove=[],this.currentFrameCancel=[],this.currentFrameWheel=[],this._pointers=[this.primary],this._boundHandle=this._handle.bind(this),this._boundWheel=this._handleWheel.bind(this)}recreate(t,e){const i=new zi(t,e);return i.primary=this.primary,i._pointers=this._pointers,i}at(t){if(t>=this._pointers.length)for(let e=this._pointers.length-1,i=t;e{window.focus()};window.PointerEvent?this.target.addEventListener("pointerdown",n):(this.target.addEventListener("touchstart",n),this.target.addEventListener("mousedown",n))}}detach(){window.PointerEvent?(this.target.removeEventListener("pointerdown",this._boundHandle),this.target.removeEventListener("pointerup",this._boundHandle),this.target.removeEventListener("pointermove",this._boundHandle),this.target.removeEventListener("pointercancel",this._boundHandle)):(this.target.removeEventListener("touchstart",this._boundHandle),this.target.removeEventListener("touchend",this._boundHandle),this.target.removeEventListener("touchmove",this._boundHandle),this.target.removeEventListener("touchcancel",this._boundHandle),this.target.removeEventListener("mousedown",this._boundHandle),this.target.removeEventListener("mouseup",this._boundHandle),this.target.removeEventListener("mousemove",this._boundHandle)),"onwheel"in document.createElement("div")?this.target.removeEventListener("wheel",this._boundWheel):document.onmousewheel!==void 0?this.target.addEventListener("mousewheel",this._boundWheel):this.target.addEventListener("MozMousePixelScroll",this._boundWheel)}_normalizePointerId(t){this._activeNativePointerIdsToNormalized.set(t,-1);const i=Array.from(this._activeNativePointerIdsToNormalized.keys()).sort((s,n)=>s-n).findIndex(s=>s===t);return this._activeNativePointerIdsToNormalized.set(t,i),i}_handle(t){t.preventDefault();const e=new Map;let i,s;if(wa(t)){i=ve.Unknown,s=xe.Touch;for(let n=0;n=this._previousSampleTime+this._samplePeriod&&(this._fps=this._frames*1e3/(t-this._previousSampleTime),this._previousSampleTime=t,this._frames=0)}get fps(){return this._fps}get instant(){return 1e3/this._currentFrameTime}}class hn{constructor(t){var e,i,s;this._onFatalException=()=>{},this._maxFps=1/0,this._lastTime=0,this._elapsed=1,this._scheduledCbs=[],this._totalElapsed=0,this._options=t,this.tick=t.tick,this._lastTime=(e=this.now())!==null&&e!==void 0?e:0,this._maxFps=(i=t.maxFps)!==null&&i!==void 0?i:this._maxFps,this._onFatalException=(s=t.onFatalException)!==null&&s!==void 0?s:this._onFatalException,this.fpsSampler=new Jr({initialFps:60,nowFn:()=>this.now()})}elapsed(){return this._elapsed}now(){return performance.now()}toTestClock(){return new Vr({...this._options,defaultUpdateMs:16.6})}toStandardClock(){return new ln({...this._options})}setFatalExceptionHandler(t){this._onFatalException=t}schedule(t,e=0){const i=this._totalElapsed+e;this._scheduledCbs.push([t,i])}_runScheduledCbs(){for(let t=this._scheduledCbs.length-1;t>-1;t--)this._scheduledCbs[t][1]<=this._totalElapsed&&(this._scheduledCbs[t][0](),this._scheduledCbs.splice(t,1))}update(t){try{this.fpsSampler.start();const e=this.now();let i=e-this._lastTime||1;const s=1e3/this._maxFps;if(i>=s){let n=0;s!==0&&(n=i%s,i=i-n),i>200&&(i=1),this._elapsed=t||i,this._totalElapsed+=this._elapsed,this._runScheduledCbs(),this.tick(t||i),s!==0?this._lastTime=e-n:this._lastTime=e,this.fpsSampler.end()}}catch(e){this._onFatalException(e),this.stop()}}}class ln extends hn{constructor(t){super(t),this._running=!1}isRunning(){return this._running}start(){if(this._running)return;this._running=!0;const t=()=>{if(this._running)try{this._requestId=window.requestAnimationFrame(t),this.update()}catch(e){throw window.cancelAnimationFrame(this._requestId),e}};t()}stop(){this._running=!1}}class Vr extends hn{constructor(t){super({...t}),this._logger=j.getInstance(),this._running=!1,this._currentTime=0,this._updateMs=t.defaultUpdateMs}now(){var t;return(t=this._currentTime)!==null&&t!==void 0?t:0}isRunning(){return this._running}start(){this._running=!0}stop(){this._running=!1}step(t){const e=t??this._updateMs;this._running?(this.update(e),this._currentTime+=e):this._logger.warn("The clock is not running, no step will be performed")}run(t,e){for(let i=0;ithis._createFragment(m));if(e){const m=document.createElement("a");m.href=e,i?m.innerText=i:m.innerText=e,n.splice(1,0,m)}const o=document.createElement("div");n.forEach(m=>{o.appendChild(m)}),s.appendChild(o);const h=document.createElement("button");h.innerText="x",h.addEventListener("click",()=>{this._container.removeChild(s)}),s.appendChild(h);const l=m=>{if(m.key==="Escape")try{this._container.removeChild(s)}catch{}document.removeEventListener("keydown",l)};document.addEventListener("keydown",l);const f=this._container.firstChild;this._container.insertBefore(s,f)}}class Xr{constructor(t){this.inputs=t,this._handlers=new Map}execute(){for(const[t,e]of this._handlers.entries()){const i=t(this.inputs);i&&e(i)}}on(t,e){this._handlers.set(t,e)}}p();const ba={FallbackGraphicsContext:"fallbackgraphicscontext",Initialize:"initialize",Visible:"visible",Hidden:"hidden",Start:"start",Stop:"stop",PreUpdate:"preupdate",PostUpdate:"postupdate",PreFrame:"preframe",PostFrame:"postframe",PreDraw:"predraw",PostDraw:"postdraw"};var Oe;(function(r){r[r.None=0]="None",r[r.Canvas=1]="Canvas",r[r.All=2]="All"})(Oe||(Oe={}));class xi{get canvasWidth(){return this.screen.canvasWidth}get halfCanvasWidth(){return this.screen.halfCanvasWidth}get canvasHeight(){return this.screen.canvasHeight}get halfCanvasHeight(){return this.screen.halfCanvasHeight}get drawWidth(){return this.screen.drawWidth}get halfDrawWidth(){return this.screen.halfDrawWidth}get drawHeight(){return this.screen.drawHeight}get halfDrawHeight(){return this.screen.halfDrawHeight}get isHiDpi(){return this.screen.isHiDpi}get stats(){return this.debug.stats}get isFullscreen(){return this.screen.isFullScreen}get displayMode(){return this.screen.displayMode}get pixelRatio(){return this.screen.pixelRatio}get isDebug(){return this._isDebug}get snapToPixel(){return this.graphicsContext.snapToPixel}set snapToPixel(t){this.graphicsContext.snapToPixel=t}emit(t,e){this.events.emit(t,e)}on(t,e){return this.events.on(t,e)}once(t,e){return this.events.once(t,e)}off(t,e){this.events.off(t,e)}constructor(t){var e,i,s,n,o,h;this.version=gn,this.events=new T,this.maxFps=Number.POSITIVE_INFINITY,this.scenes={},this._suppressPlayButton=!1,this.pauseAudioWhenHidden=!0,this._isDebug=!1,this.enableCanvasTransparency=!0,this.onFatalException=v=>{j.getInstance().fatal(v)},this._toaster=new jr,this._timescale=1,this._isInitialized=!1,this._deferredGoTo=null,this._originalOptions={},this._performanceThresholdTriggered=!1,this._fpsSamples=[],this._loadingComplete=!1,this._isReady=!1,this._isReadyPromise=new Promise(v=>{this._isReadyResolve=v}),this.currentFrameElapsedMs=0,this.currentFrameLagMs=0,this._lagMs=0,this._screenShotRequests=[],t={...xi._DEFAULT_ENGINE_OPTIONS,...t},this._originalOptions=t,x.freeze(),this.browser=new Wr(window,document);const l=new Nn;if(!t.suppressMinimumBrowserFeatureDetection&&!(this._compatible=l.test())){const v=document.createElement("div");if(v.innerText="Sorry, your browser does not support all the features needed for Excalibur",document.body.appendChild(v),l.failedTests.forEach(function(w){const y=document.createElement("div");y.innerText="Browser feature missing "+w,document.body.appendChild(y)}),t.canvasElementId){const w=document.getElementById(t.canvasElementId);w&&w.parentElement.removeChild(w)}return}else this._compatible=!0;console.log&&!t.suppressConsoleBootMessage&&(console.log(`%cPowered by Excalibur.js (v${gn})`,"background: #176BAA; color: white; border-radius: 5px; padding: 15px; font-size: 1.5em; line-height: 80px;"),console.log(` /| ________________ O|===|* >________________> - \\|`),console.log("Visit","http://excaliburjs.com","for more information")),t.suppressPlayButton&&(this._suppressPlayButton=!0),this._logger=V.getInstance(),this._logger.defaultLevel===zt.Debug&&l.logBrowserFeatures(),this._logger.debug("Building engine..."),this.canvasElementId=t.canvasElementId,t.canvasElementId?(this._logger.debug("Using Canvas element specified: "+t.canvasElementId),this.canvas=document.getElementById(t.canvasElementId)):t.canvasElement?(this._logger.debug("Using Canvas element specified:",t.canvasElement),this.canvas=t.canvasElement):(this._logger.debug("Using generated canvas element"),this.canvas=document.createElement("canvas"));let f=(e=t.displayMode)!==null&&e!==void 0?e:Tt.Fixed;t.width&&t.height||t.viewport?(t.displayMode===void 0&&(f=Tt.Fixed),this._logger.debug("Engine viewport is size "+t.width+" x "+t.height)):t.displayMode||(this._logger.debug("Engine viewport is fit"),f=Tt.FitScreen),this._originalDisplayMode=f;let p=x.isEnabled("use-canvas-context");if(!p)try{this.graphicsContext=new Me({canvasElement:this.canvas,enableTransparency:this.enableCanvasTransparency,smoothing:t.antialiasing,backgroundColor:t.backgroundColor,snapToPixel:t.snapToPixel,useDrawSorting:t.useDrawSorting})}catch(v){this._logger.warn(`Excalibur could not load webgl for some reason (${v.message}) and loaded a Canvas 2D fallback. Some features of Excalibur will not work in this mode. + \\|`),console.log("Visit","http://excaliburjs.com","for more information")),t.suppressPlayButton&&(this._suppressPlayButton=!0),this._logger=j.getInstance(),this._logger.defaultLevel===zt.Debug&&l.logBrowserFeatures(),this._logger.debug("Building engine..."),this.canvasElementId=t.canvasElementId,t.canvasElementId?(this._logger.debug("Using Canvas element specified: "+t.canvasElementId),this.canvas=document.getElementById(t.canvasElementId)):t.canvasElement?(this._logger.debug("Using Canvas element specified:",t.canvasElement),this.canvas=t.canvasElement):(this._logger.debug("Using generated canvas element"),this.canvas=document.createElement("canvas"));let f=(e=t.displayMode)!==null&&e!==void 0?e:Tt.Fixed;t.width&&t.height||t.viewport?(t.displayMode===void 0&&(f=Tt.Fixed),this._logger.debug("Engine viewport is size "+t.width+" x "+t.height)):t.displayMode||(this._logger.debug("Engine viewport is fit"),f=Tt.FitScreen),this._originalDisplayMode=f;let m=x.isEnabled("use-canvas-context");if(!m)try{this.graphicsContext=new Be({canvasElement:this.canvas,enableTransparency:this.enableCanvasTransparency,smoothing:t.antialiasing,backgroundColor:t.backgroundColor,snapToPixel:t.snapToPixel,useDrawSorting:t.useDrawSorting})}catch(v){this._logger.warn(`Excalibur could not load webgl for some reason (${v.message}) and loaded a Canvas 2D fallback. Some features of Excalibur will not work in this mode. -Read more about this issue at https://excaliburjs.com/docs/webgl`),p=!0}p&&(this.graphicsContext=new Xi({canvasElement:this.canvas,enableTransparency:this.enableCanvasTransparency,smoothing:t.antialiasing,backgroundColor:t.backgroundColor,snapToPixel:t.snapToPixel,useDrawSorting:t.useDrawSorting})),this.screen=new Qs({canvas:this.canvas,context:this.graphicsContext,antialiasing:(i=t.antialiasing)!==null&&i!==void 0?i:!0,browser:this.browser,viewport:(s=t.viewport)!==null&&s!==void 0?s:t.width&&t.height?{width:t.width,height:t.height}:Ns.SVGA,resolution:t.resolution,displayMode:f,pixelRatio:t.suppressHiDPIScaling?1:(n=t.pixelRatio)!==null&&n!==void 0?n:null}),Bt.filtering=t.antialiasing?Ot.Blended:Ot.Pixel,t.backgroundColor&&(this.backgroundColor=t.backgroundColor.clone()),this.maxFps=(o=t.maxFps)!==null&&o!==void 0?o:this.maxFps,this.fixedUpdateFps=(h=t.fixedUpdateFps)!==null&&h!==void 0?h:this.fixedUpdateFps,this.clock=new hn({maxFps:this.maxFps,tick:this._mainloop.bind(this),onFatalException:v=>this.onFatalException(v)}),this.enableCanvasTransparency=t.enableCanvasTransparency,this._loader=new Ln,this._loader.wireEngine(this),this.debug=new Hr(this),this._initialize(t),this.rootScene=this.currentScene=new Oi,this.addScene("root",this.rootScene),window.___EXCALIBUR_DEVTOOL=this}_monitorPerformanceThresholdAndTriggerFallback(){const{allow:t}=this._originalOptions.configurePerformanceCanvas2DFallback;let{threshold:e,showPlayerMessage:i}=this._originalOptions.configurePerformanceCanvas2DFallback;if(e===void 0&&(e=xi._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold),i===void 0&&(i=xi._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage),!x.isEnabled("use-canvas-context")&&t&&this.ready&&!this._performanceThresholdTriggered){this._fpsSamples.length===e.numberOfFrames&&this._fpsSamples.splice(0,1),this._fpsSamples.push(this.clock.fpsSampler.fps);let s=0;for(let o=0;othis.onFatalException(v)}),this.enableCanvasTransparency=t.enableCanvasTransparency,this._loader=new zn,this._loader.wireEngine(this),this.debug=new Yr(this),this._initialize(t),this.rootScene=this.currentScene=new Oi,this.addScene("root",this.rootScene),window.___EXCALIBUR_DEVTOOL=this}_monitorPerformanceThresholdAndTriggerFallback(){const{allow:t}=this._originalOptions.configurePerformanceCanvas2DFallback;let{threshold:e,showPlayerMessage:i}=this._originalOptions.configurePerformanceCanvas2DFallback;if(e===void 0&&(e=xi._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.threshold),i===void 0&&(i=xi._DEFAULT_ENGINE_OPTIONS.configurePerformanceCanvas2DFallback.showPlayerMessage),!x.isEnabled("use-canvas-context")&&t&&this.ready&&!this._performanceThresholdTriggered){this._fpsSamples.length===e.numberOfFrames&&this._fpsSamples.splice(0,1),this._fpsSamples.push(this.clock.fpsSampler.fps);let s=0;for(let o=0;o{document.visibilityState==="hidden"?(this.events.emit("hidden",new Re(this)),this._logger.debug("Window hidden")):document.visibilityState==="visible"&&(this.events.emit("visible",new Lt(this)),this._logger.debug("Window visible"))}),!this.canvasElementId&&!t.canvasElement&&document.body.appendChild(this.canvas)}onInitialize(t){}setAntialiasing(t){this.screen.antialiasing=t}getAntialiasing(){return this.screen.antialiasing}get isInitialized(){return this._isInitialized}_overrideInitialize(t){if(!this.isInitialized)if(this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0,this._deferredGoTo){const e=this._deferredGoTo;this._deferredGoTo=null,this.goToScene(e)}else this.goToScene("root")}_update(t){if(!this.ready){this._loader.update(this,t),this.inputMapper.execute(),this.input.keyboard.update(),this.input.gamepads.update();return}this._preupdate(t),this.currentScene.update(this,t),this.graphicsContext.updatePostProcessors(t),this._postupdate(t),this.inputMapper.execute(),this.input.keyboard.update(),this.input.gamepads.update()}_preupdate(t){this.emit("preupdate",new ot(this,t,this)),this.onPreUpdate(this,t)}onPreUpdate(t,e){}_postupdate(t){this.emit("postupdate",new gt(this,t,this)),this.onPostUpdate(this,t)}onPostUpdate(t,e){}_draw(t){var e;if(this.graphicsContext.beginDrawLifecycle(),this.graphicsContext.clear(),this._predraw(this.graphicsContext,t),!this._isReady){this._loader.canvas.draw(this.graphicsContext,0,0),this.graphicsContext.flush();return}this.graphicsContext.backgroundColor=(e=this.currentScene.backgroundColor)!==null&&e!==void 0?e:this.backgroundColor,this.currentScene.draw(this.graphicsContext,t),this._postdraw(this.graphicsContext,t),this.graphicsContext.flush(),this.graphicsContext.endDrawLifecycle(),this._checkForScreenShots()}_predraw(t,e){this.emit("predraw",new et(t,e,this)),this.onPreDraw(t,e)}onPreDraw(t,e){}_postdraw(t,e){this.emit("postdraw",new K(t,e,this)),this.onPostDraw(t,e)}onPostDraw(t,e){}showDebug(t){this._isDebug=t}toggleDebug(){return this._isDebug=!this._isDebug,this._isDebug}get loadingComplete(){return this._loadingComplete}get ready(){return this._isReady}isReady(){return this._isReadyPromise}async start(t){if(!this._compatible)throw new Error("Excalibur is incompatible with your browser");return t&&(this.screen.pushResolutionAndViewport(),this.screen.resolution=this.screen.viewport,this.screen.applyResolutionAndViewport(),this._loader=t,this._loader.suppressPlayButton=this._suppressPlayButton||this._loader.suppressPlayButton,this._loader.wireEngine(this)),this._logger.debug("Starting game clock..."),this.browser.resume(),this.clock.start(),this._logger.debug("Game clock started"),t&&(await this.load(this._loader),this._loadingComplete=!0,this.screen.popResolutionAndViewport(),this.screen.applyResolutionAndViewport()),this._loadingComplete=!0,this._overrideInitialize(this),this._isReady=!0,this._isReadyResolve(),this.emit("start",new Q(this)),this._isReadyPromise}_mainloop(t){this.emit("preframe",new Pe(this,this.stats.prevFrame));const e=t*this.timescale;this.currentFrameElapsedMs=e;const i=this.stats.prevFrame.id+1;this.stats.currFrame.reset(),this.stats.currFrame.id=i,this.stats.currFrame.delta=e,this.stats.currFrame.fps=this.clock.fpsSampler.fps,vt.clear();const s=this.clock.now(),n=1e3/this.fixedUpdateFps;if(this.fixedUpdateFps)for(this._lagMs+=e;this._lagMs>=n;)this._update(n),this._lagMs-=n;else this._update(e);const o=this.clock.now();this.currentFrameLagMs=this._lagMs,this._draw(e);const h=this.clock.now();this.stats.currFrame.duration.update=o-s,this.stats.currFrame.duration.draw=h-o,this.stats.currFrame.graphics.drawnImages=vt.DrawnImagesCount,this.stats.currFrame.graphics.drawCalls=vt.DrawCallCount,this.emit("postframe",new ei(this,this.stats.currFrame)),this.stats.prevFrame.reset(this.stats.currFrame),this._monitorPerformanceThresholdAndTriggerFallback()}stop(){this.clock.isRunning()&&(this.emit("stop",new $(this)),this.browser.pause(),this.clock.stop(),this._logger.debug("Game stopped"))}isRunning(){return this.clock.isRunning()}screenshot(t=!1){return new Promise(i=>{this._screenShotRequests.push({preserveHiDPIResolution:t,resolve:i})})}_checkForScreenShots(){for(const t of this._screenShotRequests){const e=t.preserveHiDPIResolution?this.canvas.width:this.screen.resolution.width,i=t.preserveHiDPIResolution?this.canvas.height:this.screen.resolution.height,s=document.createElement("canvas");s.width=e,s.height=i;const n=s.getContext("2d");n.imageSmoothingEnabled=this.screen.antialiasing,n.drawImage(this.canvas,0,0,e,i);const o=new Image,h=s.toDataURL("image/png");o.src=h,t.resolve(o)}this._screenShotRequests.length=0}async load(t){try{await t.load()}catch(e){this._logger.error("Error loading resources, things may not behave properly",e),await Promise.resolve()}}}xi._DEFAULT_ENGINE_OPTIONS={width:0,height:0,enableCanvasTransparency:!0,useDrawSorting:!0,configurePerformanceCanvas2DFallback:{allow:!1,showPlayerMessage:!1,threshold:{fps:20,numberOfFrames:100}},canvasElementId:"",canvasElement:void 0,snapToPixel:!1,pointerScope:Ge.Canvas,suppressConsoleBootMessage:null,suppressMinimumBrowserFeatureDetection:null,suppressHiDPIScaling:null,suppressPlayButton:null,grabWindowFocus:!0,scrollPreventionMode:Oe.Canvas,backgroundColor:L.fromHex("#2185d0")};class ba{constructor(){this._handlers={},this._wiredEventDispatchers=[],this._deferedHandlerRemovals=[]}clear(){this._handlers={},this._wiredEventDispatchers=[]}_processDeferredHandlerRemovals(){for(const t of this._deferedHandlerRemovals)this._removeHandler(t.name,t.handler);this._deferedHandlerRemovals.length=0}emit(t,e){if(this._processDeferredHandlerRemovals(),!t)return;t=t.toLowerCase(),(typeof e>"u"||e===null)&&(e=new T);let i,s;if(this._handlers[t])for(i=0,s=this._handlers[t].length,i;i-1&&this._handlers[t].splice(s,1)}}once(t,e){this._processDeferredHandlerRemovals();const i=s=>{const n=s||new T;this.off(t,i),e(n)};this.on(t,i)}wire(t){t._wiredEventDispatchers.push(this)}unwire(t){const e=t._wiredEventDispatchers.indexOf(this);e>-1&&t._wiredEventDispatchers.splice(e,1)}}class Ea extends Kt{get font(){return this._font}set font(t){this._font=t,this._text.font=t}get text(){return this._text.text}set text(t){this._text.text=t}get color(){return this._text.color}set color(t){this._text&&(this._text.color=t)}get opacity(){return this._text.opacity}set opacity(t){this._text.opacity=t}get spriteFont(){return this._spriteFont}set spriteFont(t){t&&(this._spriteFont=t,this._text.font=this._spriteFont)}constructor(t){super(t),this._font=new pi,this._text=new Mi({text:"",font:this._font});const{text:e,pos:i,x:s,y:n,spriteFont:o,font:h,color:l}=t;this.pos=i??(s&&n?R(s,n):this.pos),this.text=e??this.text,this.font=h??this.font,this.spriteFont=o??this.spriteFont,this._text.color=l??this.color;const f=this.get(Ft);f.anchor=A.Zero,f.use(this._text)}_initialize(t){super._initialize(t)}getTextWidth(){return this._text.width}}class Kr extends Rt{getGraphics(){return this._graphics}addGraphic(t,e){this._graphics.push(t),this._gfx.visible=this.map.visible,this._gfx.opacity=this.map.opacity,e!=null&&e.offset&&(this._gfx.offset=e.offset),this._gfx.localBounds=this._recalculateBounds()}_recalculateBounds(){let t=this._tileBounds.clone();for(const e of this._graphics){const i=R(this.map.graphicsOffset.x-this.map.tileWidth/2,this.map.graphicsOffset.y-(this.map.renderFromTopOfGraphic?0:e.height-this.map.tileHeight));t=t.combine(e.localBounds.translate(i))}return t}removeGraphic(t){const e=this._graphics.indexOf(t);e>-1&&this._graphics.splice(e,1),this._gfx.localBounds=this._recalculateBounds()}clearGraphics(){this._graphics.length=0,this._gfx.visible=!1,this._gfx.localBounds=this._recalculateBounds()}getColliders(){return this._colliders}addCollider(t){this._colliders.push(t),this.map.flagCollidersDirty()}removeCollider(t){const e=this._colliders.indexOf(t);e>-1&&this._colliders.splice(e,1),this.map.flagCollidersDirty()}clearColliders(){this._colliders.length=0,this.map.flagCollidersDirty()}get pos(){return this.map.tileToWorld(R(this.x,this.y))}get center(){return this.pos.add(R(0,this.map.tileHeight/2))}constructor(t,e,i,s){super([new H,new Ft({offset:i??A.Zero,onPostDraw:(w,y)=>this.draw(w,y)}),new vs(s)]),this.solid=!1,this._tileBounds=new J,this._graphics=[],this._colliders=[],this.data=new Map,this.x=t,this.y=e,this.map=s,this._transform=this.get(H),this._isometricEntityComponent=this.get(vs);const n=this.map.tileWidth/2,o=this.map.tileHeight/2,h=(this.x-this.y)*n,l=(this.x+this.y)*o;this._transform.pos=R(h,l),this._isometricEntityComponent.elevation=s.elevation,this._gfx=this.get(Ft),this._gfx.visible=!1;const f=this.map.tileWidth,p=this.map.tileHeight,v=R(0,this.map.renderFromTopOfGraphic?p:0);this._gfx.localBounds=this._tileBounds=new J({left:-f/2,top:-p,right:f/2,bottom:p}).translate(v)}draw(t,e){const i=this.map.tileWidth/2;t.save(),t.translate(-i,0);for(const s of this._graphics)s.draw(t,this.map.graphicsOffset.x,this.map.graphicsOffset.y-(this.map.renderFromTopOfGraphic?0:s.height-this.map.tileHeight));t.restore()}}class Ca extends Rt{constructor(t){super([new H,new it({type:q.Fixed}),new Ct,new fs((p,v)=>this.debug(p,v),!1)],t.name),this.elevation=0,this.visible=!0,this.opacity=1,this.renderFromTopOfGraphic=!1,this.graphicsOffset=R(0,0),this._collidersDirty=!1,this._originalOffsets=new WeakMap;const{pos:e,tileWidth:i,tileHeight:s,columns:n,rows:o,renderFromTopOfGraphic:h,graphicsOffset:l,elevation:f}=t;this.transform=this.get(H),e&&(this.transform.pos=e),this.collider=this.get(Ct),this.collider&&this.collider.set(this._composite=new Mt([])),this.renderFromTopOfGraphic=h??this.renderFromTopOfGraphic,this.graphicsOffset=l??this.graphicsOffset,this.elevation=f??this.elevation,this.tileWidth=i,this.tileHeight=s,this.columns=n,this.rows=o,this.tiles=new Array(n*o);for(let p=0;p=this.columns||e>=this.rows?null:this.tiles[t+e*this.columns]}getTileByPoint(t){const e=this.worldToTile(t);return this.getTile(e.x,e.y)}_getMaxZIndex(){let t=Number.NEGATIVE_INFINITY;for(const e of this.tiles){const i=e.get(H).z;i>t&&(t=i)}return t}debug(t,e){const{showAll:i,showPosition:s,positionColor:n,positionSize:o,showGrid:h,gridColor:l,gridWidth:f,showColliderGeometry:p}=e.isometric,{geometryColor:v,geometryLineWidth:w,geometryPointSize:y}=e.collider;if(t.save(),t.z=this._getMaxZIndex()+.5,i||h){for(let b=0;be.isComplete(t))}reset(){this._actions.forEach(t=>t.reset())}stop(){this._actions.forEach(t=>t.stop())}}function Sa(r){return!!r._initialize}function Ta(r){return!!r.onInitialize}function Pa(r){return!!r._preupdate}function Ra(r){return!!r.onPreUpdate}function Ba(r){return!!r.onPostUpdate}function Ma(r){return!!r.onPostUpdate}function ka(r){return!!r.onPreDraw}function Da(r){return!!r.onPostDraw}class Fa{constructor(t,e=L.Magenta,i=!1){this.path=t,this.color=e,this._stream=null,this._gif=null,this._textures=[],this._animation=null,this._transparentColor=null,this._resource=new Vi(t,"arraybuffer",i),this._transparentColor=e}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}async load(){const t=await this._resource.load();this._stream=new Xr(t),this._gif=new qr(this._stream,this._transparentColor);const e=this._gif.images.map(i=>new Us(i.src,!1));return await Promise.all(e.map(i=>i.load())),this.data=this._textures=e}isLoaded(){return!!this.data}toSprite(t=0){return this._textures[t].toSprite()}toSpriteSheet(){const t=this._textures.map(e=>e.toSprite());return new Ye({sprites:t})}toAnimation(t){const e=this.toSpriteSheet(),i=e.sprites.length;return this._animation=me.fromSpriteSheet(e,Cn(0,i),t),this._animation}get readCheckBytes(){return this._gif.checkBytes}}const ws=r=>r.reduce(function(t,e){return t*2+e},0),cn=r=>{const t=[];for(let e=7;e>=0;e--)t.push(!!(r&1<{if(this.position>=this.data.byteLength)throw new Error("Attempted to read past end of stream.");return this.data[this.position++]},this.readBytes=e=>{const i=[];for(let s=0;s{let i="";for(let s=0;s{const e=this.readBytes(2);return(e[1]<<8)+e[0]},this.data=new Uint8Array(t),this.len=this.data.byteLength,this.len===0)throw new Error("No data loaded from file")}}const Oa=function(r,t){let e=0;const i=function(w){let y=0;for(let b=0;b>3)&1<<(e&7)&&(y|=1<{const s=[];for(let n=0;n{const f=l.toString(16);return f.length===1?"0"+f:f}).join("");s.push(h)}return s},this.readSubBlocks=()=>{let i,s;s="";do i=this._st.readByte(),s+=this._st.read(i);while(i!==0);return s},this.parseHeader=()=>{const i={sig:null,ver:null,width:null,height:null,colorRes:null,globalColorTableSize:null,gctFlag:null,sorted:null,globalColorTable:[],bgColor:null,pixelAspectRatio:null};if(i.sig=this._st.read(3),i.ver=this._st.read(3),i.sig!=="GIF")throw new Error("Not a GIF file.");i.width=this._st.readUnsigned(),i.height=this._st.readUnsigned();const s=cn(this._st.readByte());i.gctFlag=s.shift(),i.colorRes=ws(s.splice(0,3)),i.sorted=s.shift(),i.globalColorTableSize=ws(s.splice(0,3)),i.bgColor=this._st.readByte(),i.pixelAspectRatio=this._st.readByte(),i.gctFlag&&(i.globalColorTable=this.parseColorTable(1<{const s=f=>{this.checkBytes.push(this._st.readByte());const p=cn(this._st.readByte());f.reserved=p.splice(0,3),f.disposalMethod=ws(p.splice(0,3)),f.userInput=p.shift(),f.transparencyGiven=p.shift(),f.delayTime=this._st.readUnsigned(),f.transparencyIndex=this._st.readByte(),f.terminator=this._st.readByte(),this._handler.gce&&this._handler.gce(f)&&this.checkBytes.push(this._handler.gce)},n=f=>{f.comment=this.readSubBlocks(),this._handler.com&&this._handler.com(f)&&this.checkBytes.push(this._handler.com)},o=f=>{this.checkBytes.push(this._st.readByte()),f.ptHeader=this._st.readBytes(12),f.ptData=this.readSubBlocks(),this._handler.pte&&this._handler.pte(f)&&this.checkBytes.push(this._handler.pte)},h=f=>{const p=w=>{this.checkBytes.push(this._st.readByte()),w.unknown=this._st.readByte(),w.iterations=this._st.readUnsigned(),w.terminator=this._st.readByte(),this._handler.app&&this._handler.app.NETSCAPE&&this._handler.app.NETSCAPE(w)&&this.checkBytes.push(this._handler.app)},v=w=>{w.appData=this.readSubBlocks(),this._handler.app&&this._handler.app[w.identifier]&&this._handler.app[w.identifier](w)&&this.checkBytes.push(this._handler.app[w.identifier])};switch(this.checkBytes.push(this._st.readByte()),f.identifier=this._st.read(8),f.authCode=this._st.read(3),f.identifier){case"NETSCAPE":p(f);break;default:v(f);break}},l=f=>{f.data=this.readSubBlocks(),this._handler.unknown&&this._handler.unknown(f)&&this.checkBytes.push(this._handler.unknown)};switch(i.label=this._st.readByte(),i.label){case 249:i.extType="gce",s(i);break;case 254:i.extType="com",n(i);break;case 1:i.extType="pte",o(i);break;case 255:i.extType="app",h(i);break;default:i.extType="unknown",l(i);break}},this.parseImg=i=>{const s=(h,l)=>{const f=new Array(h.length),p=h.length/l,v=(k,D)=>{const C=h.slice(D*l,(D+1)*l);f.splice.apply(f,[k*l,l].concat(C))},w=[0,4,2,1],y=[8,8,4,2];let b=0;for(let k=0;k<4;k++)for(let D=w[k];D{const i={sentinel:this._st.readByte(),type:""};switch(String.fromCharCode(i.sentinel)){case"!":i.type="ext",this.parseExt(i);break;case",":i.type="img",this.parseImg(i);break;case";":i.type="eof",this._handler.eof&&this._handler.eof(i)&&this.checkBytes.push(this._handler.eof);break;default:throw new Error("Unknown block: 0x"+i.sentinel.toString(16))}i.type!=="eof"&&this.parseBlock()},this.arrayToImage=i=>{let s=0;const n=document.createElement("canvas");n.id=s.toString(),n.width=i.width,n.height=i.height,s++;const o=n.getContext("2d"),h=1;let l=0,f=0;for(let v=0;vMath.max(s.x,i),0)-e.x,this.height=this._points.reduce((i,s)=>Math.max(s.y,i),0)-e.y,this.flagDirty()}get minPoint(){const t=this._points.reduce((i,s)=>Math.min(s.x,i),1/0),e=this._points.reduce((i,s)=>Math.min(s.y,i),1/0);return R(t,e)}constructor(t){super(t),this.points=t.points,this.filtering=Ot.Blended,this.rasterize()}clone(){return new un({points:this.points.map(t=>t.clone()),...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){if(this.points&&this.points.length){t.beginPath();const e=this.minPoint.negate(),i=this.points[0].add(e);t.moveTo(i.x,i.y),this.points.forEach(s=>{t.lineTo(s.x+e.x,s.y+e.y)}),t.lineTo(i.x,i.y),t.closePath(),this.color&&t.fill(),this.strokeColor&&t.stroke()}}}class Ua{constructor(){this._queue=[]}get length(){return this._queue.length}enqueue(){const t=new Ne;return this._queue.push(t),t.promise}dequeue(t){this._queue.shift().resolve(t)}}class La{constructor(t){this._count=t,this._waitQueue=new Ua}get count(){return this._count}get waiting(){return this._waitQueue.length}async enter(){return this._count!==0?(this._count--,Promise.resolve()):this._waitQueue.enqueue()}exit(t=1){if(t!==0){for(;t!==0&&this._waitQueue.length!==0;)this._waitQueue.dequeue(null),t--;this._count+=t}}}const fn="0.29.0-alpha.4+6f6d7bb";m()})();_.y1j;_.fWn;_.Ia8;_.rqv;_.zH6;_.hLI;_.yyv;_.tX5;var Yi=_.vtX;_.r7K;_.lCh;_.cE4;_.fwF;_.sce;_.AQ6;_._c7;_.KUs;_.Ajp;_.dkO;_.RDh;_._H9;_.mxs;_.OmD;_.kBf;_.C4F;_.NQt;_.JjN;_.EK_;_.V1s;_.xHm;_.Xz7;_.Cdc;_.FKn;_.SUY;_.ab2;_.GfZ;_.YMS;_.oyv;_.aUb;_.SdD;_.JUv;_.jEj;_.TFq;_.HDU;_.R_y;_.ydN;_.t50;_.s$$;var xn=_.v2G,_n=_.Ilk;_.s9i;_.dxL;_.LLX;_.wA2;_.R_p;_.IQ$;_.I5F;_.X8$;_.FR6;_.U8o;_.kbG;_.iS_;_.cGG;_.RPN;_.skb;_.SLU;_.RdJ;_.cNu;_.gU7;_.LSk;_.Nmp;var Ha=_.d1Y;_.xrL;_.sRW;_.cmV;_.qWz;_.N0Q;_.q8b;_.ynB;_.jT9;var Ya=_.wAz,Wa=_.D4V;_.NLr;_.N6H;_.W1A;_.JHW;_.ZZ$;_.v2K;_.pBf;_.vpe;_.GMl;_.zW2;_.B0K;_.Nv7;_.C_p;_.MUA;_.xqU;_.pTp;_.vUK;_.j9l;_.Zxw;_.v51;_.Hdx;_.Z$d;_.iqV;_.o$7;_.olM;_.Zm$;_.$QH;_.i78;_.nJg;_.h6u;_.hts;_.j88;_.VME;_.fy2;_.nt;_.Ukr;_.zsu;_.oA6;_.TVh;_.TwZ;_.GTT;_.xxj;_.XdK;_.Jmb;var oe=_.cXo;_.Dm5;_.IIB;_.ebW;_.zI0;_.LYD;_.cEG;_.SEl;_.t9V;_.ez5;_.N1d;var Ue=_.R8U;_.SKZ;_.__J;_.RI$;_.x12;_.ccz;var Za=_.aNw;_.XrL;_.xwn;_.dNK;_.ini;_.YdH;_.F5T;_.y3G;_.l57;_.xn0;_.t2V;_.uxB;_.cpd;_.fiy;_.$XZ;_.UG6;_.uqK;_.STE;_.y$z;_.mAD;_.sOq;_.hUw;_._0G;_.Sqs;_.hpZ;var Ja=_.Vol;_.vYX;_.wIZ;_.cBi;_.c30;_.MPV;_.RFv;_.Ux6;_.rxy;_.I$c;_.kfC;_.VjY;_.mgq;_.YVA;_.Kgp;_.HH$;_.M_d;_.rgh;_.Ra6;_.KhR;_.gvQ;_.BS5;_.xhz;_.xOq;_.a9j;_.bHk;_.CgK;_.cEd;_.cuY;_.kvE;_.SBu;_.PsT;_.AE_;_.ctO;_.OLH;_.kky;_.nSF;_.zHn;_.zwx;_.AeJ;_.hLz;_.D9g;_.wA;_.jhr;_.GVs;_._zO;_.LXZ;_.w6$;_.mhV;_.MOD;_.kwd;_.Lmr;var wn=_.xsS;_.K5l;_.lLr;_.Z$r;_.IXb;_.Xsu;_.SGH;_.SMj;_.L34;_.exe;_.bnF;_.MFA;var Gi=_.$uU;_.Sap;_.jyi;_.E03;_.V6q;_.rg2;_.DVW;_.nVo;_.F6N;_.xP7;_.Odq;_.Zif;_.ZGJ;_.MJk;_.xvT;_.PHM;_.dpR;_.n9L;_.KwO;_.SxM;var ja=_.B7y;_.x7r;_.wx7;_.Uvn;_.OFT;_.xzN;_.CcZ;_.M5Z;_.ZrN;_.OWs;_.dF9;_.oZy;_.rD2;_.VHo;_.ohE;_.R$E;_.xQN;_.AdJ;_.q3I;_.Pab;_.uZ5;_.McK;_.F9c;_.k0b;_.hnT;_.RSJ;_.Mku;_.h90;_.rms;_.ErP;_.aVg;_.lPc;_.Z8E;_._N2;_.yFn;_.lNv;_.cu9;_.MZQ;_.FUM;_.BxR;_.vdf;_.iaL;_.w6H;_.Q4c;_.Xxe;_.Uxb;_.Yr5;var Ut=_.Bhw;_.yOA;const Va="data:image/png;base64,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",Ka="data:image/png;base64,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",Xa="data:image/png;base64,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",qa="data:image/png;base64,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",$a="data:image/png;base64,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",th="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD2SURBVHgB7VGxDoIwEL0qJO3A4szAD7ibuPgpfpp/YqJhdvAHGFiZSIRFzr5LSwDdYNDYl5B7d+/1lbZEAQEBAQEBXwp12+0OtCCiaL0+04JY0cIIgf8QGHnCRCeaAUV0lHrf7xlkm+eKZsDn/NCjpGlqbDFZlml8lms3AxcN/WQ2rIL+Ucqy3KAWReHvkquqAsfdKOchY4z0toqpaRpynnEguNZahLZtyXLlzLLA9pj3M7aAz232MbA3YLGfeeI06bGZq5j3JxgFOnFoett9EO5DeOKnqGO+QIzj+IFAHMv23SBMJUkif1fX9XQThTDoT+arFfgF3rFtVgjtI8cAAAAASUVORK5CYII=",eh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEASURBVHgB7VExjoMwEJzlQLILmqspeMXV94A8IveHk+4N94v7wz0gUlJE+QUFLRVSoAmOxzEISLpQJIpHQjueHc/aGAgICAgICHhQyOp7/4kFEeMt2mBBRFgYIfAVAuOeCOQPd8DArCeB/78fX7gDq5/DmvWJHiXLMm2LzvNc8bNceY3c9bieaePqMPzDsizfWYuiEC+ZqqrIDfhmFw+01m5tqzM1TQPvmQaSK6Vco21bWC7e7DbYNfVBMxb0+WE3AwcDN/daT3zPrTnMV+rDDSaBvjk2XU0fhfchZuZHbE++BTpJkuTIQF7L6t0oTNI0daer63o+RBjGvulOO0hkzks6bRNn/MavAAAAAElFTkSuQmCC",ih="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADuSURBVHgB7ZXBCoJAEIZntkCP9gR5DgI7CKIv26N0UbwZBF1bn6A6hrrT7upC52YNAr/Lvxc/ZhlnFi9FQeARAZ5ZhItwES7C3wjRHdxe3Jclwhe47+e7MhJJk9c83wKD+SokxIfJV9dtgMFnhVYIQRABAyts0jTRkej2nqHvJTCwwlUYxjoiRdQe6loCg/HKwzBeE/EOTKyQiKxQ/zpPYDJWiGiFyjWGLfTIKCSKTeguS2AyT4VCCDu/gxASmPzJxsapKYFSN2AyT4V6dcUmd1XVAhP/FTZZFk9n9thZoTugJ+F6ypNijp1+Q48m359nP16rOGJzAAAAAElFTkSuQmCC",sh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD9SURBVHgB7ZQxjsIwEEX/2NFuy55gfQREg7gBQlTcBYFEjQS34ARUFJQ0CNEgbkA4AVCBkPBgOwR6xkEUeUW+U+Rp4vGY2r01IyIKkSmFpbAUlsLPCClf5PfibFwnvEH+fXG/zODUZ2ew+YeA4iokpqPPy/X8BwGvCikTKq0qEJD4R6u7rLpdrDJoewNSCAgVKkqMC1eZ3c9HjRQCgtCyrWQv6gAhQaiJg5BhTxCiMhFljWA+Qkgx59ANofFpWdbhpzAmQUikw/wq/a0VRhe682d8/ujfHYQU1BSQ8Tkd1vYQEr/CZn9lHmvx2AVhvqBIwuShW0B4sbo+THzeAZmHOzUW9OpSAAAAAElFTkSuQmCC",nh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAF0SURBVHgB7ZZNToNAFMffszSBRRPjugsuYKK7BrqwR/AEegOPoEfwBvYGHqGJpt3WSA/Agi2JCYmwUJ7vjQOZIrWQdkPCP2ne5/ymA8MAQK9evbqiwPPuN553UVc7gZba+P4TID7kiM+tgOvJxK2DEcAtux/fRNeNgTLQGgzW5rJM2BfR7HK1eqsba9Ulc+BFAZwS4oKhM47umsBEuKvw7vtzLt4Yqb2wf4EVaCNYIwXT6eN6xxbpppD32xUcURbvtwUcUa0fvR7YA43ji4+nORwg/D3eAAPfJ3HOl0uEA1RwOnRTxuOxw8ZxXdeWH/u2zomvahJXcqZVKm9KFEVnYsMwLK4lxXEsvlwb1D3gOI6K2aqmNE1B92wDxbdtWxWyLAP2UTerARxLvswRS/r0ZLXAskEGF7nC0TUVy2TaSr5cwRZQF82mP7Mb8AJClX6wcqIXKQ6Hw08ByrJAvZpLGI5GI/XvkiSpToICkzp/SbxygX4A3V2uBtBE7m4AAAAASUVORK5CYII=",rh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGBSURBVHgB7ZU7TsNAEIZnFluyi0iIOoWPQEVDQzpE3HACwgloIKGDFtFwA3IDCiTaSCAUHgUcIUXaSEiRiItkl5llbTbGAVtJY8m/FM3sP7PfevOYAFSqVKksCtuvZ3snj5tZNQEF1ey8XAPKcxTOTSHg7mk/yIIhqBalH0pO93MDeaOjxJt9LRsm5bRxd7n9nrXXyTJBzRBQrAvh9AjaQOEe5YGxcFGh2e53EcWBZf0L+xOYguaC5VLYebpa9BUppzA87u/ACuXAmujBClX4p1cBK6A1vmhedWEJqe/x9gO8vdg6hCUUdp5bHEv0odTrdZ+CHwSBxy/KPeNxrmu8Tnl21Erew+FwuMFxMBjEU1yNRiPOFZjJTj3g+75eU9RNk8kETM88kHPP83QhiiKgHE2z3kBr9hNPkbjPHJYJTBp4c+zFianpNR9mIvvJDeaApmg3/TrdgscQleoHh578HkCi67qfDORrkS8tGNZqNf104/E4fQgyjOtKzh7ov1x9AV4isRWJB09iAAAAAElFTkSuQmCC",oh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABQCAYAAAAOYsW+AAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL/SURBVHgB7Vg9T+NAEJ18kXDJ1VADNfRQXQE99KAroecHUAM9dCdBD1cDBQ1QQw81dKcTCYTEMfPG3shYQt7ZgJHRPsmwcZx9np23M7ND5OHhUXSU8Of/4uJvHvyhPBCGv36enZ2X6Yvgib8/cVXzcKnZpNrKClXn56k8PS33Bre31Ds+pv7FBYXttvVc1sTliQka392l8PGReicnFNzcRPenpqi+tkZjq6v0tLlJg4cHq/msiA0prOru77/5Dhb3T0+FGM901tetLLfyMSaFpWnSJF4OD8VauMIGVsQV9ml3by/6AfsWvjbAGD435LXlZZsps4mFqNUa+vQHv0Blbm74fXVpiRpbW/ICWHY8C9dkQaVqoM0WJX0IReOlkvdKIM4QWabFYTyBsQIWwecGMg7DN8/A8ixkE7OoYBGWVD6zZTUeN9lSXBhTbC2Elbb+PVgtNUQzvrMj22lwd0dtthJ+xksZ66AFCKuzsWEzpZ2qg+vriJz3qVEt7omYWFRmD8uWslhmwFpcMun9fRSl+DKkpclJIuzx7W3qX13ZTqdTNSIULixzKSEkWyudiQ2wzKPCFwKe+PsRq7cTQuNYKuciV2vqLZmHlEC26iM3c5YCJJjEYw3UFiMx9LnYQwrES0jIdIBT5AJ6R0fyP0DItKwsP4TY+DR0iNNAsVRdTyX7LhcJ2uXWi4sJkJuTyMXHUoMVOS0WL3Jh/1YWFoYlkBZOPgZ5nY+kLwcHcpJwgdpixGbU2LAU26oVh08t1BZD0Z3EEQbILWS6EKVRnO0EHzdYWEloeh/OxPDxU4rY+/jTiLGP0d9C76NueR4emdg0XsozM9Hn2Vl5iU8nRshEVYkWU8AdAqkwlQkCUItLOnmXlzKWgzgT56bqZAWSW5L4KOgLAc5E5URnDwiULWMnYvkRlMyVCMhCbsiAWD0HKQEhPXNrSTq6PEbv2gXONZexGPvYpeZyqqvltBh3c13hfFocFb4H4ok9sSf2xNaQWB30en8bROeUA56J/tFX4hXJx4DZFieaegAAAABJRU5ErkJggg==",ah=""+new URL("winter-MwpCX4RD.wav",import.meta.url).href,hh=""+new URL("start_race-hiAgOaoX.mp3",import.meta.url).href,lh=""+new URL("finish_race-uYgKFh7v.mp3",import.meta.url).href,ch=""+new URL("gate_missed-_-ZxwNrJ.mp3",import.meta.url).href,dh=""+new URL("pole_hitting-vctwAcnk.mp3",import.meta.url).href,lt={Skier:new oe(Va),SkierCarving:new oe(Ka),SkierSliding:new oe(Xa),SkierBraking:new oe(qa),SkierJumping:new oe($a),PoleRed:new oe(th),PoleBlue:new oe(eh),PoleTouchedRed:new oe(ih),PoleTouchedBlue:new oe(sh),PolePassedRed:new oe(nh),PolePassedBlue:new oe(rh),FinalPole:new oe(oh),WinterSound:new Gi(ah),FinishRaceSound:new Gi(lh),StartRaceSound:new Gi(hh),GateMissedSound:new Gi(ch),PoleHittingSound:new Gi(dh)},W=class W{};S(W,"DISPLAY_WIDTH",800),S(W,"DISPLAY_HEIGHT",600),S(W,"CAMERA_ZOOM",.6),S(W,"DISPLAY_MIN_MARGIN",25),S(W,"DISPLAY_MAX_RIGHT_POSITION",W.DISPLAY_WIDTH/2-W.DISPLAY_MIN_MARGIN),S(W,"DISPLAY_MAX_LEFT_POSITION",-W.DISPLAY_MAX_RIGHT_POSITION),S(W,"FRONT_GHOST_DISTANCE",-W.DISPLAY_HEIGHT/2),S(W,"FORMAT_TIMING","mm:ss:SS"),S(W,"DEFAULT_TRACKS",["soelden"]),S(W,"CONTROL_CARVE_RIGHT",Ue.ArrowRight),S(W,"CONTROL_CARVE_LEFT",Ue.ArrowLeft),S(W,"CONTROL_BRAKE",Ue.Space),S(W,"DEBUG_KEY",Ue.D),S(W,"RESTART_KEY",Ue.R),S(W,"EXIT_KEY",Ue.Escape),S(W,"START_KEY",Ue.ArrowUp),S(W,"SOUND_KEY",Ue.S),S(W,"MAX_SPEED",145),S(W,"VELOCITY_MULTIPLIER_RATE",7),S(W,"LATERAL_VELOCITY_ROTATION_RATE",1.15),S(W,"WIND_FRICTION_RATE",.002),S(W,"INITIAL_SLOPE",.1),S(W,"ACCELERATION_RATE",3),S(W,"BRAKING_RATE",1),S(W,"GATE_MAX_WIDTH",200),S(W,"GATE_MIN_WIDTH",160),S(W,"GATE_MIN_VERTICAL_DISTANCE",220),S(W,"GATE_MAX_VERTICAL_DISTANCE",400),S(W,"GATE_MAX_HORIZONTAL_DISTANCE",320),S(W,"GATE_MAX_LEFT_POSITION",W.DISPLAY_MAX_LEFT_POSITION),S(W,"GATE_MAX_RIGHT_POSITION",W.DISPLAY_MAX_RIGHT_POSITION),S(W,"GATE_MAX_NUMBER",56),S(W,"GATE_MIN_NUMBER",41),S(W,"FINAL_GATE_WIDTH",W.DISPLAY_WIDTH-2*W.DISPLAY_MIN_MARGIN),S(W,"FINAL_GATE_POSITION",W.DISPLAY_MAX_LEFT_POSITION),S(W,"GATE_OTHER_SIDE_PROBABILITY",.95),S(W,"POLE_WIDTH",20),S(W,"POLE_HEIGHT",40),S(W,"POLE_DETECTOR_MARGIN",22),S(W,"FINAL_POLE_WIDTH",30),S(W,"FINAL_POLE_HEIGHT",80),S(W,"MAX_RIGHT_ROTATION_ANGLE",Math.PI/2),S(W,"MAX_LEFT_ROTATION_ANGLE",3*Math.PI/2),S(W,"ROTATION_RECENTER_RATE",.2),S(W,"CARVING_ROTATION_RATE",3.1),S(W,"CARVING_ROTATION_OPTIMAL_SPEED",60),S(W,"CARVING_ADHERENCE_RATE",.9),S(W,"CARVING_BRAKING_RATE",.01),S(W,"SLIDING_ROTATION_RATE",4.1),S(W,"SLIDING_ROTATION_OPTIMAL_SPEED",45),S(W,"SLIDING_ADHERENCE_RATE",.6),S(W,"SLIDING_BRAKING_RATE",.9);let N=W;class uh{constructor(d,a,c,g,m){S(this,"position");S(this,"player");S(this,"date");S(this,"time");S(this,"difference");this.position=d,this.player=a,this.date=c,this.time=g,this.difference=m}}class fh{static getParticlesEmitter(){return new Ja({pos:Ut(0,-20),emitterType:Ya.Circle,radius:6,minVel:50,maxVel:200,minAngle:3.4,maxAngle:6,emitRate:300,opacity:.5,fadeFlag:!0,particleLife:800,maxSize:4,minSize:1,beginColor:_n.ExcaliburBlue,isEmitting:!1})}}class An extends Yi{constructor(a){super({pos:Ut(0,0),width:30,height:50,z:10,anchor:Ut(.5,.5),collisionType:xn.Fixed});S(this,"speed",0);S(this,"skierName");S(this,"racing",!1);S(this,"finish",!1);S(this,"skierSprite",lt.Skier.toSprite());S(this,"skierCarvingSprite",lt.SkierCarving.toSprite());S(this,"skierSlidingSprite",lt.SkierSliding.toSprite());S(this,"skierBrakingSprite",lt.SkierBraking.toSprite());S(this,"particlesEmitter");this.skierName=a}onInitialize(){this.graphics.add(this.skierSprite),this.particlesEmitter=fh.getParticlesEmitter(),this.addChild(this.particlesEmitter)}update(a){this.racing?(this.updateRotation(a),this.updateSpeed(a,!1),this.updateVelocity(a),this.updateGraphics(a),this.updateCameraPosition(),this.emitParticles(a)):this.finish?(this.updateSpeed(a,!0),this.updateVelocity(a),this.graphics.use(this.skierBrakingSprite),this.emitBreakingParticles()):a.input.keyboard.isHeld(N.START_KEY)&&this.scene.startRace()}finishRace(){this.racing=!1,this.finish=!0,this.graphics.use(this.skierBrakingSprite),this.emitBreakingParticles()}startRace(){this.racing=!0}updateRotation(a){let c=0,g=0;if(this.hasTurningIntention(a)){if(this.hasSlidingIntention(a)){const x=this.speed=270?this.rotation+x:this.rotation-x)}const m=g*(180/Math.PI);m>180&&m<270?this.rotation=N.MAX_LEFT_ROTATION_ANGLE:m<180&&m>90?this.rotation=N.MAX_RIGHT_ROTATION_ANGLE:this.rotation=g}updateSpeed(a,c){let g=this.rotation*(180/Math.PI);g>=270&&(g=360-g);let m=N.ACCELERATION_RATE*N.INITIAL_SLOPE;m-=m*g/90,m-=N.WIND_FRICTION_RATE*this.speed,c?m-=N.BRAKING_RATE:this.hasSlidingIntention(a)?m-=N.SLIDING_BRAKING_RATE:this.hasCarvingIntention(a)?m-=N.CARVING_BRAKING_RATE:this.hasBreakingIntention(a)&&(m-=N.BRAKING_RATE);const x=this.speed+m;x<0?this.speed=0:this.speed=x}updateVelocity(a){let c=0,g=0;const m=this.getAdherenceRate(a),x=this.rotation*(180/Math.PI);if(x===0)c=0,g=this.speed;else if(x<=90){const I=x/90*this.speed;c=I*N.LATERAL_VELOCITY_ROTATION_RATE*m,g=Math.max(0,this.speed-m*I)}else{const I=(360-x)/90*this.speed;c=-I*N.LATERAL_VELOCITY_ROTATION_RATE*m,g=Math.max(0,this.speed-m*I)}this.vel=Ut(c*N.VELOCITY_MULTIPLIER_RATE,-g*N.VELOCITY_MULTIPLIER_RATE)}updateCameraPosition(){this.scene.updateGhost(this.pos.y)}getAdherenceRate(a){let c=1;return this.hasTurningIntention(a)&&(c=this.hasSlidingIntention(a)?N.SLIDING_ADHERENCE_RATE:N.CARVING_ADHERENCE_RATE),c}updateGraphics(a){this.hasSlidingIntention(a)?(this.graphics.use(this.skierSlidingSprite),this.graphics.flipHorizontal=this.hasLeftSlidingIntention(a)):this.hasBreakingIntention(a)?this.graphics.use(this.skierBrakingSprite):this.hasCarvingIntention(a)?(this.graphics.use(this.skierCarvingSprite),this.graphics.flipHorizontal=this.hasLeftCarvingIntention(a)):this.graphics.use(this.skierSprite)}emitParticles(a){if(this.particlesEmitter){const c=this.speed/N.MAX_SPEED;this.hasSlidingIntention(a)?(this.particlesEmitter.pos.y=5,this.particlesEmitter.radius=6,this.particlesEmitter.particleLife=1500,this.hasLeftSlidingIntention(a)?(this.particlesEmitter.maxAngle=1.6,this.particlesEmitter.minAngle=.5,this.particlesEmitter.pos.x=12):(this.particlesEmitter.maxAngle=2.6,this.particlesEmitter.minAngle=1.6,this.particlesEmitter.pos.x=-12),this.particlesEmitter.emitParticles(c*30)):this.hasCarvingIntention(a)?(this.particlesEmitter.pos.y=5,this.particlesEmitter.radius=1,this.particlesEmitter.particleLife=450,this.particlesEmitter.maxAngle=4.8,this.particlesEmitter.minAngle=4.6,this.particlesEmitter.pos.x=this.hasLeftCarvingIntention(a)?12:-12,this.particlesEmitter.emitParticles(c*15)):this.hasBreakingIntention(a)?this.emitBreakingParticles():this.speed>0&&(this.particlesEmitter.pos.y=0,this.particlesEmitter.radius=3,this.particlesEmitter.particleLife=500,this.particlesEmitter.maxAngle=6,this.particlesEmitter.minAngle=3.4,this.particlesEmitter.pos.x=0,this.particlesEmitter.emitParticles(c*5))}}emitBreakingParticles(){this.particlesEmitter.pos.y=-20,this.particlesEmitter.radius=6,this.particlesEmitter.particleLife=1500,this.particlesEmitter.maxAngle=6,this.particlesEmitter.minAngle=3.4,this.particlesEmitter.pos.x=0,this.particlesEmitter.emitParticles(this.speed/N.MAX_SPEED*50)}hasBreakingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_BRAKE)}hasCarvingIntention(a){return this.hasLeftCarvingIntention(a)||this.hasRightCarvingIntention(a)}hasSlidingIntention(a){return this.hasLeftSlidingIntention(a)||this.hasRightSlidingIntention(a)}hasLeftTurningIntention(a){return this.hasLeftCarvingIntention(a)||this.hasLeftSlidingIntention(a)}hasLeftSlidingIntention(a){return this.hasLeftCarvingIntention(a)&&this.hasBreakingIntention(a)}hasRightSlidingIntention(a){return this.hasRightCarvingIntention(a)&&this.hasBreakingIntention(a)}hasLeftCarvingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_CARVE_LEFT)}hasRightCarvingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_CARVE_RIGHT)}hasTurningIntention(a){return this.hasSlidingIntention(a)||this.hasCarvingIntention(a)}}class gn extends Yi{constructor(d,a,c=!1){super({pos:d,width:c?N.FINAL_POLE_WIDTH:N.POLE_WIDTH,height:c?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT,anchor:Ut(0,.5),collisionType:xn.Active}),c?this.graphics.use(lt.FinalPole.toSprite()):this.graphics.use(a==="red"?lt.PoleRed.toSprite():lt.PoleBlue.toSprite())}onInitialize(){this.on("collisionstart",d=>this.onPreCollision(d))}onPreCollision(d){d.other instanceof An&&this.scene.engine.soundPlayer.playSound(lt.PoleHittingSound,.2)}}class gh extends Yi{constructor(d,a,c=!1){super({pos:d,width:a,height:c?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT/2,anchor:Ut(0,c?.5:0),collisionType:xn.Passive})}onInitialize(){this.on("precollision",d=>this.onPreCollision(d))}onPreCollision(d){d.other instanceof An&&(this.parent.emit("passed"),this.kill())}}class pn extends Yi{constructor(a,c,g,m,x=!1){super({pos:a,width:c,height:x?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT,anchor:Ut(0,.5)});S(this,"isFinalGate");S(this,"leftPole");S(this,"rightPole");S(this,"gateDetector");S(this,"gateNumber");S(this,"polesColor");S(this,"gatePassed",!1);this.isFinalGate=x,this.polesColor=g,this.gateNumber=m}onInitialize(){this.on("passed",()=>this.onGatePassed())}update(){this.isOnScreen()&&!this.children.length&&this.buildComponents(),!this.isFinalGate&&!this.gatePassed&&this.shouldBePassed()&&(this.scene.addPenalty(this.gateNumber),this.gatePassed=!0),this.canBeDestroy()&&this.kill()}getStockableGate(){return{x:this.pos.x,y:this.pos.y,color:this.polesColor,width:this.width,gateNumber:this.gateNumber,isFinal:this.isFinalGate}}isOnScreen(){return Math.abs(this.scene.camera.y-this.pos.y)this.scene.camera.pos.y)}canBeDestroy(){return this.scene.camera.y-this.pos.y<-N.DISPLAY_HEIGHT}buildComponents(){const a=this.isFinalGate?N.FINAL_POLE_WIDTH:N.POLE_WIDTH;this.leftPole=new gn(Ut(0,0),this.polesColor,this.isFinalGate),this.gateDetector=new gh(Ut(a+N.POLE_DETECTOR_MARGIN,0),this.width-2*(a+N.POLE_DETECTOR_MARGIN),this.isFinalGate),this.rightPole=new gn(Ut(this.width-a,0),this.polesColor,this.isFinalGate),this.addChild(this.leftPole),this.addChild(this.gateDetector),this.addChild(this.rightPole)}onGatePassed(){this.gatePassed=!0,this.isFinalGate?this.scene.stopRace():this.updatePassedPolesGraphics()}updatePassedPolesGraphics(){this.children.forEach(a=>{const c=this.polesColor==="red"?lt.PolePassedRed.toSprite():lt.PolePassedBlue.toSprite();a instanceof gn&&a.graphics.use(c)})}}class ro{constructor(d,a,c,g){S(this,"name");S(this,"date");S(this,"gates");S(this,"records");this.name=d,this.date=a,this.gates=c,this.records=g}toStockable(){return new vn(this.name,this.date,this.gates.map(d=>d.getStockableGate()),this.records)}}class Ae{static designTrack(d){const a=[],c=Math.floor(N.GATE_MIN_NUMBER+Math.random()*(N.GATE_MAX_NUMBER-N.GATE_MIN_NUMBER));console.log("TrackBuilder - Designing a new track of ",c," gates");let g=Ae.getRandomGateWidth(),m=Ae.getNextGatePosition(g);for(let x=0;x0?"red":"blue",x+1);a.push(I),g=Ae.getRandomGateWidth(),m=Ae.getNextGatePosition(g,m)}return a.push(Ae.generateFinalGate(m.y)),new ro(d,new Date,a,[])}static buildTrack(d){console.log("TrackBuilder - Rebuilding an existing track");const a=[];return d.gates.forEach(c=>{a.push(new pn(Ut(c.x,c.y),c.width,c.color,c.gateNumber,c.isFinal))}),new ro(d.name,d.date,a,d.records)}static getRandomGateWidth(){return N.GATE_MIN_WIDTH+Math.random()*(N.GATE_MAX_WIDTH-N.GATE_MIN_WIDTH)}static generateFinalGate(d){return new pn(Ut(N.FINAL_GATE_POSITION,d),N.FINAL_GATE_WIDTH,"red",void 0,!0)}static getNextGatePosition(d,a){const c=Math.random(),g=N.GATE_MAX_RIGHT_POSITION-d;if(a){const x=this.getGateSide(a)==="left"?c>=N.GATE_OTHER_SIDE_PROBABILITY:cN.GATE_MAX_HORIZONTAL_DISTANCE?B=Ae.furtherAutorizedXPosition(a.x,x?"left":"right",g):B=I;const T=a.y-(N.GATE_MIN_VERTICAL_DISTANCE+Math.random()*(N.GATE_MAX_VERTICAL_DISTANCE-N.GATE_MIN_VERTICAL_DISTANCE));return Ut(B,T)}else{const m=c>.5,x=g*Math.random();return Ut(m?-x:x,-N.GATE_MAX_VERTICAL_DISTANCE)}}static furtherAutorizedXPosition(d,a,c){return a==="left"?Math.max(d-N.GATE_MAX_HORIZONTAL_DISTANCE,N.GATE_MAX_LEFT_POSITION):Math.min(d+N.GATE_MAX_HORIZONTAL_DISTANCE,c)}static getDistance(d,a){return d>=0&&a>=0?Math.abs(d-a):d>=0&&a<0?d-a:Math.abs(a-d)}static getGateSide(d){return d.x<0?"left":d.x>0?"right":"middle"}}class vn{constructor(d,a,c,g){S(this,"name");S(this,"date");S(this,"gates");S(this,"records");this.name=d,this.date=a,this.gates=c,this.records=g}toTrack(){return Ae.buildTrack(this)}}function be(u){const d=Object.prototype.toString.call(u);return u instanceof Date||typeof u=="object"&&d==="[object Date]"?new u.constructor(+u):typeof u=="number"||d==="[object Number]"||typeof u=="string"||d==="[object String]"?new Date(u):new Date(NaN)}function ti(u,d){return u instanceof Date?new u.constructor(d):new Date(d)}const go=6048e5,ph=864e5;let mh={};function ys(){return mh}function Hi(u,d){var I,P,B,T;const a=ys(),c=(d==null?void 0:d.weekStartsOn)??((P=(I=d==null?void 0:d.locale)==null?void 0:I.options)==null?void 0:P.weekStartsOn)??a.weekStartsOn??((T=(B=a.locale)==null?void 0:B.options)==null?void 0:T.weekStartsOn)??0,g=be(u),m=g.getDay(),x=(m=g.getTime()?a+1:d.getTime()>=x.getTime()?a:a-1}function oo(u){const d=be(u);return d.setHours(0,0,0,0),d}function ao(u){const d=new Date(Date.UTC(u.getFullYear(),u.getMonth(),u.getDate(),u.getHours(),u.getMinutes(),u.getSeconds(),u.getMilliseconds()));return d.setUTCFullYear(u.getFullYear()),u.getTime()-d.getTime()}function _h(u,d){const a=oo(u),c=oo(d),g=a.getTime()-ao(a),m=c.getTime()-ao(c);return Math.round((g-m)/ph)}function vh(u){const d=po(u),a=ti(u,0);return a.setFullYear(d,0,4),a.setHours(0,0,0,0),As(a)}function xh(u){return u instanceof Date||typeof u=="object"&&Object.prototype.toString.call(u)==="[object Date]"}function wh(u){if(!xh(u)&&typeof u!="number")return!1;const d=be(u);return!isNaN(Number(d))}function Ah(u){const d=be(u),a=ti(u,0);return a.setFullYear(d.getFullYear(),0,1),a.setHours(0,0,0,0),a}const yh={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},bh=(u,d,a)=>{let c;const g=yh[u];return typeof g=="string"?c=g:d===1?c=g.one:c=g.other.replace("{{count}}",d.toString()),a!=null&&a.addSuffix?a.comparison&&a.comparison>0?"in "+c:c+" ago":c};function mn(u){return(d={})=>{const a=d.width?String(d.width):u.defaultWidth;return u.formats[a]||u.formats[u.defaultWidth]}}const Eh={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ch={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ih={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Sh={date:mn({formats:Eh,defaultWidth:"full"}),time:mn({formats:Ch,defaultWidth:"full"}),dateTime:mn({formats:Ih,defaultWidth:"full"})},Th={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Ph=(u,d,a,c)=>Th[u];function Ni(u){return(d,a)=>{const c=a!=null&&a.context?String(a.context):"standalone";let g;if(c==="formatting"&&u.formattingValues){const x=u.defaultFormattingWidth||u.defaultWidth,I=a!=null&&a.width?String(a.width):x;g=u.formattingValues[I]||u.formattingValues[x]}else{const x=u.defaultWidth,I=a!=null&&a.width?String(a.width):u.defaultWidth;g=u.values[I]||u.values[x]}const m=u.argumentCallback?u.argumentCallback(d):d;return g[m]}}const Rh={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Bh={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},Mh={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},kh={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Dh={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Fh={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Oh=(u,d)=>{const a=Number(u),c=a%100;if(c>20||c<10)switch(c%10){case 1:return a+"st";case 2:return a+"nd";case 3:return a+"rd"}return a+"th"},Uh={ordinalNumber:Oh,era:Ni({values:Rh,defaultWidth:"wide"}),quarter:Ni({values:Bh,defaultWidth:"wide",argumentCallback:u=>u-1}),month:Ni({values:Mh,defaultWidth:"wide"}),day:Ni({values:kh,defaultWidth:"wide"}),dayPeriod:Ni({values:Dh,defaultWidth:"wide",formattingValues:Fh,defaultFormattingWidth:"wide"})};function Qi(u){return(d,a={})=>{const c=a.width,g=c&&u.matchPatterns[c]||u.matchPatterns[u.defaultMatchWidth],m=d.match(g);if(!m)return null;const x=m[0],I=c&&u.parsePatterns[c]||u.parsePatterns[u.defaultParseWidth],P=Array.isArray(I)?zh(I,z=>z.test(x)):Lh(I,z=>z.test(x));let B;B=u.valueCallback?u.valueCallback(P):P,B=a.valueCallback?a.valueCallback(B):B;const T=d.slice(x.length);return{value:B,rest:T}}}function Lh(u,d){for(const a in u)if(Object.prototype.hasOwnProperty.call(u,a)&&d(u[a]))return a}function zh(u,d){for(let a=0;a{const c=d.match(u.matchPattern);if(!c)return null;const g=c[0],m=d.match(u.parsePattern);if(!m)return null;let x=u.valueCallback?u.valueCallback(m[0]):m[0];x=a.valueCallback?a.valueCallback(x):x;const I=d.slice(g.length);return{value:x,rest:I}}}const Nh=/^(\d+)(th|st|nd|rd)?/i,Qh=/\d+/i,Hh={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Yh={any:[/^b/i,/^(a|c)/i]},Wh={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Zh={any:[/1/i,/2/i,/3/i,/4/i]},Jh={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},jh={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},Vh={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Kh={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},Xh={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},qh={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},$h={ordinalNumber:Gh({matchPattern:Nh,parsePattern:Qh,valueCallback:u=>parseInt(u,10)}),era:Qi({matchPatterns:Hh,defaultMatchWidth:"wide",parsePatterns:Yh,defaultParseWidth:"any"}),quarter:Qi({matchPatterns:Wh,defaultMatchWidth:"wide",parsePatterns:Zh,defaultParseWidth:"any",valueCallback:u=>u+1}),month:Qi({matchPatterns:Jh,defaultMatchWidth:"wide",parsePatterns:jh,defaultParseWidth:"any"}),day:Qi({matchPatterns:Vh,defaultMatchWidth:"wide",parsePatterns:Kh,defaultParseWidth:"any"}),dayPeriod:Qi({matchPatterns:Xh,defaultMatchWidth:"any",parsePatterns:qh,defaultParseWidth:"any"})},tl={code:"en-US",formatDistance:bh,formatLong:Sh,formatRelative:Ph,localize:Uh,match:$h,options:{weekStartsOn:0,firstWeekContainsDate:1}};function el(u){const d=be(u);return _h(d,Ah(d))+1}function il(u){const d=be(u),a=As(d).getTime()-vh(d).getTime();return Math.round(a/go)+1}function mo(u,d){var T,z,G,O;const a=be(u),c=a.getFullYear(),g=ys(),m=(d==null?void 0:d.firstWeekContainsDate)??((z=(T=d==null?void 0:d.locale)==null?void 0:T.options)==null?void 0:z.firstWeekContainsDate)??g.firstWeekContainsDate??((O=(G=g.locale)==null?void 0:G.options)==null?void 0:O.firstWeekContainsDate)??1,x=ti(u,0);x.setFullYear(c+1,0,m),x.setHours(0,0,0,0);const I=Hi(x,d),P=ti(u,0);P.setFullYear(c,0,m),P.setHours(0,0,0,0);const B=Hi(P,d);return a.getTime()>=I.getTime()?c+1:a.getTime()>=B.getTime()?c:c-1}function sl(u,d){var I,P,B,T;const a=ys(),c=(d==null?void 0:d.firstWeekContainsDate)??((P=(I=d==null?void 0:d.locale)==null?void 0:I.options)==null?void 0:P.firstWeekContainsDate)??a.firstWeekContainsDate??((T=(B=a.locale)==null?void 0:B.options)==null?void 0:T.firstWeekContainsDate)??1,g=mo(u,d),m=ti(u,0);return m.setFullYear(g,0,c),m.setHours(0,0,0,0),Hi(m,d)}function nl(u,d){const a=be(u),c=Hi(a,d).getTime()-sl(a,d).getTime();return Math.round(c/go)+1}function ut(u,d){const a=u<0?"-":"",c=Math.abs(u).toString().padStart(d,"0");return a+c}const Le={y(u,d){const a=u.getFullYear(),c=a>0?a:1-a;return ut(d==="yy"?c%100:c,d.length)},M(u,d){const a=u.getMonth();return d==="M"?String(a+1):ut(a+1,2)},d(u,d){return ut(u.getDate(),d.length)},a(u,d){const a=u.getHours()/12>=1?"pm":"am";switch(d){case"a":case"aa":return a.toUpperCase();case"aaa":return a;case"aaaaa":return a[0];case"aaaa":default:return a==="am"?"a.m.":"p.m."}},h(u,d){return ut(u.getHours()%12||12,d.length)},H(u,d){return ut(u.getHours(),d.length)},m(u,d){return ut(u.getMinutes(),d.length)},s(u,d){return ut(u.getSeconds(),d.length)},S(u,d){const a=d.length,c=u.getMilliseconds(),g=Math.floor(c*Math.pow(10,a-3));return ut(g,d.length)}},Ai={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},rl={G:function(u,d,a){const c=u.getFullYear()>0?1:0;switch(d){case"G":case"GG":case"GGG":return a.era(c,{width:"abbreviated"});case"GGGGG":return a.era(c,{width:"narrow"});case"GGGG":default:return a.era(c,{width:"wide"})}},y:function(u,d,a){if(d==="yo"){const c=u.getFullYear(),g=c>0?c:1-c;return a.ordinalNumber(g,{unit:"year"})}return Le.y(u,d)},Y:function(u,d,a,c){const g=mo(u,c),m=g>0?g:1-g;if(d==="YY"){const x=m%100;return ut(x,2)}return d==="Yo"?a.ordinalNumber(m,{unit:"year"}):ut(m,d.length)},R:function(u,d){const a=po(u);return ut(a,d.length)},u:function(u,d){const a=u.getFullYear();return ut(a,d.length)},Q:function(u,d,a){const c=Math.ceil((u.getMonth()+1)/3);switch(d){case"Q":return String(c);case"QQ":return ut(c,2);case"Qo":return a.ordinalNumber(c,{unit:"quarter"});case"QQQ":return a.quarter(c,{width:"abbreviated",context:"formatting"});case"QQQQQ":return a.quarter(c,{width:"narrow",context:"formatting"});case"QQQQ":default:return a.quarter(c,{width:"wide",context:"formatting"})}},q:function(u,d,a){const c=Math.ceil((u.getMonth()+1)/3);switch(d){case"q":return String(c);case"qq":return ut(c,2);case"qo":return a.ordinalNumber(c,{unit:"quarter"});case"qqq":return a.quarter(c,{width:"abbreviated",context:"standalone"});case"qqqqq":return a.quarter(c,{width:"narrow",context:"standalone"});case"qqqq":default:return a.quarter(c,{width:"wide",context:"standalone"})}},M:function(u,d,a){const c=u.getMonth();switch(d){case"M":case"MM":return Le.M(u,d);case"Mo":return a.ordinalNumber(c+1,{unit:"month"});case"MMM":return a.month(c,{width:"abbreviated",context:"formatting"});case"MMMMM":return a.month(c,{width:"narrow",context:"formatting"});case"MMMM":default:return a.month(c,{width:"wide",context:"formatting"})}},L:function(u,d,a){const c=u.getMonth();switch(d){case"L":return String(c+1);case"LL":return ut(c+1,2);case"Lo":return a.ordinalNumber(c+1,{unit:"month"});case"LLL":return a.month(c,{width:"abbreviated",context:"standalone"});case"LLLLL":return a.month(c,{width:"narrow",context:"standalone"});case"LLLL":default:return a.month(c,{width:"wide",context:"standalone"})}},w:function(u,d,a,c){const g=nl(u,c);return d==="wo"?a.ordinalNumber(g,{unit:"week"}):ut(g,d.length)},I:function(u,d,a){const c=il(u);return d==="Io"?a.ordinalNumber(c,{unit:"week"}):ut(c,d.length)},d:function(u,d,a){return d==="do"?a.ordinalNumber(u.getDate(),{unit:"date"}):Le.d(u,d)},D:function(u,d,a){const c=el(u);return d==="Do"?a.ordinalNumber(c,{unit:"dayOfYear"}):ut(c,d.length)},E:function(u,d,a){const c=u.getDay();switch(d){case"E":case"EE":case"EEE":return a.day(c,{width:"abbreviated",context:"formatting"});case"EEEEE":return a.day(c,{width:"narrow",context:"formatting"});case"EEEEEE":return a.day(c,{width:"short",context:"formatting"});case"EEEE":default:return a.day(c,{width:"wide",context:"formatting"})}},e:function(u,d,a,c){const g=u.getDay(),m=(g-c.weekStartsOn+8)%7||7;switch(d){case"e":return String(m);case"ee":return ut(m,2);case"eo":return a.ordinalNumber(m,{unit:"day"});case"eee":return a.day(g,{width:"abbreviated",context:"formatting"});case"eeeee":return a.day(g,{width:"narrow",context:"formatting"});case"eeeeee":return a.day(g,{width:"short",context:"formatting"});case"eeee":default:return a.day(g,{width:"wide",context:"formatting"})}},c:function(u,d,a,c){const g=u.getDay(),m=(g-c.weekStartsOn+8)%7||7;switch(d){case"c":return String(m);case"cc":return ut(m,d.length);case"co":return a.ordinalNumber(m,{unit:"day"});case"ccc":return a.day(g,{width:"abbreviated",context:"standalone"});case"ccccc":return a.day(g,{width:"narrow",context:"standalone"});case"cccccc":return a.day(g,{width:"short",context:"standalone"});case"cccc":default:return a.day(g,{width:"wide",context:"standalone"})}},i:function(u,d,a){const c=u.getDay(),g=c===0?7:c;switch(d){case"i":return String(g);case"ii":return ut(g,d.length);case"io":return a.ordinalNumber(g,{unit:"day"});case"iii":return a.day(c,{width:"abbreviated",context:"formatting"});case"iiiii":return a.day(c,{width:"narrow",context:"formatting"});case"iiiiii":return a.day(c,{width:"short",context:"formatting"});case"iiii":default:return a.day(c,{width:"wide",context:"formatting"})}},a:function(u,d,a){const g=u.getHours()/12>=1?"pm":"am";switch(d){case"a":case"aa":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"aaa":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"aaaa":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},b:function(u,d,a){const c=u.getHours();let g;switch(c===12?g=Ai.noon:c===0?g=Ai.midnight:g=c/12>=1?"pm":"am",d){case"b":case"bb":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"bbb":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"bbbb":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},B:function(u,d,a){const c=u.getHours();let g;switch(c>=17?g=Ai.evening:c>=12?g=Ai.afternoon:c>=4?g=Ai.morning:g=Ai.night,d){case"B":case"BB":case"BBB":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"BBBBB":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"BBBB":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},h:function(u,d,a){if(d==="ho"){let c=u.getHours()%12;return c===0&&(c=12),a.ordinalNumber(c,{unit:"hour"})}return Le.h(u,d)},H:function(u,d,a){return d==="Ho"?a.ordinalNumber(u.getHours(),{unit:"hour"}):Le.H(u,d)},K:function(u,d,a){const c=u.getHours()%12;return d==="Ko"?a.ordinalNumber(c,{unit:"hour"}):ut(c,d.length)},k:function(u,d,a){let c=u.getHours();return c===0&&(c=24),d==="ko"?a.ordinalNumber(c,{unit:"hour"}):ut(c,d.length)},m:function(u,d,a){return d==="mo"?a.ordinalNumber(u.getMinutes(),{unit:"minute"}):Le.m(u,d)},s:function(u,d,a){return d==="so"?a.ordinalNumber(u.getSeconds(),{unit:"second"}):Le.s(u,d)},S:function(u,d){return Le.S(u,d)},X:function(u,d,a,c){const m=(c._originalDate||u).getTimezoneOffset();if(m===0)return"Z";switch(d){case"X":return lo(m);case"XXXX":case"XX":return $e(m);case"XXXXX":case"XXX":default:return $e(m,":")}},x:function(u,d,a,c){const m=(c._originalDate||u).getTimezoneOffset();switch(d){case"x":return lo(m);case"xxxx":case"xx":return $e(m);case"xxxxx":case"xxx":default:return $e(m,":")}},O:function(u,d,a,c){const m=(c._originalDate||u).getTimezoneOffset();switch(d){case"O":case"OO":case"OOO":return"GMT"+ho(m,":");case"OOOO":default:return"GMT"+$e(m,":")}},z:function(u,d,a,c){const m=(c._originalDate||u).getTimezoneOffset();switch(d){case"z":case"zz":case"zzz":return"GMT"+ho(m,":");case"zzzz":default:return"GMT"+$e(m,":")}},t:function(u,d,a,c){const g=c._originalDate||u,m=Math.floor(g.getTime()/1e3);return ut(m,d.length)},T:function(u,d,a,c){const m=(c._originalDate||u).getTime();return ut(m,d.length)}};function ho(u,d=""){const a=u>0?"-":"+",c=Math.abs(u),g=Math.floor(c/60),m=c%60;return m===0?a+String(g):a+String(g)+d+ut(m,2)}function lo(u,d){return u%60===0?(u>0?"-":"+")+ut(Math.abs(u)/60,2):$e(u,d)}function $e(u,d=""){const a=u>0?"-":"+",c=Math.abs(u),g=ut(Math.floor(c/60),2),m=ut(c%60,2);return a+g+d+m}const co=(u,d)=>{switch(u){case"P":return d.date({width:"short"});case"PP":return d.date({width:"medium"});case"PPP":return d.date({width:"long"});case"PPPP":default:return d.date({width:"full"})}},_o=(u,d)=>{switch(u){case"p":return d.time({width:"short"});case"pp":return d.time({width:"medium"});case"ppp":return d.time({width:"long"});case"pppp":default:return d.time({width:"full"})}},ol=(u,d)=>{const a=u.match(/(P+)(p+)?/)||[],c=a[1],g=a[2];if(!g)return co(u,d);let m;switch(c){case"P":m=d.dateTime({width:"short"});break;case"PP":m=d.dateTime({width:"medium"});break;case"PPP":m=d.dateTime({width:"long"});break;case"PPPP":default:m=d.dateTime({width:"full"});break}return m.replace("{{date}}",co(c,d)).replace("{{time}}",_o(g,d))},al={p:_o,P:ol},hl=/^D+$/,ll=/^Y+$/,cl=["D","DD","YY","YYYY"];function dl(u){return hl.test(u)}function ul(u){return ll.test(u)}function uo(u,d,a){const c=fl(u,d,a);if(console.warn(c),cl.includes(u))throw new RangeError(c)}function fl(u,d,a){const c=u[0]==="Y"?"years":"days of the month";return`Use \`${u.toLowerCase()}\` instead of \`${u}\` (in \`${d}\`) for formatting ${c} to the input \`${a}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const gl=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,pl=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,ml=/^'([^]*?)'?$/,_l=/''/g,vl=/[a-zA-Z]/;function ye(u,d,a){var T,z,G,O,Q,$,et,K;const c=ys(),g=(a==null?void 0:a.locale)??c.locale??tl,m=(a==null?void 0:a.firstWeekContainsDate)??((z=(T=a==null?void 0:a.locale)==null?void 0:T.options)==null?void 0:z.firstWeekContainsDate)??c.firstWeekContainsDate??((O=(G=c.locale)==null?void 0:G.options)==null?void 0:O.firstWeekContainsDate)??1,x=(a==null?void 0:a.weekStartsOn)??(($=(Q=a==null?void 0:a.locale)==null?void 0:Q.options)==null?void 0:$.weekStartsOn)??c.weekStartsOn??((K=(et=c.locale)==null?void 0:et.options)==null?void 0:K.weekStartsOn)??0,I=be(u);if(!wh(I))throw new RangeError("Invalid time value");const P={firstWeekContainsDate:m,weekStartsOn:x,locale:g,_originalDate:I};return d.match(pl).map(function(st){const ht=st[0];if(ht==="p"||ht==="P"){const mt=al[ht];return mt(st,g.formatLong)}return st}).join("").match(gl).map(function(st){if(st==="''")return"'";const ht=st[0];if(ht==="'")return xl(st);const mt=rl[ht];if(mt)return!(a!=null&&a.useAdditionalWeekYearTokens)&&ul(st)&&uo(st,d,String(u)),!(a!=null&&a.useAdditionalDayOfYearTokens)&&dl(st)&&uo(st,d,String(u)),mt(I,st,g.localize,P);if(ht.match(vl))throw new RangeError("Format string contains an unescaped latin alphabet character `"+ht+"`");return st}).join("")}function xl(u){const d=u.match(ml);return d?d[1].replace(_l,"'"):u}class wl{constructor(){}loadTrack(d){const a=this.getTrackFromLocalStorage(d);if(a)return a.toTrack();const c=Ae.designTrack(d),g=c.toStockable();return this.saveTrackToLocalStorage(g),c}importDefaultTracks(){N.DEFAULT_TRACKS.forEach(d=>{localStorage.getItem(`track_${d}`)||fetch(`tracks/${d}.json`).then(a=>a.json()).then(a=>{localStorage.setItem(`track_${d}`,a)})})}saveRecord(d,a){const c=this.getTrackFromLocalStorage(d);return c&&(c.records.push(a),c.records.sort((g,m)=>g.timing-m.timing),this.saveTrackToLocalStorage(c)),{position:c.records.filter(g=>g.timingc.timing===a)+1}getRecord(d){const a=this.getRecords(d);return a.length?a[0].timing:null}getRecords(d){var a;return((a=this.getTrackFromLocalStorage(d))==null?void 0:a.records)||[]}saveTrackToLocalStorage(d){localStorage.setItem(`track_${d.name}`,JSON.stringify(d))}getTrackFromLocalStorage(d){let a=localStorage.getItem("track_"+d);if(a){const c=Object.assign(new vn,JSON.parse(a));return new vn(c.name,c.date,c.gates,c.records)}return null}getCurrentRecords(d){const a=this.getTrackFromLocalStorage(d).records;return a==null?void 0:a.map((c,g)=>{const m=c.timing-a[0].timing;return new uh(g+1,c.player,ye(c.date,"d MMM yyyy HH:mm"),ye(c.timing,"mm:ss:SS"),m?ye(m,"ss:SS"):"")})}}class Al{constructor(d,a,c,g){S(this,"raceNumber");S(this,"trackName");S(this,"skier1Name");S(this,"skier2Name");S(this,"skier1Timing");S(this,"skier2Timing");this.raceNumber=d,this.trackName=a,this.skier1Name=c,this.skier2Name=g}getWinner(){return this.isCompleted()?this.skier1Timing(a.raceNumber===d.raceNumber&&a.setTiming(d.skierName,d.timing),a))}getNextRace(){return this.racesResults.find(d=>!d.isCompleted())||null}getActualRankings(){let d=0,a=0,c=0,g=0;return this.racesResults.filter(m=>m.isCompleted()).forEach(m=>{m.getWinner()===this.skier1Name?d++:a++,c+=m.skier1Timing,g+=m.skier2Timing}),[new fo(this.skier1Name,d,c),new fo(this.skier2Name,a,g)].sort((m,x)=>m.time-x.time)}initRacesResults(d){this.racesResults=[];for(let a=1;a<=d;a++)this.racesResults.push(new Al(a,this.trackName,this.skier1Name,this.skier2Name))}}class bl extends wn{constructor(a){super();S(this,"raceSetupUi",document.getElementById("event-setup"));S(this,"trackInput",document.getElementById("track-input"));S(this,"skier1Input",document.getElementById("skier-1-input"));S(this,"skier2Input",document.getElementById("skier-2-input"));S(this,"racesNumberInput",document.getElementById("races-number-input"));S(this,"setupCompletedButton",document.getElementById("setup-completed-button"));this.engine=a,this.listenSetupCompleted()}onActivate(a){this.prepareRaceSetup()}onDeactivate(a){this.cleanRaceSetup()}prepareRaceSetup(){this.raceSetupUi.style.display="flex",this.engine.soundPlayer.showButton()}cleanRaceSetup(){this.raceSetupUi.style.display="none"}listenSetupCompleted(){this.setupCompletedButton.addEventListener("click",()=>{this.completeSetup()})}completeSetup(){const a=this.trackInput.value,c=this.skier1Input.value,g=this.skier2Input.value,m=+this.racesNumberInput.value;if(a&&c&&g&&m){const x=new yl(a,c,g,m);this.engine.goToScene("eventManager",{eventConfig:x})}}}class El{constructor(){S(this,"state","menu");S(this,"_isDisplayed",!1);S(this,"resultUi",document.getElementById("result"));S(this,"resultsContainerUi",document.getElementById("results-container"));S(this,"speedometerUi",document.getElementById("speedometer"));S(this,"timerUi",document.getElementById("timer"));S(this,"backToManagerButton",document.getElementById("back-to-manager"));this.updateUiState(this.state)}isDisplayed(){return this._isDisplayed}hideUi(){this.resultUi.style.display="none",this.resultsContainerUi.innerHTML="",this.speedometerUi.style.visibility="hidden",this.timerUi.style.visibility="hidden",this._isDisplayed=!1}updateUi(d,a,c){const g=`${ye(a,"mm:ss:SS")}`;this.state==="result"&&(location.hash="",this.resultsContainerUi.innerHTML=this.prepareResultsTable(c),location.hash="startPosition"),this.speedometerUi.innerText=`${Math.floor(d)} km/h`,this.timerUi.innerText=g}updateUiState(d){switch(this.state=d,d){case"menu":this.hideUi();break;case"racing":this.showRacingUi();break;case"result":this.showResultUi();break}}showRacingUi(){this.resultUi.style.display="none",this.speedometerUi.style.visibility="visible",this.timerUi.style.visibility="visible"}showResultUi(){this.resultUi.style.display="flex"}prepareResultsTable(d){return d.records.map(a=>{const c=a.position===d.position;return`
+Read more about this issue at https://excaliburjs.com/docs/performance`),i&&this._toaster.toast("Excalibur is encountering performance issues. It's possible that your browser doesn't have hardware acceleration enabled. Visit [LINK] for more information and potential solutions.","https://excaliburjs.com/docs/performance"),this.useCanvas2DFallback(),this.emit("fallbackgraphicscontext",this.graphicsContext))}}useCanvas2DFallback(){var t,e,i;const s=this.canvas.cloneNode(!1);this.canvas.parentNode.replaceChild(s,this.canvas),this.canvas=s;const n={...this._originalOptions,antialiasing:this.getAntialiasing()},o=this._originalDisplayMode;this.graphicsContext=new Ki({canvasElement:this.canvas,enableTransparency:this.enableCanvasTransparency,smoothing:n.antialiasing,backgroundColor:n.backgroundColor,snapToPixel:n.snapToPixel,useDrawSorting:n.useDrawSorting}),this.screen&&this.screen.dispose(),this.screen=new Qs({canvas:this.canvas,context:this.graphicsContext,antialiasing:(t=n.antialiasing)!==null&&t!==void 0?t:!0,browser:this.browser,viewport:(e=n.viewport)!==null&&e!==void 0?e:n.width&&n.height?{width:n.width,height:n.height}:Hs.SVGA,resolution:n.resolution,displayMode:o,pixelRatio:n.suppressHiDPIScaling?1:(i=n.pixelRatio)!==null&&i!==void 0?i:null}),this.screen.setCurrentCamera(this.currentScene.camera),this.input.pointers.detach();const h=n&&n.pointerScope===Ge.Document?document:this.canvas;this.input.pointers=this.input.pointers.recreate(h,this),this.input.pointers.init()}getWorldBounds(){return this.screen.getWorldBounds()}get timescale(){return this._timescale}set timescale(t){if(t<=0){j.getInstance().error("Cannot set engine.timescale to a value of 0 or less than 0.");return}this._timescale=t}addTimer(t){return this.currentScene.addTimer(t)}removeTimer(t){return this.currentScene.removeTimer(t)}addScene(t,e){this.scenes[t]&&this._logger.warn("Scene",t,"already exists overwriting"),this.scenes[t]=e}removeScene(t){if(t instanceof Oi)for(const e in this.scenes)this.scenes.hasOwnProperty(e)&&this.scenes[e]===t&&delete this.scenes[e];typeof t=="string"&&delete this.scenes[t]}add(t){if(arguments.length===2){this.addScene(arguments[0],arguments[1]);return}this._deferredGoTo&&this.scenes[this._deferredGoTo]?this.scenes[this._deferredGoTo].add(t):this.currentScene.add(t)}remove(t){t instanceof Rt&&this.currentScene.remove(t),t instanceof Oi&&this.removeScene(t),typeof t=="string"&&this.removeScene(t)}goToScene(t,e){if(!this.isInitialized){this._deferredGoTo=t;return}if(this.scenes[t]){const i=this.currentScene,s=this.scenes[t];if(this._logger.debug("Going to scene:",t),this.currentScene.isInitialized){const o={engine:this,previousScene:i,nextScene:s};this.currentScene._deactivate.apply(this.currentScene,[o,s]),this.currentScene.events.emit("deactivate",new Cs(o,this.currentScene))}this.currentScene=s,this.screen.setCurrentCamera(s.camera),this.currentScene._initialize(this);const n={engine:this,previousScene:i,nextScene:s,data:e};this.currentScene._activate.apply(this.currentScene,[n,s]),this.currentScene.events.emit("activate",new Es(n,this.currentScene))}else this._logger.error("Scene",t,"does not exist!")}screenToWorldCoordinates(t){return this.screen.screenToWorldCoordinates(t)}worldToScreenCoordinates(t){return this.screen.worldToScreenCoordinates(t)}_initialize(t){var e,i,s,n;this.pageScrollPreventionMode=t.scrollPreventionMode;const o=t&&t.pointerScope===Ge.Document?document:this.canvas;this.input={keyboard:new ks,pointers:new zi(o,this),gamepads:new Ei},this.input.keyboard.init({grabWindowFocus:(i=(e=this._originalOptions)===null||e===void 0?void 0:e.grabWindowFocus)!==null&&i!==void 0?i:!0}),this.input.pointers.init({grabWindowFocus:(n=(s=this._originalOptions)===null||s===void 0?void 0:s.grabWindowFocus)!==null&&n!==void 0?n:!0}),this.input.gamepads.init(),this.inputMapper=new Xr(this.input),this.browser.document.on("visibilitychange",()=>{document.visibilityState==="hidden"?(this.events.emit("hidden",new Re(this)),this._logger.debug("Window hidden")):document.visibilityState==="visible"&&(this.events.emit("visible",new Lt(this)),this._logger.debug("Window visible"))}),!this.canvasElementId&&!t.canvasElement&&document.body.appendChild(this.canvas)}onInitialize(t){}setAntialiasing(t){this.screen.antialiasing=t}getAntialiasing(){return this.screen.antialiasing}get isInitialized(){return this._isInitialized}_overrideInitialize(t){if(!this.isInitialized)if(this.onInitialize(t),this.events.emit("initialize",new ii(t,this)),this._isInitialized=!0,this._deferredGoTo){const e=this._deferredGoTo;this._deferredGoTo=null,this.goToScene(e)}else this.goToScene("root")}_update(t){if(!this.ready){this._loader.update(this,t),this.inputMapper.execute(),this.input.keyboard.update(),this.input.gamepads.update();return}this._preupdate(t),this.currentScene.update(this,t),this.graphicsContext.updatePostProcessors(t),this._postupdate(t),this.inputMapper.execute(),this.input.keyboard.update(),this.input.gamepads.update()}_preupdate(t){this.emit("preupdate",new ot(this,t,this)),this.onPreUpdate(this,t)}onPreUpdate(t,e){}_postupdate(t){this.emit("postupdate",new gt(this,t,this)),this.onPostUpdate(this,t)}onPostUpdate(t,e){}_draw(t){var e;if(this.graphicsContext.beginDrawLifecycle(),this.graphicsContext.clear(),this._predraw(this.graphicsContext,t),!this._isReady){this._loader.canvas.draw(this.graphicsContext,0,0),this.graphicsContext.flush();return}this.graphicsContext.backgroundColor=(e=this.currentScene.backgroundColor)!==null&&e!==void 0?e:this.backgroundColor,this.currentScene.draw(this.graphicsContext,t),this._postdraw(this.graphicsContext,t),this.graphicsContext.flush(),this.graphicsContext.endDrawLifecycle(),this._checkForScreenShots()}_predraw(t,e){this.emit("predraw",new et(t,e,this)),this.onPreDraw(t,e)}onPreDraw(t,e){}_postdraw(t,e){this.emit("postdraw",new X(t,e,this)),this.onPostDraw(t,e)}onPostDraw(t,e){}showDebug(t){this._isDebug=t}toggleDebug(){return this._isDebug=!this._isDebug,this._isDebug}get loadingComplete(){return this._loadingComplete}get ready(){return this._isReady}isReady(){return this._isReadyPromise}async start(t){if(!this._compatible)throw new Error("Excalibur is incompatible with your browser");return t&&(this.screen.pushResolutionAndViewport(),this.screen.resolution=this.screen.viewport,this.screen.applyResolutionAndViewport(),this._loader=t,this._loader.suppressPlayButton=this._suppressPlayButton||this._loader.suppressPlayButton,this._loader.wireEngine(this)),this._logger.debug("Starting game clock..."),this.browser.resume(),this.clock.start(),this._logger.debug("Game clock started"),t&&(await this.load(this._loader),this._loadingComplete=!0,this.screen.popResolutionAndViewport(),this.screen.applyResolutionAndViewport()),this._loadingComplete=!0,this._overrideInitialize(this),this._isReady=!0,this._isReadyResolve(),this.emit("start",new Q(this)),this._isReadyPromise}_mainloop(t){this.emit("preframe",new Pe(this,this.stats.prevFrame));const e=t*this.timescale;this.currentFrameElapsedMs=e;const i=this.stats.prevFrame.id+1;this.stats.currFrame.reset(),this.stats.currFrame.id=i,this.stats.currFrame.delta=e,this.stats.currFrame.fps=this.clock.fpsSampler.fps,vt.clear();const s=this.clock.now(),n=1e3/this.fixedUpdateFps;if(this.fixedUpdateFps)for(this._lagMs+=e;this._lagMs>=n;)this._update(n),this._lagMs-=n;else this._update(e);const o=this.clock.now();this.currentFrameLagMs=this._lagMs,this._draw(e);const h=this.clock.now();this.stats.currFrame.duration.update=o-s,this.stats.currFrame.duration.draw=h-o,this.stats.currFrame.graphics.drawnImages=vt.DrawnImagesCount,this.stats.currFrame.graphics.drawCalls=vt.DrawCallCount,this.emit("postframe",new ei(this,this.stats.currFrame)),this.stats.prevFrame.reset(this.stats.currFrame),this._monitorPerformanceThresholdAndTriggerFallback()}stop(){this.clock.isRunning()&&(this.emit("stop",new $(this)),this.browser.pause(),this.clock.stop(),this._logger.debug("Game stopped"))}isRunning(){return this.clock.isRunning()}screenshot(t=!1){return new Promise(i=>{this._screenShotRequests.push({preserveHiDPIResolution:t,resolve:i})})}_checkForScreenShots(){for(const t of this._screenShotRequests){const e=t.preserveHiDPIResolution?this.canvas.width:this.screen.resolution.width,i=t.preserveHiDPIResolution?this.canvas.height:this.screen.resolution.height,s=document.createElement("canvas");s.width=e,s.height=i;const n=s.getContext("2d");n.imageSmoothingEnabled=this.screen.antialiasing,n.drawImage(this.canvas,0,0,e,i);const o=new Image,h=s.toDataURL("image/png");o.src=h,t.resolve(o)}this._screenShotRequests.length=0}async load(t){try{await t.load()}catch(e){this._logger.error("Error loading resources, things may not behave properly",e),await Promise.resolve()}}}xi._DEFAULT_ENGINE_OPTIONS={width:0,height:0,enableCanvasTransparency:!0,useDrawSorting:!0,configurePerformanceCanvas2DFallback:{allow:!1,showPlayerMessage:!1,threshold:{fps:20,numberOfFrames:100}},canvasElementId:"",canvasElement:void 0,snapToPixel:!1,pointerScope:Ge.Canvas,suppressConsoleBootMessage:null,suppressMinimumBrowserFeatureDetection:null,suppressHiDPIScaling:null,suppressPlayButton:null,grabWindowFocus:!0,scrollPreventionMode:Oe.Canvas,backgroundColor:L.fromHex("#2185d0")};class Ea{constructor(){this._handlers={},this._wiredEventDispatchers=[],this._deferedHandlerRemovals=[]}clear(){this._handlers={},this._wiredEventDispatchers=[]}_processDeferredHandlerRemovals(){for(const t of this._deferedHandlerRemovals)this._removeHandler(t.name,t.handler);this._deferedHandlerRemovals.length=0}emit(t,e){if(this._processDeferredHandlerRemovals(),!t)return;t=t.toLowerCase(),(typeof e>"u"||e===null)&&(e=new P);let i,s;if(this._handlers[t])for(i=0,s=this._handlers[t].length,i;i-1&&this._handlers[t].splice(s,1)}}once(t,e){this._processDeferredHandlerRemovals();const i=s=>{const n=s||new P;this.off(t,i),e(n)};this.on(t,i)}wire(t){t._wiredEventDispatchers.push(this)}unwire(t){const e=t._wiredEventDispatchers.indexOf(this);e>-1&&t._wiredEventDispatchers.splice(e,1)}}class Ca extends Xt{get font(){return this._font}set font(t){this._font=t,this._text.font=t}get text(){return this._text.text}set text(t){this._text.text=t}get color(){return this._text.color}set color(t){this._text&&(this._text.color=t)}get opacity(){return this._text.opacity}set opacity(t){this._text.opacity=t}get spriteFont(){return this._spriteFont}set spriteFont(t){t&&(this._spriteFont=t,this._text.font=this._spriteFont)}constructor(t){super(t),this._font=new pi,this._text=new Bi({text:"",font:this._font});const{text:e,pos:i,x:s,y:n,spriteFont:o,font:h,color:l}=t;this.pos=i??(s&&n?R(s,n):this.pos),this.text=e??this.text,this.font=h??this.font,this.spriteFont=o??this.spriteFont,this._text.color=l??this.color;const f=this.get(Ft);f.anchor=A.Zero,f.use(this._text)}_initialize(t){super._initialize(t)}getTextWidth(){return this._text.width}}class Kr extends Rt{getGraphics(){return this._graphics}addGraphic(t,e){this._graphics.push(t),this._gfx.visible=this.map.visible,this._gfx.opacity=this.map.opacity,e!=null&&e.offset&&(this._gfx.offset=e.offset),this._gfx.localBounds=this._recalculateBounds()}_recalculateBounds(){let t=this._tileBounds.clone();for(const e of this._graphics){const i=R(this.map.graphicsOffset.x-this.map.tileWidth/2,this.map.graphicsOffset.y-(this.map.renderFromTopOfGraphic?0:e.height-this.map.tileHeight));t=t.combine(e.localBounds.translate(i))}return t}removeGraphic(t){const e=this._graphics.indexOf(t);e>-1&&this._graphics.splice(e,1),this._gfx.localBounds=this._recalculateBounds()}clearGraphics(){this._graphics.length=0,this._gfx.visible=!1,this._gfx.localBounds=this._recalculateBounds()}getColliders(){return this._colliders}addCollider(t){this._colliders.push(t),this.map.flagCollidersDirty()}removeCollider(t){const e=this._colliders.indexOf(t);e>-1&&this._colliders.splice(e,1),this.map.flagCollidersDirty()}clearColliders(){this._colliders.length=0,this.map.flagCollidersDirty()}get pos(){return this.map.tileToWorld(R(this.x,this.y))}get center(){return this.pos.add(R(0,this.map.tileHeight/2))}constructor(t,e,i,s){super([new Y,new Ft({offset:i??A.Zero,onPostDraw:(w,y)=>this.draw(w,y)}),new vs(s)]),this.solid=!1,this._tileBounds=new J,this._graphics=[],this._colliders=[],this.data=new Map,this.x=t,this.y=e,this.map=s,this._transform=this.get(Y),this._isometricEntityComponent=this.get(vs);const n=this.map.tileWidth/2,o=this.map.tileHeight/2,h=(this.x-this.y)*n,l=(this.x+this.y)*o;this._transform.pos=R(h,l),this._isometricEntityComponent.elevation=s.elevation,this._gfx=this.get(Ft),this._gfx.visible=!1;const f=this.map.tileWidth,m=this.map.tileHeight,v=R(0,this.map.renderFromTopOfGraphic?m:0);this._gfx.localBounds=this._tileBounds=new J({left:-f/2,top:-m,right:f/2,bottom:m}).translate(v)}draw(t,e){const i=this.map.tileWidth/2;t.save(),t.translate(-i,0);for(const s of this._graphics)s.draw(t,this.map.graphicsOffset.x,this.map.graphicsOffset.y-(this.map.renderFromTopOfGraphic?0:s.height-this.map.tileHeight));t.restore()}}class Ia extends Rt{constructor(t){super([new Y,new it({type:q.Fixed}),new Ct,new fs((m,v)=>this.debug(m,v),!1)],t.name),this.elevation=0,this.visible=!0,this.opacity=1,this.renderFromTopOfGraphic=!1,this.graphicsOffset=R(0,0),this._collidersDirty=!1,this._originalOffsets=new WeakMap;const{pos:e,tileWidth:i,tileHeight:s,columns:n,rows:o,renderFromTopOfGraphic:h,graphicsOffset:l,elevation:f}=t;this.transform=this.get(Y),e&&(this.transform.pos=e),this.collider=this.get(Ct),this.collider&&this.collider.set(this._composite=new Bt([])),this.renderFromTopOfGraphic=h??this.renderFromTopOfGraphic,this.graphicsOffset=l??this.graphicsOffset,this.elevation=f??this.elevation,this.tileWidth=i,this.tileHeight=s,this.columns=n,this.rows=o,this.tiles=new Array(n*o);for(let m=0;m=this.columns||e>=this.rows?null:this.tiles[t+e*this.columns]}getTileByPoint(t){const e=this.worldToTile(t);return this.getTile(e.x,e.y)}_getMaxZIndex(){let t=Number.NEGATIVE_INFINITY;for(const e of this.tiles){const i=e.get(Y).z;i>t&&(t=i)}return t}debug(t,e){const{showAll:i,showPosition:s,positionColor:n,positionSize:o,showGrid:h,gridColor:l,gridWidth:f,showColliderGeometry:m}=e.isometric,{geometryColor:v,geometryLineWidth:w,geometryPointSize:y}=e.collider;if(t.save(),t.z=this._getMaxZIndex()+.5,i||h){for(let b=0;be.isComplete(t))}reset(){this._actions.forEach(t=>t.reset())}stop(){this._actions.forEach(t=>t.stop())}}function Ta(r){return!!r._initialize}function Pa(r){return!!r.onInitialize}function Ra(r){return!!r._preupdate}function Ma(r){return!!r.onPreUpdate}function Ba(r){return!!r.onPostUpdate}function ka(r){return!!r.onPostUpdate}function Da(r){return!!r.onPreDraw}function Fa(r){return!!r.onPostDraw}class Oa{constructor(t,e=L.Magenta,i=!1){this.path=t,this.color=e,this._stream=null,this._gif=null,this._textures=[],this._animation=null,this._transparentColor=null,this._resource=new ji(t,"arraybuffer",i),this._transparentColor=e}get bustCache(){return this._resource.bustCache}set bustCache(t){this._resource.bustCache=t}async load(){const t=await this._resource.load();this._stream=new qr(t),this._gif=new $r(this._stream,this._transparentColor);const e=this._gif.images.map(i=>new Ls(i.src,!1));return await Promise.all(e.map(i=>i.load())),this.data=this._textures=e}isLoaded(){return!!this.data}toSprite(t=0){return this._textures[t].toSprite()}toSpriteSheet(){const t=this._textures.map(e=>e.toSprite());return new Ye({sprites:t})}toAnimation(t){const e=this.toSpriteSheet(),i=e.sprites.length;return this._animation=_e.fromSpriteSheet(e,In(0,i),t),this._animation}get readCheckBytes(){return this._gif.checkBytes}}const ws=r=>r.reduce(function(t,e){return t*2+e},0),dn=r=>{const t=[];for(let e=7;e>=0;e--)t.push(!!(r&1<{if(this.position>=this.data.byteLength)throw new Error("Attempted to read past end of stream.");return this.data[this.position++]},this.readBytes=e=>{const i=[];for(let s=0;s{let i="";for(let s=0;s{const e=this.readBytes(2);return(e[1]<<8)+e[0]},this.data=new Uint8Array(t),this.len=this.data.byteLength,this.len===0)throw new Error("No data loaded from file")}}const Ua=function(r,t){let e=0;const i=function(w){let y=0;for(let b=0;b>3)&1<<(e&7)&&(y|=1<{const s=[];for(let n=0;n{const f=l.toString(16);return f.length===1?"0"+f:f}).join("");s.push(h)}return s},this.readSubBlocks=()=>{let i,s;s="";do i=this._st.readByte(),s+=this._st.read(i);while(i!==0);return s},this.parseHeader=()=>{const i={sig:null,ver:null,width:null,height:null,colorRes:null,globalColorTableSize:null,gctFlag:null,sorted:null,globalColorTable:[],bgColor:null,pixelAspectRatio:null};if(i.sig=this._st.read(3),i.ver=this._st.read(3),i.sig!=="GIF")throw new Error("Not a GIF file.");i.width=this._st.readUnsigned(),i.height=this._st.readUnsigned();const s=dn(this._st.readByte());i.gctFlag=s.shift(),i.colorRes=ws(s.splice(0,3)),i.sorted=s.shift(),i.globalColorTableSize=ws(s.splice(0,3)),i.bgColor=this._st.readByte(),i.pixelAspectRatio=this._st.readByte(),i.gctFlag&&(i.globalColorTable=this.parseColorTable(1<{const s=f=>{this.checkBytes.push(this._st.readByte());const m=dn(this._st.readByte());f.reserved=m.splice(0,3),f.disposalMethod=ws(m.splice(0,3)),f.userInput=m.shift(),f.transparencyGiven=m.shift(),f.delayTime=this._st.readUnsigned(),f.transparencyIndex=this._st.readByte(),f.terminator=this._st.readByte(),this._handler.gce&&this._handler.gce(f)&&this.checkBytes.push(this._handler.gce)},n=f=>{f.comment=this.readSubBlocks(),this._handler.com&&this._handler.com(f)&&this.checkBytes.push(this._handler.com)},o=f=>{this.checkBytes.push(this._st.readByte()),f.ptHeader=this._st.readBytes(12),f.ptData=this.readSubBlocks(),this._handler.pte&&this._handler.pte(f)&&this.checkBytes.push(this._handler.pte)},h=f=>{const m=w=>{this.checkBytes.push(this._st.readByte()),w.unknown=this._st.readByte(),w.iterations=this._st.readUnsigned(),w.terminator=this._st.readByte(),this._handler.app&&this._handler.app.NETSCAPE&&this._handler.app.NETSCAPE(w)&&this.checkBytes.push(this._handler.app)},v=w=>{w.appData=this.readSubBlocks(),this._handler.app&&this._handler.app[w.identifier]&&this._handler.app[w.identifier](w)&&this.checkBytes.push(this._handler.app[w.identifier])};switch(this.checkBytes.push(this._st.readByte()),f.identifier=this._st.read(8),f.authCode=this._st.read(3),f.identifier){case"NETSCAPE":m(f);break;default:v(f);break}},l=f=>{f.data=this.readSubBlocks(),this._handler.unknown&&this._handler.unknown(f)&&this.checkBytes.push(this._handler.unknown)};switch(i.label=this._st.readByte(),i.label){case 249:i.extType="gce",s(i);break;case 254:i.extType="com",n(i);break;case 1:i.extType="pte",o(i);break;case 255:i.extType="app",h(i);break;default:i.extType="unknown",l(i);break}},this.parseImg=i=>{const s=(h,l)=>{const f=new Array(h.length),m=h.length/l,v=(k,D)=>{const I=h.slice(D*l,(D+1)*l);f.splice.apply(f,[k*l,l].concat(I))},w=[0,4,2,1],y=[8,8,4,2];let b=0;for(let k=0;k<4;k++)for(let D=w[k];D{const i={sentinel:this._st.readByte(),type:""};switch(String.fromCharCode(i.sentinel)){case"!":i.type="ext",this.parseExt(i);break;case",":i.type="img",this.parseImg(i);break;case";":i.type="eof",this._handler.eof&&this._handler.eof(i)&&this.checkBytes.push(this._handler.eof);break;default:throw new Error("Unknown block: 0x"+i.sentinel.toString(16))}i.type!=="eof"&&this.parseBlock()},this.arrayToImage=i=>{let s=0;const n=document.createElement("canvas");n.id=s.toString(),n.width=i.width,n.height=i.height,s++;const o=n.getContext("2d"),h=1;let l=0,f=0;for(let v=0;vMath.max(s.x,i),0)-e.x,this.height=this._points.reduce((i,s)=>Math.max(s.y,i),0)-e.y,this.flagDirty()}get minPoint(){const t=this._points.reduce((i,s)=>Math.min(s.x,i),1/0),e=this._points.reduce((i,s)=>Math.min(s.y,i),1/0);return R(t,e)}constructor(t){super(t),this.points=t.points,this.filtering=Ot.Blended,this.rasterize()}clone(){return new fn({points:this.points.map(t=>t.clone()),...this.cloneGraphicOptions(),...this.cloneRasterOptions()})}execute(t){if(this.points&&this.points.length){t.beginPath();const e=this.minPoint.negate(),i=this.points[0].add(e);t.moveTo(i.x,i.y),this.points.forEach(s=>{t.lineTo(s.x+e.x,s.y+e.y)}),t.lineTo(i.x,i.y),t.closePath(),this.color&&t.fill(),this.strokeColor&&t.stroke()}}}class La{constructor(){this._queue=[]}get length(){return this._queue.length}enqueue(){const t=new Ne;return this._queue.push(t),t.promise}dequeue(t){this._queue.shift().resolve(t)}}class za{constructor(t){this._count=t,this._waitQueue=new La}get count(){return this._count}get waiting(){return this._waitQueue.length}async enter(){return this._count!==0?(this._count--,Promise.resolve()):this._waitQueue.enqueue()}exit(t=1){if(t!==0){for(;t!==0&&this._waitQueue.length!==0;)this._waitQueue.dequeue(null),t--;this._count+=t}}}const gn="0.29.0-alpha.4+6f6d7bb";p()})();_.y1j;_.fWn;_.Ia8;_.rqv;_.zH6;_.hLI;_.yyv;_.tX5;var Yi=_.vtX;_.r7K;_.lCh;_.cE4;_.fwF;_.sce;_.AQ6;_._c7;_.KUs;_.Ajp;_.dkO;_.RDh;_._H9;_.mxs;_.OmD;_.kBf;_.C4F;_.NQt;_.JjN;_.EK_;_.V1s;_.xHm;_.Xz7;_.Cdc;_.FKn;_.SUY;_.ab2;_.GfZ;_.YMS;_.oyv;_.aUb;_.SdD;_.JUv;_.jEj;_.TFq;_.HDU;_.R_y;_.ydN;_.t50;_.s$$;var wn=_.v2G,vn=_.Ilk;_.s9i;_.dxL;_.LLX;_.wA2;_.R_p;_.IQ$;_.I5F;_.X8$;_.FR6;_.U8o;_.kbG;_.iS_;_.cGG;_.RPN;_.skb;_.SLU;_.RdJ;_.cNu;_.gU7;_.LSk;_.Nmp;var Ya=_.d1Y;_.xrL;_.sRW;_.cmV;_.qWz;_.N0Q;_.q8b;_.ynB;_.jT9;var Wa=_.wAz,Za=_.D4V;_.NLr;_.N6H;_.W1A;_.JHW;_.ZZ$;_.v2K;_.pBf;_.vpe;_.GMl;_.zW2;_.B0K;_.Nv7;_.C_p;_.MUA;_.xqU;_.pTp;_.vUK;_.j9l;_.Zxw;_.v51;_.Hdx;_.Z$d;_.iqV;_.o$7;_.olM;_.Zm$;_.$QH;_.i78;_.nJg;_.h6u;_.hts;_.j88;_.VME;_.fy2;_.nt;_.Ukr;_.zsu;_.oA6;_.TVh;_.TwZ;_.GTT;_.xxj;_.XdK;_.Jmb;var oe=_.cXo;_.Dm5;_.IIB;_.ebW;_.zI0;_.LYD;_.cEG;_.SEl;_.t9V;_.ez5;_.N1d;var Ue=_.R8U;_.SKZ;_.__J;_.RI$;_.x12;_.ccz;var Ja=_.aNw;_.XrL;_.xwn;_.dNK;_.ini;_.YdH;_.F5T;_.y3G;_.l57;_.xn0;_.t2V;_.uxB;_.cpd;_.fiy;_.$XZ;_.UG6;_.uqK;_.STE;_.y$z;_.mAD;_.sOq;_.hUw;_._0G;_.Sqs;_.hpZ;var Va=_.Vol;_.vYX;_.wIZ;_.cBi;_.c30;_.MPV;_.RFv;_.Ux6;_.rxy;_.I$c;_.kfC;_.VjY;_.mgq;_.YVA;_.Kgp;_.HH$;_.M_d;_.rgh;_.Ra6;_.KhR;_.gvQ;_.BS5;_.xhz;_.xOq;_.a9j;_.bHk;_.CgK;_.cEd;_.cuY;_.kvE;_.SBu;_.PsT;_.AE_;_.ctO;_.OLH;_.kky;_.nSF;_.zHn;_.zwx;_.AeJ;_.hLz;_.D9g;_.wA;_.jhr;_.GVs;_._zO;_.LXZ;_.w6$;_.mhV;_.MOD;_.kwd;_.Lmr;var An=_.xsS;_.K5l;_.lLr;_.Z$r;_.IXb;_.Xsu;_.SGH;_.SMj;_.L34;_.exe;_.bnF;_.MFA;var Gi=_.$uU;_.Sap;_.jyi;_.E03;_.V6q;_.rg2;_.DVW;_.nVo;_.F6N;_.xP7;_.Odq;_.Zif;_.ZGJ;_.MJk;_.xvT;_.PHM;_.dpR;_.n9L;_.KwO;_.SxM;var ja=_.B7y;_.x7r;_.wx7;_.Uvn;_.OFT;_.xzN;_.CcZ;_.M5Z;_.ZrN;_.OWs;_.dF9;_.oZy;_.rD2;_.VHo;_.ohE;_.R$E;_.xQN;_.AdJ;_.q3I;_.Pab;_.uZ5;_.McK;_.F9c;_.k0b;_.hnT;_.RSJ;_.Mku;_.h90;_.rms;_.ErP;_.aVg;_.lPc;_.Z8E;_._N2;_.yFn;_.lNv;_.cu9;_.MZQ;_.FUM;_.BxR;_.vdf;_.iaL;_.w6H;_.Q4c;_.Xxe;_.Uxb;_.Yr5;var Ut=_.Bhw;_.yOA;const Xa="data:image/png;base64,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",Ka="data:image/png;base64,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",qa="data:image/png;base64,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",$a="data:image/png;base64,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",th="data:image/png;base64,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",eh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD2SURBVHgB7VGxDoIwEL0qJO3A4szAD7ibuPgpfpp/YqJhdvAHGFiZSIRFzr5LSwDdYNDYl5B7d+/1lbZEAQEBAQEBXwp12+0OtCCiaL0+04JY0cIIgf8QGHnCRCeaAUV0lHrf7xlkm+eKZsDn/NCjpGlqbDFZlml8lms3AxcN/WQ2rIL+Ucqy3KAWReHvkquqAsfdKOchY4z0toqpaRpynnEguNZahLZtyXLlzLLA9pj3M7aAz232MbA3YLGfeeI06bGZq5j3JxgFOnFoett9EO5DeOKnqGO+QIzj+IFAHMv23SBMJUkif1fX9XQThTDoT+arFfgF3rFtVgjtI8cAAAAASUVORK5CYII=",ih="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAEASURBVHgB7VExjoMwEJzlQLILmqspeMXV94A8IveHk+4N94v7wz0gUlJE+QUFLRVSoAmOxzEISLpQJIpHQjueHc/aGAgICAgICHhQyOp7/4kFEeMt2mBBRFgYIfAVAuOeCOQPd8DArCeB/78fX7gDq5/DmvWJHiXLMm2LzvNc8bNceY3c9bieaePqMPzDsizfWYuiEC+ZqqrIDfhmFw+01m5tqzM1TQPvmQaSK6Vco21bWC7e7DbYNfVBMxb0+WE3AwcDN/daT3zPrTnMV+rDDSaBvjk2XU0fhfchZuZHbE++BTpJkuTIQF7L6t0oTNI0daer63o+RBjGvulOO0hkzks6bRNn/MavAAAAAElFTkSuQmCC",sh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADuSURBVHgB7ZXBCoJAEIZntkCP9gR5DgI7CKIv26N0UbwZBF1bn6A6hrrT7upC52YNAr/Lvxc/ZhlnFi9FQeARAZ5ZhItwES7C3wjRHdxe3Jclwhe47+e7MhJJk9c83wKD+SokxIfJV9dtgMFnhVYIQRABAyts0jTRkej2nqHvJTCwwlUYxjoiRdQe6loCg/HKwzBeE/EOTKyQiKxQ/zpPYDJWiGiFyjWGLfTIKCSKTeguS2AyT4VCCDu/gxASmPzJxsapKYFSN2AyT4V6dcUmd1XVAhP/FTZZFk9n9thZoTugJ+F6ypNijp1+Q48m359nP16rOGJzAAAAAElFTkSuQmCC",nh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD9SURBVHgB7ZQxjsIwEEX/2NFuy55gfQREg7gBQlTcBYFEjQS34ARUFJQ0CNEgbkA4AVCBkPBgOwR6xkEUeUW+U+Rp4vGY2r01IyIKkSmFpbAUlsLPCClf5PfibFwnvEH+fXG/zODUZ2ew+YeA4iokpqPPy/X8BwGvCikTKq0qEJD4R6u7rLpdrDJoewNSCAgVKkqMC1eZ3c9HjRQCgtCyrWQv6gAhQaiJg5BhTxCiMhFljWA+Qkgx59ANofFpWdbhpzAmQUikw/wq/a0VRhe682d8/ujfHYQU1BSQ8Tkd1vYQEr/CZn9lHmvx2AVhvqBIwuShW0B4sbo+THzeAZmHOzUW9OpSAAAAAElFTkSuQmCC",rh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAF0SURBVHgB7ZZNToNAFMffszSBRRPjugsuYKK7BrqwR/AEegOPoEfwBvYGHqGJpt3WSA/Agi2JCYmwUJ7vjQOZIrWQdkPCP2ne5/ymA8MAQK9evbqiwPPuN553UVc7gZba+P4TID7kiM+tgOvJxK2DEcAtux/fRNeNgTLQGgzW5rJM2BfR7HK1eqsba9Ulc+BFAZwS4oKhM47umsBEuKvw7vtzLt4Yqb2wf4EVaCNYIwXT6eN6xxbpppD32xUcURbvtwUcUa0fvR7YA43ji4+nORwg/D3eAAPfJ3HOl0uEA1RwOnRTxuOxw8ZxXdeWH/u2zomvahJXcqZVKm9KFEVnYsMwLK4lxXEsvlwb1D3gOI6K2aqmNE1B92wDxbdtWxWyLAP2UTerARxLvswRS/r0ZLXAskEGF7nC0TUVy2TaSr5cwRZQF82mP7Mb8AJClX6wcqIXKQ6Hw08ByrJAvZpLGI5GI/XvkiSpToICkzp/SbxygX4A3V2uBtBE7m4AAAAASUVORK5CYII=",oh="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAGBSURBVHgB7ZU7TsNAEIZnFluyi0iIOoWPQEVDQzpE3HACwgloIKGDFtFwA3IDCiTaSCAUHgUcIUXaSEiRiItkl5llbTbGAVtJY8m/FM3sP7PfevOYAFSqVKksCtuvZ3snj5tZNQEF1ey8XAPKcxTOTSHg7mk/yIIhqBalH0pO93MDeaOjxJt9LRsm5bRxd7n9nrXXyTJBzRBQrAvh9AjaQOEe5YGxcFGh2e53EcWBZf0L+xOYguaC5VLYebpa9BUppzA87u/ACuXAmujBClX4p1cBK6A1vmhedWEJqe/x9gO8vdg6hCUUdp5bHEv0odTrdZ+CHwSBxy/KPeNxrmu8Tnl21Erew+FwuMFxMBjEU1yNRiPOFZjJTj3g+75eU9RNk8kETM88kHPP83QhiiKgHE2z3kBr9hNPkbjPHJYJTBp4c+zFianpNR9mIvvJDeaApmg3/TrdgscQleoHh578HkCi67qfDORrkS8tGNZqNf104/E4fQgyjOtKzh7ov1x9AV4isRWJB09iAAAAAElFTkSuQmCC",ah="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABQCAYAAAAOYsW+AAAACXBIWXMAAAEUAAABFAH7OeD/AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAL/SURBVHgB7Vg9T+NAEJ18kXDJ1VADNfRQXQE99KAroecHUAM9dCdBD1cDBQ1QQw81dKcTCYTEMfPG3shYQt7ZgJHRPsmwcZx9np23M7ND5OHhUXSU8Of/4uJvHvyhPBCGv36enZ2X6Yvgib8/cVXzcKnZpNrKClXn56k8PS33Bre31Ds+pv7FBYXttvVc1sTliQka392l8PGReicnFNzcRPenpqi+tkZjq6v0tLlJg4cHq/msiA0prOru77/5Dhb3T0+FGM901tetLLfyMSaFpWnSJF4OD8VauMIGVsQV9ml3by/6AfsWvjbAGD435LXlZZsps4mFqNUa+vQHv0Blbm74fXVpiRpbW/ICWHY8C9dkQaVqoM0WJX0IReOlkvdKIM4QWabFYTyBsQIWwecGMg7DN8/A8ixkE7OoYBGWVD6zZTUeN9lSXBhTbC2Elbb+PVgtNUQzvrMj22lwd0dtthJ+xksZ66AFCKuzsWEzpZ2qg+vriJz3qVEt7omYWFRmD8uWslhmwFpcMun9fRSl+DKkpclJIuzx7W3qX13ZTqdTNSIULixzKSEkWyudiQ2wzKPCFwKe+PsRq7cTQuNYKuciV2vqLZmHlEC26iM3c5YCJJjEYw3UFiMx9LnYQwrES0jIdIBT5AJ6R0fyP0DItKwsP4TY+DR0iNNAsVRdTyX7LhcJ2uXWi4sJkJuTyMXHUoMVOS0WL3Jh/1YWFoYlkBZOPgZ5nY+kLwcHcpJwgdpixGbU2LAU26oVh08t1BZD0Z3EEQbILWS6EKVRnO0EHzdYWEloeh/OxPDxU4rY+/jTiLGP0d9C76NueR4emdg0XsozM9Hn2Vl5iU8nRshEVYkWU8AdAqkwlQkCUItLOnmXlzKWgzgT56bqZAWSW5L4KOgLAc5E5URnDwiULWMnYvkRlMyVCMhCbsiAWD0HKQEhPXNrSTq6PEbv2gXONZexGPvYpeZyqqvltBh3c13hfFocFb4H4ok9sSf2xNaQWB30en8bROeUA56J/tFX4hXJx4DZFieaegAAAABJRU5ErkJggg==",hh=""+new URL("winter-MwpCX4RD.wav",import.meta.url).href,lh=""+new URL("start_race-hiAgOaoX.mp3",import.meta.url).href,ch=""+new URL("finish_race-uYgKFh7v.mp3",import.meta.url).href,dh=""+new URL("gate_missed-_-ZxwNrJ.mp3",import.meta.url).href,uh=""+new URL("pole_hitting-vctwAcnk.mp3",import.meta.url).href,lt={Skier:new oe(Xa),SkierCarving:new oe(Ka),SkierSliding:new oe(qa),SkierBraking:new oe($a),SkierJumping:new oe(th),PoleRed:new oe(eh),PoleBlue:new oe(ih),PoleTouchedRed:new oe(sh),PoleTouchedBlue:new oe(nh),PolePassedRed:new oe(rh),PolePassedBlue:new oe(oh),FinalPole:new oe(ah),WinterSound:new Gi(hh),FinishRaceSound:new Gi(ch),StartRaceSound:new Gi(lh),GateMissedSound:new Gi(dh),PoleHittingSound:new Gi(uh)},H=class H{};S(H,"DISPLAY_WIDTH",800),S(H,"DISPLAY_HEIGHT",600),S(H,"CAMERA_ZOOM",.6),S(H,"DISPLAY_MIN_MARGIN",25),S(H,"DISPLAY_MAX_RIGHT_POSITION",H.DISPLAY_WIDTH/2-H.DISPLAY_MIN_MARGIN),S(H,"DISPLAY_MAX_LEFT_POSITION",-H.DISPLAY_MAX_RIGHT_POSITION),S(H,"FRONT_GHOST_DISTANCE",-H.DISPLAY_HEIGHT/2),S(H,"FORMAT_TIMING","mm:ss:SS"),S(H,"TRACK_STYLES"),S(H,"DEFAULT_TRACKS",["soelden","davos","wengen","adelboden","zermatt"]),S(H,"CONTROL_CARVE_RIGHT",Ue.ArrowRight),S(H,"CONTROL_CARVE_LEFT",Ue.ArrowLeft),S(H,"CONTROL_BRAKE",Ue.Space),S(H,"DEBUG_KEY",Ue.D),S(H,"RESTART_KEY",Ue.R),S(H,"EXIT_KEY",Ue.Escape),S(H,"START_KEY",Ue.ArrowUp),S(H,"SOUND_KEY",Ue.S),S(H,"MAX_SPEED",145),S(H,"VELOCITY_MULTIPLIER_RATE",7),S(H,"LATERAL_VELOCITY_ROTATION_RATE",1.15),S(H,"WIND_FRICTION_RATE",.002),S(H,"INITIAL_SLOPE",.1),S(H,"ACCELERATION_RATE",3),S(H,"BRAKING_RATE",1),S(H,"GATE_MAX_WIDTH",200),S(H,"GATE_MIN_WIDTH",160),S(H,"GATE_MAX_HORIZONTAL_DISTANCE",320),S(H,"GATE_MAX_LEFT_POSITION",H.DISPLAY_MAX_LEFT_POSITION),S(H,"GATE_MAX_RIGHT_POSITION",H.DISPLAY_MAX_RIGHT_POSITION),S(H,"GATE_MAX_NUMBER",56),S(H,"GATE_MIN_NUMBER",41),S(H,"FINAL_GATE_WIDTH",H.DISPLAY_WIDTH-2*H.DISPLAY_MIN_MARGIN),S(H,"FINAL_GATE_POSITION",H.DISPLAY_MAX_LEFT_POSITION),S(H,"GATE_OTHER_SIDE_PROBABILITY",.95),S(H,"SL_MIN_VERTICAL_DISTANCE",170),S(H,"SL_MAX_VERTICAL_DISTANCE",270),S(H,"GS_MIN_VERTICAL_DISTANCE",200),S(H,"GS_MAX_VERTICAL_DISTANCE",350),S(H,"SG_MIN_VERTICAL_DISTANCE",320),S(H,"SG_MAX_VERTICAL_DISTANCE",500),S(H,"DH_MIN_VERTICAL_DISTANCE",370),S(H,"DH_MAX_VERTICAL_DISTANCE",550),S(H,"POLE_WIDTH",20),S(H,"POLE_HEIGHT",40),S(H,"POLE_DETECTOR_MARGIN",22),S(H,"FINAL_POLE_WIDTH",30),S(H,"FINAL_POLE_HEIGHT",80),S(H,"MAX_RIGHT_ROTATION_ANGLE",Math.PI/2),S(H,"MAX_LEFT_ROTATION_ANGLE",3*Math.PI/2),S(H,"ROTATION_RECENTER_RATE",.2),S(H,"CARVING_ROTATION_RATE",3.1),S(H,"CARVING_ROTATION_OPTIMAL_SPEED",60),S(H,"CARVING_ADHERENCE_RATE",.9),S(H,"CARVING_BRAKING_RATE",.01),S(H,"SLIDING_ROTATION_RATE",4.1),S(H,"SLIDING_ROTATION_OPTIMAL_SPEED",45),S(H,"SLIDING_ADHERENCE_RATE",.6),S(H,"SLIDING_BRAKING_RATE",.9);let N=H;class fh{constructor(d,a,c,g,p){S(this,"position");S(this,"player");S(this,"date");S(this,"time");S(this,"difference");this.position=d,this.player=a,this.date=c,this.time=g,this.difference=p}}class gh{static getParticlesEmitter(){return new Va({pos:Ut(0,-20),emitterType:Wa.Circle,radius:6,minVel:50,maxVel:200,minAngle:3.4,maxAngle:6,emitRate:300,opacity:.5,fadeFlag:!0,particleLife:800,maxSize:4,minSize:1,beginColor:vn.ExcaliburBlue,isEmitting:!1})}}class yn extends Yi{constructor(a){super({pos:Ut(0,0),width:30,height:50,z:10,anchor:Ut(.5,.5),collisionType:wn.Fixed});S(this,"speed",0);S(this,"skierName");S(this,"racing",!1);S(this,"finish",!1);S(this,"skierSprite",lt.Skier.toSprite());S(this,"skierCarvingSprite",lt.SkierCarving.toSprite());S(this,"skierSlidingSprite",lt.SkierSliding.toSprite());S(this,"skierBrakingSprite",lt.SkierBraking.toSprite());S(this,"particlesEmitter");this.skierName=a}onInitialize(){this.graphics.add(this.skierSprite),this.particlesEmitter=gh.getParticlesEmitter(),this.addChild(this.particlesEmitter)}update(a){this.racing?(this.updateRotation(a),this.updateSpeed(a,!1),this.updateVelocity(a),this.updateGraphics(a),this.updateCameraPosition(),this.emitParticles(a)):this.finish?(this.updateSpeed(a,!0),this.updateVelocity(a),this.graphics.use(this.skierBrakingSprite),this.emitBreakingParticles()):a.input.keyboard.isHeld(N.START_KEY)&&this.scene.startRace()}finishRace(){this.racing=!1,this.finish=!0,this.graphics.use(this.skierBrakingSprite),this.emitBreakingParticles()}startRace(){this.racing=!0}updateRotation(a){let c=0,g=0;if(this.hasTurningIntention(a)){if(this.hasSlidingIntention(a)){const x=this.speed=270?this.rotation+x:this.rotation-x)}const p=g*(180/Math.PI);p>180&&p<270?this.rotation=N.MAX_LEFT_ROTATION_ANGLE:p<180&&p>90?this.rotation=N.MAX_RIGHT_ROTATION_ANGLE:this.rotation=g}updateSpeed(a,c){let g=this.rotation*(180/Math.PI);g>=270&&(g=360-g);let p=N.ACCELERATION_RATE*N.INITIAL_SLOPE;p-=p*g/90,p-=N.WIND_FRICTION_RATE*this.speed,c?p-=N.BRAKING_RATE:this.hasSlidingIntention(a)?p-=N.SLIDING_BRAKING_RATE:this.hasCarvingIntention(a)?p-=N.CARVING_BRAKING_RATE:this.hasBreakingIntention(a)&&(p-=N.BRAKING_RATE);const x=this.speed+p;x<0?this.speed=0:this.speed=x}updateVelocity(a){let c=0,g=0;const p=this.getAdherenceRate(a),x=this.rotation*(180/Math.PI);if(x===0)c=0,g=this.speed;else if(x<=90){const C=x/90*this.speed;c=C*N.LATERAL_VELOCITY_ROTATION_RATE*p,g=Math.max(0,this.speed-p*C)}else{const C=(360-x)/90*this.speed;c=-C*N.LATERAL_VELOCITY_ROTATION_RATE*p,g=Math.max(0,this.speed-p*C)}this.vel=Ut(c*N.VELOCITY_MULTIPLIER_RATE,-g*N.VELOCITY_MULTIPLIER_RATE)}updateCameraPosition(){this.scene.updateGhost(this.pos.y)}getAdherenceRate(a){let c=1;return this.hasTurningIntention(a)&&(c=this.hasSlidingIntention(a)?N.SLIDING_ADHERENCE_RATE:N.CARVING_ADHERENCE_RATE),c}updateGraphics(a){this.hasSlidingIntention(a)?(this.graphics.use(this.skierSlidingSprite),this.graphics.flipHorizontal=this.hasLeftSlidingIntention(a)):this.hasBreakingIntention(a)?this.graphics.use(this.skierBrakingSprite):this.hasCarvingIntention(a)?(this.graphics.use(this.skierCarvingSprite),this.graphics.flipHorizontal=this.hasLeftCarvingIntention(a)):this.graphics.use(this.skierSprite)}emitParticles(a){if(this.particlesEmitter){const c=this.speed/N.MAX_SPEED;this.hasSlidingIntention(a)?(this.particlesEmitter.pos.y=5,this.particlesEmitter.radius=6,this.particlesEmitter.particleLife=1500,this.hasLeftSlidingIntention(a)?(this.particlesEmitter.maxAngle=1.6,this.particlesEmitter.minAngle=.5,this.particlesEmitter.pos.x=12):(this.particlesEmitter.maxAngle=2.6,this.particlesEmitter.minAngle=1.6,this.particlesEmitter.pos.x=-12),this.particlesEmitter.emitParticles(c*30)):this.hasCarvingIntention(a)?(this.particlesEmitter.pos.y=5,this.particlesEmitter.radius=1,this.particlesEmitter.particleLife=450,this.particlesEmitter.maxAngle=4.8,this.particlesEmitter.minAngle=4.6,this.particlesEmitter.pos.x=this.hasLeftCarvingIntention(a)?12:-12,this.particlesEmitter.emitParticles(c*15)):this.hasBreakingIntention(a)?this.emitBreakingParticles():this.speed>0&&(this.particlesEmitter.pos.y=0,this.particlesEmitter.radius=3,this.particlesEmitter.particleLife=500,this.particlesEmitter.maxAngle=6,this.particlesEmitter.minAngle=3.4,this.particlesEmitter.pos.x=0,this.particlesEmitter.emitParticles(c*5))}}emitBreakingParticles(){this.particlesEmitter.pos.y=-20,this.particlesEmitter.radius=6,this.particlesEmitter.particleLife=1500,this.particlesEmitter.maxAngle=6,this.particlesEmitter.minAngle=3.4,this.particlesEmitter.pos.x=0,this.particlesEmitter.emitParticles(this.speed/N.MAX_SPEED*50)}hasBreakingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_BRAKE)}hasCarvingIntention(a){return this.hasLeftCarvingIntention(a)||this.hasRightCarvingIntention(a)}hasSlidingIntention(a){return this.hasLeftSlidingIntention(a)||this.hasRightSlidingIntention(a)}hasLeftTurningIntention(a){return this.hasLeftCarvingIntention(a)||this.hasLeftSlidingIntention(a)}hasLeftSlidingIntention(a){return this.hasLeftCarvingIntention(a)&&this.hasBreakingIntention(a)}hasRightSlidingIntention(a){return this.hasRightCarvingIntention(a)&&this.hasBreakingIntention(a)}hasLeftCarvingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_CARVE_LEFT)}hasRightCarvingIntention(a){return a.input.keyboard.isHeld(N.CONTROL_CARVE_RIGHT)}hasTurningIntention(a){return this.hasSlidingIntention(a)||this.hasCarvingIntention(a)}}class pn extends Yi{constructor(d,a,c=!1){super({pos:d,width:c?N.FINAL_POLE_WIDTH:N.POLE_WIDTH,height:c?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT,anchor:Ut(0,.5),collisionType:wn.Active}),c?this.graphics.use(lt.FinalPole.toSprite()):this.graphics.use(a==="red"?lt.PoleRed.toSprite():lt.PoleBlue.toSprite())}onInitialize(){this.on("collisionstart",d=>this.onPreCollision(d))}onPreCollision(d){d.other instanceof yn&&this.scene.engine.soundPlayer.playSound(lt.PoleHittingSound,.2)}}class ph extends Yi{constructor(d,a,c=!1){super({pos:d,width:a,height:c?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT/2,anchor:Ut(0,c?.5:0),collisionType:wn.Passive})}onInitialize(){this.on("precollision",d=>this.onPreCollision(d))}onPreCollision(d){d.other instanceof yn&&(this.parent.emit("passed"),this.kill())}}class mn extends Yi{constructor(a,c,g,p,x=!1){super({pos:a,width:c,height:x?N.FINAL_POLE_HEIGHT:N.POLE_HEIGHT,anchor:Ut(0,.5)});S(this,"isFinalGate");S(this,"leftPole");S(this,"rightPole");S(this,"gateDetector");S(this,"gateNumber");S(this,"polesColor");S(this,"gatePassed",!1);this.isFinalGate=x,this.polesColor=g,this.gateNumber=p}onInitialize(){this.on("passed",()=>this.onGatePassed())}update(){this.isOnScreen()&&!this.children.length&&this.buildComponents(),!this.isFinalGate&&!this.gatePassed&&this.shouldBePassed()&&(this.scene.addPenalty(this.gateNumber),this.gatePassed=!0),this.canBeDestroy()&&this.kill()}getStockableGate(){return{x:this.pos.x,y:this.pos.y,color:this.polesColor,width:this.width,gateNumber:this.gateNumber,isFinal:this.isFinalGate}}isOnScreen(){return Math.abs(this.scene.camera.y-this.pos.y)this.scene.camera.pos.y)}canBeDestroy(){return this.scene.camera.y-this.pos.y<-N.DISPLAY_HEIGHT}buildComponents(){const a=this.isFinalGate?N.FINAL_POLE_WIDTH:N.POLE_WIDTH;this.leftPole=new pn(Ut(0,0),this.polesColor,this.isFinalGate),this.gateDetector=new ph(Ut(a+N.POLE_DETECTOR_MARGIN,0),this.width-2*(a+N.POLE_DETECTOR_MARGIN),this.isFinalGate),this.rightPole=new pn(Ut(this.width-a,0),this.polesColor,this.isFinalGate),this.addChild(this.leftPole),this.addChild(this.gateDetector),this.addChild(this.rightPole)}onGatePassed(){this.gatePassed=!0,this.isFinalGate?this.scene.stopRace():this.updatePassedPolesGraphics()}updatePassedPolesGraphics(){this.children.forEach(a=>{const c=this.polesColor==="red"?lt.PolePassedRed.toSprite():lt.PolePassedBlue.toSprite();a instanceof pn&&a.graphics.use(c)})}}class oo{constructor(d,a,c,g,p){S(this,"name");S(this,"style");S(this,"date");S(this,"gates");S(this,"records");this.name=d,this.style=a,this.date=c,this.gates=g,this.records=p}toStockable(){return new xn(this.name,this.style,this.date,this.gates.map(d=>d.getStockableGate()),this.records)}}var As=(u=>(u.SL="SL",u.GS="GS",u.SG="SG",u.DH="DH",u))(As||{});class fe{static designTrack(d,a){const c=[],g=Math.floor(N.GATE_MIN_NUMBER+Math.random()*(N.GATE_MAX_NUMBER-N.GATE_MIN_NUMBER));console.log("TrackBuilder - Designing a new track of ",g," gates");let p=fe.getRandomGateWidth(),x=fe.getNextGatePosition(p,a);for(let C=0;C0?"red":"blue",C+1);c.push(T),p=fe.getRandomGateWidth(),x=fe.getNextGatePosition(p,a,x)}return c.push(fe.generateFinalGate(x.y)),new oo(d,a,new Date,c,[])}static buildTrack(d){console.log("TrackBuilder - Rebuilding an existing track");const a=[];return d.gates.forEach(c=>{a.push(new mn(Ut(c.x,c.y),c.width,c.color,c.gateNumber,c.isFinal))}),new oo(d.name,d.style,d.date,a,d.records)}static getRandomGateWidth(){return N.GATE_MIN_WIDTH+Math.random()*(N.GATE_MAX_WIDTH-N.GATE_MIN_WIDTH)}static generateFinalGate(d){return new mn(Ut(N.FINAL_GATE_POSITION,d),N.FINAL_GATE_WIDTH,"red",void 0,!0)}static getNextGatePosition(d,a,c){const g=Math.random(),p=fe.getGateDistance(a),x=N.GATE_MAX_RIGHT_POSITION-d;if(c){const T=this.getGateSide(c)==="left"?g>=N.GATE_OTHER_SIDE_PROBABILITY:gN.GATE_MAX_HORIZONTAL_DISTANCE?z=fe.furtherAutorizedXPosition(c.x,T?"left":"right",x):z=B;const G=c.y-(p.minVertical+Math.random()*(p.maxVertical-p.minVertical));return Ut(z,G)}else{const C=g>.5,T=x*Math.random();return Ut(C?-T:T,-((p.maxVertical+p.minVertical)/2))}}static getGateDistance(d){return d===As.SL?{minVertical:N.SL_MIN_VERTICAL_DISTANCE,maxVertical:N.SL_MAX_VERTICAL_DISTANCE}:d===As.GS?{minVertical:N.GS_MIN_VERTICAL_DISTANCE,maxVertical:N.GS_MAX_VERTICAL_DISTANCE}:d===As.SG?{minVertical:N.SG_MIN_VERTICAL_DISTANCE,maxVertical:N.SG_MAX_VERTICAL_DISTANCE}:{minVertical:N.DH_MIN_VERTICAL_DISTANCE,maxVertical:N.DH_MAX_VERTICAL_DISTANCE}}static furtherAutorizedXPosition(d,a,c){return a==="left"?Math.max(d-N.GATE_MAX_HORIZONTAL_DISTANCE,N.GATE_MAX_LEFT_POSITION):Math.min(d+N.GATE_MAX_HORIZONTAL_DISTANCE,c)}static getDistance(d,a){return d>=0&&a>=0?Math.abs(d-a):d>=0&&a<0?d-a:Math.abs(a-d)}static getGateSide(d){return d.x<0?"left":d.x>0?"right":"middle"}}class xn{constructor(d,a,c,g,p){S(this,"name");S(this,"style");S(this,"date");S(this,"gates");S(this,"records");this.name=d,this.style=a,this.date=c,this.gates=g,this.records=p}toTrack(){return fe.buildTrack(this)}}function be(u){const d=Object.prototype.toString.call(u);return u instanceof Date||typeof u=="object"&&d==="[object Date]"?new u.constructor(+u):typeof u=="number"||d==="[object Number]"||typeof u=="string"||d==="[object String]"?new Date(u):new Date(NaN)}function ti(u,d){return u instanceof Date?new u.constructor(d):new Date(d)}const po=6048e5,mh=864e5;let _h={};function bs(){return _h}function Qi(u,d){var C,T,B,P;const a=bs(),c=(d==null?void 0:d.weekStartsOn)??((T=(C=d==null?void 0:d.locale)==null?void 0:C.options)==null?void 0:T.weekStartsOn)??a.weekStartsOn??((P=(B=a.locale)==null?void 0:B.options)==null?void 0:P.weekStartsOn)??0,g=be(u),p=g.getDay(),x=(p=g.getTime()?a+1:d.getTime()>=x.getTime()?a:a-1}function ao(u){const d=be(u);return d.setHours(0,0,0,0),d}function ho(u){const d=new Date(Date.UTC(u.getFullYear(),u.getMonth(),u.getDate(),u.getHours(),u.getMinutes(),u.getSeconds(),u.getMilliseconds()));return d.setUTCFullYear(u.getFullYear()),u.getTime()-d.getTime()}function vh(u,d){const a=ao(u),c=ao(d),g=a.getTime()-ho(a),p=c.getTime()-ho(c);return Math.round((g-p)/mh)}function xh(u){const d=mo(u),a=ti(u,0);return a.setFullYear(d,0,4),a.setHours(0,0,0,0),ys(a)}function wh(u){return u instanceof Date||typeof u=="object"&&Object.prototype.toString.call(u)==="[object Date]"}function Ah(u){if(!wh(u)&&typeof u!="number")return!1;const d=be(u);return!isNaN(Number(d))}function yh(u){const d=be(u),a=ti(u,0);return a.setFullYear(d.getFullYear(),0,1),a.setHours(0,0,0,0),a}const bh={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Eh=(u,d,a)=>{let c;const g=bh[u];return typeof g=="string"?c=g:d===1?c=g.one:c=g.other.replace("{{count}}",d.toString()),a!=null&&a.addSuffix?a.comparison&&a.comparison>0?"in "+c:c+" ago":c};function _n(u){return(d={})=>{const a=d.width?String(d.width):u.defaultWidth;return u.formats[a]||u.formats[u.defaultWidth]}}const Ch={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},Ih={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Sh={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Th={date:_n({formats:Ch,defaultWidth:"full"}),time:_n({formats:Ih,defaultWidth:"full"}),dateTime:_n({formats:Sh,defaultWidth:"full"})},Ph={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Rh=(u,d,a,c)=>Ph[u];function Ni(u){return(d,a)=>{const c=a!=null&&a.context?String(a.context):"standalone";let g;if(c==="formatting"&&u.formattingValues){const x=u.defaultFormattingWidth||u.defaultWidth,C=a!=null&&a.width?String(a.width):x;g=u.formattingValues[C]||u.formattingValues[x]}else{const x=u.defaultWidth,C=a!=null&&a.width?String(a.width):u.defaultWidth;g=u.values[C]||u.values[x]}const p=u.argumentCallback?u.argumentCallback(d):d;return g[p]}}const Mh={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Bh={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},kh={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Dh={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Fh={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Oh={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Uh=(u,d)=>{const a=Number(u),c=a%100;if(c>20||c<10)switch(c%10){case 1:return a+"st";case 2:return a+"nd";case 3:return a+"rd"}return a+"th"},Lh={ordinalNumber:Uh,era:Ni({values:Mh,defaultWidth:"wide"}),quarter:Ni({values:Bh,defaultWidth:"wide",argumentCallback:u=>u-1}),month:Ni({values:kh,defaultWidth:"wide"}),day:Ni({values:Dh,defaultWidth:"wide"}),dayPeriod:Ni({values:Fh,defaultWidth:"wide",formattingValues:Oh,defaultFormattingWidth:"wide"})};function Hi(u){return(d,a={})=>{const c=a.width,g=c&&u.matchPatterns[c]||u.matchPatterns[u.defaultMatchWidth],p=d.match(g);if(!p)return null;const x=p[0],C=c&&u.parsePatterns[c]||u.parsePatterns[u.defaultParseWidth],T=Array.isArray(C)?Gh(C,z=>z.test(x)):zh(C,z=>z.test(x));let B;B=u.valueCallback?u.valueCallback(T):T,B=a.valueCallback?a.valueCallback(B):B;const P=d.slice(x.length);return{value:B,rest:P}}}function zh(u,d){for(const a in u)if(Object.prototype.hasOwnProperty.call(u,a)&&d(u[a]))return a}function Gh(u,d){for(let a=0;a{const c=d.match(u.matchPattern);if(!c)return null;const g=c[0],p=d.match(u.parsePattern);if(!p)return null;let x=u.valueCallback?u.valueCallback(p[0]):p[0];x=a.valueCallback?a.valueCallback(x):x;const C=d.slice(g.length);return{value:x,rest:C}}}const Hh=/^(\d+)(th|st|nd|rd)?/i,Qh=/\d+/i,Yh={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Wh={any:[/^b/i,/^(a|c)/i]},Zh={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Jh={any:[/1/i,/2/i,/3/i,/4/i]},Vh={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},jh={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},Xh={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Kh={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},qh={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},$h={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},tl={ordinalNumber:Nh({matchPattern:Hh,parsePattern:Qh,valueCallback:u=>parseInt(u,10)}),era:Hi({matchPatterns:Yh,defaultMatchWidth:"wide",parsePatterns:Wh,defaultParseWidth:"any"}),quarter:Hi({matchPatterns:Zh,defaultMatchWidth:"wide",parsePatterns:Jh,defaultParseWidth:"any",valueCallback:u=>u+1}),month:Hi({matchPatterns:Vh,defaultMatchWidth:"wide",parsePatterns:jh,defaultParseWidth:"any"}),day:Hi({matchPatterns:Xh,defaultMatchWidth:"wide",parsePatterns:Kh,defaultParseWidth:"any"}),dayPeriod:Hi({matchPatterns:qh,defaultMatchWidth:"any",parsePatterns:$h,defaultParseWidth:"any"})},el={code:"en-US",formatDistance:Eh,formatLong:Th,formatRelative:Rh,localize:Lh,match:tl,options:{weekStartsOn:0,firstWeekContainsDate:1}};function il(u){const d=be(u);return vh(d,yh(d))+1}function sl(u){const d=be(u),a=ys(d).getTime()-xh(d).getTime();return Math.round(a/po)+1}function _o(u,d){var P,z,G,O;const a=be(u),c=a.getFullYear(),g=bs(),p=(d==null?void 0:d.firstWeekContainsDate)??((z=(P=d==null?void 0:d.locale)==null?void 0:P.options)==null?void 0:z.firstWeekContainsDate)??g.firstWeekContainsDate??((O=(G=g.locale)==null?void 0:G.options)==null?void 0:O.firstWeekContainsDate)??1,x=ti(u,0);x.setFullYear(c+1,0,p),x.setHours(0,0,0,0);const C=Qi(x,d),T=ti(u,0);T.setFullYear(c,0,p),T.setHours(0,0,0,0);const B=Qi(T,d);return a.getTime()>=C.getTime()?c+1:a.getTime()>=B.getTime()?c:c-1}function nl(u,d){var C,T,B,P;const a=bs(),c=(d==null?void 0:d.firstWeekContainsDate)??((T=(C=d==null?void 0:d.locale)==null?void 0:C.options)==null?void 0:T.firstWeekContainsDate)??a.firstWeekContainsDate??((P=(B=a.locale)==null?void 0:B.options)==null?void 0:P.firstWeekContainsDate)??1,g=_o(u,d),p=ti(u,0);return p.setFullYear(g,0,c),p.setHours(0,0,0,0),Qi(p,d)}function rl(u,d){const a=be(u),c=Qi(a,d).getTime()-nl(a,d).getTime();return Math.round(c/po)+1}function ut(u,d){const a=u<0?"-":"",c=Math.abs(u).toString().padStart(d,"0");return a+c}const Le={y(u,d){const a=u.getFullYear(),c=a>0?a:1-a;return ut(d==="yy"?c%100:c,d.length)},M(u,d){const a=u.getMonth();return d==="M"?String(a+1):ut(a+1,2)},d(u,d){return ut(u.getDate(),d.length)},a(u,d){const a=u.getHours()/12>=1?"pm":"am";switch(d){case"a":case"aa":return a.toUpperCase();case"aaa":return a;case"aaaaa":return a[0];case"aaaa":default:return a==="am"?"a.m.":"p.m."}},h(u,d){return ut(u.getHours()%12||12,d.length)},H(u,d){return ut(u.getHours(),d.length)},m(u,d){return ut(u.getMinutes(),d.length)},s(u,d){return ut(u.getSeconds(),d.length)},S(u,d){const a=d.length,c=u.getMilliseconds(),g=Math.floor(c*Math.pow(10,a-3));return ut(g,d.length)}},Ai={am:"am",pm:"pm",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},ol={G:function(u,d,a){const c=u.getFullYear()>0?1:0;switch(d){case"G":case"GG":case"GGG":return a.era(c,{width:"abbreviated"});case"GGGGG":return a.era(c,{width:"narrow"});case"GGGG":default:return a.era(c,{width:"wide"})}},y:function(u,d,a){if(d==="yo"){const c=u.getFullYear(),g=c>0?c:1-c;return a.ordinalNumber(g,{unit:"year"})}return Le.y(u,d)},Y:function(u,d,a,c){const g=_o(u,c),p=g>0?g:1-g;if(d==="YY"){const x=p%100;return ut(x,2)}return d==="Yo"?a.ordinalNumber(p,{unit:"year"}):ut(p,d.length)},R:function(u,d){const a=mo(u);return ut(a,d.length)},u:function(u,d){const a=u.getFullYear();return ut(a,d.length)},Q:function(u,d,a){const c=Math.ceil((u.getMonth()+1)/3);switch(d){case"Q":return String(c);case"QQ":return ut(c,2);case"Qo":return a.ordinalNumber(c,{unit:"quarter"});case"QQQ":return a.quarter(c,{width:"abbreviated",context:"formatting"});case"QQQQQ":return a.quarter(c,{width:"narrow",context:"formatting"});case"QQQQ":default:return a.quarter(c,{width:"wide",context:"formatting"})}},q:function(u,d,a){const c=Math.ceil((u.getMonth()+1)/3);switch(d){case"q":return String(c);case"qq":return ut(c,2);case"qo":return a.ordinalNumber(c,{unit:"quarter"});case"qqq":return a.quarter(c,{width:"abbreviated",context:"standalone"});case"qqqqq":return a.quarter(c,{width:"narrow",context:"standalone"});case"qqqq":default:return a.quarter(c,{width:"wide",context:"standalone"})}},M:function(u,d,a){const c=u.getMonth();switch(d){case"M":case"MM":return Le.M(u,d);case"Mo":return a.ordinalNumber(c+1,{unit:"month"});case"MMM":return a.month(c,{width:"abbreviated",context:"formatting"});case"MMMMM":return a.month(c,{width:"narrow",context:"formatting"});case"MMMM":default:return a.month(c,{width:"wide",context:"formatting"})}},L:function(u,d,a){const c=u.getMonth();switch(d){case"L":return String(c+1);case"LL":return ut(c+1,2);case"Lo":return a.ordinalNumber(c+1,{unit:"month"});case"LLL":return a.month(c,{width:"abbreviated",context:"standalone"});case"LLLLL":return a.month(c,{width:"narrow",context:"standalone"});case"LLLL":default:return a.month(c,{width:"wide",context:"standalone"})}},w:function(u,d,a,c){const g=rl(u,c);return d==="wo"?a.ordinalNumber(g,{unit:"week"}):ut(g,d.length)},I:function(u,d,a){const c=sl(u);return d==="Io"?a.ordinalNumber(c,{unit:"week"}):ut(c,d.length)},d:function(u,d,a){return d==="do"?a.ordinalNumber(u.getDate(),{unit:"date"}):Le.d(u,d)},D:function(u,d,a){const c=il(u);return d==="Do"?a.ordinalNumber(c,{unit:"dayOfYear"}):ut(c,d.length)},E:function(u,d,a){const c=u.getDay();switch(d){case"E":case"EE":case"EEE":return a.day(c,{width:"abbreviated",context:"formatting"});case"EEEEE":return a.day(c,{width:"narrow",context:"formatting"});case"EEEEEE":return a.day(c,{width:"short",context:"formatting"});case"EEEE":default:return a.day(c,{width:"wide",context:"formatting"})}},e:function(u,d,a,c){const g=u.getDay(),p=(g-c.weekStartsOn+8)%7||7;switch(d){case"e":return String(p);case"ee":return ut(p,2);case"eo":return a.ordinalNumber(p,{unit:"day"});case"eee":return a.day(g,{width:"abbreviated",context:"formatting"});case"eeeee":return a.day(g,{width:"narrow",context:"formatting"});case"eeeeee":return a.day(g,{width:"short",context:"formatting"});case"eeee":default:return a.day(g,{width:"wide",context:"formatting"})}},c:function(u,d,a,c){const g=u.getDay(),p=(g-c.weekStartsOn+8)%7||7;switch(d){case"c":return String(p);case"cc":return ut(p,d.length);case"co":return a.ordinalNumber(p,{unit:"day"});case"ccc":return a.day(g,{width:"abbreviated",context:"standalone"});case"ccccc":return a.day(g,{width:"narrow",context:"standalone"});case"cccccc":return a.day(g,{width:"short",context:"standalone"});case"cccc":default:return a.day(g,{width:"wide",context:"standalone"})}},i:function(u,d,a){const c=u.getDay(),g=c===0?7:c;switch(d){case"i":return String(g);case"ii":return ut(g,d.length);case"io":return a.ordinalNumber(g,{unit:"day"});case"iii":return a.day(c,{width:"abbreviated",context:"formatting"});case"iiiii":return a.day(c,{width:"narrow",context:"formatting"});case"iiiiii":return a.day(c,{width:"short",context:"formatting"});case"iiii":default:return a.day(c,{width:"wide",context:"formatting"})}},a:function(u,d,a){const g=u.getHours()/12>=1?"pm":"am";switch(d){case"a":case"aa":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"aaa":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"aaaa":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},b:function(u,d,a){const c=u.getHours();let g;switch(c===12?g=Ai.noon:c===0?g=Ai.midnight:g=c/12>=1?"pm":"am",d){case"b":case"bb":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"bbb":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"bbbb":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},B:function(u,d,a){const c=u.getHours();let g;switch(c>=17?g=Ai.evening:c>=12?g=Ai.afternoon:c>=4?g=Ai.morning:g=Ai.night,d){case"B":case"BB":case"BBB":return a.dayPeriod(g,{width:"abbreviated",context:"formatting"});case"BBBBB":return a.dayPeriod(g,{width:"narrow",context:"formatting"});case"BBBB":default:return a.dayPeriod(g,{width:"wide",context:"formatting"})}},h:function(u,d,a){if(d==="ho"){let c=u.getHours()%12;return c===0&&(c=12),a.ordinalNumber(c,{unit:"hour"})}return Le.h(u,d)},H:function(u,d,a){return d==="Ho"?a.ordinalNumber(u.getHours(),{unit:"hour"}):Le.H(u,d)},K:function(u,d,a){const c=u.getHours()%12;return d==="Ko"?a.ordinalNumber(c,{unit:"hour"}):ut(c,d.length)},k:function(u,d,a){let c=u.getHours();return c===0&&(c=24),d==="ko"?a.ordinalNumber(c,{unit:"hour"}):ut(c,d.length)},m:function(u,d,a){return d==="mo"?a.ordinalNumber(u.getMinutes(),{unit:"minute"}):Le.m(u,d)},s:function(u,d,a){return d==="so"?a.ordinalNumber(u.getSeconds(),{unit:"second"}):Le.s(u,d)},S:function(u,d){return Le.S(u,d)},X:function(u,d,a,c){const p=(c._originalDate||u).getTimezoneOffset();if(p===0)return"Z";switch(d){case"X":return co(p);case"XXXX":case"XX":return $e(p);case"XXXXX":case"XXX":default:return $e(p,":")}},x:function(u,d,a,c){const p=(c._originalDate||u).getTimezoneOffset();switch(d){case"x":return co(p);case"xxxx":case"xx":return $e(p);case"xxxxx":case"xxx":default:return $e(p,":")}},O:function(u,d,a,c){const p=(c._originalDate||u).getTimezoneOffset();switch(d){case"O":case"OO":case"OOO":return"GMT"+lo(p,":");case"OOOO":default:return"GMT"+$e(p,":")}},z:function(u,d,a,c){const p=(c._originalDate||u).getTimezoneOffset();switch(d){case"z":case"zz":case"zzz":return"GMT"+lo(p,":");case"zzzz":default:return"GMT"+$e(p,":")}},t:function(u,d,a,c){const g=c._originalDate||u,p=Math.floor(g.getTime()/1e3);return ut(p,d.length)},T:function(u,d,a,c){const p=(c._originalDate||u).getTime();return ut(p,d.length)}};function lo(u,d=""){const a=u>0?"-":"+",c=Math.abs(u),g=Math.floor(c/60),p=c%60;return p===0?a+String(g):a+String(g)+d+ut(p,2)}function co(u,d){return u%60===0?(u>0?"-":"+")+ut(Math.abs(u)/60,2):$e(u,d)}function $e(u,d=""){const a=u>0?"-":"+",c=Math.abs(u),g=ut(Math.floor(c/60),2),p=ut(c%60,2);return a+g+d+p}const uo=(u,d)=>{switch(u){case"P":return d.date({width:"short"});case"PP":return d.date({width:"medium"});case"PPP":return d.date({width:"long"});case"PPPP":default:return d.date({width:"full"})}},vo=(u,d)=>{switch(u){case"p":return d.time({width:"short"});case"pp":return d.time({width:"medium"});case"ppp":return d.time({width:"long"});case"pppp":default:return d.time({width:"full"})}},al=(u,d)=>{const a=u.match(/(P+)(p+)?/)||[],c=a[1],g=a[2];if(!g)return uo(u,d);let p;switch(c){case"P":p=d.dateTime({width:"short"});break;case"PP":p=d.dateTime({width:"medium"});break;case"PPP":p=d.dateTime({width:"long"});break;case"PPPP":default:p=d.dateTime({width:"full"});break}return p.replace("{{date}}",uo(c,d)).replace("{{time}}",vo(g,d))},hl={p:vo,P:al},ll=/^D+$/,cl=/^Y+$/,dl=["D","DD","YY","YYYY"];function ul(u){return ll.test(u)}function fl(u){return cl.test(u)}function fo(u,d,a){const c=gl(u,d,a);if(console.warn(c),dl.includes(u))throw new RangeError(c)}function gl(u,d,a){const c=u[0]==="Y"?"years":"days of the month";return`Use \`${u.toLowerCase()}\` instead of \`${u}\` (in \`${d}\`) for formatting ${c} to the input \`${a}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`}const pl=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,ml=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,_l=/^'([^]*?)'?$/,vl=/''/g,xl=/[a-zA-Z]/;function ye(u,d,a){var P,z,G,O,Q,$,et,X;const c=bs(),g=(a==null?void 0:a.locale)??c.locale??el,p=(a==null?void 0:a.firstWeekContainsDate)??((z=(P=a==null?void 0:a.locale)==null?void 0:P.options)==null?void 0:z.firstWeekContainsDate)??c.firstWeekContainsDate??((O=(G=c.locale)==null?void 0:G.options)==null?void 0:O.firstWeekContainsDate)??1,x=(a==null?void 0:a.weekStartsOn)??(($=(Q=a==null?void 0:a.locale)==null?void 0:Q.options)==null?void 0:$.weekStartsOn)??c.weekStartsOn??((X=(et=c.locale)==null?void 0:et.options)==null?void 0:X.weekStartsOn)??0,C=be(u);if(!Ah(C))throw new RangeError("Invalid time value");const T={firstWeekContainsDate:p,weekStartsOn:x,locale:g,_originalDate:C};return d.match(ml).map(function(st){const ht=st[0];if(ht==="p"||ht==="P"){const mt=hl[ht];return mt(st,g.formatLong)}return st}).join("").match(pl).map(function(st){if(st==="''")return"'";const ht=st[0];if(ht==="'")return wl(st);const mt=ol[ht];if(mt)return!(a!=null&&a.useAdditionalWeekYearTokens)&&fl(st)&&fo(st,d,String(u)),!(a!=null&&a.useAdditionalDayOfYearTokens)&&ul(st)&&fo(st,d,String(u)),mt(C,st,g.localize,T);if(ht.match(xl))throw new RangeError("Format string contains an unescaped latin alphabet character `"+ht+"`");return st}).join("")}function wl(u){const d=u.match(_l);return d?d[1].replace(vl,"'"):u}class Al{constructor(){}loadTrack(d,a){const c=this.getTrackFromLocalStorage(d);if(c)return c.toTrack();const g=fe.designTrack(d,a),p=g.toStockable();return this.saveTrackToLocalStorage(p),g}importDefaultTracks(){N.DEFAULT_TRACKS.forEach(d=>{localStorage.getItem(`track_${d}`)||fetch(`tracks/${d}.json`).then(a=>a.json()).then(a=>{localStorage.setItem(`track_${d}`,JSON.stringify(a))})})}saveRecord(d,a){const c=this.getTrackFromLocalStorage(d);return c&&(c.records.push(a),c.records.sort((g,p)=>g.timing-p.timing),this.saveTrackToLocalStorage(c)),{position:c.records.filter(g=>g.timingc.timing===a)+1}getRecord(d){const a=this.getRecords(d);return a.length?a[0].timing:null}getRecords(d){var a;return((a=this.getTrackFromLocalStorage(d))==null?void 0:a.records)||[]}saveTrackToLocalStorage(d){localStorage.setItem(`track_${d.name}`,JSON.stringify(d))}getTrackFromLocalStorage(d){let a=localStorage.getItem("track_"+d);if(a){const c=Object.assign(new xn,JSON.parse(a));return new xn(c.name,c.style,c.date,c.gates,c.records)}return null}getCurrentRecords(d){const a=this.getTrackFromLocalStorage(d).records;return a==null?void 0:a.map((c,g)=>{const p=c.timing-a[0].timing;return new fh(g+1,c.player,ye(c.date,"d MMM yyyy HH:mm"),ye(c.timing,"mm:ss:SS"),p?ye(p,"ss:SS"):"")})}}class yl{constructor(d,a,c,g,p){S(this,"raceNumber");S(this,"trackName");S(this,"trackStyle");S(this,"skier1Name");S(this,"skier2Name");S(this,"skier1Timing");S(this,"skier2Timing");this.raceNumber=d,this.trackName=a,this.trackStyle=c,this.skier1Name=g,this.skier2Name=p}getWinner(){return this.isCompleted()?this.skier1Timing(a.raceNumber===d.raceNumber&&a.setTiming(d.skierName,d.timing),a))}getNextRace(){return this.racesResults.find(d=>!d.isCompleted())||null}getActualRankings(){let d=0,a=0,c=0,g=0;return this.racesResults.filter(p=>p.isCompleted()).forEach(p=>{p.getWinner()===this.skier1Name?d++:a++,c+=p.skier1Timing,g+=p.skier2Timing}),[new go(this.skier1Name,d,c),new go(this.skier2Name,a,g)].sort((p,x)=>p.time-x.time)}initRacesResults(d){this.racesResults=[];for(let a=1;a<=d;a++)this.racesResults.push(new yl(a,this.trackName,this.trackStyle,this.skier1Name,this.skier2Name))}}class El extends An{constructor(a){super();S(this,"raceSetupUi",document.getElementById("event-setup"));S(this,"trackInput",document.getElementById("track-input"));S(this,"trackStyleSelect",document.getElementById("track-style-select"));S(this,"skier1Input",document.getElementById("skier-1-input"));S(this,"skier2Input",document.getElementById("skier-2-input"));S(this,"racesNumberInput",document.getElementById("races-number-input"));S(this,"setupCompletedButton",document.getElementById("setup-completed-button"));this.engine=a,this.listenSetupCompleted()}onActivate(a){this.prepareRaceSetup()}onDeactivate(a){this.cleanRaceSetup()}prepareRaceSetup(){this.raceSetupUi.style.display="flex",this.engine.soundPlayer.showButton()}cleanRaceSetup(){this.raceSetupUi.style.display="none"}listenSetupCompleted(){this.setupCompletedButton.addEventListener("click",()=>{this.completeSetup()})}completeSetup(){const a=this.trackInput.value,c=this.trackStyleSelect.value,g=this.skier1Input.value,p=this.skier2Input.value,x=+this.racesNumberInput.value;if(a&&g&&p&&x){const C=new bl(a,c,g,p,x);this.engine.goToScene("eventManager",{eventConfig:C})}}}class Cl{constructor(){S(this,"state","menu");S(this,"_isDisplayed",!1);S(this,"resultUi",document.getElementById("result"));S(this,"resultsContainerUi",document.getElementById("results-container"));S(this,"speedometerUi",document.getElementById("speedometer"));S(this,"timerUi",document.getElementById("timer"));S(this,"backToManagerButton",document.getElementById("back-to-manager"));this.updateUiState(this.state)}isDisplayed(){return this._isDisplayed}hideUi(){this.resultUi.style.display="none",this.resultsContainerUi.innerHTML="",this.speedometerUi.style.visibility="hidden",this.timerUi.style.visibility="hidden",this._isDisplayed=!1}updateUi(d,a,c){const g=`${ye(a,"mm:ss:SS")}`;this.state==="result"&&(location.hash="",this.resultsContainerUi.innerHTML=this.prepareResultsTable(c),location.hash="startPosition"),this.speedometerUi.innerText=`${Math.floor(d)} km/h`,this.timerUi.innerText=g}updateUiState(d){switch(this.state=d,d){case"menu":this.hideUi();break;case"racing":this.showRacingUi();break;case"result":this.showResultUi();break}}showRacingUi(){this.resultUi.style.display="none",this.speedometerUi.style.visibility="visible",this.timerUi.style.visibility="visible"}showResultUi(){this.resultUi.style.display="flex"}prepareResultsTable(d){return d.records.map(a=>{const c=a.position===d.position;return`
${a.position}
${a.player}
${a.date}
${a.time}
${a.difference?"+ "+a.difference:""}
-
`}).join("")}}class Cl{constructor(d){S(this,"player");S(this,"date");S(this,"timing");this.player=d.skierName,this.date=d.date,this.timing=d.timing}}class Il{constructor(d,a,c,g){S(this,"raceNumber");S(this,"skierName");S(this,"date");S(this,"timing");this.raceNumber=d,this.skierName=a,this.date=c,this.timing=g}}class Sl extends wn{constructor(a){super();S(this,"uiManager",new El);S(this,"uiTimer",new ja({interval:10,repeats:!0,fcn:()=>this.updateUi()}));S(this,"raceConfig");S(this,"skier");S(this,"skierGhost");S(this,"gates");S(this,"startTime");S(this,"endTime");this.engine=a}onPreUpdate(a,c){a.input.keyboard.wasPressed(N.RESTART_KEY)&&this.returnToEventManager()}onActivate(a){var c,g;(c=a.data)!=null&&c.raceConfig?(this.raceConfig=(g=a.data)==null?void 0:g.raceConfig,this.prepareRace(this.raceConfig.trackName,this.raceConfig.getNextSkierName())):this.returnToEventManager()}onDeactivate(a){this.cleanRace()}stopRace(){var m,x,I;this.endTime=this.engine.clock.now(),this.skier.finishRace(),this.uiTimer.stop();const a=this.endTime-this.startTime,c=new Il((m=this.raceConfig)==null?void 0:m.raceNumber,(x=this.skier)==null?void 0:x.skierName,new Date,a),g=this.engine.trackManager.saveRecord(this.raceConfig.trackName,new Cl(c));this.uiManager.updateUiState("result"),this.uiManager.updateUi(((I=this.skier)==null?void 0:I.speed)||0,a,g),this.uiManager.backToManagerButton.addEventListener("click",()=>this.returnToEventManager(c),{once:!0}),this.engine.soundPlayer.playSound(lt.FinishRaceSound,.3)}addPenalty(a){console.warn("Missed the gate n°",a," (+ 3s.)"),this.camera.shake(3,3,250),this.startTime-=3e3,this.engine.soundPlayer.playSound(lt.GateMissedSound,.3)}updateGhost(a){this.skierGhost.pos=Ut(0,a+N.FRONT_GHOST_DISTANCE)}setupCamera(){this.camera.strategy.elasticToActor(this.skierGhost,.12,.2),this.camera.zoom=N.CAMERA_ZOOM}startRace(){this.uiTimer.start(),this.listenStopRaceEvent(),this.skier.startRace(),this.engine.soundPlayer.playSound(lt.StartRaceSound,.3)}returnToEventManager(a){lt.FinishRaceSound.stop(),this.engine.goToScene("eventManager",a?{raceResult:a}:{}),this.engine.removeScene("race")}prepareRace(a,c){this.skier=new An(c),this.add(this.skier),this.skierGhost=new Yi({width:1,height:1,pos:Ut(this.skier.pos.x,this.skier.pos.y+N.FRONT_GHOST_DISTANCE)}),this.setupCamera(),this.buildTrack(a),this.add(this.skierGhost),this.addTimer(this.uiTimer),this.engine.soundPlayer.playSound(lt.WinterSound,.1,!0)}cleanRace(){this.startTime=void 0,this.endTime=void 0,this.uiManager.updateUiState("menu"),this.gates=[],this.raceConfig=void 0,this.engine.soundPlayer.stopSound(lt.WinterSound),this.clear()}listenStopRaceEvent(){var a;(a=this.gates)==null||a.find(c=>c.isFinalGate).on("stoprace",()=>this.stopRace())}updateUi(){var a;this.uiManager.state==="menu"&&this.uiManager.updateUiState("racing"),this.startTime=this.startTime||this.engine.clock.now(),this.uiManager.updateUi(((a=this.skier)==null?void 0:a.speed)||0,(this.endTime||this.engine.clock.now())-this.startTime)}buildTrack(a){this.engine.trackManager.loadTrack(a).gates.forEach(c=>{var g;(g=this.gates)==null||g.push(c),this.add(c)})}}class Tl extends wn{constructor(a){super();S(this,"eventConfig");S(this,"trackManager");S(this,"eventManagerUi",document.getElementById("event-manager"));S(this,"skier1Label",document.getElementById("skier-1-label"));S(this,"skier2Label",document.getElementById("skier-2-label"));S(this,"lastResultsContainer",document.getElementById("last-results-container"));S(this,"actualRankingContainer",document.getElementById("actual-ranking-container"));S(this,"nextRacesContainer",document.getElementById("next-races-container"));S(this,"startRaceButton",document.getElementById("start-race-button"));this.engine=a,this.startRaceButton.addEventListener("click",()=>{this.eventConfig.getNextRace()?this.startRace():this.backToMenu()})}onActivate(a){var c,g,m;this.trackManager=this.engine.trackManager,(c=a.data)!=null&&c.eventConfig&&(this.eventConfig=(g=a.data)==null?void 0:g.eventConfig,this.startRaceButton),(m=a.data)!=null&&m.raceResult&&this.eventConfig.updateRaceResult(a.data.raceResult),this.prepareManager(this.eventConfig)}onDeactivate(a){this.cleanManager()}prepareManager(a){this.eventConfig=a,this.startRaceButton.innerText=this.eventConfig.getNextRace()?"Race":"Back to menu",this.eventManagerUi.style.display="flex",this.skier1Label.innerText=a.skier1Name,this.skier2Label.innerText=a.skier2Name,this.lastResultsContainer.innerHTML=this.prepareLastResultsTable(a)||'
No result for the moment
',this.actualRankingContainer.innerHTML=this.prepareActualRankingTable(a)||'
No ranking for the moment
',this.nextRacesContainer.innerHTML=this.prepareNextRacesTable(a)||'
No race to come
',this.engine.soundPlayer.showButton()}cleanManager(){this.eventManagerUi.style.display="none",this.startRaceButton.removeEventListener("click",()=>{})}startRace(){this.engine.soundPlayer.hideButton(),this.engine.addScene("race",new Sl(this.engine)),this.engine.goToScene("race",{raceConfig:this.eventConfig.getNextRace()})}prepareLastResultsTable(a){return a.racesResults.filter(c=>c.isStarted()).map(c=>{const g=`${c.skier1Timing?" ("+this.trackManager.getRecordPosition(c.trackName,c.skier1Timing)+")":""}`,m=`${c.skier2Timing?" ("+this.trackManager.getRecordPosition(c.trackName,c.skier2Timing)+")":""}`;return`
+
`}).join("")}}class Il{constructor(d){S(this,"player");S(this,"date");S(this,"timing");this.player=d.skierName,this.date=d.date,this.timing=d.timing}}class Sl{constructor(d,a,c,g){S(this,"raceNumber");S(this,"skierName");S(this,"date");S(this,"timing");this.raceNumber=d,this.skierName=a,this.date=c,this.timing=g}}class Tl extends An{constructor(a){super();S(this,"uiManager",new Cl);S(this,"uiTimer",new ja({interval:10,repeats:!0,fcn:()=>this.updateUi()}));S(this,"raceConfig");S(this,"skier");S(this,"skierGhost");S(this,"gates");S(this,"startTime");S(this,"endTime");this.engine=a}onPreUpdate(a,c){a.input.keyboard.wasPressed(N.RESTART_KEY)&&this.returnToEventManager()}onActivate(a){var c,g;(c=a.data)!=null&&c.raceConfig?(this.raceConfig=(g=a.data)==null?void 0:g.raceConfig,this.prepareRace(this.raceConfig.trackName,this.raceConfig.trackStyle,this.raceConfig.getNextSkierName())):this.returnToEventManager()}onDeactivate(a){this.cleanRace()}stopRace(){var p,x,C;this.endTime=this.engine.clock.now(),this.skier.finishRace(),this.uiTimer.stop();const a=this.endTime-this.startTime,c=new Sl((p=this.raceConfig)==null?void 0:p.raceNumber,(x=this.skier)==null?void 0:x.skierName,new Date,a),g=this.engine.trackManager.saveRecord(this.raceConfig.trackName,new Il(c));this.uiManager.updateUiState("result"),this.uiManager.updateUi(((C=this.skier)==null?void 0:C.speed)||0,a,g),this.uiManager.backToManagerButton.addEventListener("click",()=>this.returnToEventManager(c),{once:!0}),this.engine.soundPlayer.playSound(lt.FinishRaceSound,.3)}addPenalty(a){console.warn("Missed the gate n°",a," (+ 3s.)"),this.camera.shake(3,3,250),this.startTime-=3e3,this.engine.soundPlayer.playSound(lt.GateMissedSound,.3)}updateGhost(a){this.skierGhost.pos=Ut(0,a+N.FRONT_GHOST_DISTANCE)}setupCamera(){this.camera.strategy.elasticToActor(this.skierGhost,.12,.2),this.camera.zoom=N.CAMERA_ZOOM}startRace(){this.uiTimer.start(),this.listenStopRaceEvent(),this.skier.startRace(),this.engine.soundPlayer.playSound(lt.StartRaceSound,.3)}returnToEventManager(a){lt.FinishRaceSound.stop(),this.engine.goToScene("eventManager",a?{raceResult:a}:{}),this.engine.removeScene("race")}prepareRace(a,c,g){this.skier=new yn(g),this.add(this.skier),this.skierGhost=new Yi({width:1,height:1,pos:Ut(this.skier.pos.x,this.skier.pos.y+N.FRONT_GHOST_DISTANCE)}),this.setupCamera(),this.buildTrack(a,c),this.add(this.skierGhost),this.addTimer(this.uiTimer),this.engine.soundPlayer.playSound(lt.WinterSound,.1,!0)}cleanRace(){this.startTime=void 0,this.endTime=void 0,this.uiManager.updateUiState("menu"),this.gates=[],this.raceConfig=void 0,this.engine.soundPlayer.stopSound(lt.WinterSound),this.clear()}listenStopRaceEvent(){var a;(a=this.gates)==null||a.find(c=>c.isFinalGate).on("stoprace",()=>this.stopRace())}updateUi(){var a;this.uiManager.state==="menu"&&this.uiManager.updateUiState("racing"),this.startTime=this.startTime||this.engine.clock.now(),this.uiManager.updateUi(((a=this.skier)==null?void 0:a.speed)||0,(this.endTime||this.engine.clock.now())-this.startTime)}buildTrack(a,c){this.engine.trackManager.loadTrack(a,c).gates.forEach(g=>{var p;(p=this.gates)==null||p.push(g),this.add(g)})}}class Pl extends An{constructor(a){super();S(this,"eventConfig");S(this,"trackManager");S(this,"eventManagerUi",document.getElementById("event-manager"));S(this,"skier1Label",document.getElementById("skier-1-label"));S(this,"skier2Label",document.getElementById("skier-2-label"));S(this,"lastResultsContainer",document.getElementById("last-results-container"));S(this,"actualRankingContainer",document.getElementById("actual-ranking-container"));S(this,"nextRacesContainer",document.getElementById("next-races-container"));S(this,"startRaceButton",document.getElementById("start-race-button"));this.engine=a,this.startRaceButton.addEventListener("click",()=>{this.eventConfig.getNextRace()?this.startRace():this.backToMenu()})}onActivate(a){var c,g,p;this.trackManager=this.engine.trackManager,(c=a.data)!=null&&c.eventConfig&&(this.eventConfig=(g=a.data)==null?void 0:g.eventConfig,this.startRaceButton),(p=a.data)!=null&&p.raceResult&&this.eventConfig.updateRaceResult(a.data.raceResult),this.prepareManager(this.eventConfig)}onDeactivate(a){this.cleanManager()}prepareManager(a){this.eventConfig=a,this.startRaceButton.innerText=this.eventConfig.getNextRace()?"Race":"Back to menu",this.eventManagerUi.style.display="flex",this.skier1Label.innerText=a.skier1Name,this.skier2Label.innerText=a.skier2Name,this.lastResultsContainer.innerHTML=this.prepareLastResultsTable(a)||'
No result for the moment
',this.actualRankingContainer.innerHTML=this.prepareActualRankingTable(a)||'
No ranking for the moment
',this.nextRacesContainer.innerHTML=this.prepareNextRacesTable(a)||'
No race to come
',this.engine.soundPlayer.showButton()}cleanManager(){this.eventManagerUi.style.display="none",this.startRaceButton.removeEventListener("click",()=>{})}startRace(){this.engine.soundPlayer.hideButton(),this.engine.addScene("race",new Tl(this.engine)),this.engine.goToScene("race",{raceConfig:this.eventConfig.getNextRace()})}prepareLastResultsTable(a){return a.racesResults.filter(c=>c.isStarted()).map(c=>{const g=`${c.skier1Timing?" ("+this.trackManager.getRecordPosition(c.trackName,c.skier1Timing)+")":""}`,p=`${c.skier2Timing?" ("+this.trackManager.getRecordPosition(c.trackName,c.skier2Timing)+")":""}`;return`
Race ${c.raceNumber}
${c.trackName}
${c.skier1Timing?ye(c.skier1Timing,N.FORMAT_TIMING):""}${g}
${c.isCompleted()?"("+ye(Math.abs(c.skier1Timing-c.skier2Timing),N.FORMAT_TIMING)+")":""}
-
${c.skier2Timing?ye(c.skier2Timing,N.FORMAT_TIMING):""}${m}
-
`}).join("")}prepareActualRankingTable(a){const c=a.getActualRankings();return c.filter(g=>g.time>0).map((g,m)=>` -
-
${m+1}
+
${c.skier2Timing?ye(c.skier2Timing,N.FORMAT_TIMING):""}${p}
+
`}).join("")}prepareActualRankingTable(a){const c=a.getActualRankings();return c.filter(g=>g.time>0).map((g,p)=>` +
+
${p+1}
${g.skierName}
${g.victories}
${ye(g.time,N.FORMAT_TIMING)}
-
${m>0?"+ "+ye(Math.abs(g.time-c[0].time),N.FORMAT_TIMING):""}
+
${p>0?"+ "+ye(Math.abs(g.time-c[0].time),N.FORMAT_TIMING):""}
- `).join("")}prepareNextRacesTable(a){return a.racesResults.filter(c=>!c.isCompleted()).map((c,g)=>{let m=`${this.trackManager.getRecord(a.trackName)||""}`;m=m?ye(+m,N.FORMAT_TIMING):"";let x="";return c.skier1Timing||(x+=` + `).join("")}prepareNextRacesTable(a){return a.racesResults.filter(c=>!c.isCompleted()).map((c,g)=>{let p=`${this.trackManager.getRecord(a.trackName)||""}`;p=p?ye(+p,N.FORMAT_TIMING):"";let x="";return c.skier1Timing||(x+=`
Race ${c.raceNumber}
${c.trackName}
${c.skier1Name}
-
${m}
+
${p}
`),c.skier2Timing||(x+=`
Race ${c.raceNumber}
${c.trackName}
${c.skier2Name}
-
${m}
-
`),x}).join("")}backToMenu(){this.engine.goToScene("eventSetup")}}class Pl{constructor(){S(this,"sound",!0);S(this,"soundMuteButton",document.getElementById("sound-mute-button"));S(this,"soundButton",document.getElementById("sound-button"));this.soundButton.addEventListener("click",()=>{this.changeSound(!0)}),this.soundMuteButton.addEventListener("click",()=>{this.changeSound(!1)})}showButton(){this.sound?(this.soundMuteButton.style.display="inline",this.soundButton.style.display="none"):(this.soundButton.style.display="inline",this.soundMuteButton.style.display="none")}hideButton(){this.soundMuteButton.style.display="none",this.soundButton.style.display="none"}playSound(d,a,c=!1){this.sound&&(d.loop=c,d.play(a))}stopSound(d){d.stop()}changeSound(d){this.sound=d,this.showButton()}}class vo{}S(vo,"base64Image","data:image/png;base64,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");class Rl extends Wa{constructor(){super({displayMode:Ha.FitContainer,backgroundColor:_n.White,fixedUpdateFps:60,maxFps:60,canvasElementId:"game"});S(this,"resourcesToLoad",[lt.Skier,lt.SkierCarving,lt.SkierSliding,lt.SkierBraking,lt.SkierJumping,lt.PoleRed,lt.PoleBlue,lt.PoleTouchedRed,lt.PoleTouchedBlue,lt.PolePassedRed,lt.PolePassedBlue,lt.FinalPole,lt.WinterSound,lt.StartRaceSound,lt.FinishRaceSound,lt.GateMissedSound,lt.PoleHittingSound]);S(this,"trackManager",new wl);S(this,"soundPlayer",new Pl)}initialize(){this.addScene("eventSetup",new bl(this)),this.addScene("eventManager",new Tl(this)),this.trackManager.importDefaultTracks(),this.start(this.getLoader()),this.goToScene("eventSetup")}onPreUpdate(a,c){a.input.keyboard.wasPressed(N.DEBUG_KEY)&&a.showDebug(!a.isDebug),a.input.keyboard.wasPressed(N.EXIT_KEY)&&this.restartGame(),a.input.keyboard.wasPressed(N.SOUND_KEY)}getLoader(){const a=new Za(this.resourcesToLoad);return a.backgroundColor="#b0d4dd",a.logo=vo.base64Image,a.logoHeight=250,a.logoWidth=250,a.loadingBarColor=_n.fromHex("4a8291"),a.startButtonFactory=()=>{let c=document.createElement("button");return c.classList.add("start-button"),c.textContent="Play",c},a}restartGame(){this.removeScene("race"),this.goToScene("eventSetup")}}const Bl=new Rl;Bl.initialize(); +
${p}
+
`),x}).join("")}backToMenu(){this.engine.goToScene("eventSetup")}}class Rl{constructor(){S(this,"sound",!0);S(this,"soundMuteButton",document.getElementById("sound-mute-button"));S(this,"soundButton",document.getElementById("sound-button"));this.soundButton.addEventListener("click",()=>{this.changeSound(!0)}),this.soundMuteButton.addEventListener("click",()=>{this.changeSound(!1)})}showButton(){this.sound?(this.soundMuteButton.style.display="inline",this.soundButton.style.display="none"):(this.soundButton.style.display="inline",this.soundMuteButton.style.display="none")}hideButton(){this.soundMuteButton.style.display="none",this.soundButton.style.display="none"}playSound(d,a,c=!1){this.sound&&(d.loop=c,d.play(a))}stopSound(d){d.stop()}changeSound(d){this.sound=d,this.showButton()}}class xo{}S(xo,"base64Image","data:image/png;base64,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");class Ml extends Za{constructor(){super({displayMode:Ya.FitContainer,backgroundColor:vn.White,fixedUpdateFps:60,maxFps:60,canvasElementId:"game"});S(this,"resourcesToLoad",[lt.Skier,lt.SkierCarving,lt.SkierSliding,lt.SkierBraking,lt.SkierJumping,lt.PoleRed,lt.PoleBlue,lt.PoleTouchedRed,lt.PoleTouchedBlue,lt.PolePassedRed,lt.PolePassedBlue,lt.FinalPole,lt.WinterSound,lt.StartRaceSound,lt.FinishRaceSound,lt.GateMissedSound,lt.PoleHittingSound]);S(this,"trackManager",new Al);S(this,"soundPlayer",new Rl)}initialize(){this.addScene("eventSetup",new El(this)),this.addScene("eventManager",new Pl(this)),this.trackManager.importDefaultTracks(),this.start(this.getLoader()),this.goToScene("eventSetup")}onPreUpdate(a,c){a.input.keyboard.wasPressed(N.DEBUG_KEY)&&a.showDebug(!a.isDebug),a.input.keyboard.wasPressed(N.EXIT_KEY)&&this.restartGame(),a.input.keyboard.wasPressed(N.SOUND_KEY)}getLoader(){const a=new Ja(this.resourcesToLoad);return a.backgroundColor="#b0d4dd",a.logo=xo.base64Image,a.logoHeight=250,a.logoWidth=250,a.loadingBarColor=vn.fromHex("4a8291"),a.startButtonFactory=()=>{let c=document.createElement("button");return c.classList.add("start-button"),c.textContent="Play",c},a}restartGame(){this.removeScene("race"),this.goToScene("eventSetup")}}const Bl=new Ml;Bl.initialize(); diff --git a/assets/index-NYnQYsoM.css b/assets/index-NYnQYsoM.css deleted file mode 100644 index 201290b..0000000 --- a/assets/index-NYnQYsoM.css +++ /dev/null @@ -1 +0,0 @@ -@import"https://fonts.googleapis.com/css2?family=Inter&display=swap";html body{padding:0;margin:0;font-family:Inter,sans-serif;color:#4a8291}.ui-container{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;width:100vw;background-color:#b0d4dd;overflow:hidden}.ui-container .header{display:flex;width:calc(100% - 4rem);align-items:center;justify-content:center}.ui-container .header img{width:80px;height:80px}.ui-container .hud-container{position:relative;border-radius:10px;overflow:hidden}.ui-container .hud-container .actions-toolbar{position:absolute;right:0;width:200px;padding:2rem;gap:1rem;display:flex;align-items:center;justify-content:flex-end;color:#fff;z-index:10}.ui-container .hud-container .actions-toolbar #sound-button,.ui-container .hud-container .actions-toolbar #sound-mute-button{cursor:pointer;display:none}.ui-container .hud-container .dialog{display:flex;flex-direction:column;padding-bottom:1rem;width:calc(100% - 4rem);height:calc(100% - 4rem);padding:2rem;border:none;color:#fff;background-color:#4a8291}.ui-container .hud-container .dialog .dialog-content{flex:1 1 auto;padding:1rem}.ui-container .hud-container .dialog .dialog-actions{padding:1rem}.ui-container .hud-container #event-setup{display:none;position:absolute;width:100%;height:100%;align-items:center;justify-content:center}.ui-container .hud-container #event-setup .dialog{font-size:1.3rem}.ui-container .hud-container #event-setup .dialog .title{margin-bottom:2rem}.ui-container .hud-container #event-setup .dialog .dialog-content{font-size:1.7rem;justify-content:center;display:flex;flex-direction:column;gap:2rem}.ui-container .hud-container #event-setup .dialog .dialog-content .form-line{display:flex;gap:1rem;justify-content:space-between;align-items:center;overflow:hidden}.ui-container .hud-container #event-setup .dialog .dialog-content .form-line .input{display:flex;overflow:hidden}.ui-container .hud-container #event-setup select,.ui-container .hud-container #event-setup input,.ui-container .hud-container #event-setup input:active,.ui-container .hud-container #event-setup input:focus{max-width:300px;font-size:1.5rem;padding:.5rem 1rem;color:#fff;background-color:transparent;border:2px solid white;border-radius:4px;outline:none}.ui-container .hud-container #event-manager{display:none;position:absolute;width:100%;height:100%;align-items:center;justify-content:center}.ui-container .hud-container #event-manager .dialog{font-size:1.3rem}.ui-container .hud-container #event-manager .dialog .title{margin-bottom:.5rem}.ui-container .hud-container #event-manager .dialog .dialog-content{display:flex;flex:1 1 auto;flex-direction:column;justify-content:space-between}.ui-container .hud-container #event-manager .dialog .dialog-content .section-title{font-size:.9rem;margin-top:.5rem}.ui-container .hud-container #event-manager .dialog .dialog-content #last-results-container,.ui-container .hud-container #event-manager .dialog .dialog-content #next-races-container,.ui-container .hud-container #event-manager .dialog .dialog-content #actual-ranking-container{display:flex;flex-direction:column;max-height:120px;overflow:auto;border-radius:5px}.ui-container .hud-container #event-manager .dialog .dialog-content .placeholder{display:flex;font-size:.8rem;justify-content:center;padding:.5rem;color:#cecece}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.header-line,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.header-line{display:flex;justify-content:space-between;padding:.3rem 1rem;font-size:.75rem;color:#cecece}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line{display:flex;justify-content:space-between;padding:.3rem 1rem;font-size:.75rem;background-color:#ffffff29}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line.next,.ui-container .hud-container #event-manager .dialog .dialog-content .header-line.result-line.first,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line.next,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line.result-line.first{background-color:#6aff9091}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line div,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line div{min-width:100px;max-width:100px;overflow:hidden}.ui-container .hud-container #event-manager .dialog .dialog-content .header-line div.winner,.ui-container .hud-container #event-manager .dialog .dialog-content .result-line div.winner{font-weight:700;color:#6aff9091}.ui-container .hud-container #event-manager .dialog .dialog-content button{margin-top:1rem}.ui-container .hud-container button{cursor:pointer;font-size:1.8rem;font-weight:400;border-radius:10px;width:100%;padding:1rem;color:#fff;border:0;background-color:#3d3378!important}.ui-container .hud-container .game-container{width:800px;max-width:100vw;height:600px;max-height:100vh}.ui-container .hud-container .game-container .start-button{font-weight:200;border:none;background-color:#3d3378!important;font-size:1.5rem;width:300px}.ui-container .hud-container #result{position:absolute;top:50px;left:0;width:calc(100% - 2rem);max-height:500px;padding:1rem;display:none;flex-direction:column;align-items:center;justify-content:center;gap:1rem;background-color:#4a8291ce}.ui-container .hud-container #result #position{font-size:4rem;color:#fff}.ui-container .hud-container #result #timing{font-size:2rem;font-style:italic;color:#fff}.ui-container .hud-container #result .results-table{display:flex;flex-direction:column;width:100%;align-items:center;justify-content:center;overflow:hidden;font-family:monospace}.ui-container .hud-container #result .results-table #results-container{display:flex;flex-direction:column;max-height:300px;overflow-y:auto}.ui-container .hud-container #result .results-table .header-line,.ui-container .hud-container #result .results-table .result-line{padding:.5rem;display:flex;font-size:.75rem;color:#ffffffce}.ui-container .hud-container #result .results-table .header-line div:first-child,.ui-container .hud-container #result .results-table .result-line div:first-child{width:75px}.ui-container .hud-container #result .results-table .header-line div,.ui-container .hud-container #result .results-table .result-line div{width:150px}.ui-container .hud-container #result .results-table .header-line div.time,.ui-container .hud-container #result .results-table .result-line div.time{text-align:right}.ui-container .hud-container #result .results-table .result-line{color:#fff;background-color:#ffffff29}.ui-container .hud-container #result .results-table .result-line.current{background-color:#6aff9091}.ui-container .hud-container #result button#back-to-manager{margin-top:1rem;font-size:1.8rem;width:200px}.ui-container .hud-container #speedometer,.ui-container .hud-container #timer{display:flex;width:90px;align-items:center;justify-content:end;position:absolute;bottom:0;color:#4c829087;font-size:1.1rem;padding:.25rem .5rem;height:40px;visibility:hidden}.ui-container .hud-container #speedometer#speedometer,.ui-container .hud-container #timer#speedometer{left:0}.ui-container .hud-container #speedometer#timer,.ui-container .hud-container #timer#timer{right:0}.ui-container .footer{display:flex;justify-content:center;align-items:center;padding:2rem}i.fa-solid{font-size:1.2rem}::-webkit-scrollbar{width:0px} diff --git a/index.html b/index.html index c75d394..160c34c 100644 --- a/index.html +++ b/index.html @@ -7,8 +7,8 @@ Retro Ski - - + + @@ -32,6 +32,17 @@ placeholder="davos, adelboden, etc." /> +
+
Style (only on new track)
+
+ +
+
Skier 1
diff --git a/test.txt b/test.txt deleted file mode 100644 index 8e08f3b..0000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -sdasd \ No newline at end of file diff --git a/tracks/adelboden.json b/tracks/adelboden.json new file mode 100644 index 0000000..a4fc969 --- /dev/null +++ b/tracks/adelboden.json @@ -0,0 +1,426 @@ +{ + "name": "adelboden", + "style": "SL", + "date": "2024-01-18T16:20:31.580Z", + "gates": [ + { + "x": -152.9519786477767, + "y": -270, + "color": "blue", + "width": 177.3044568257645, + "gateNumber": 1, + "isFinal": false + }, + { + "x": 144.76768708924726, + "y": -473.83743873629516, + "color": "red", + "width": 195.48433128116667, + "gateNumber": 2, + "isFinal": false + }, + { + "x": -84.64858218483265, + "y": -734.8412729360473, + "color": "blue", + "width": 188.80823673113392, + "gateNumber": 3, + "isFinal": false + }, + { + "x": 14.689340371904384, + "y": -990.1013782012334, + "color": "red", + "width": 173.86849183497563, + "gateNumber": 4, + "isFinal": false + }, + { + "x": -187.15361851945661, + "y": -1259.878339001215, + "color": "blue", + "width": 177.67097819465738, + "gateNumber": 5, + "isFinal": false + }, + { + "x": 118.07580980867158, + "y": -1450.6270178794039, + "color": "red", + "width": 199.97709034859028, + "gateNumber": 6, + "isFinal": false + }, + { + "x": -89.87116598473283, + "y": -1624.9451729610669, + "color": "blue", + "width": 195.45344582409078, + "gateNumber": 7, + "isFinal": false + }, + { + "x": 37.74060163998807, + "y": -1806.2302061916407, + "color": "red", + "width": 189.01582509078762, + "gateNumber": 8, + "isFinal": false + }, + { + "x": -58.37570151716076, + "y": -1976.3769851776851, + "color": "blue", + "width": 195.057724999463, + "gateNumber": 9, + "isFinal": false + }, + { + "x": 168.76340143116062, + "y": -2147.6282421302485, + "color": "red", + "width": 165.16923440012764, + "gateNumber": 10, + "isFinal": false + }, + { + "x": -145.49075979404108, + "y": -2406.8490799884353, + "color": "blue", + "width": 181.21343748804, + "gateNumber": 11, + "isFinal": false + }, + { + "x": 49.54221176926131, + "y": -2643.7175019773144, + "color": "red", + "width": 190.7664931532099, + "gateNumber": 12, + "isFinal": false + }, + { + "x": -16.861466475246363, + "y": -2850.6014662250072, + "color": "blue", + "width": 196.9311428746866, + "gateNumber": 13, + "isFinal": false + }, + { + "x": 150.08606569161216, + "y": -3115.14089029409, + "color": "red", + "width": 187.6950401964951, + "gateNumber": 14, + "isFinal": false + }, + { + "x": -37.02904666084383, + "y": -3328.2085718361823, + "color": "blue", + "width": 173.20101937921493, + "gateNumber": 15, + "isFinal": false + }, + { + "x": 123.85317772332277, + "y": -3540.6134073216513, + "color": "red", + "width": 183.2064718662054, + "gateNumber": 16, + "isFinal": false + }, + { + "x": -196.14682227667723, + "y": -3767.0197829499693, + "color": "blue", + "width": 163.34315630817474, + "gateNumber": 17, + "isFinal": false + }, + { + "x": 123.85317772332277, + "y": -3937.8061632462095, + "color": "red", + "width": 197.39603288990327, + "gateNumber": 18, + "isFinal": false + }, + { + "x": -196.14682227667723, + "y": -4157.9738684430195, + "color": "blue", + "width": 162.53056477304963, + "gateNumber": 19, + "isFinal": false + }, + { + "x": 123.85317772332277, + "y": -4427.41281161471, + "color": "red", + "width": 176.4262027581292, + "gateNumber": 20, + "isFinal": false + }, + { + "x": -196.14682227667723, + "y": -4603.49428804389, + "color": "blue", + "width": 197.5875602820333, + "gateNumber": 21, + "isFinal": false + }, + { + "x": 34.02487219570653, + "y": -4781.989036200279, + "color": "red", + "width": 172.34634340543877, + "gateNumber": 22, + "isFinal": false + }, + { + "x": -56.235141570894626, + "y": -5015.29665394756, + "color": "blue", + "width": 183.05508458588187, + "gateNumber": 23, + "isFinal": false + }, + { + "x": 18.252873297733807, + "y": -5262.149041449943, + "color": "red", + "width": 185.9701973624289, + "gateNumber": 24, + "isFinal": false + }, + { + "x": -52.430969937061924, + "y": -5468.543475557336, + "color": "blue", + "width": 190.86415338347842, + "gateNumber": 25, + "isFinal": false + }, + { + "x": 99.73231756324294, + "y": -5670.064750359165, + "color": "red", + "width": 165.70501972707714, + "gateNumber": 26, + "isFinal": false + }, + { + "x": -220.26768243675707, + "y": -5845.75583177915, + "color": "blue", + "width": 199.9323360409528, + "gateNumber": 27, + "isFinal": false + }, + { + "x": 99.73231756324293, + "y": -6115.397554125779, + "color": "red", + "width": 190.4622860353976, + "gateNumber": 28, + "isFinal": false + }, + { + "x": -220.26768243675707, + "y": -6356.730220282943, + "color": "blue", + "width": 178.58916815767716, + "gateNumber": 29, + "isFinal": false + }, + { + "x": 58.42497179711435, + "y": -6530.198126162856, + "color": "red", + "width": 163.67332937174527, + "gateNumber": 30, + "isFinal": false + }, + { + "x": -261.5750282028856, + "y": -6787.404677469013, + "color": "blue", + "width": 192.74773895186968, + "gateNumber": 31, + "isFinal": false + }, + { + "x": 56.48575639159729, + "y": -7009.255492297837, + "color": "red", + "width": 181.32992558242486, + "gateNumber": 32, + "isFinal": false + }, + { + "x": -195.28882242521655, + "y": -7201.817270803172, + "color": "blue", + "width": 163.0891042144832, + "gateNumber": 33, + "isFinal": false + }, + { + "x": 102.91388857399595, + "y": -7444.539937337508, + "color": "red", + "width": 169.47010278764853, + "gateNumber": 34, + "isFinal": false + }, + { + "x": -116.66117567779533, + "y": -7694.033045300818, + "color": "blue", + "width": 187.45351593411698, + "gateNumber": 35, + "isFinal": false + }, + { + "x": 14.579458273940363, + "y": -7945.654085342867, + "color": "red", + "width": 197.92391044221063, + "gateNumber": 36, + "isFinal": false + }, + { + "x": 53.55390857811748, + "y": -8187.147162920943, + "color": "blue", + "width": 186.23398486563593, + "gateNumber": 37, + "isFinal": false + }, + { + "x": -39.431495851814354, + "y": -8357.293104898858, + "color": "red", + "width": 165.19478735703171, + "gateNumber": 38, + "isFinal": false + }, + { + "x": 89.42811365669064, + "y": -8592.25613644711, + "color": "blue", + "width": 177.40091066641352, + "gateNumber": 39, + "isFinal": false + }, + { + "x": -157.6359337902689, + "y": -8787.753306685954, + "color": "red", + "width": 192.09808396118126, + "gateNumber": 40, + "isFinal": false + }, + { + "x": 57.89106792346334, + "y": -8979.597594976483, + "color": "blue", + "width": 187.47086772763492, + "gateNumber": 41, + "isFinal": false + }, + { + "x": -260.246285797928, + "y": -9245.350721542494, + "color": "red", + "width": 171.20414851875557, + "gateNumber": 42, + "isFinal": false + }, + { + "x": 59.75371420207199, + "y": -9485.004670258926, + "color": "blue", + "width": 193.13412458688623, + "gateNumber": 43, + "isFinal": false + }, + { + "x": 65.47900780291286, + "y": -9751.475256664016, + "color": "red", + "width": 182.477489988876, + "gateNumber": 44, + "isFinal": false + }, + { + "x": -24.0221297099463, + "y": -9972.08549011309, + "color": "blue", + "width": 176.24874483989223, + "gateNumber": 45, + "isFinal": false + }, + { + "x": 77.70646059258642, + "y": -10191.783013130278, + "color": "red", + "width": 197.90348715124247, + "gateNumber": 46, + "isFinal": false + }, + { + "x": -242.29353940741356, + "y": -10407.422584789927, + "color": "blue", + "width": 184.76541312567963, + "gateNumber": 47, + "isFinal": false + }, + { + "x": 77.70646059258644, + "y": -10639.074693211132, + "color": "red", + "width": 186.10033531699318, + "gateNumber": 48, + "isFinal": false + }, + { + "x": -242.29353940741356, + "y": -10894.082156931056, + "color": "blue", + "width": 194.24322872295596, + "gateNumber": 49, + "isFinal": false + }, + { + "x": 77.70646059258644, + "y": -11082.238042242067, + "color": "red", + "width": 170.13934729168776, + "gateNumber": 50, + "isFinal": false + }, + { + "x": -375, + "y": -11288.31095250928, + "color": "red", + "width": 750, + "isFinal": true + } + ], + "records": [ + { + "player": "Emilie Hugas", + "date": "2024-01-18T16:24:40.206Z", + "timing": 44634.5 + }, + { + "player": "Mathieu Hugas", + "date": "2024-01-18T16:27:53.888Z", + "timing": 46468 + } + ] +} \ No newline at end of file diff --git a/tracks/davos.json b/tracks/davos.json index 2b643a5..332698f 100644 --- a/tracks/davos.json +++ b/tracks/davos.json @@ -1,5 +1,6 @@ { "name": "davos", + "style": "GS", "date": "2024-01-06T22:37:35.797Z", "gates": [ { @@ -258,5 +259,16 @@ "isFinal": true } ], - "records": [] + "records": [ + { + "player": "Mathieu Hugas", + "date": "2024-01-11T15:09:23.209Z", + "timing": 31617.40000000596 + }, + { + "player": "Emilie Hugas", + "date": "2024-01-18T14:51:29.866Z", + "timing": 33067.800000071526 + } + ] } \ No newline at end of file diff --git a/tracks/soelden.json b/tracks/soelden.json index 39a12be..e88ff3c 100644 --- a/tracks/soelden.json +++ b/tracks/soelden.json @@ -1,5 +1,6 @@ { "name": "soelden", + "style": "GS", "date": "2024-01-18T15:05:20.590Z", "gates": [ { diff --git a/tracks/wengen.json b/tracks/wengen.json new file mode 100644 index 0000000..55f342a --- /dev/null +++ b/tracks/wengen.json @@ -0,0 +1,418 @@ +{ + "name": "wengen", + "style": "SG", + "date": "2024-01-18T16:14:25.944Z", + "gates": [ + { + "x": -156.41778004295332, + "y": -500, + "color": "blue", + "width": 194.0340755521742, + "gateNumber": 1, + "isFinal": false + }, + { + "x": 163.58221995704668, + "y": -909.9917499749173, + "color": "red", + "width": 167.74087909515703, + "gateNumber": 2, + "isFinal": false + }, + { + "x": -156.41778004295332, + "y": -1408.8251334810398, + "color": "blue", + "width": 198.41754193692515, + "gateNumber": 3, + "isFinal": false + }, + { + "x": 27.839520327423084, + "y": -1802.2166757830523, + "color": "red", + "width": 189.30105566053308, + "gateNumber": 4, + "isFinal": false + }, + { + "x": -133.18273475304287, + "y": -2158.330205060089, + "color": "blue", + "width": 164.03061076606323, + "gateNumber": 5, + "isFinal": false + }, + { + "x": 23.299085863618892, + "y": -2489.922599820674, + "color": "red", + "width": 160.39671620805856, + "gateNumber": 6, + "isFinal": false + }, + { + "x": -190.38094361666361, + "y": -2908.1333324354814, + "color": "blue", + "width": 191.59944417967964, + "gateNumber": 7, + "isFinal": false + }, + { + "x": 35.37612116593736, + "y": -3255.510531000004, + "color": "red", + "width": 171.4871657615376, + "gateNumber": 8, + "isFinal": false + }, + { + "x": -145.62309334081226, + "y": -3738.4610113871054, + "color": "blue", + "width": 173.86490021221425, + "gateNumber": 9, + "isFinal": false + }, + { + "x": 42.790469936809664, + "y": -4142.4973595221645, + "color": "red", + "width": 171.3781347213542, + "gateNumber": 10, + "isFinal": false + }, + { + "x": -98.24822767912977, + "y": -4516.626704336066, + "color": "blue", + "width": 161.77542345746753, + "gateNumber": 11, + "isFinal": false + }, + { + "x": 157.73674898766154, + "y": -4949.589309567406, + "color": "red", + "width": 191.64995206065637, + "gateNumber": 12, + "isFinal": false + }, + { + "x": -35.659202977650516, + "y": -5293.45327902431, + "color": "blue", + "width": 176.65436308845943, + "gateNumber": 13, + "isFinal": false + }, + { + "x": 146.6280234197108, + "y": -5663.415530622964, + "color": "red", + "width": 166.26740011822233, + "gateNumber": 14, + "isFinal": false + }, + { + "x": -118.9941192044865, + "y": -6039.17661104481, + "color": "blue", + "width": 184.73113735419315, + "gateNumber": 15, + "isFinal": false + }, + { + "x": 129.7960245228134, + "y": -6478.718397370124, + "color": "red", + "width": 191.4432947205913, + "gateNumber": 16, + "isFinal": false + }, + { + "x": -190.2039754771866, + "y": -6964.426156658624, + "color": "blue", + "width": 198.76570655265613, + "gateNumber": 17, + "isFinal": false + }, + { + "x": 75.99187765497106, + "y": -7389.616388055164, + "color": "red", + "width": 184.3456833557983, + "gateNumber": 18, + "isFinal": false + }, + { + "x": -244.00812234502894, + "y": -7860.774813563722, + "color": "blue", + "width": 166.3017170835514, + "gateNumber": 19, + "isFinal": false + }, + { + "x": 75.99187765497106, + "y": -8209.58436519747, + "color": "red", + "width": 185.7654412635593, + "gateNumber": 20, + "isFinal": false + }, + { + "x": -122.99472726147206, + "y": -8673.199630573163, + "color": "blue", + "width": 190.35432391057043, + "gateNumber": 21, + "isFinal": false + }, + { + "x": 169.79174527929678, + "y": -9065.555066802246, + "color": "red", + "width": 178.96990252413963, + "gateNumber": 22, + "isFinal": false + }, + { + "x": -150.20825472070322, + "y": -9538.641324748065, + "color": "blue", + "width": 183.60169493291772, + "gateNumber": 23, + "isFinal": false + }, + { + "x": 18.676264825821665, + "y": -10013.83414196108, + "color": "red", + "width": 194.55373659447855, + "gateNumber": 24, + "isFinal": false + }, + { + "x": -168.84584159763293, + "y": -10481.904222720681, + "color": "blue", + "width": 187.75237305714816, + "gateNumber": 25, + "isFinal": false + }, + { + "x": 61.713828112170226, + "y": -10961.061939891464, + "color": "red", + "width": 168.89506625423712, + "gateNumber": 26, + "isFinal": false + }, + { + "x": -71.74697704601104, + "y": -11447.247365138923, + "color": "blue", + "width": 196.8955576953216, + "gateNumber": 27, + "isFinal": false + }, + { + "x": 0.7303060391208748, + "y": -11783.448885613063, + "color": "red", + "width": 187.64256936290647, + "gateNumber": 28, + "isFinal": false + }, + { + "x": -118.03983358913001, + "y": -12162.43661936472, + "color": "blue", + "width": 182.6774765335323, + "gateNumber": 29, + "isFinal": false + }, + { + "x": 24.833190584597617, + "y": -12490.994594996979, + "color": "red", + "width": 163.83560232792266, + "gateNumber": 30, + "isFinal": false + }, + { + "x": -86.93012517955351, + "y": -12898.887229343718, + "color": "blue", + "width": 165.45158477173837, + "gateNumber": 31, + "isFinal": false + }, + { + "x": 98.7473808027089, + "y": -13352.260088442094, + "color": "red", + "width": 172.29345338340056, + "gateNumber": 32, + "isFinal": false + }, + { + "x": -135.2174085403293, + "y": -13695.897773530636, + "color": "blue", + "width": 196.92932690053144, + "gateNumber": 33, + "isFinal": false + }, + { + "x": 16.92188293534325, + "y": -14152.409809294379, + "color": "red", + "width": 161.51384570408186, + "gateNumber": 34, + "isFinal": false + }, + { + "x": -303.07811706465674, + "y": -14488.714795311675, + "color": "blue", + "width": 175.8691201338439, + "gateNumber": 35, + "isFinal": false + }, + { + "x": 16.921882935343262, + "y": -14841.411722496265, + "color": "red", + "width": 178.42079457550767, + "gateNumber": 36, + "isFinal": false + }, + { + "x": -303.07811706465674, + "y": -15250.879968578647, + "color": "blue", + "width": 167.23609861427155, + "gateNumber": 37, + "isFinal": false + }, + { + "x": 16.921882935343262, + "y": -15720.246785628786, + "color": "red", + "width": 170.5733718632249, + "gateNumber": 38, + "isFinal": false + }, + { + "x": -301.21588224635656, + "y": -16151.555821329059, + "color": "blue", + "width": 187.11626004936454, + "gateNumber": 39, + "isFinal": false + }, + { + "x": 7.448196232400471, + "y": -16585.825296878655, + "color": "red", + "width": 187.2649907613198, + "gateNumber": 40, + "isFinal": false + }, + { + "x": -312.55180376759955, + "y": -17049.154837956103, + "color": "blue", + "width": 195.6150784206531, + "gateNumber": 41, + "isFinal": false + }, + { + "x": 7.4481962324004485, + "y": -17448.86672843719, + "color": "red", + "width": 185.50463438579152, + "gateNumber": 42, + "isFinal": false + }, + { + "x": -188.53721735832767, + "y": -17946.592394678395, + "color": "blue", + "width": 166.56310509313178, + "gateNumber": 43, + "isFinal": false + }, + { + "x": 124.24204005071962, + "y": -18354.59605468592, + "color": "red", + "width": 182.78036846756112, + "gateNumber": 44, + "isFinal": false + }, + { + "x": -4.910617091843983, + "y": -18784.16049955728, + "color": "blue", + "width": 161.54727372757188, + "gateNumber": 45, + "isFinal": false + }, + { + "x": 189.58618406629878, + "y": -19260.602384921433, + "color": "red", + "width": 180.99350509834423, + "gateNumber": 46, + "isFinal": false + }, + { + "x": -130.41381593370122, + "y": -19629.40451207453, + "color": "blue", + "width": 183.7834631723535, + "gateNumber": 47, + "isFinal": false + }, + { + "x": 126.87175975736321, + "y": -20071.714643920634, + "color": "red", + "width": 192.46716091858463, + "gateNumber": 48, + "isFinal": false + }, + { + "x": -193.1282402426368, + "y": -20510.392436745627, + "color": "blue", + "width": 183.36342591056106, + "gateNumber": 49, + "isFinal": false + }, + { + "x": -375, + "y": -20972.36596025854, + "color": "red", + "width": 750, + "isFinal": true + } + ], + "records": [ + { + "player": "Emilie Hugas", + "date": "2024-01-18T16:16:12.351Z", + "timing": 45818 + }, + { + "player": "Mathieu Hugas", + "date": "2024-01-18T16:15:13.001Z", + "timing": 46017.89999997616 + } + ] +} \ No newline at end of file diff --git a/tracks/zermatt.json b/tracks/zermatt.json new file mode 100644 index 0000000..7e327a6 --- /dev/null +++ b/tracks/zermatt.json @@ -0,0 +1,426 @@ +{ + "name": "zermatt", + "style": "DH", + "date": "2024-01-18T16:31:11.527Z", + "gates": [ + { + "x": 175.32112305325415, + "y": -550, + "color": "blue", + "width": 182.02520589320682, + "gateNumber": 1, + "isFinal": false + }, + { + "x": -144.67887694674585, + "y": -1074.7483893584822, + "color": "red", + "width": 191.7874346935178, + "gateNumber": 2, + "isFinal": false + }, + { + "x": 120.5577100731615, + "y": -1593.898466339607, + "color": "blue", + "width": 178.69932833989307, + "gateNumber": 3, + "isFinal": false + }, + { + "x": -199.4422899268385, + "y": -2053.531410488122, + "color": "red", + "width": 163.9057889924269, + "gateNumber": 4, + "isFinal": false + }, + { + "x": 120.5577100731615, + "y": -2463.886319870833, + "color": "blue", + "width": 177.94502507844024, + "gateNumber": 5, + "isFinal": false + }, + { + "x": -92.40776661298821, + "y": -2883.237087957154, + "color": "red", + "width": 180.70067892524776, + "gateNumber": 6, + "isFinal": false + }, + { + "x": 17.09387366712258, + "y": -3431.675244249097, + "color": "blue", + "width": 186.04687153525012, + "gateNumber": 7, + "isFinal": false + }, + { + "x": -191.8233587934189, + "y": -3894.6628243111754, + "color": "red", + "width": 167.59049345707476, + "gateNumber": 8, + "isFinal": false + }, + { + "x": 125.11794865833825, + "y": -4413.330901904594, + "color": "blue", + "width": 168.79114744365106, + "gateNumber": 9, + "isFinal": false + }, + { + "x": -194.88205134166174, + "y": -4891.424747042923, + "color": "red", + "width": 183.16947393910093, + "gateNumber": 10, + "isFinal": false + }, + { + "x": 114.61734206949177, + "y": -5405.293310037033, + "color": "blue", + "width": 174.1795602215406, + "gateNumber": 11, + "isFinal": false + }, + { + "x": -133.4386663559949, + "y": -5819.6831470855495, + "color": "red", + "width": 163.64659923755164, + "gateNumber": 12, + "isFinal": false + }, + { + "x": 65.39042907041548, + "y": -6296.501624396458, + "color": "blue", + "width": 189.34490621026384, + "gateNumber": 13, + "isFinal": false + }, + { + "x": -136.01683217366755, + "y": -6720.134553804712, + "color": "red", + "width": 195.03240194088926, + "gateNumber": 14, + "isFinal": false + }, + { + "x": 69.86460636953478, + "y": -7177.306707080947, + "color": "blue", + "width": 195.1321789672542, + "gateNumber": 15, + "isFinal": false + }, + { + "x": -250.13539363046522, + "y": -7646.1049515993245, + "color": "red", + "width": 189.0429908309267, + "gateNumber": 16, + "isFinal": false + }, + { + "x": 69.86460636953478, + "y": -8037.472127856251, + "color": "blue", + "width": 179.2689898827389, + "gateNumber": 17, + "isFinal": false + }, + { + "x": -52.030487159886064, + "y": -8515.311487439565, + "color": "red", + "width": 189.22643405319053, + "gateNumber": 18, + "isFinal": false + }, + { + "x": 135.07551381205568, + "y": -8921.305412123122, + "color": "blue", + "width": 168.4738805308115, + "gateNumber": 19, + "isFinal": false + }, + { + "x": -6.655376707498245, + "y": -9398.319736865487, + "color": "red", + "width": 193.9666237912555, + "gateNumber": 20, + "isFinal": false + }, + { + "x": 3.1416596719257432, + "y": -9901.105359364237, + "color": "blue", + "width": 177.37350440652082, + "gateNumber": 21, + "isFinal": false + }, + { + "x": -316.85834032807423, + "y": -10340.021617501578, + "color": "red", + "width": 169.62068329294564, + "gateNumber": 22, + "isFinal": false + }, + { + "x": 3.1416596719257655, + "y": -10833.666941078018, + "color": "blue", + "width": 167.4590192020463, + "gateNumber": 23, + "isFinal": false + }, + { + "x": -252.63302267410612, + "y": -11374.73013376605, + "color": "red", + "width": 176.44863456041924, + "gateNumber": 24, + "isFinal": false + }, + { + "x": 67.36697732589388, + "y": -11770.024008597804, + "color": "blue", + "width": 196.81537010958152, + "gateNumber": 25, + "isFinal": false + }, + { + "x": -224.8093573457037, + "y": -12310.958385732683, + "color": "red", + "width": 184.2800462378568, + "gateNumber": 26, + "isFinal": false + }, + { + "x": 22.15260784909977, + "y": -12856.245443843252, + "color": "blue", + "width": 192.97992574876747, + "gateNumber": 27, + "isFinal": false + }, + { + "x": -297.84739215090025, + "y": -13294.567061282905, + "color": "red", + "width": 160.6399912105498, + "gateNumber": 28, + "isFinal": false + }, + { + "x": 22.152607849099752, + "y": -13823.79532775815, + "color": "blue", + "width": 165.06088108450277, + "gateNumber": 29, + "isFinal": false + }, + { + "x": -297.84739215090025, + "y": -14327.783302272725, + "color": "red", + "width": 184.3618479626898, + "gateNumber": 30, + "isFinal": false + }, + { + "x": 22.152607849099752, + "y": -14830.061464176986, + "color": "blue", + "width": 191.30796201278503, + "gateNumber": 31, + "isFinal": false + }, + { + "x": -241.43512773954066, + "y": -15327.025328538606, + "color": "red", + "width": 174.13926151902578, + "gateNumber": 32, + "isFinal": false + }, + { + "x": 78.56487226045934, + "y": -15787.341907634685, + "color": "blue", + "width": 186.2721924716355, + "gateNumber": 33, + "isFinal": false + }, + { + "x": -227.8888209258704, + "y": -16212.151771158622, + "color": "red", + "width": 166.59279746873656, + "gateNumber": 34, + "isFinal": false + }, + { + "x": -165.83619415832334, + "y": -16744.98190916917, + "color": "blue", + "width": 173.31721073681277, + "gateNumber": 35, + "isFinal": false + }, + { + "x": 29.97460321284196, + "y": -17117.398739919852, + "color": "red", + "width": 185.92993831862555, + "gateNumber": 36, + "isFinal": false + }, + { + "x": -99.05872197469782, + "y": -17493.56289457468, + "color": "blue", + "width": 179.53047914464835, + "gateNumber": 37, + "isFinal": false + }, + { + "x": 205.62923880507626, + "y": -17887.921816327525, + "color": "red", + "width": 168.9159271555012, + "gateNumber": 38, + "isFinal": false + }, + { + "x": 115.57114091940088, + "y": -18301.431608724666, + "color": "blue", + "width": 163.66891761665252, + "gateNumber": 39, + "isFinal": false + }, + { + "x": -204.42885908059912, + "y": -18829.33407738185, + "color": "red", + "width": 199.68070648452334, + "gateNumber": 40, + "isFinal": false + }, + { + "x": 76.46892758670518, + "y": -19268.370191244507, + "color": "blue", + "width": 184.98296217191535, + "gateNumber": 41, + "isFinal": false + }, + { + "x": -243.53107241329482, + "y": -19748.069227247663, + "color": "red", + "width": 167.79714682694848, + "gateNumber": 42, + "isFinal": false + }, + { + "x": 76.46892758670518, + "y": -20229.11119702662, + "color": "blue", + "width": 191.68457467304927, + "gateNumber": 43, + "isFinal": false + }, + { + "x": -243.53107241329482, + "y": -20611.429927455898, + "color": "red", + "width": 185.76815029684522, + "gateNumber": 44, + "isFinal": false + }, + { + "x": 76.46892758670518, + "y": -21001.344080842384, + "color": "blue", + "width": 166.19683044878772, + "gateNumber": 45, + "isFinal": false + }, + { + "x": -243.53107241329482, + "y": -21501.073760707117, + "color": "red", + "width": 170.80370887937278, + "gateNumber": 46, + "isFinal": false + }, + { + "x": 76.46892758670518, + "y": -21898.501243162264, + "color": "blue", + "width": 186.10069666151415, + "gateNumber": 47, + "isFinal": false + }, + { + "x": -243.53107241329482, + "y": -22410.391472997737, + "color": "red", + "width": 167.00367361702172, + "gateNumber": 48, + "isFinal": false + }, + { + "x": 15.360393036676983, + "y": -22909.015895298784, + "color": "blue", + "width": 180.67070749934476, + "gateNumber": 49, + "isFinal": false + }, + { + "x": 110.72800596349498, + "y": -23447.603901004026, + "color": "red", + "width": 182.29800783853008, + "gateNumber": 50, + "isFinal": false + }, + { + "x": -375, + "y": -23912.064865753455, + "color": "red", + "width": 750, + "isFinal": true + } + ], + "records": [ + { + "player": "Emilie Hugas", + "date": "2024-01-18T16:39:06.435Z", + "timing": 53917.800000071526 + }, + { + "player": "Mathieu Hugas", + "date": "2024-01-18T16:36:10.118Z", + "timing": 55400.799999952316 + } + ] +} \ No newline at end of file