{"version":3,"file":"js/app.10a3a43e.js","mappings":"yIAKA,MAAMA,EAAmC,CACrCC,QAAS,CACLC,OAAQ,CACJC,QAAS,CACLC,eAAe,EACfC,gBAAgB,EAChBC,UAAW,IAEfC,MAAO,CACHD,UAAW,GACXF,eAAe,EACfC,gBAAgB,GAEpBG,UAAW,CACPF,UAAW,GACXF,eAAe,EACfC,gBAAgB,GAEpBI,MAAO,CACHH,UAAW,GACXF,eAAe,EACfC,gBAAgB,IAGxBK,cAAe,CACXC,GAAI,CACAC,cAAc,GAElBC,IAAK,CACDD,cAAc,IAGtBE,QAAS,CACLX,QAAS,CACLY,iBAAiB,EACjBC,iBAAiB,EACjBC,cAAc,GAElBJ,IAAK,CACDE,iBAAiB,EACjBC,iBAAiB,EACjBC,cAAc,GAGlBC,MAAO,CACHH,iBAAiB,EACjBC,iBAAiB,EACjBC,cAAc,KAI1BE,SAAU,CACNC,SAAU,CACNF,MAAO,CACHG,WAAY,EACZC,YAAa,EACbC,SAAS,EACTC,aAAc,MAElBC,IAAK,CACDJ,WAAY,EACZC,YAAa,EACbC,SAAS,GAEbG,OAAQ,CACJL,WAAY,EACZC,YAAa,EACbC,SAAS,EACTC,aAAc,KAElBG,KAAM,CACFN,WAAY,EACZC,YAAa,GACbC,SAAS,EACTC,aAAc,MAElBI,MAAO,CACHP,WAAY,GACZC,YAAa,GACbO,iBAAkB,GAClBN,SAAS,EACTC,aAAc,OAGtBM,MAAO,CACHnB,GAAI,CACAoB,OAAO,GAEXlB,IAAK,CACDkB,OAAO,MAMvB,SAASC,IACL,IAAK,MAAMC,KAAYjC,EACnB,IAAK,MAAMkC,KAAWlC,EAASiC,GAAW,CACtC,MAAME,EAAgBC,aAAaC,QAC/B,YAAYJ,KAAYC,KAGxBC,GAAiBA,KAAiBnC,EAASiC,GAAUC,KACrDI,EAAW,IACJA,KACAtC,EAASiC,GAAUC,GAASC,I,CAKnD,CAEA,IAAIG,EAAW,IACRtC,EAASmB,SAASW,MAAMnB,MACxBX,EAASmB,SAASC,SAASK,OAC3BzB,EAASC,QAAQC,OAAOC,WACxBH,EAASC,QAAQa,QAAQX,WACzBH,EAASC,QAAQa,QAAQX,WACzBH,EAASC,QAAQS,cAAcG,KAEtCmB,IC1HA,MAAMO,EAAe,IACfC,EAAgB,IAEtB,SAASC,EAASC,GACd,MAAMC,EAAKD,GAAO,GAAM,IAClBE,EAAKF,GAAO,EAAK,IACjBG,EAAU,IAANH,EAEV,MAAO,CAAEC,IAAGC,IAAGC,IACnB,CAEA,SAASC,EAAkBC,GACvB,MAAMC,EAAU,IAAIC,EAAAA,IAEdC,EAAa,IAAID,EAAAA,IAAoBD,GAASG,KAChDC,EAAiBL,IAGfM,EAAc,IAAIJ,EAAAA,IAAwB,CAC5CK,MAAO,SACPC,IAAKL,EACLM,KAAMP,EAAAA,IACNQ,KAAK,IAGT,OAAOJ,CACX,CAEA,SAASK,EAAuBC,EAAWZ,GACvC,MAAMa,EAAgB,IAEhBC,EAAarB,EAAgB,EAAIoB,EACjCE,EAActB,EAAgB,EAEpC,GAAImB,EAAIE,EAAY,CAChB,MAAME,EAAaC,KAAKC,IAAI,EAAIN,EAAIE,EAAY,IAEhD,MAAO,CACHK,MAAOH,EACPI,IAAK,EAAIJ,EACTK,QAAS,EACTC,OAAQ,E,CAGhB,GAAIV,EAAIG,EAAa,CACjB,MAAMQ,EAAcN,KAAKC,IACrB,GAAKzB,EAAgBmB,GAAKG,EAC1B,IAGJ,MAAO,CACHI,MAAO,EACPC,IAAK,EACLC,QAAS,EAAIE,EACbD,OAAQC,E,CAGhB,MAAO,CACHJ,MAAO,EACPC,IAAK,GAAKR,EAAIE,EAAa,IAAMC,EAAcD,GAC/CO,SAAUT,EAAIE,EAAa,IAAMC,EAAcD,GAC/CQ,OAAQ,EAEhB,CAEA,SAASjB,EAAiBL,GACtB,MAAMwB,EAAS,IAAIC,kBAAkBjC,EAAeC,EAAgB,GAE9DiC,EAAY,CACdC,IAAK,CACDC,WAAY,QACZC,SAAU,QACVC,aAAc,SACdC,YAAa,UAEjBC,OAAQ,CACJJ,WAAY,QACZC,SAAU,QACVC,aAAc,SACdC,YAAa,SAEjBE,MAAO,CACHL,WAAY,OACZC,SAAU,QACVC,aAAc,QACdC,YAAa,UAIfG,EAAuClC,EAAMoB,IAE7CQ,EAAalC,EAASgC,EAAUQ,GAAUN,YAC1CC,EAAWnC,EAASgC,EAAUQ,GAAUL,UACxCC,EAAepC,EAASgC,EAAUQ,GAAUJ,cAC5CC,EAAcrC,EAASgC,EAAUQ,GAAUH,aAEjD,IAAK,IAAInB,EAAI,EAAGA,EAAInB,EAAemB,IAC/B,IAAK,IAAIuB,EAAI,EAAGA,EAAI3C,EAAc2C,IAAK,CACnC,MAAMC,EAA+B,GAAxBxB,EAAIpB,EAAe2C,GAEhC,IAAI5B,EAAQ,CACRX,EAAG,EACHC,EAAG,EACHC,EAAG,GAGP,MAAMuC,EAAI1B,EAAuBC,EAAGZ,GAEpCO,EAAQ,CACJX,EACIgC,EAAWhC,EAAIyC,EAAElB,MACjBU,EAASjC,EAAIyC,EAAEjB,IACfU,EAAalC,EAAIyC,EAAEhB,QACnBU,EAAYnC,EAAIyC,EAAEf,OACtBzB,EACI+B,EAAW/B,EAAIwC,EAAElB,MACjBU,EAAShC,EAAIwC,EAAEjB,IACfU,EAAajC,EAAIwC,EAAEhB,QACnBU,EAAYlC,EAAIwC,EAAEf,OACtBxB,EACI8B,EAAW9B,EAAIuC,EAAElB,MACjBU,EAAS/B,EAAIuC,EAAEjB,IACfU,EAAahC,EAAIuC,EAAEhB,QACnBU,EAAYjC,EAAIuC,EAAEf,QAG1BE,EAAOY,GAAO7B,EAAMX,EACpB4B,EAAOY,EAAM,GAAK7B,EAAMV,EACxB2B,EAAOY,EAAM,GAAK7B,EAAMT,EACxB0B,EAAOY,EAAM,GAAK,G,CAI1B,MAAME,EAASC,SAASC,cAAc,UAChCC,EAAMH,EAAOI,WAAW,MAE9BJ,EAAOK,MAAQnD,EACf8C,EAAOM,OAASnD,EAEhB,MAAMoD,EAAYJ,EAAKK,gBAAgBtD,EAAcC,GAIrD,GAHAoD,EAAUE,KAAKC,IAAIxB,GACnBiB,EAAKQ,aAAaJ,EAAW,EAAG,GAEf,UAAbX,EAAsB,CACtBO,EAAKS,UAAY,UACjB,IAAK,IAAIb,EAAI,EAAGA,EAAI,KAAMA,IAAK,CAC3B,MAAMF,EAAIlB,KAAKkC,MAAMlC,KAAKmC,SAAW5D,GAC/BoB,EAAIK,KAAKkC,MAAOlC,KAAKmC,SAAW3D,EAAiB,GACjDG,EAAIqB,KAAKC,IAAoB,IAAhBD,KAAKmC,SAAgB,GAExCX,EAAKY,YACLZ,EAAKa,IAAInB,EAAGvB,EAAGhB,EAAG,EAAa,EAAVqB,KAAKsC,IAC1Bd,EAAKe,M,EAIb,MAAMC,EAAUnB,EAAOoB,YACvB,OAAOD,CACX,CAEA,SAASE,EAAU3D,GACf,MAAMoB,EAAM,IAAIlB,EAAAA,IACZ,IAAIA,EAAAA,IACJH,EAAkBC,IAGtB,OAAOoB,CACX,CCvKA,SAASwC,EAAkB5D,GACvB,MAAMC,EAAU,IAAIC,EAAAA,IAEd2D,EAAY,CACdlC,IAAK,UACLM,MAAO,YACPD,OAAQ,WAGN8B,EAAa,IAAI5D,EAAAA,IAAoBD,GAASG,KAChD,sBAAsByD,EAAU7D,EAAMoB,QAGpC2C,EAAc,IAAI7D,EAAAA,IAAwB,CAC5C8D,aAAa,EACbxD,IAAKsD,EACLpD,KAAK,EACLuD,SAAU/D,EAAAA,MAGd,OAAO6D,CACX,CAEA,SAASG,EAAUlE,GACf,MAAMmE,EAAM,IAAIjE,EAAAA,IACZ,IAAIA,EAAAA,IACJ0D,EAAkB5D,IAGtB,OAAOmE,CACX,C,QChBA,MAAMC,UAAkBC,EAAAA,IACpBC,YAAYC,GACRC,MACIJ,EAAUK,SACV,IAAIC,EAAAA,IAAkB,CAAEH,QAAS,EAAGP,aAAa,KAGrDW,KAAKC,aAAc,EAEnBD,KAAKE,KAAO,YACZF,KAAKG,eAAgB,EACrBH,KAAKI,YAAcC,IAInB,MAAMC,EAAiB,IAAIC,EAAAA,IACrBC,EAAe,IAAID,EAAAA,IAInBE,EAAU,IAAIC,EAAAA,IAAmB,GAAI,GAAIC,EAAAA,KACzCC,EAAe,IAAIF,EAAAA,IAAmB,GAAI,GAAIC,EAAAA,KAI9CE,EAAWpB,EAAUK,SAErBgB,EAAa,IAAIC,EAAAA,IAAkB,CACrCC,SAAU,CACNC,MAAO,CAAEC,MAAO,MAChBC,eAAgB,CAAED,MAAO,OAE7BE,aAA0B,uRAe1BC,eAA4B,mIAS5BC,WAAW,EACXC,YAAY,EACZlC,aAAa,IAGXmC,EAAa,IAAIT,EAAAA,IAAkB,CACrCC,SAAU,CACNnF,IAAK,CAAEqF,MAAOT,GACdQ,MAAO,CAAEC,MAAO,MAChBC,eAAgB,CAAED,MAAO,OAE7BE,aAA0B,uWAoB1BC,eAA4B,6LAa5BC,WAAW,EACXC,YAAY,EACZlC,aAAa,IAKXoC,EAAQ,IAAI/B,EAAAA,IAAKmB,EAAUC,GAI3BY,EAAW,GAEXC,EAASC,EAAiBC,OAE1BC,EAAY,IAAIf,EAAAA,IAAkB,CACpCC,SAAU,CACNnF,IAAK,CAAEqF,MAAO,MACdN,aAAc,CAAEM,MAAON,GACvBhF,MAAO,CAAEsF,MAAO,IAAIa,EAAAA,IAAM,WAC1Bd,MAAO,CAAEC,MAAO,IAAIc,EAAAA,KACpBb,eAAgB,CAAED,MAAO,IAAIX,EAAAA,MAEjCa,aAAcO,EAAOP,aACrBC,eAAgBM,EAAON,eACvB/B,SAAU2C,EAAAA,IACV5C,aAAa,EACbkC,YAAY,IAGVW,EAAQ,IAAIxC,EAAAA,IAAKmB,EAAUiB,GAEjC9B,KAAKmC,WAAa,SAAUC,GACxBV,EAASW,KAAKD,EAClB,EAIA,MAAMnB,EAAQ,IAAIe,EAAAA,IACZM,EAAuB,IAAIN,EAAAA,IAC3BO,EAAY,IAAIC,EAAAA,IAChBC,EAAW,IAAIC,EAAAA,IAErB1C,KAAK2C,eAAiB,SAAUC,EAAUC,EAAOC,GAC7CF,EAASG,mBAAmBN,GAE5B,MAAMO,EAAYP,EAASQ,EAAIR,EAASS,EAClCC,EAAoBV,EAASS,EAAI,EACjCE,EAAqBX,EAASQ,EAAI,EAExC,IAAII,EAAO,GAAKZ,EAASQ,EAczB,GAbAhC,EAAM5C,IAAIgF,EAAOL,EAAWK,GAE5Bd,EAAUe,IAAIjF,IAAIoE,EAASjF,EAAI,IAAKiF,EAASxG,EAAI,KACjDsG,EAAUgB,IAAIlF,IACVoE,EAASjF,GAAKiF,EAASS,EAAI,KAC3BT,EAASxG,GAAKwG,EAASQ,EAAI,MAK/BzC,EAAagD,sBAAsBxD,KAAKyD,aACxCjD,EAAakD,aAAaZ,EAAOa,sBAE7BnD,EAAa0C,EAAI,KAErB5C,EACKsD,KAAKpD,GACLkD,aAAaZ,EAAOe,kBAIzBvB,EAAqB9E,EACjBiF,EAASjF,EACT8C,EAAe9C,EAAI2F,EACnBA,EACA,EACJb,EAAqBrG,EACjBwG,EAASxG,EACTqE,EAAerE,EAAImH,EACnBA,EACA,EAIAb,EAAUuB,cAAcxB,IAAuB,CAG/CM,EAASmB,yBACLzB,EACA7B,GAKJ,IAAIO,EAAWF,EAAWE,SAC1BA,EAAS,SAASE,MAAQD,EAC1BD,EAAS,kBAAkBE,MAAQZ,EAEnCsC,EAASoB,mBACLlB,EACA,KACAjC,EACAC,EACAW,EACA,MAKJmB,EAASmB,yBACLzB,EACA1B,GAKJI,EAAWQ,EAAWR,SACtBA,EAAS,SAASE,MAAQD,EAC1BD,EAAS,kBAAkBE,MAAQZ,EAEnCsC,EAASoB,mBACLlB,EACA,KACAjC,EACAW,EACAC,EACA,MAKJ,MAAMwC,EAA2B,GAAnB3D,EAAe9C,EACvB0G,EAA2B,GAAnB5D,EAAerE,EAE7B,IAAK,IAAIyB,EAAI,EAAGyG,EAAIzC,EAAS0C,OAAQ1G,EAAIyG,EAAGzG,IAAK,CAC7C,MAAM0E,EAAUV,EAAShE,GAEnBsD,EAAWc,EAAUd,SAE3BA,EAAS,SAASE,MAAM0C,KAAKxB,EAAQxG,OACrCoF,EAAS,OAAOE,MAAQkB,EAAQtD,QAChCkC,EAAS,kBAAkBE,MAAM1D,EAC7B8C,EAAe9C,EAAIyG,EAAO7B,EAAQiC,SACtCrD,EAAS,kBAAkBE,MAAMjF,EAC7BqE,EAAerE,EAAIiI,EAAO9B,EAAQiC,SACtCrD,EAAS,mBAAqB,CAAEE,MAAOtB,GACvCyD,EAAOjB,EAAQiB,KAAOZ,EAASQ,EAC/B,MAAMD,EAAYP,EAASQ,EAAIR,EAASS,EAExClC,EAAS,SAASE,MAAM7C,IAAIgF,EAAOL,EAAWK,GAE9CvB,EAAUwC,oBAAqB,EAE/B1B,EAASoB,mBACLlB,EACA,KACAjC,EACAiB,EACAI,EACA,KAER,CACJ,CACJ,EAEAlC,KAAKuE,QAAU,WACXzD,EAAWyD,UACX/C,EAAW+C,UACXzC,EAAUyC,UAEV9D,EAAQ8D,UACR3D,EAAa2D,UAEb,IAAK,IAAI7G,EAAI,EAAGyG,EAAIzC,EAAS0C,OAAQ1G,EAAIyG,EAAGzG,IACxCgE,EAAShE,GAAGoB,QAAQyF,SAE5B,CACJ,EAKJ,MAAM3C,EACFjC,YAAYb,EAASuE,EAAO,EAAGgB,EAAW,EAAGzI,EAAQ,IAAImG,EAAAA,IAAM,WAC3D/B,KAAKlB,QAAUA,EACfkB,KAAKqD,KAAOA,EACZrD,KAAKqE,SAAWA,EAChBrE,KAAKpE,MAAQA,CACjB,EAGJgG,EAAiBC,OAAS,CACtBb,SAAU,CACNnF,IAAK,CAAEqF,MAAO,MACdN,aAAc,CAAEM,MAAO,MACvBtF,MAAO,CAAEsF,MAAO,MAChBD,MAAO,CAAEC,MAAO,MAChBC,eAAgB,CAAED,MAAO,MACzBsD,gBAAiB,CAAEtD,MAAO,OAG9BE,aAA0B,uuCA0C1BC,eAA4B,iUAoBhC5B,EAAUK,SAAY,WAClB,MAAMe,EAAW,IAAI4D,EAAAA,IAEfC,EAAe,IAAIC,aAAa,EACjC,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,IAG3DC,EAAoB,IAAIC,EAAAA,IAAkBH,EAAc,GAY9D,OAVA7D,EAASiE,SAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,IAClCjE,EAASkE,aACL,WACA,IAAIC,EAAAA,IAA2BJ,EAAmB,EAAG,GAAG,IAE5D/D,EAASkE,aACL,KACA,IAAIC,EAAAA,IAA2BJ,EAAmB,EAAG,GAAG,IAGrD/D,CACX,CApBsB,GCxXtB,MAAMoE,EAGFtF,YAAYuF,EAAcrC,GAGtB,IAHyC,2BACzC7C,KAAKmF,KAAOnF,KAAKoF,WAAWF,GAExBrC,EAAO,CACP,MAAMwC,EAAgB,IAAI9J,EAAAA,IAAwB,CAC9CK,MAAO,IAEX,IAAK,MAAM0J,KAAWtF,KAAKmF,KACvB,IAAK,MAAMI,KAASD,EAChB,IAAK,IAAI5H,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,MAAM8H,EAAO,IAAIjK,EAAAA,IACb,IAAIA,EAAAA,IAAkB,EAAG,EAAG,GAC5B8J,GAEJG,EAAKvE,MAAMzD,EAAI,GACfgI,EAAKvE,MAAMhF,EAAI,GACfuJ,EAAKvE,MAAMiC,EAAI,GACfsC,EAAKC,SAASpH,IACVkH,EAAM,EAAQ,EAAJ7H,GACV6H,EAAM,EAAQ,EAAJ7H,GACV6H,EAAM,EAAQ,EAAJ7H,IAEdmF,EAAM6C,IAAIF,E,EAK9B,CAEQJ,WAAWF,GACf,MAAMS,EAAqB,GAE3B,IAAK,MAAML,KAAWJ,EAAMS,SAAU,CAClC,MAAMC,EAAc5F,KAAK6F,cAAcX,EAAOI,GAC9CK,EAAStD,KAAKuD,E,CAGlB,OAAOD,CACX,CAEQG,sBACJC,EACA5K,GAEA,IAAI6K,EAAqB,EAEzB,MAAMC,EAAQ3J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BgL,EAAQ7J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BiL,EAAQ9J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BkL,EACF/J,KAAKgH,IAAIhH,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAAKmB,KAAK4J,IAAIH,EAAE,GAAKzJ,KAAKsC,GAAKzD,EAAE,MAC3DmB,KAAKsC,GAAK,GACT0H,EACFhK,KAAKgH,IAAIhH,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAAKmB,KAAK4J,IAAIH,EAAE,GAAKzJ,KAAKsC,GAAKzD,EAAE,MAC3DmB,KAAKsC,GAAK,GAMf,OAJAoH,GACI,EAAI1J,KAAKiK,KAAKJ,GACd,EAAI7J,KAAKiK,KAAKjK,KAAKiH,IAAI8C,EAAQC,IAAWhK,KAAKiK,KAAKN,EAAQG,GAEzDJ,CACX,CAEQQ,2BACJT,EACA5K,EACAsL,GAEA,MAAMC,GAAepK,KAAKqK,IAAIF,EAAQnK,KAAKsC,GAAKtC,KAAKsC,GAAK,GAAK,GAAK,EAE9DgI,EACFtK,KAAKgH,IAAInI,EAAE,GAAK4K,EAAE,GAAI5K,EAAE,GAAK4K,EAAE,GAAKzJ,KAAKsC,KAAOtC,KAAKsC,GAAK,GAExDiI,EAAQvK,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1B2L,EAAQxK,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAE1B4L,EAAO,CACThB,EAAE,GAAKa,EAAkBtK,KAAKqK,IAAIZ,EAAE,IAAMc,EAC1Cd,EAAE,GACFA,EAAE,GAAKa,EAAkBtK,KAAK0K,IAAIjB,EAAE,GAAKzJ,KAAKsC,IAAMkI,EACpDf,EAAE,IAGAkB,EAAO,CACT9L,EAAE,GAAKyL,EAAkBtK,KAAKqK,IAAIxL,EAAE,IAAM0L,EAC1C1L,EAAE,GACFA,EAAE,GAAKyL,EAAkBtK,KAAK0K,IAAI7L,EAAE,GAAKmB,KAAKsC,IAAMkI,EACpD3L,EAAE,IAGAqC,GACDuI,EAAE,IAAM,EAAIU,GAASQ,EAAK,GAAKR,IAAU,EAAIA,IAC7CM,EAAK,IAAM,EAAIN,GAAStL,EAAE,GAAKsL,GAASA,EAEvCxK,EAAI8J,EAAE,IAAM,EAAIW,GAAevL,EAAE,GAAKuL,EAEtCxD,GACD6C,EAAE,IAAM,EAAIU,GAASQ,EAAK,GAAKR,IAAU,EAAIA,IAC7CM,EAAK,IAAM,EAAIN,GAAStL,EAAE,GAAKsL,GAASA,EAEvCS,EAAKnB,EAAE,IAAM,EAAIU,GAAStL,EAAE,GAAKsL,EACjCU,EAAKpB,EAAE,IAAM,EAAIW,GAAevL,EAAE,GAAKuL,EAE7C,MAAO,CAAClJ,EAAGvB,EAAGiH,EAAGgE,EAAIC,EACzB,CAEQtB,cAAcX,EAAcI,GAChC,MAAM8B,EAAgB,GAEhBhD,EAASkB,EAAQ+B,SAASjD,OAChC,IAAK,IAAI1G,EAAI,EAAGA,EAAI0G,EAAS,EAAG1G,IAAK,CACjC,MAAMqI,EAAIT,EAAQ+B,SAAS3J,GACrBvC,EAAImK,EAAQ+B,SAAS3J,EAAI,GAE3BvC,EAAE,GAAK4K,EAAE,GAAgB,GAAVzJ,KAAKsC,KACpBmH,EAAE,IAAgB,EAAVzJ,KAAKsC,IAGbzD,EAAE,GAAK4K,EAAE,IAAgB,EAAVzJ,KAAKsC,KACpBmH,EAAE,IAAgB,EAAVzJ,KAAKsC,IAGjB,MAAMoH,EAAqBhG,KAAK8F,sBAAsBC,EAAG5K,GAEnDmM,EAAe5J,IAAM0G,EAAS,EAC9BmD,EAAiBvB,GAAsBsB,EAAe,EAAI,GAChE,IAAK,IAAI5J,EAAI,EAAGA,EAAI6J,EAAgB7J,IAAK,CACrC,MAAM8J,EAAqBxH,KAAKwG,2BAC5BT,EACA5K,EACAuC,EAAIsI,GAGFyB,EAAWzH,KAAK0H,+BAClBF,EACAlC,EAAQtH,OAGZoJ,EAAM/E,KAAKoF,E,EAInB,OAAOL,CACX,CAEQM,+BACJnC,EACAvH,GAEA,MAAMiF,EAAIjF,EACJoJ,EAAc,CAChB7B,EAAM,GACNA,EAAM,IACLtC,EAAIsC,EAAM,GACXA,EAAM,GACNA,EAAM,GACNtC,EAAIsC,EAAM,GACVA,EAAM,IAGV,IAAK,IAAI7H,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAExB,MAAMiK,EAASP,EAAU,EAAJ1J,EAAQ,MAAQuF,EAAIsC,EAAM,GAE3CoC,GACAP,EAAU,EAAJ1J,IAAUuF,EAAI3G,KAAKqK,IAAIpB,EAAM,IACnC6B,EAAU,EAAJ1J,EAAQ,IAAMuF,GAAK3G,KAAK0K,IAAIzB,EAAM,IAAM,KAE9C6B,EAAU,EAAJ1J,IAAUuF,EAAI3G,KAAKqK,IAAIpB,EAAM,GAAKjJ,KAAKsC,IAC7CwI,EAAU,EAAJ1J,EAAQ,IAAMuF,GAAK3G,KAAK0K,IAAIzB,EAAM,IAAM,IAI9C6B,EAAU,EAAJ1J,EAAQ,IADdiK,EACoB1E,EAAI3G,KAAKqK,IAAIpB,EAAM,IAEnBtC,EAAI3G,KAAKqK,IAAIpB,EAAM,GAAKjJ,KAAKsC,G,CAIzD,IAAK,IAAIlB,EAAI,EAAGA,EAAI0J,EAAMhD,OAAS,EAAG1G,IAClC0J,EAAM1J,IAAM,EAGhB,OAAO0J,CACX,CAEQQ,IAAIpK,GACR,OAAOA,EAAIA,CACf,CACQqK,MAAMC,EAA6B7E,GACvC,OAAOjD,KAAK4H,IAAIE,EAAEtK,EAAIyF,EAAEzF,GAAKwC,KAAK4H,IAAIE,EAAE7L,EAAIgH,EAAEhH,EAClD,CACQ8L,qBACJC,EACAF,EACA7E,GAEA,MAAMgF,EAAKjI,KAAK6H,MAAMC,EAAG7E,GACzB,GAAU,GAANgF,EAAS,OAAOjI,KAAK6H,MAAMG,EAAGF,GAClC,IAAII,IAAMF,EAAExK,EAAIsK,EAAEtK,IAAMyF,EAAEzF,EAAIsK,EAAEtK,IAAMwK,EAAE/L,EAAI6L,EAAE7L,IAAMgH,EAAEhH,EAAI6L,EAAE7L,IAAMgM,EAElE,OADAC,EAAI5L,KAAKiH,IAAI,EAAGjH,KAAKgH,IAAI,EAAG4E,IACrBlI,KAAK6H,MAAMG,EAAG,CACjBxK,EAAGsK,EAAEtK,EAAI0K,GAAKjF,EAAEzF,EAAIsK,EAAEtK,GACtBvB,EAAG6L,EAAE7L,EAAIiM,GAAKjF,EAAEhH,EAAI6L,EAAE7L,IAE9B,CACQkM,cACJH,EACAF,EACA7E,GAEA,OAAO3G,KAAK8L,KAAKpI,KAAK+H,qBAAqBC,EAAGF,EAAG7E,GACrD,CAEOoF,eAAe7K,EAAWvB,GAC7B,IAAIqM,EAA8B,GAElC,IAAK,MAAMhD,KAAWtF,KAAKmF,KACvBoD,EAAa,IAAK,IAAI7K,EAAI,EAAGA,EAAI4H,EAAQlB,OAAS,EAAG1G,IAAK,CACtD,MAAM8K,EAAS,CACX,CAAClD,EAAQ5H,EAAI,GAAG,GAAI4H,EAAQ5H,EAAI,GAAG,IACnC,CAAC4H,EAAQ5H,EAAI,GAAG,GAAI4H,EAAQ5H,EAAI,GAAG,IACnC,CAAC4H,EAAQ5H,GAAG,GAAI4H,EAAQ5H,GAAG,IAC3B,CAAC4H,EAAQ5H,GAAG,GAAI4H,EAAQ5H,GAAG,KAG/B,IAAK,IAAIA,EAAI,EAAGA,EAAI,EAAGA,IAAK,CACxB,MAAM+K,EAAa,CACfD,GAAQ9K,EAAI,GAAK,GAAG,GAAK8K,EAAO9K,GAAG,GACnC8K,GAAQ9K,EAAI,GAAK,GAAG,GAAK8K,EAAO9K,GAAG,IAEjCgL,EAAe,CAAClL,EAAIgL,EAAO9K,GAAG,GAAIzB,EAAIuM,EAAO9K,GAAG,IAEhDiL,EAAYrM,KAAKsM,MAAMH,EAAW,GAAIA,EAAW,IACvD,IAAII,EAAcvM,KAAKsM,MACnBF,EAAa,GACbA,EAAa,IAGbG,EAAcF,IACdE,GAAyB,EAAVvM,KAAKsC,IAGxB,MAAMkK,EAAaD,EAAcF,EACjC,GAAIG,EAAaxM,KAAKsC,GAClB,SAAS2J,C,CAIjB,MAAMQ,EAAc,CAAEvL,IAAGvB,KAEnB+M,EAAU,CAAExL,EAAG8H,EAAQ5H,GAAG,GAAIzB,EAAGqJ,EAAQ5H,GAAG,IAC5CuL,EAAU,CAAEzL,EAAG8H,EAAQ5H,GAAG,GAAIzB,EAAGqJ,EAAQ5H,GAAG,IAC5CwL,EAAU,CAAE1L,EAAG8H,EAAQ5H,EAAI,GAAG,GAAIzB,EAAGqJ,EAAQ5H,EAAI,GAAG,IACpDyL,EAAU,CAAE3L,EAAG8H,EAAQ5H,EAAI,GAAG,GAAIzB,EAAGqJ,EAAQ5H,EAAI,GAAG,IAEpD0L,EAAQpJ,KAAKmI,cAAcY,EAAaC,EAASC,GACjDI,EAAQrJ,KAAKmI,cAAcY,EAAaG,EAASC,GACjDG,EAAcF,EAAQC,EAEtBE,EAAQvJ,KAAKmI,cAAcY,EAAaC,EAASE,GACjDM,EAAQxJ,KAAKmI,cAAcY,EAAaE,EAASE,GACjDM,EAAcF,EAAQC,EAEtBE,EACDpE,EAAQ5H,GAAG,GAAK8L,EAASC,EACzBnE,EAAQ5H,GAAG,GAAK6L,EAASE,EACxBE,EACDrE,EAAQ5H,EAAI,GAAG,GAAK8L,EAASC,EAC7BnE,EAAQ5H,EAAI,GAAG,GAAK6L,EAASE,EAE5BxL,EAA2B,CAC7ByL,GAAWL,EAAQC,GACfK,GAAWP,EAAQE,GACvBhE,EAAQ5H,GAAG,IAGf4K,EAAQjG,KAAKpE,E,CAKrB,OADAqK,EAAUA,EAAQsB,MAAK,CAAC7D,EAAG5K,IAAO4K,EAAE,GAAK5K,EAAE,GAAK,GAAK,IAC9CmN,CACX,E,cCjSJ,SAAS9B,EACLT,EACA5K,EACAsL,GAEA,MAAMC,GAAepK,KAAKqK,IAAIF,EAAQnK,KAAKsC,GAAKtC,KAAKsC,GAAK,GAAK,GAAK,EAE9DgI,EACFtK,KAAKgH,IAAInI,EAAE+L,GAAKnB,EAAEmB,GAAI/L,EAAE+L,GAAKnB,EAAEmB,GAAK5K,KAAKsC,KAAOtC,KAAKsC,GAAK,GAExDiI,EAAQvK,KAAK4J,IAAIH,EAAEvI,EAAIrC,EAAEqC,GACzBsJ,EAAQxK,KAAK4J,IAAIH,EAAE7C,EAAI/H,EAAE+H,GAEzB6D,EAAO,CACTvJ,EAAGuI,EAAEvI,EAAIoJ,EAAkBtK,KAAKqK,IAAIZ,EAAEmB,IAAML,EAC5C5K,EAAG8J,EAAE9J,EACLiH,EAAG6C,EAAE7C,EAAI0D,EAAkBtK,KAAK0K,IAAIjB,EAAEmB,GAAK5K,KAAKsC,IAAMkI,EACtDI,GAAInB,EAAEmB,IAGJD,EAAO,CACTzJ,EAAGrC,EAAEqC,EAAIoJ,EAAkBtK,KAAKqK,IAAIxL,EAAE+L,IAAML,EAC5C5K,EAAGd,EAAEc,EACLiH,EAAG/H,EAAE+H,EAAI0D,EAAkBtK,KAAK0K,IAAI7L,EAAE+L,GAAK5K,KAAKsC,IAAMkI,EACtDI,GAAI/L,EAAE+L,IAGJ1J,GACDuI,EAAEvI,GAAK,EAAIiJ,GAASQ,EAAKzJ,EAAIiJ,IAAU,EAAIA,IAC3CM,EAAKvJ,GAAK,EAAIiJ,GAAStL,EAAEqC,EAAIiJ,GAASA,EAErCxK,EAAI8J,EAAE9J,GAAK,EAAIyK,GAAevL,EAAEc,EAAIyK,EAEpCxD,GACD6C,EAAE7C,GAAK,EAAIuD,GAASQ,EAAK/D,EAAIuD,IAAU,EAAIA,IAC3CM,EAAK7D,GAAK,EAAIuD,GAAStL,EAAE+H,EAAIuD,GAASA,EAErCS,EAAKnB,EAAEmB,IAAM,EAAIT,GAAStL,EAAE+L,GAAKT,EACjCU,EAAKpB,EAAEoB,IAAM,EAAIT,GAAevL,EAAEgM,GAAKT,EAE7C,MAAO,CACHlJ,IACAvB,IACAiH,IACAgE,KACAC,KAER,CAQA,SAAS0C,EACL9D,EACA5K,EACA6K,EACA3K,EACAyO,GAEA,MAAMzC,EAAwC,CAAC,EAE3ClM,EAAE+L,GAAKnB,EAAEmB,IAAM5K,KAAKsC,KACpBmH,EAAEmB,IAAgB,EAAV5K,KAAKsC,IAGjB,IAAK,IAAIlB,EAAI,EAAGA,EAAIsI,EAAoBtI,IAAK,CACzC,MAAMqM,EAAgBvD,EAClBT,EACA5K,EACAuC,EAAIsI,GAEFgE,EAAgBxD,EAClBT,EACA5K,GACCuC,EAAI,GAAKsI,GAGRiE,EAAcvC,EAChBqC,EACAC,EACA3O,EACAyO,EAAQ9L,MACR8L,EAAQI,QAAUxM,IAAMsI,EAAqB,EAC7C8D,EAAQK,SAAiB,IAANzM,GAGvB,IAAK,MAAM0M,KAAQH,EACV5C,EAAS+C,KACV/C,EAAS+C,GAAQ,IAErB/C,EAAS+C,GAAM/H,QAAQ4H,EAAYG,G,CAI3C,OAAO/C,CACX,CAUA,SAASK,EACL3B,EACA5K,EACAE,EACA2C,EACAqM,EACAC,GAEA,MAAMjD,EAAwC,CAC1CkD,IAAK,GACLC,KAAM,GACNC,MAAO,GACPC,OAAQ,IAGNC,EAAItP,EAAMuP,YAAc,IAExB3H,EAAIjF,EAGVqJ,EAASkD,IAAIlI,MAAM,EAAK,GAAIY,GAAI,EAAK,EAAGA,EAAG,EAAK,GAAIA,GACpDoE,EAASkD,IAAIlI,MAAM,EAAK,EAAGY,EAAG,EAAK,EAAGA,EAAG,EAAK,GAAIA,GAGlDoE,EAASqD,OAAOrI,KAAK,GAAMsI,GAAI1H,GAAI,GAAM0H,EAAG1H,GAAI,GAAM0H,GAAI1H,GAC1DoE,EAASqD,OAAOrI,KAAK,GAAMsI,EAAG1H,GAAI,GAAM0H,EAAG1H,EAAG,GAAM0H,GAAI1H,GAGxDoE,EAASmD,KAAKnI,KAAK,GAAMsI,EAAG1H,GAAI,EAAK,EAAGA,GAAI,GAAM0H,EAAG1H,GACrDoE,EAASmD,KAAKnI,MAAM,EAAK,EAAGY,EAAG,GAAM0H,EAAG1H,EAAG,EAAK,EAAGA,GAGnDoE,EAASoD,MAAMpI,MAAM,GAAMsI,GAAI1H,GAAI,EAAK,GAAIA,EAAG,GAAM0H,GAAI1H,GACzDoE,EAASoD,MAAMpI,MAAM,EAAK,GAAIY,EAAG,EAAK,GAAIA,EAAG,GAAM0H,GAAI1H,GAGnDoH,IACAhD,EAASwD,MAAQ,GACjBxD,EAASwD,MAAMxI,KAAK,EAAK,EAAGY,EAAG,GAAM0H,GAAI1H,EAAG,EAAK,GAAIA,GACrDoE,EAASwD,MAAMxI,KAAK,EAAK,EAAGY,EAAG,GAAM0H,EAAG1H,EAAG,GAAM0H,GAAI1H,IAIrDqH,IACAjD,EAASyD,KAAO,GAChBzD,EAASyD,KAAKzI,MAAM,EAAK,EAAGY,GAAI,EAAK,GAAIA,GAAI,GAAM0H,GAAI1H,GACvDoE,EAASyD,KAAKzI,MAAM,GAAMsI,GAAI1H,GAAI,GAAM0H,EAAG1H,GAAI,EAAK,EAAGA,IAG3D,IAAK,MAAMmH,KAAQ/C,EAAU,CACzB,MAAM0D,EAAiB1D,EAAS+C,GAAMhG,OAAS,EAE/C,IAAK,IAAI1G,EAAI,EAAGA,EAAIqN,EAAgBrN,IAAK,CAErC,MAAMsN,GAAiC,IAA3B3D,EAAS+C,GAAU,EAAJ1M,GACrBiK,EAASN,EAAS+C,GAAU,EAAJ1M,EAAQ,MAAQuF,EAExCgI,EAAUD,EAAMjF,EAAI5K,EAE1BkM,EAAS+C,GAAU,EAAJ1M,GAASuN,EAAQzN,EAChC6J,EAAS+C,GAAU,EAAJ1M,EAAQ,IAAMuN,EAAQhP,EACrCoL,EAAS+C,GAAU,EAAJ1M,EAAQ,IAAMuN,EAAQ/H,EAEjCyE,GACAN,EAAS+C,GAAU,EAAJ1M,IAAUuF,EAAI3G,KAAKqK,IAAIsE,EAAQ/D,IAC9CG,EAAS+C,GAAU,EAAJ1M,EAAQ,IAAMuF,GAAK3G,KAAK0K,IAAIiE,EAAQ/D,IAAM,KAEzDG,EAAS+C,GAAU,EAAJ1M,IAAUuF,EAAI3G,KAAKqK,IAAIsE,EAAQ/D,GAAK5K,KAAKsC,IACxDyI,EAAS+C,GAAU,EAAJ1M,EAAQ,IAAMuF,GAAK3G,KAAK0K,IAAIiE,EAAQ/D,IAAM,IAIzDG,EAAS+C,GAAU,EAAJ1M,EAAQ,IADvBiK,EAC6B1E,EAAI3G,KAAKqK,IAAIsE,EAAQ9D,IAErBlE,EAAI3G,KAAKqK,IAAIsE,EAAQ9D,GAAK7K,KAAKsC,G,CAKpE,IAAK,IAAIlB,EAAI,EAAGA,EAAI2J,EAAS+C,GAAMhG,OAAQ1G,IACvC2J,EAAS+C,GAAM1M,IAAM,C,CAI7B,OAAO2J,CACX,CCnMA,SAAStM,EAASC,GACd,MAAMC,EAAKD,GAAO,GAAM,IAClBE,EAAKF,GAAO,EAAK,IACjBG,EAAU,IAANH,EAEV,MAAO,CAAEC,IAAGC,IAAGC,IACnB,CCFA,MAAMN,EAAe,KACfC,EAAgB,EAEtB,SAASoQ,EAAkB7P,EAAmB8P,GAC1C,MAAM7P,EAAU,IAAIC,EAAAA,IAEd6P,GAAS,IAAI7P,EAAAA,KAAsBE,KAAK,6BAC9C2P,EAAOC,QAAU9P,EAAAA,IAEjB,MAAM+P,EAAoC,CAAC,EAErCC,EAAc,IAAIhQ,EAAAA,IAAoBD,GAASG,KACjD,2BAGJ,IAAK,MAAM+P,KAASL,EAAQ,CACxB,MAAMM,GAAc,IAAIlQ,EAAAA,KAAsBE,KAC1CiQ,EAAeP,EAAOK,KAEpBG,EAAe,IAAIpQ,EAAAA,IAAwB,CAC7CK,MAAO,SACP2F,YAAY,EACZ1F,IAAK4P,EACLG,QAASL,EACTM,UAAW,KAAQV,EAAOK,GAAOM,MAAQ,GACzCC,SAAU,QACVC,UAAWb,EAAOK,GAAOQ,WAAa,IACtCZ,SACAa,QAAS1Q,EAAAA,IACT2Q,aAAc,KAGZC,EAAc,IAAI5Q,EAAAA,IAAoBD,GAASG,KACjD2Q,EAAejB,EAAOK,KAEpBa,EAAe,IAAI9Q,EAAAA,IAAwB,CAC7CK,MAAO,SACP2F,YAAY,EACZ1F,IAAKsQ,EACLP,QAASL,EACTM,UAAW,KAAQV,EAAOK,GAAOM,MAAQ,GACzCC,SAAU,QACVC,UAAWb,EAAOK,GAAOQ,WAAa,IACtCZ,SACAa,QAAS1Q,EAAAA,IACT2Q,aAAc,KAGZI,EAAe,IAAI/Q,EAAAA,IAAoBD,GAASG,KAClD8Q,EAAgBpB,EAAOK,KAGrBgB,EAAoB,IAAIjR,EAAAA,IAAwB,CAClDK,MAAOuP,EAAOK,GAAOiB,WACrBlL,YAAY,EACZwK,SAAU,SACVC,UAAW,GACX3M,aAAa,EACbqN,SAAUJ,IAGRK,EAAoB,IAAIpR,EAAAA,IAAwB,CAClDK,MAAOuP,EAAOK,GAAOiB,WACrBlL,YAAY,EACZwK,SAAU,SACVC,UAAW,GACX3M,aAAa,EACbO,QAAS,MAGb0L,EAAUE,GAAS,CACfoB,KAAMjB,EACN7P,KAAMuQ,EACNQ,WAAYL,EACZM,WAAYH,E,CAIpB,OAAOrB,CACX,CAEA,SAASI,EAAeF,GACpB,MAAM3O,EAAS,IAAIC,kBAAkBjC,EAAeC,EAAgB,GAEpE,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAemB,IAC/B,IAAK,IAAIuB,EAAI,EAAGA,EAAI3C,EAAc2C,IAAK,CACnC,MAAMC,EAA+B,GAAxBxB,EAAIpB,EAAe2C,GAEhC,IAAI5B,EAAQb,EAAS,UAEjBgS,GAAU,EAEd,IAAK,MAAMC,KAASxB,EAAMyB,OAClBzP,GAAKwP,EAAM,IAAMxP,EAAIwP,EAAM,GAAKA,EAAM,KACtCD,GAAU,GAGVvP,GAAK3C,EAAemS,EAAM,IAC1BxP,EAAI3C,GAAgBmS,EAAM,GAAKA,EAAM,MAErCD,GAAU,GAIlB,IAAKA,EAAS,CACV,MAAMtG,EAAQnK,KAAKC,IAAIiB,GAAK3C,EAAe,GAAK,EAAG,GAE7CqS,EAAqBnS,EAASyQ,EAAM2B,iBACpCC,EAAmBrS,EAASyQ,EAAM6B,eAExCzR,EAAQ,CACJX,EACIiS,EAAmBjS,GAAK,EAAIwL,GAC5B2G,EAAiBnS,EAAIwL,EACzBvL,EACIgS,EAAmBhS,GAAK,EAAIuL,GAC5B2G,EAAiBlS,EAAIuL,EACzBtL,EACI+R,EAAmB/R,GAAK,EAAIsL,GAC5B2G,EAAiBjS,EAAIsL,E,CAGjC5J,EAAOY,GAAO7B,EAAMX,EACpB4B,EAAOY,EAAM,GAAK7B,EAAMV,EACxB2B,EAAOY,EAAM,GAAK7B,EAAMT,EACxB0B,EAAOY,EAAM,GAAK,G,CAI1B,MAAME,EAASC,SAASC,cAAc,UAChCC,EAAMH,EAAOI,WAAW,MAE9BJ,EAAOK,MAAQnD,EACf8C,EAAOM,OAASnD,EAEhB,MAAMoD,EAAYJ,EAAKK,gBAAgBtD,EAAcC,GACrDoD,EAAUE,KAAKC,IAAIxB,GACnBiB,EAAKQ,aAAaJ,EAAW,EAAG,GAEhC,MAAMY,EAAUnB,EAAOoB,YACvB,OAAOD,CACX,CAEA,SAASsN,EAAeZ,GACpB,MAAM3O,EAAS,IAAIC,kBAAkBjC,EAAeC,EAAgB,GAEpE,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAemB,IAC/B,IAAK,IAAIuB,EAAI,EAAGA,EAAI3C,EAAc2C,IAAK,CACnC,MAAMC,EAA+B,GAAxBxB,EAAIpB,EAAe2C,GAEhC,IAAI5B,EAAQ,CACRX,EAAG,EACHC,EAAG,EACHC,EAAG,GAGP,MAAMsL,EAAQnK,KAAKC,IAAIiB,GAAK3C,EAAe,GAAK,EAAG,GAE7CyS,EAAmBvS,EAAS,UAC5BwS,EAAuBxS,EAAS,UAEtCa,EAAQ,CACJX,EACIsS,EAAqBtS,GAAK,EAAIwL,GAC9B6G,EAAiBrS,EAAIwL,EACzBvL,EACIqS,EAAqBrS,GAAK,EAAIuL,GAC9B6G,EAAiBpS,EAAIuL,EACzBtL,EACIoS,EAAqBpS,GAAK,EAAIsL,GAC9B6G,EAAiBnS,EAAIsL,GAG7B5J,EAAOY,GAAO7B,EAAMX,EACpB4B,EAAOY,EAAM,GAAK7B,EAAMV,EACxB2B,EAAOY,EAAM,GAAK7B,EAAMT,EACxB0B,EAAOY,EAAM,GAAK,G,CAI1B,MAAME,EAASC,SAASC,cAAc,UAChCC,EAAMH,EAAOI,WAAW,MAE9BJ,EAAOK,MAAQnD,EACf8C,EAAOM,OAASnD,EAEhB,MAAMoD,EAAYJ,EAAKK,gBAAgBtD,EAAcC,GACrDoD,EAAUE,KAAKC,IAAIxB,GACnBiB,EAAKQ,aAAaJ,EAAW,EAAG,GAEhC,MAAMY,EAAUnB,EAAOoB,YACvB,OAAOD,CACX,CAEA,SAASyN,EAAgBf,GACrB,MAAM3O,EAAS,IAAIC,kBAAkBjC,EAAeC,EAAgB,GAEpE,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAemB,IAC/B,IAAK,IAAIuB,EAAI,EAAGA,EAAI3C,EAAc2C,IAAK,CACnC,MAAMC,EAA+B,GAAxBxB,EAAIpB,EAAe2C,GAEhC,IAAI5B,EAAQ,CACRX,EAAG,IACHC,EAAG,IACHC,EAAG,KAGH4R,GAAU,EAEd,IAAK,MAAMC,KAASxB,EAAMyB,OAClBzP,EAAIwP,EAAM,IAAMxP,EAAIwP,EAAM,GAAKA,EAAM,KACrCD,GAAU,GAIdA,IACAnR,EAAQ,CACJX,EAAG,IACHC,EAAG,IACHC,EAAG,MAIX0B,EAAOY,GAAO7B,EAAMX,EACpB4B,EAAOY,EAAM,GAAK7B,EAAMV,EACxB2B,EAAOY,EAAM,GAAK7B,EAAMT,EACxB0B,EAAOY,EAAM,GAAK,G,CAI1B,MAAME,EAASC,SAASC,cAAc,UAChCC,EAAMH,EAAOI,WAAW,MAE9BJ,EAAOK,MAAQnD,EACf8C,EAAOM,OAASnD,EAEhB,MAAMoD,EAAYJ,EAAKK,gBAAgBtD,EAAcC,GACrDoD,EAAUE,KAAKC,IAAIxB,GACnBiB,EAAKQ,aAAaJ,EAAW,EAAG,GAEhC,MAAMY,EAAUnB,EAAOoB,YACvB,OAAOD,CACX,CChPA,SAAS0O,IACL,MAAMC,EAAe,GAErBA,EAAGpL,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAC7B,IAAK,IAAI3E,EAAI,EAAGA,EAAI,EAAGA,IACnB+P,EAAGpL,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAG7C,MAAMqL,EAAe,IAAI/I,aAAa8I,GACtC,OAAO,IAAIlS,EAAAA,IAA6BmS,EAAc,EAC1D,CAEA,SAASC,EAAmBlQ,EAAsBpC,GAC9C,MAAMgM,EAAqB,GAErBpE,EAAI5H,EAAMuP,WAAa,GAAK,KAC5BgD,GAAgB,GAGtBvG,EAAShF,MAAMY,EAAG,EAAGA,EAAGA,EAAG,EAAGA,EAAGA,EAAG,GAAIA,GACxCoE,EAAShF,MAAMY,EAAG,GAAIA,GAAIA,EAAG,EAAGA,EAAGA,EAAG,GAAIA,GAG1CoE,EAAShF,MAAMY,EAAG,EAAGA,EAAGA,EAAG2K,EAAc3K,EAAGA,EAAG,EAAGA,GAClDoE,EAAShF,MAAMY,EAAG2K,EAAc3K,EAAGA,EAAG2K,EAAc3K,GAAIA,EAAG,EAAGA,GAG9DoE,EAAShF,MAAMY,EAAG,GAAIA,EAAGA,EAAG,GAAIA,EAAGA,EAAG2K,GAAe3K,GACrDoE,EAAShF,MAAMY,EAAG,GAAIA,EAAGA,EAAG2K,GAAe3K,GAAIA,EAAG2K,GAAe3K,GAGjEoE,EAAShF,KAAKY,EAAG,EAAGA,EAAGA,EAAG2K,GAAe3K,EAAGA,EAAG,GAAIA,GACnDoE,EAAShF,KAAKY,EAAG2K,EAAc3K,EAAGA,EAAG2K,GAAe3K,EAAGA,EAAG,EAAGA,GAG7DoE,EAAShF,MAAMY,EAAG,EAAGA,GAAIA,EAAG,GAAIA,GAAIA,EAAG2K,GAAe3K,GACtDoE,EAAShF,MAAMY,EAAG,EAAGA,GAAIA,EAAG2K,GAAe3K,GAAIA,EAAG2K,EAAc3K,GAEhE,MAAM8H,EAAiB1D,EAASjD,OAAS,EAEzC,IAAK,IAAI1G,EAAI,EAAGA,EAAIqN,EAAgBrN,IAChC2J,EAAa,EAAJ3J,IAAUD,EAAI,GACvB4J,EAAa,EAAJ3J,EAAQ,IAAMD,EAAI,GAEvB4J,EAAa,EAAJ3J,EAAQ,KAAOkQ,IACxBvG,EAAa,EAAJ3J,EAAQ,IAAMD,EAAI,IAG/B4J,EAAa,EAAJ3J,EAAQ,IAAM,IAI3B,IAAK,IAAIA,EAAI,EAAGA,EAAI2J,EAASjD,OAAQ1G,IACjC2J,EAAS3J,IAAM,GAGnB,MAAMmQ,EAAmB,IAAIlJ,aAAa0C,GAEpCxG,EAAW,IAAItF,EAAAA,IAQrB,OAPAsF,EAASkE,aACL,WACA,IAAIxJ,EAAAA,IAA6BsS,EAAkB,IAEvDhN,EAASiN,uBACTjN,EAASkE,aAAa,KAAMyI,KAErB3M,CACX,CC5DA,SAASkN,EAAa3J,GAClB,MAAMqJ,EAAe,GAErB,IAAK,IAAI/P,EAAI,EAAGA,EAAI0G,EAAQ1G,IACxB+P,EAAGpL,KAAK,EAAG,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,MAGtC,MAAMqL,EAAe,IAAI/I,aAAa8I,GACtC,OAAO,IAAIlS,EAAAA,IAA6BmS,EAAc,EAC1D,CACA,SAASM,IACL,MAAMP,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAE3BC,EAAe,IAAI/I,aAAa8I,GACtC,OAAO,IAAIlS,EAAAA,IAA6BmS,EAAc,EAC1D,CAEA,SAASO,EAAa7J,GAClB,MAAMqJ,EAAe,GAErB,IAAK,IAAI/P,EAAI,EAAGA,EAAI0G,EAAQ1G,IACxB+P,EAAGpL,KAAK,EAAG,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,MAGtC,MAAMqL,EAAe,IAAI/I,aAAa8I,GACtC,OAAO,IAAIlS,EAAAA,IAA6BmS,EAAc,EAC1D,CAEA,SAASQ,EACLnI,EACA5K,GAEA,IAAI6K,EAAqB,EAEzB,MAAMC,EAAQ3J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BgL,EAAQ7J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BiL,EAAQ9J,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAC1BgT,EACF7R,KAAKgH,IAAIhH,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,IAAKmB,KAAK4J,IAAIH,EAAE,GAAKzJ,KAAKsC,GAAKzD,EAAE,MAC3DmB,KAAKsC,GAAK,GAOf,OALAoH,GACI,GAAK1J,KAAKiK,KAAKJ,GACf,GAAK7J,KAAKiK,KAAK4H,GAAa7R,KAAKiK,KAAKN,EAAQG,GAClDJ,GAAsB,GAEfA,CACX,CAEA,SAASoI,EAAqB7I,GAC1B,MAAO,CACH/H,EAAG+H,EAAM,GACTtJ,EAAGsJ,EAAM,GACTrC,EAAGqC,EAAM,GACT2B,GAAI3B,EAAM,GACV4B,GAAI5B,EAAM,GAElB,CAEA,SAAS8I,EACLnJ,EACAoG,EACAhG,GAEA,MAAMgJ,EAAuB,GAEvBjH,EAAwC,CAAC,EAEzCkH,EAAgBjJ,EAAQ+B,SAASjD,OACvC,IAAK,IAAI1G,EAAI,EAAGA,EAAI6Q,EAAgB,EAAG7Q,IAAK,CACxC,MAAMqI,EAAIT,EAAQ+B,SAAS3J,GACrBvC,EAAImK,EAAQ+B,SAAS3J,EAAI,GAE3BpB,KAAK4J,IAAIH,EAAE,GAAK5K,EAAE,KAAiB,EAAVmB,KAAKsC,MAAY,IAC1CmH,EAAE,GAAK5K,EAAE,IAGb,MAAMqT,EAAUJ,EAAqBrI,GAC/B0I,EAAUL,EAAqBjT,GAE/B6K,EAAqBkI,EAAkCnI,EAAG5K,GAE1D8O,EAAcJ,EAChB2E,EACAC,EACAzI,EACAd,EAAM7J,MACN,CACI2C,MAAOsH,EAAQtH,MACfmM,QAAe,IAANzM,EACTwM,OAAQxM,IAAM6Q,EAAgB,IAItC,IAAK,MAAMnE,KAAQH,EACV5C,EAAS+C,KACV/C,EAAS+C,GAAQ,IAErB/C,EAAS+C,GAAM/H,QAAQ4H,EAAYG,G,CAI3C,IAAK,MAAMA,KAAQ/C,EAAU,CACzB,MAAMwG,EAAmB,IAAIlJ,aAAa0C,EAAS+C,IAEnD,IAAIvJ,EAAW,IAAItF,EAAAA,IACnBsF,EAASkE,aACL,WACA,IAAIxJ,EAAAA,IAA6BsS,EAAkB,IAEvDhN,EAAW6N,EAAAA,GAAkC7N,EAAU,OACvDA,EAASiN,uBAET,IAAIL,EAAmCQ,EAAa,KACvC,SAAT7D,GAA4B,UAATA,IAAkBqD,EAAKO,KACjC,SAAT5D,GAA4B,UAATA,IAAkBqD,EAAKM,EAAa,MAE3DlN,EAASkE,aAAa,KAAM0I,GAE5B,IAAIkB,EAAkC,OACzB,QAATvE,IAAgBuE,EAAe,SAE/BzJ,EAAM7J,MAAMuT,mBACF,WAATxE,GAA8B,UAATA,GAA6B,SAATA,IAE1CuE,EAAe,QACO,UAAtBrJ,EAAQuJ,YACRF,EAAe,SAASA,KAG5B,MAAMnJ,EAAO,IAAIjK,EAAAA,IACbsF,EACAyK,EAAUhG,EAAQkG,OAAOmD,IAE7BL,EAAOjM,KAAKmD,E,CAGhB,IAAK,MAAMpD,KAAW8C,EAAM4J,YAAa,CACrC,MAAMjO,EAAW8M,EAAmBvL,EAAQ3E,IAAKyH,EAAM7J,OAEjDmK,EAAO,IAAIjK,EAAAA,IAAWsF,EAAUyK,EAAUlJ,EAAQoJ,OAAO,SAC/D8C,EAAOjM,KAAKmD,E,CAGhB,OAAO8I,CACX,CAEA,SAASS,EAAY7J,GACjB,MAAMoJ,EAAS,GAEThD,EAAYJ,EAAkBhG,EAAM7J,MAAO6J,EAAMiG,QAEvD,IAAK,MAAM7F,KAAWJ,EAAMS,SAAU,CAClC,MAAMqJ,EAAgBX,EAAmBnJ,EAAOoG,EAAWhG,GAC3DgJ,EAAOjM,QAAQ2M,E,CAGnB,OAAOV,CACX,CAEA,SAASW,EAAW/J,GAChB,MAAMgK,EAAkBC,KAAKC,MAAMD,KAAKE,UAAUnK,IAClD,IAAK,MAAMI,KAAW4J,EAASvJ,SAC3B,IAAK,MAAM2J,KAAUJ,EAASvJ,SAASL,GAAS+B,SAC5C6H,EAASvJ,SAASL,GAAS+B,SAASiI,GAAQ,IAAM,IAClDJ,EAASvJ,SAASL,GAAS+B,SAASiI,GAAQ,IAAMhT,KAAKsC,GAEvDsQ,EAASvJ,SAASL,GAAS+B,SAASiI,GAAQ,IAAM,IAClDJ,EAASvJ,SAASL,GAAS+B,SAASiI,GAAQ,IAAMhT,KAAKsC,GAI/D,OAAOsQ,CACX,CCzJA,SAASK,IACL,MAAMC,EAAiB,GACjBC,EAAiB,GAEjBhC,EAAe,GAErB,IAAK,IAAIjQ,EAAI,EAAGA,EAAIgS,EAAgBhS,IAChC,IAAK,IAAIvB,EAAI,EAAGA,GAAKwT,EAAgBxT,IACjCwR,EAAGpL,KAAKpG,EAAIwT,EAAgBjS,EAAIgS,GAIxC,MAAME,EAAU,IAAI/K,aAAa8I,GACjC,OAAOiC,CACX,CAMA,SAASC,EAAyBC,GAC9B,MAAM/U,EAAe,IACfC,EAAgB,KAEhB+B,EAAS,IAAIC,kBAAkBjC,EAAeC,EAAgB,GAEpE,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAemB,IAC/B,IAAK,IAAIuB,EAAI,EAAGA,EAAI3C,EAAc2C,IAAK,CACnC,MAAMC,EAA+B,GAAxBxB,EAAIpB,EAAe2C,GAEhC,IAAI5B,EAAQb,EAAS,SAErB,MAAM0L,EAAQxK,EAAIK,KAAK4J,IAAI1I,EAAI3C,EAAe,GAAK,EAE7CgV,EAAcvT,KAAKkC,MAAMiI,EAAQ,KAAO,IAAM,EAEhDoJ,IACAjU,EAAQb,EAAS,UAGrB8B,EAAOY,GAAO7B,EAAMX,EACpB4B,EAAOY,EAAM,GAAK7B,EAAMV,EACxB2B,EAAOY,EAAM,GAAK7B,EAAMT,EACxB0B,EAAOY,EAAM,GAAK,G,CAI1B,MAAME,EAASC,SAASC,cAAc,UAChCC,EAAMH,EAAOI,WAAW,MAE9BJ,EAAOK,MAAQnD,EACf8C,EAAOM,OAASnD,EAEhB,MAAMoD,EAAYJ,EAAKK,gBAAgBtD,EAAcC,GACrDoD,EAAUE,KAAKC,IAAIxB,GACnBiB,EAAKQ,aAAaJ,EAAW,EAAG,GAEhC,MAAMY,EAAUnB,EAAOoB,YACvB,OAAOD,CACX,CAEA,SAASgR,EAA0BC,GAC/B,MAAM1I,EAAqB,GAErBmI,EAAiB,GACjBC,EAAiB,GAEvB,IAAK,IAAIjS,EAAI,EAAGA,EAAIgS,EAAgBhS,IAChC,IAAK,IAAIvB,EAAI,EAAGA,EAAIwT,EAAgBxT,IAAK,CACrC,MAAM+T,EAAK,EAAI1T,KAAK4J,IAAI5J,KAAKC,KAAKN,EAAI,IAAM,GAAI8T,IAAc,EACxDE,EAAK,EAAI3T,KAAK4J,IAAI5J,KAAKC,KAAKN,EAAI,IAAM,GAAI8T,IAAc,EAExDG,EAAK5T,KAAK0K,IAAKxJ,EAAIgS,EAAkBlT,KAAKsC,GAAK,GAC/CuR,EAAK7T,KAAK0K,KAAMxJ,EAAI,GAAKgS,EAAkBlT,KAAKsC,GAAK,GAErDwR,EAAK9T,KAAKqK,IAAKnJ,EAAIgS,EAAkBlT,KAAKsC,GAAK,GAC/CyR,EAAK/T,KAAKqK,KAAMnJ,EAAI,GAAKgS,EAAkBlT,KAAKsC,GAAK,GAErD0R,EAAgB,KAAVrU,EAAI,IACVsU,EAAgB,KAAVtU,EAAI,IAEhBoL,EAAShF,KACL6N,EAAKD,EACLG,EAAKH,EACLM,EACAL,EAAKF,EACLI,EAAKJ,EACLM,EACAH,EAAKH,EACLK,EAAKL,EACLM,GAEJjJ,EAAShF,KACL6N,EAAKD,EACLG,EAAKH,EACLM,EACAJ,EAAKH,EACLK,EAAKL,EACLM,EACAH,EAAKF,EACLI,EAAKJ,EACLM,E,CAKZ,MAAMC,EAAqB,IAAI7L,aAAa0C,GAC5C,IAAIxG,EAAW,IAAItF,EAAAA,IAanB,OAXAsF,EAASkE,aACL,WACA,IAAIxJ,EAAAA,IAA6BiV,EAAoB,IAEzD3P,EAAW6N,EAAAA,GAAkC7N,EAAU,KACvDA,EAASiN,uBACTjN,EAASkE,aACL,KACA,IAAIxJ,EAAAA,IAA6BgU,IAAuB,IAGrD1O,CACX,CAEA,SAAS4P,IACL,MAAM3R,GAAU,IAAIvD,EAAAA,KAAsBE,KACtCkU,EAAyB,CACrBe,QAAS,UACTC,OAAQ,aAGhB7R,EAAQ8R,MAAQrV,EAAAA,IAChBuD,EAAQ+R,MAAQtV,EAAAA,IAEhB,MAAMgQ,GAAc,IAAIhQ,EAAAA,KAAsBE,KAC1C,2BAGE2P,GAAS,IAAI7P,EAAAA,KAAsBE,KAAK,6BAC9C2P,EAAOC,QAAU9P,EAAAA,IAEjB,MAAMuV,EAAW,IAAIvV,EAAAA,IAAwB,CACzCK,MAAO,SACPmQ,SAAU,QACVC,UAAW,GACXnQ,IAAKiD,EACL8M,QAASL,EACTM,UAAW,IACX/P,KAAMP,EAAAA,IACN6P,SACAc,aAAc,GACdD,QAAS1Q,EAAAA,MAGb,OAAOuV,CACX,CAEA,MAAMC,EAAe,IAAIxV,EAAAA,IAEzB,SAASyV,IACL,MAAMC,EAAS,IAAI1V,EAAAA,IAKb2V,GAHiB,IAAI3V,EAAAA,IAAuB,EAAG,GAAI,IAClC,IAAIA,EAAAA,IAAwB,CAAEK,MAAO,WAExC,IAAIL,EAAAA,IACpBuU,EAA0B,IAC1BW,MAGEU,EAAe,IAAI5V,EAAAA,IAAoB,IAAM,IAAM,EAAG,IACtD6V,EAAe,IAAI7V,EAAAA,IAAwB,CAAEK,MAAO,WAEpDyV,EAAkB,IAAI9V,EAAAA,IAAW4V,EAAcC,GACrDC,EAAgB5L,SAASvC,EAAI,IAE7B,MAAMoO,EAAiB,IAAI/V,EAAAA,IAAW4V,EAAcC,GACpDE,EAAe7L,SAASvC,GAAK,IAE7B6N,EAAatL,SAASxJ,EAAI,IAC1B8U,EAAa9P,MAAMzD,EAAI,GACvBuT,EAAa9P,MAAMhF,EAAI,GACvB8U,EAAa9P,MAAMiC,EAAI,GAEvB6N,EAAarL,IAAIwL,GAEjBH,EAAarL,IAAI2L,GACjBN,EAAarL,IAAI4L,GAEjB,MAAMC,EAAc,IAAIhW,EAAAA,IAmCxB,OAlCAgW,EAAY7L,IAAIqL,GAChBE,EAAOvL,IAAI6L,GAEXN,EAAOO,SAAW,CACdC,SAAS,EACTC,SAAS,EACTC,UAAU,EACVC,OAAO,EACPpH,MAAM,EACNC,OAAO,EACPoH,MAAO,EACPC,cAAe,EACfC,UAAW,EACXC,aAAc,EACdC,WAAY,EACZC,WAAY,GAGhBtU,SAASuU,iBAAiB,WAAYC,IAChB,YAAdA,EAAMC,KAAmBC,EAAY,WAAW,EAAMrB,GACxC,cAAdmB,EAAMC,KAAqBC,EAAY,YAAY,EAAMrB,GAC3C,eAAdmB,EAAMC,KAAsBC,EAAY,SAAS,EAAMrB,GACzC,cAAdmB,EAAMC,KAAqBC,EAAY,QAAQ,EAAMrB,GACvC,UAAdmB,EAAMC,KAAiBC,EAAY,SAAS,EAAMrB,EAAO,IAGjErT,SAASuU,iBAAiB,SAAUC,IACd,YAAdA,EAAMC,KAAmBC,EAAY,WAAW,EAAOrB,GACzC,cAAdmB,EAAMC,KAAqBC,EAAY,YAAY,EAAOrB,GAC5C,eAAdmB,EAAMC,KAAsBC,EAAY,SAAS,EAAOrB,GAC1C,cAAdmB,EAAMC,KAAqBC,EAAY,QAAQ,EAAOrB,GACxC,UAAdmB,EAAMC,KAAiBC,EAAY,SAAS,EAAOrB,EAAO,IAG3DA,CACX,CAEA,SAASqB,EAAYC,EAAkBrR,EAAgB+P,GACnDA,EAAOO,SAASe,GAAYrR,CAChC,CCnQA,SAASsR,KACL,MAAM/V,EAAMH,KAAKmC,SAAW,GAAK,MAAQ,QACnCmM,EAAa,GAAsB,GAAhBtO,KAAKmC,SACxBgU,EAAmB,GAAsB,GAAhBnW,KAAKmC,SAC9BiU,EAAmBpW,KAAKmC,SACxBmQ,GAAoB,EAC1B,MAAO,CACHnS,MACAmO,aACA6H,mBACAC,mBACA9D,oBAER,CAoBA,SAAShT,GAAM+W,EAAaC,GACxB,IAAIhX,EAAQ,EAERA,EADA+W,EAAM,IACG,KAAQ,KAAOrW,KAAKkC,MAAcmU,EAAM,GAAd,MAAsB,GAClDA,EAAM,IACL,OAAerW,KAAKkC,OAAe,IAAMmU,GAAO,GAAtB,MAA8B,IACzDA,EAAM,IACL,OAAerW,KAAKkC,OAAemU,EAAM,KAAO,GAAtB,MAA8B,GACzDA,EAAM,IACL,KAAerW,KAAKkC,OAAe,IAAMmU,GAAO,GAAtB,MAA8B,GACzDA,EAAM,IACL,KAAerW,KAAKkC,OAAemU,EAAM,KAAO,GAAtB,MAA8B,KAEvD,KAAQ,KAAOrW,KAAKkC,OAAe,IAAMmU,GAAO,GAAtB,MAA8B,GAErE,MAAME,EAAa,IAAOD,EAE1B,OADAhX,IAAUiX,GAAc,KAAOA,GAAc,IAAMA,GAAc,GAC1DjX,CACX,CAEA,MAAMkX,GAAY,GAAsB,GAAhBxW,KAAKmC,SACvBT,GAAQ1B,KAAKmC,SACbqN,GAAOxP,KAAKmC,SACZuN,GAA4B,KAAhB1P,KAAKmC,SACvB,SAASsU,KACL,MAAMJ,EAAMrW,KAAKkC,MAAsB,IAAhBlC,KAAKmC,UAC5B,MAAO,CACH0O,gBAAiBvR,GAAM+W,EAAK,GAC5BtF,cAAezR,GAAM+W,EAAK,GAC1B1F,OAAQ,CACJ,CAAC,EAAG,IAAc,IAARjP,IACV,CAAC,IAAc,IAARA,GAAc,GAAa,GAARA,GAAY,GAAa,GAARA,IAC3C,CAAC,KAAM,GAAa,GAARA,KAEhByO,WAAY,EACZX,KAAMA,GACNE,UAAWA,GAEnB,CAEA,MAAM9G,GAAe,CACjB8N,SAAU,CACNC,SAAU,EACVpB,MAAO,GAEXxW,MAAOmX,KACPrH,OAAQ,CACJ+H,IAAKH,KACLI,KAAMJ,MAEVpN,SAAU,CACN,CACI6F,MAAO,OACPxN,MAAO8U,GACPzL,SAAU,CACN,CAAC,EAAG,EAAG,EAAG,EAAG,GACb,CAAC,EAAG,EAAG,EAAG,EAAG,GACb,CAAC,EAAG,GAAI,GAAI,GAAI,GAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAChB,CAAC,EAAG,IAAM,GAAI,GAAI,KAG1B,CACImE,MAAO,MACPxN,MAAO8U,GACPzL,SAAU,CACN,CAAC,EAAG,GAAI,KAAM,GAAI,GAClB,CAAC,EAAG,GAAI,GAAI,GAAI,GAChB,CAAC,EAAG,GAAI,GAAI,IAAK,GACjB,CAAC,EAAG,GAAI,GAAI,IAAK,GACjB,CAAC,IAAK,GAAI,KAAM,IAAK,GACrB,CAAC,EAAG,GAAI,GAAI,IAAK,GACjB,CAAC,EAAG,GAAI,GAAI,IAAK,GACjB,CAAC,EAAG,GAAI,KAAM,IAAK,GACnB,EAAE,IAAK,GAAI,GAAI,IAAK,GACpB,EAAE,EAAG,GAAI,EAAG,IAAK,GACjB,EAAE,EAAG,EAAG,EAAG,GAAI,GACf,EAAE,EAAG,GAAK,IAAK,GAAI,KAG3B,CACImE,MAAO,OACPxN,MAAO8U,GACPzL,SAAU,CACN,EAAE,EAAG,EAAG,EAAG,GAAI,GACf,EAAE,EAAG,EAAG,EAAG,GAAI,GACf,EAAE,EAAG,EAAG,EAAG,EAAG,GACd,EAAE,EAAG,IAAM,EAAG,EAAG,KAGzB,CACImE,MAAO,MACPxN,MAAO8U,GACPzL,SAAU,CACN,CAAC,EAAG,EAAG,EAAG,EAAG,GACb,CAAC,EAAG,GAAK,EAAG,EAAG,GACf,CAAC,EAAG,IAAK,GAAI,GAAI,GACjB,CAAC,EAAG,KAAM,GAAI,IAAK,GACnB,CAAC,EAAG,IAAK,GAAI,IAAK,GAClB,CAAC,EAAG,EAAG,GAAI,IAAK,KAGxB,CACImE,MAAO,MACPxN,MAAO8U,GACPzL,SAAU,CACN,CAAC,EAAG,KAAM,GAAI,IAAK,GACnB,EAAE,EAAG,KAAM,GAAI,IAAK,GACpB,EAAE,EAAG,KAAM,GAAI,IAAK,KAG5B,CACImE,MAAO,OACPxN,MAAO8U,GACPzL,SAAU,CACN,EAAE,EAAG,EAAG,GAAI,IAAK,GACjB,EAAE,GAAI,EAAG,GAAI,IAAK,GAClB,EAAE,GAAI,GAAI,GAAI,GAAI,GAClB,EAAE,GAAI,KAAM,GAAI,IAAK,GACrB,EAAE,GAAI,GAAI,GAAI,IAAK,GACnB,EAAE,GAAI,GAAK,GAAI,IAAK,GACpB,EAAE,GAAI,EAAG,EAAG,GAAI,GAChB,EAAE,IAAK,GAAK,EAAG,EAAG,GAClB,EAAE,IAAK,EAAG,GAAI,GAAI,GAClB,EAAE,GAAI,IAAK,EAAG,EAAG,GACjB,EAAE,KAAM,EAAG,EAAG,EAAG,GACjB,CAAC,EAAG,EAAG,EAAG,EAAG,MAIzByH,YAAa,GACbsE,cAAe,CACX,CAAC,EAAG,EAAG,EAAG,EAAG,GACb,CAAC,EAAG,KAIZ,IAAK,MAAMC,MAAMnO,GAAMS,SACnB,IAAK,MAAMqC,KAAK9C,GAAMS,SAAS0N,IAAIhM,UAMvC,UChLA,MAAMiM,IAA0BC,EAAAA,EAAAA,GAAoB,SAAU,CAC5DC,MAAO,UACPC,GAAI,aACH,MAAO,GACJC,IAA0BH,EAAAA,EAAAA,GAAoB,MAAO,CACzDE,GAAI,QACJD,MAAO,WACN,MAAO,GACJG,IAA0BJ,EAAAA,EAAAA,GAAoB,MAAO,CACzDE,GAAI,WACJD,MAAO,WACN,MAAO,GACJI,IAA0BL,EAAAA,EAAAA,GAAoB,SAAU,CAAEE,GAAI,UAAY,MAAO,GA8BvF,QAA4BI,EAAAA,EAAAA,IAAiB,CAC3CC,OAAQ,MACRC,MAAMC,IAEMC,EAAAA,EAAAA,IAAS,CACnBhB,SAAU,KAGdiB,EAAAA,EAAAA,KAAU,KACO,IAAIC,EAAavZ,EAAS,IAO3C,MAAMuZ,EAgBFxU,YAAY/E,IAAsB,uaAFd,GAGhBoF,KAAKpF,SAAWA,EAEhBoF,KAAKrC,OAASC,SAASwW,eAAe,UAEtCpU,KAAK4C,SAAW,IAAIrH,EAAAA,IAAoB,CACpCoC,OAAQqC,KAAKrC,OACb0W,WAAW,IAEfrU,KAAK4C,SAAS0R,cAAcC,OAAOC,kBACnCxU,KAAK4C,SAAS6R,QAAQF,OAAOG,WAAYH,OAAOI,aAE5C/Z,EAASf,UACTmG,KAAK4C,SAASgS,UAAUC,SAAU,EAClC7U,KAAK4C,SAASgS,UAAU1U,KAAO3E,EAAAA,KAGnCyE,KAAK6C,MAAQ,IAAItH,EAAAA,IAEjByE,KAAKkF,MAAQ+J,EAAW/J,IAExBlF,KAAKiR,OAASD,EAAahR,KAAK8C,QAChC9C,KAAK6C,MAAM6C,IAAI1F,KAAKiR,QAEpBjR,KAAK8U,aACL9U,KAAK+U,eACL/U,KAAKgV,UACLhV,KAAKiV,UACLjV,KAAKkV,gBACLlV,KAAKmV,qBACLnV,KAAKoV,YAELpV,KAAKqV,UAAY,IAAIpQ,EAAUjF,KAAKkF,OAOpC,MAAMoQ,EAAwBpQ,GAAAA,SAAAA,GAAAA,SAAAA,GAE9BlF,KAAKiR,OAAOxL,SAASjI,EAA+B,EAA3B8X,EAAsB,GAC/CtV,KAAKiR,OAAOxL,SAASxJ,EAA+B,EAA3BqZ,EAAsB,GAC/CtV,KAAKiR,OAAOxL,SAASvC,EAA+B,EAA3BoS,EAAsB,GAE/CtV,KAAKuV,YACT,CAEQC,cACJ,MAAMF,EAAwBpQ,GAAAA,SAAAA,GAAAA,SAAAA,GAE9BlF,KAAKiR,OAAOxL,SAASjI,EAA+B,EAA3B8X,EAAsB,GAC/CtV,KAAKiR,OAAOxL,SAASxJ,EAA+B,EAA3BqZ,EAAsB,GAC/CtV,KAAKiR,OAAOxL,SAASvC,EAA+B,EAA3BoS,EAAsB,GAC/CtV,KAAKiR,OAAOwE,SAASxZ,EAAI,EACzB+D,KAAKiR,OAAOO,SAASK,MAAQ,CACjC,CAEQiD,aACJ9U,KAAK8C,OAAS,IAAIvH,EAAAA,IACdX,EAAShC,UACT2b,OAAOG,WAAaH,OAAOI,YAC3B,GACA,KAEJ3U,KAAK8C,OAAO2C,SAASpH,KAAK,EAAG,IAAK,GAClC2B,KAAK8C,OAAO2S,SAASjY,GAAKlB,KAAKsC,GAAK,EACpCoB,KAAK8C,OAAO2S,SAASxZ,GAAKK,KAAKsC,GAAK,KACpCoB,KAAK8C,OAAO2S,SAASvS,GAAK5G,KAAKsC,GAAK,EAKpCoB,KAAK6C,MAAM6C,IAAI1F,KAAK8C,QAEpB9C,KAAK0V,YAAc,IAAIna,EAAAA,IACvByE,KAAK0V,YAAYhQ,IAAI1F,KAAK8C,QAE1B9C,KAAK6C,MAAM6C,IAAI1F,KAAK0V,YACxB,CAEQX,eACJ,MAAMY,EAAkB,IAAIpa,EAAAA,IACxB,QACA,QACA,GAEJyE,KAAK6C,MAAM6C,IAAIiQ,GACf,MAAM/C,EAAQ,IAAIrX,EAAAA,IAAiB,SAAU,KAC7CqX,EAAMnN,SAASpH,KAAK,IAAK,KAAM,KAC/B2B,KAAK6C,MAAM6C,IAAIkN,GAEf,IAAK,IAAIlV,EAAI,EAAGA,EAAIsC,KAAKpF,SAASjB,WAAY+D,IAAK,CAC/C,MAAMkV,EAAQ,IAAIrX,EAAAA,IACd,SACA,IAAOyE,KAAKpF,SAASjB,YAEnBic,EAAUtZ,KAAKmC,SAAWuB,KAAKpF,SAAShB,YACxCic,EAAUvZ,KAAKmC,SAAWuB,KAAKpF,SAAShB,YACxCkc,EAAUxZ,KAAKmC,SAAWuB,KAAKpF,SAAShB,YAC9CgZ,EAAMnN,SAASpH,IAAI,IAAMuX,EAAS,IAAMC,EAAS,IAAMC,GACvDlD,EAAMmD,OAAOC,OAAShW,KAAKpF,SAAShB,YACpCgZ,EAAMqD,YAAa,EACnBrD,EAAMmD,OAAOG,QAAQlY,MAAQgC,KAAKpF,SAASd,aAC3C8Y,EAAMmD,OAAOG,QAAQjY,OAAS+B,KAAKpF,SAASd,aAE5CkG,KAAK6C,MAAM6C,IAAIkN,E,CAEvB,CAEQoC,UACJhV,KAAKR,IAAMD,EAAU2F,GAAAA,OACrBlF,KAAKR,IAAIiG,SAASpH,IAAI,IAAK,IAAK,KAChC2B,KAAKR,IAAIyB,MAAMzD,EAAI,IACnBwC,KAAKR,IAAIyB,MAAMhF,EAAI,IACnB+D,KAAK6C,MAAM6C,IAAI1F,KAAKR,IACxB,CAEQyV,UACJjV,KAAKvD,IAAMuC,EAAUkG,GAAAA,OACrBlF,KAAKvD,IAAIwE,MAAMzD,EAAI,IACnBwC,KAAKvD,IAAIwE,MAAMhF,EAAI,IACnB+D,KAAKvD,IAAIwE,MAAMiC,EAAI,IACnBlD,KAAK6C,MAAM6C,IAAI1F,KAAKvD,IACxB,CAEQ0Y,qBACJ,MAAMgB,EAAc,IAAIC,EAAAA,EAAWpW,KAAK6C,MAAO7C,KAAK8C,QAQpD,GANA9C,KAAKqW,SAAW,IAAIC,EAAAA,EAAetW,KAAK4C,UACxC5C,KAAKqW,SAASE,QAAQJ,IAKjBvb,EAASP,MAAO,OACrB,MAAMmc,EAAY,IAAIC,EAAAA,EAClB,IAAIlb,EAAAA,IAAcgZ,OAAOG,WAAYH,OAAOI,aAC5C,KACA,KACA,IAEJ3U,KAAKqW,SAASE,QAAQC,GACtB,MAAME,EAAa,IAAID,EAAAA,EACnB,IAAIlb,EAAAA,IAAcgZ,OAAOG,WAAYH,OAAOI,aAC5C,KACA,KACA,KAGJ,GADA3U,KAAKqW,SAASE,QAAQG,GACE,UAApBxR,GAAAA,MAAAA,IAA6B,CAC7B,MAAMyR,EAAa,IAAIF,EAAAA,EACnB,IAAIlb,EAAAA,IAAcgZ,OAAOG,WAAYH,OAAOI,aAC5C,GACA,EACA,KAEJ3U,KAAKqW,SAASE,QAAQI,E,CAE9B,CAEQzB,gBACJ,MAAMtC,EAAQ,IAAIrX,EAAAA,IAAiB,EAAU,GAC7CqX,EAAMnN,SAASpH,IAAI,GAAI,IAAK,KAE5B,MAAMuY,EAAgB,IAAIrb,EAAAA,IACpBsb,EAAeD,EAAcnb,KAAK,2BAClCqb,EAAY,IAAIrX,EAClBsX,WAAW7R,GAAAA,MAAAA,mBAEf4R,EAAU3U,WAAW,IAAIP,EAAiBiV,EAAc,GAAI,KAC5DC,EAAU3U,WAAW,IAAIP,EAAiBiV,EAAc,IAAK,KAC7DC,EAAU3U,WAAW,IAAIP,EAAiBiV,EAAc,IAAK,KAC7DC,EAAU3U,WAAW,IAAIP,EAAiBiV,EAAc,IAAK,IAC7DjE,EAAMlN,IAAIoR,GACV9W,KAAK6C,MAAM6C,IAAIkN,EACnB,CAEOoE,mBACHhX,KAAKiX,UAGLrZ,SAASuU,iBACL,oBACA,KACInS,KAAKkX,WAAY,CAAI,IAEzB,EAER,CAEQD,UACJE,uBAAsB,IAAMnX,KAAKiX,QAAQG,KAAKpX,QAC1CA,KAAKkX,YACLlX,KAAKqX,eACLrX,KAAKsX,eAELtX,KAAKuX,SAEb,CAEQC,KAAKzR,EAAW5K,EAAWsL,GAC/B,OAAOV,GAAK,EAAIU,GAAStL,EAAIsL,CACjC,CAEQ4Q,eACJ,MAAMjZ,EAAO4B,KAAKiR,OAAOO,SACnBD,EAAcvR,KAAKiR,OAAOwG,SAAS,GACnCC,EAAanG,EAAYkG,SAAS,GAClCvG,EAAcwG,EAAWD,SAAS,GAElCE,EAAavZ,EAAKuZ,WAClBC,EAAgBC,KAAKC,MAC3B1Z,EAAKuZ,WAAaC,EAElB,MAAMG,EAASzb,KAAKkC,OAAOoZ,EAAgBD,GAAc,GACnDK,EAAc1b,KAAKgH,IAAIyU,EAAQ,KACrC,IAAK,IAAIra,EAAI,EAAGA,EAAIsa,EAAata,IAAK,CAClC,MAAMua,EAAkB7Z,EAAKqT,QAAU,GAAM,EAC7C,GAAIrT,EAAKsT,QAAS,CACd,IAAIwG,EAAW,GACf,GAAI9Z,EAAKoM,MAAQpM,EAAKqM,MAAO,CACzB,IAAI0N,EAAgB7b,KAAKgH,IACrB,IACA,EAAIhH,KAAK4J,IAAI9H,EAAK0T,gBAEtBqG,GAAiB/Z,EAAKwT,QAAUxT,EAAKqT,QAAU,EAAI,EACnDyG,GAAYC,EACZD,GAAYD,C,CAEhB7Z,EAAKyT,MAAQ7R,KAAKwX,KAAKpZ,EAAKyT,MAAOqG,EAAU,K,MAC1C,GAAI9Z,EAAKuT,SACZvT,EAAKyT,MAAQ7R,KAAKwX,KAAKpZ,EAAKyT,OAAQ,GAAK,UACtC,CACH,MAAMuG,EAAgBha,EAAKqT,QAAU,KAAS,KAC9CrT,EAAKyT,MAAQ7R,KAAKwX,KAAKpZ,EAAKyT,MAAO,EAAGuG,E,CAG1C,MAAMC,EAAqBja,EAAKqT,QAAU,GAAM,EAC1C6G,EAA0Bla,EAAKwT,MAAQ,GAAM,EAC7C2G,EAAoBD,EAA0Bhc,KAAKsC,GAAM,GAC3DR,EAAKoM,OAASpM,EAAKqM,OACnBrM,EAAK0T,cAAgB9R,KAAKwX,KACtBpZ,EAAK0T,cACLyG,EACA,KAAQF,GAERja,EAAKwT,QACLxT,EAAK6T,WAAajS,KAAKwX,KACnBpZ,EAAK6T,WACiB,IAArB7T,EAAK0T,cACN,OAGD1T,EAAKqM,QAAUrM,EAAKoM,MAC3BpM,EAAK0T,cAAgB9R,KAAKwX,KACtBpZ,EAAK0T,eACJyG,EACD,KAAQF,GAERja,EAAKwT,QACLxT,EAAK6T,WAAajS,KAAKwX,KACnBpZ,EAAK6T,WACiB,IAArB7T,EAAK0T,cACN,OAIR1T,EAAK0T,cAAgB9R,KAAKwX,KAAKpZ,EAAK0T,cAAe,EAAG,KAErD1T,EAAKwT,QACNxT,EAAK6T,WAAajS,KAAKwX,KAAKpZ,EAAK6T,WAAY,EAAG,MAGpD,MAAMuG,EAAU,GAAMpa,EAAKyT,MAAQvV,KAAK0K,KAAK5I,EAAK2T,WAC5C0G,EAAU,GAAMra,EAAKyT,MAAQvV,KAAKqK,KAAKvI,EAAK2T,WAE5C2G,EACF,IACgC,IAA/Bpc,KAAKqc,KAAKva,EAAKyT,MAAQ,KAAezT,EAAKyT,MAAQ,KACpDzT,EAAK0T,cAET1T,EAAK2T,WAAa2G,EAClB1Y,KAAKiR,OAAOxL,SAASjI,GAAKgb,EAC1BxY,KAAKiR,OAAOxL,SAASvC,GAAKuV,EAC1BzY,KAAKiR,OAAOwE,SAASxZ,EAAImC,EAAK2T,UAC9B2F,EAAWjC,SAASxZ,GAAKmC,EAAK6T,WAE9B,MAAM2G,EAAe5Y,KAAKqV,UAAUhN,eAChCrI,KAAKiR,OAAOxL,SAASjI,EACrBwC,KAAKiR,OAAOxL,SAASvC,GAGzB,IAAI2V,GAAgB,GACpB,GAAID,EACA,IAAK,MAAME,KAASF,EAAc,CAC9B,MAAMG,EAAO/Y,KAAKiR,OAAOxL,SAASxJ,EAC5B+c,EAASF,EAAM,GAAKC,EAEV3a,EAAK2T,UAAY+G,EAAM,GAEvC,KAAIE,EAAS,GAAb,CACA,KAAIA,EAAS,GAAb,CAMAH,EAAeC,EAAM,GAErB,K,CAPI9Y,KAAKiR,OAAOxL,SAASjI,GAAKgb,EAC1BxY,KAAKiR,OAAOxL,SAASvC,GAAKuV,CAHN,C,CAYhC,IAAIO,EAASH,EAAe7Y,KAAKiR,OAAOxL,SAASxJ,EAE7Cgd,EAAY,GAEM,KAAlBJ,GACAza,EAAK4T,cAAgB,KACrBiH,EAAY7a,EAAK4T,aACjB5T,EAAKqT,SAAU,GACRuH,EAAS,GAChB5a,EAAK4T,aAAwB,GAATgH,EACpB5a,EAAK4T,aAAe1V,KAAKgH,IAAIlF,EAAK4T,aAAc,KAChDiH,EAAY3c,KAAKiH,IAAInF,EAAK4T,aAAcgH,GACxC5a,EAAKqT,SAAU,EACfrT,EAAKyT,MAAQ7R,KAAKwX,KAAKpZ,EAAKyT,MAAO,IAAMoH,EAAY,KAC9CD,IAAW,KAAQA,GAAU,GAEpCC,EAAY7a,EAAK4T,aACjB5T,EAAKqT,SAAU,GACRuH,GAAU,MACjB5a,EAAK4T,cAAgB,KAEjBiH,EADA7a,EAAK4T,aAAe,EACR5T,EAAK4T,aAEL1V,KAAKiH,IAAInF,EAAK4T,aAAuB,IAATgH,GAE5C5a,EAAKqT,SAAU,GAGnBzR,KAAKiR,OAAOxL,SAASxJ,GAAKgd,C,CAG9BjZ,KAAK8C,OAAOoW,IAAM,GAAkB,GAAb9a,EAAKyT,MAE5B7R,KAAK8C,OAAOoW,IAAMlZ,KAAKwX,KACnBxX,KAAK8C,OAAOoW,IACZlZ,KAAK8C,OAAOoW,IAAM,GAAK9a,EAAKqT,QAC5B,KAGJzR,KAAK8C,OAAO2S,SAASjY,EAAIwC,KAAKwX,KAC1BxX,KAAK8C,OAAO2S,SAASjY,EACrBY,EAAKyT,OAASzT,EAAK0T,cAAgB,GAAKxV,KAAKsC,GAAK,EAClD,MAGJ2S,EAAYkE,SAASjY,EAAIwC,KAAKwX,KAC1BjG,EAAYkE,SAASjY,EACC,IAArBY,EAAK0T,cAAqB1T,EAAKyT,MAChC,IAGAzT,EAAKqT,QACLrT,EAAK8T,WAAalS,KAAKwX,KAAKpZ,EAAK8T,WAAY,EAAG,KAEhD9T,EAAK8T,WAAalS,KAAKwX,KAAKpZ,EAAK8T,WAAyB,IAAb9T,EAAKyT,MAAc,GAGpEX,EAAYJ,SAASjV,IAAIsd,OAAOld,GAC3BiV,EAAYJ,SAASjV,IAAIsd,OAAOld,EAAImC,EAAK8T,YAAc,EAExDlS,KAAKiR,OAAOxL,SAASxJ,GAAK,IAC1B+D,KAAKwV,aAEb,CAEQ8B,eACJtX,KAAK0V,YAAYjQ,SAASjI,EAAIwC,KAAKiR,OAAOxL,SAASjI,EACnDwC,KAAK0V,YAAYjQ,SAASxJ,EAAI+D,KAAKiR,OAAOxL,SAASxJ,EACnD+D,KAAK0V,YAAYjQ,SAASvC,EAAIlD,KAAKiR,OAAOxL,SAASvC,EAEnDlD,KAAK0V,YAAYD,SAASxZ,EAAI+D,KAAKwX,KAC/BxX,KAAK0V,YAAYD,SAASxZ,EAC1B+D,KAAKiR,OAAOwE,SAASxZ,EACrB,EAER,CAEQsb,SACJvX,KAAKR,IAAI4Z,OAAOpZ,KAAK8C,OAAO2C,UAE5BzF,KAAK8C,OAAOuW,yBAGZrZ,KAAKqW,SAASkB,QAClB,CAEQnC,YACJ,MAAMkE,EAAcvK,EAAY/O,KAAKkF,OAErC,IAAK,MAAMM,KAAQ8T,EACfA,EAAY9T,GAAMyQ,YAAa,EAC/BqD,EAAY9T,GAAM+T,eAAgB,EAClCvZ,KAAK6C,MAAM6C,IAAI4T,EAAY9T,GAEnC,CAEQgU,iBACJxZ,KAAK8C,OAAO2W,OAASlF,OAAOG,WAAaH,OAAOI,YAChD3U,KAAK4C,SAAS6R,QAAQF,OAAOG,WAAYH,OAAOI,YACpD,EAGJ,MAAO,CAAC+E,EAAUC,MACRC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoBC,EAAAA,GAAW,KAAM,CACzDxG,GACAI,GACAC,GACAC,IACC,IAEL,IC/eA,MAAMmG,GAAc,GAEpB,U,YCFEC,EAAAA,GAAAA,GAAS,qBAA4C,CACnDC,QACEC,QAAQC,IACN,qGAGJ,EACAC,aACEF,QAAQC,IAAI,sCACd,EACAE,SACEH,QAAQC,IAAI,2CACd,EACAG,cACEJ,QAAQC,IAAI,8BACd,EACAI,UACEL,QAAQC,IAAI,4CACd,EACAK,UACEN,QAAQC,IAAI,gEACd,EACAM,MAAOA,GACLP,QAAQO,MAAM,4CAA6CA,EAC7D,I,u9RCzBJ,MAAMnH,GAAa,CAAEE,MAAO,QACtBE,IAA0BH,EAAAA,EAAAA,GAAoB,MAAO,CACzDmH,IAAK,WACLC,IAAKC,IACJ,MAAO,GACJjH,GAAa,CACjBD,IAGI,SAAU6D,GAAOmC,EAAUC,EAAYkB,EAAYC,EAAYC,EAAWC,GAC9E,OAAQpB,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOvG,GAAYK,GAC/D,CCZA,QAAesH,EAAAA,EAAAA,IAAgB,CAC3BC,KAAM,a,SCCV,MAAM,IAA2B,QAAgB,GAAQ,CAAC,CAAC,SAAS3D,MAEpE,UCJA,MAAM4D,GAAgC,CAClC,CACIC,KAAM,IACNF,KAAM,OACNG,UAAWC,KAIbC,IAASC,EAAAA,GAAAA,IAAa,CACxBC,SAASC,EAAAA,GAAAA,IAAiBC,KAC1BR,YAGJ,WCXAS,EAAAA,EAAAA,IAAUC,IAAKC,IAAIP,IAAQQ,MAAM,O,GCJ7BC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAUI,EAAQA,EAAOD,QAASJ,GAG/CK,EAAOD,OACf,CAGAJ,EAAoBO,EAAID,E,WCzBxB,IAAIE,EAAW,GACfR,EAAoBS,EAAI,SAASC,EAAQC,EAAUC,EAAIC,GACtD,IAAGF,EAAH,CAMA,IAAIG,EAAe1c,IACnB,IAAS3C,EAAI,EAAGA,EAAI+e,EAASrY,OAAQ1G,IAAK,CACrCkf,EAAWH,EAAS/e,GAAG,GACvBmf,EAAKJ,EAAS/e,GAAG,GACjBof,EAAWL,EAAS/e,GAAG,GAE3B,IAJA,IAGIsf,GAAY,EACPC,EAAI,EAAGA,EAAIL,EAASxY,OAAQ6Y,MACpB,EAAXH,GAAsBC,GAAgBD,IAAaI,OAAOC,KAAKlB,EAAoBS,GAAGU,OAAM,SAAS/K,GAAO,OAAO4J,EAAoBS,EAAErK,GAAKuK,EAASK,GAAK,IAChKL,EAASS,OAAOJ,IAAK,IAErBD,GAAY,EACTF,EAAWC,IAAcA,EAAeD,IAG7C,GAAGE,EAAW,CACbP,EAASY,OAAO3f,IAAK,GACrB,IAAIzC,EAAI4hB,SACET,IAANnhB,IAAiB0hB,EAAS1hB,EAC/B,CACD,CACA,OAAO0hB,CArBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIpf,EAAI+e,EAASrY,OAAQ1G,EAAI,GAAK+e,EAAS/e,EAAI,GAAG,GAAKof,EAAUpf,IAAK+e,EAAS/e,GAAK+e,EAAS/e,EAAI,GACrG+e,EAAS/e,GAAK,CAACkf,EAAUC,EAAIC,EAwB/B,C,eC5BAb,EAAoBqB,EAAI,SAAShB,GAChC,IAAIiB,EAASjB,GAAUA,EAAOkB,WAC7B,WAAa,OAAOlB,EAAO,UAAY,EACvC,WAAa,OAAOA,CAAQ,EAE7B,OADAL,EAAoBwB,EAAEF,EAAQ,CAAExX,EAAGwX,IAC5BA,CACR,C,eCNAtB,EAAoBwB,EAAI,SAASpB,EAASqB,GACzC,IAAI,IAAIrL,KAAOqL,EACXzB,EAAoB0B,EAAED,EAAYrL,KAAS4J,EAAoB0B,EAAEtB,EAAShK,IAC5E6K,OAAOU,eAAevB,EAAShK,EAAK,CAAEwL,YAAY,EAAMC,IAAKJ,EAAWrL,IAG3E,C,eCPA4J,EAAoB/gB,EAAI,WACvB,GAA0B,kBAAf6iB,WAAyB,OAAOA,WAC3C,IACC,OAAO/d,MAAQ,IAAIge,SAAS,cAAb,EAGhB,CAFE,MAAOC,GACR,GAAsB,kBAAX1J,OAAqB,OAAOA,MACxC,CACA,CAPuB,E,eCAxB0H,EAAoB0B,EAAI,SAASO,EAAKC,GAAQ,OAAOjB,OAAOkB,UAAUC,eAAejH,KAAK8G,EAAKC,EAAO,C,eCKtG,IAAIG,EAAkB,CACrB,IAAK,GAaNrC,EAAoBS,EAAEO,EAAI,SAASsB,GAAW,OAAoC,IAA7BD,EAAgBC,EAAgB,EAGrF,IAAIC,EAAuB,SAASC,EAA4BrgB,GAC/D,IAKI8d,EAAUqC,EALV3B,EAAWxe,EAAK,GAChBsgB,EAActgB,EAAK,GACnBugB,EAAUvgB,EAAK,GAGIV,EAAI,EAC3B,GAAGkf,EAASgC,MAAK,SAASnL,GAAM,OAA+B,IAAxB6K,EAAgB7K,EAAW,IAAI,CACrE,IAAIyI,KAAYwC,EACZzC,EAAoB0B,EAAEe,EAAaxC,KACrCD,EAAoBO,EAAEN,GAAYwC,EAAYxC,IAGhD,GAAGyC,EAAS,IAAIhC,EAASgC,EAAQ1C,EAClC,CAEA,IADGwC,GAA4BA,EAA2BrgB,GACrDV,EAAIkf,EAASxY,OAAQ1G,IACzB6gB,EAAU3B,EAASlf,GAChBue,EAAoB0B,EAAEW,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOtC,EAAoBS,EAAEC,EAC9B,EAEIkC,EAAqBC,KAAK,wBAA0BA,KAAK,yBAA2B,GACxFD,EAAmBE,QAAQP,EAAqBQ,KAAK,KAAM,IAC3DH,EAAmBxc,KAAOmc,EAAqBQ,KAAK,KAAMH,EAAmBxc,KAAK2c,KAAKH,G,IC/CvF,IAAII,EAAsBhD,EAAoBS,OAAEN,EAAW,CAAC,MAAM,WAAa,OAAOH,EAAoB,KAAO,IACjHgD,EAAsBhD,EAAoBS,EAAEuC,E","sources":["webpack://rollesia/./src/settings.ts","webpack://rollesia/./src/utils/sky.ts","webpack://rollesia/./src/utils/sun.ts","webpack://rollesia/./src/Lensflare.js","webpack://rollesia/./src/modules/TrackBody.ts","webpack://rollesia/./src/utils/trackGeometry.ts","webpack://rollesia/./src/utils/colors.ts","webpack://rollesia/./src/utils/trackMaterials.ts","webpack://rollesia/./src/utils/beam.ts","webpack://rollesia/./src/track.ts","webpack://rollesia/./src/utils/player.ts","webpack://rollesia/./src/lowTrick.ts","webpack://rollesia/./src/App.vue?2a5e","webpack://rollesia/./src/App.vue","webpack://rollesia/./src/registerServiceWorker.ts","webpack://rollesia/./src/views/HomeView.vue?542d","webpack://rollesia/./src/views/HomeView.vue?4752","webpack://rollesia/./src/views/HomeView.vue","webpack://rollesia/./src/router/index.ts","webpack://rollesia/./src/main.ts","webpack://rollesia/webpack/bootstrap","webpack://rollesia/webpack/runtime/chunk loaded","webpack://rollesia/webpack/runtime/compat get default export","webpack://rollesia/webpack/runtime/define property getters","webpack://rollesia/webpack/runtime/global","webpack://rollesia/webpack/runtime/hasOwnProperty shorthand","webpack://rollesia/webpack/runtime/jsonp chunk loading","webpack://rollesia/webpack/startup"],"sourcesContent":["type SETTINGS = {\r\n DISPLAY: { [key: string]: unknown };\r\n GRAPHICS: { [key: string]: unknown };\r\n};\r\n\r\nconst SETTINGS: { [key: string]: any } = {\r\n DISPLAY: {\r\n CAMERA: {\r\n DEFAULT: {\r\n cameraShaking: true,\r\n cameraRotation: true,\r\n cameraFov: 80,\r\n },\r\n CHILL: {\r\n cameraFov: 70,\r\n cameraShaking: false,\r\n cameraRotation: true,\r\n },\r\n CINEMATIC: {\r\n cameraFov: 90,\r\n cameraShaking: false,\r\n cameraRotation: true,\r\n },\r\n FIXED: {\r\n cameraFov: 80,\r\n cameraShaking: false,\r\n cameraRotation: false,\r\n },\r\n },\r\n STREAMER_MODE: {\r\n ON: {\r\n streamerMode: true,\r\n },\r\n OFF: {\r\n streamerMode: false,\r\n },\r\n },\r\n OVERLAY: {\r\n DEFAULT: {\r\n overlayElements: true,\r\n overlayVignette: true,\r\n overlayDebug: false,\r\n },\r\n OFF: {\r\n overlayElements: false,\r\n overlayVignette: false,\r\n overlayDebug: false,\r\n },\r\n\r\n DEBUG: {\r\n overlayElements: true,\r\n overlayVignette: true,\r\n overlayDebug: true,\r\n },\r\n },\r\n },\r\n GRAPHICS: {\r\n LIGHTING: {\r\n DEBUG: {\r\n lightCount: 1,\r\n lightRadius: 0,\r\n shadows: false,\r\n shadowMapRes: 2048,\r\n },\r\n LOW: {\r\n lightCount: 4,\r\n lightRadius: 5,\r\n shadows: false,\r\n },\r\n MEDIUM: {\r\n lightCount: 5,\r\n lightRadius: 4,\r\n shadows: true,\r\n shadowMapRes: 512,\r\n },\r\n HIGH: {\r\n lightCount: 8,\r\n lightRadius: 10,\r\n shadows: true,\r\n shadowMapRes: 1024,\r\n },\r\n ULTRA: {\r\n lightCount: 10,\r\n lightRadius: 25,\r\n ambientOcclusion: 0.6,\r\n shadows: true,\r\n shadowMapRes: 2048,\r\n },\r\n },\r\n BLOOM: {\r\n ON: {\r\n bloom: true,\r\n },\r\n OFF: {\r\n bloom: false,\r\n },\r\n },\r\n },\r\n};\r\n\r\nfunction getLocalStorageSettings() {\r\n for (const category in SETTINGS) {\r\n for (const setting in SETTINGS[category]) {\r\n const savedSettings = localStorage.getItem(\r\n `settings_${category}_${setting}`\r\n );\r\n\r\n if (savedSettings && savedSettings in SETTINGS[category][setting]) {\r\n settings = {\r\n ...settings,\r\n ...SETTINGS[category][setting][savedSettings],\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\nlet settings = {\r\n ...SETTINGS.GRAPHICS.BLOOM.ON,\r\n ...SETTINGS.GRAPHICS.LIGHTING.LOW,\r\n ...SETTINGS.DISPLAY.CAMERA.DEFAULT,\r\n ...SETTINGS.DISPLAY.OVERLAY.DEFAULT,\r\n ...SETTINGS.DISPLAY.OVERLAY.DEFAULT,\r\n ...SETTINGS.DISPLAY.STREAMER_MODE.OFF,\r\n};\r\ngetLocalStorageSettings();\r\n\r\nexport { settings };\r\n","import { TrackTheme } from \"@/types/track\";\r\nimport * as THREE from \"three\";\r\n\r\nconst textureWidth = 4000;\r\nconst textureHeight = 2000;\r\n\r\nfunction hexToRgb(hex: number) {\r\n const r = (hex >> 16) & 255;\r\n const g = (hex >> 8) & 255;\r\n const b = hex & 255;\r\n\r\n return { r, g, b };\r\n}\r\n\r\nfunction createSkyMaterial(theme: TrackTheme) {\r\n const manager = new THREE.LoadingManager();\r\n\r\n const skyTexture = new THREE.TextureLoader(manager).load(\r\n createSkyTexture(theme)\r\n );\r\n\r\n const skyMaterial = new THREE.MeshBasicMaterial({\r\n color: 0xffffff,\r\n map: skyTexture,\r\n side: THREE.BackSide,\r\n fog: false,\r\n });\r\n\r\n return skyMaterial;\r\n}\r\n\r\nfunction getTextureColorIndexes(y: number, theme: TrackTheme) {\r\n const horizonHeight = 100;\r\n\r\n const spaceLimit = textureHeight / 2 - horizonHeight;\r\n const groundLimit = textureHeight / 2;\r\n\r\n if (y < spaceLimit) {\r\n const spaceIndex = Math.pow(1 - y / spaceLimit, 1 / 2.5);\r\n\r\n return {\r\n space: spaceIndex,\r\n sky: 1 - spaceIndex,\r\n horizon: 0,\r\n ground: 0,\r\n };\r\n }\r\n if (y > groundLimit) {\r\n const groundIndex = Math.pow(\r\n 1 - (textureHeight - y) / groundLimit,\r\n 1 / 5\r\n );\r\n\r\n return {\r\n space: 0,\r\n sky: 0,\r\n horizon: 1 - groundIndex,\r\n ground: groundIndex,\r\n };\r\n }\r\n return {\r\n space: 0,\r\n sky: 1 - (y - spaceLimit + 1) / (groundLimit - spaceLimit),\r\n horizon: (y - spaceLimit + 1) / (groundLimit - spaceLimit),\r\n ground: 0,\r\n };\r\n}\r\n\r\nfunction createSkyTexture(theme: TrackTheme) {\r\n const buffer = new Uint8ClampedArray(textureWidth * textureHeight * 4);\r\n\r\n const skyThemes = {\r\n day: {\r\n spaceColor: 0x4068b0,\r\n skyColor: 0x6fa8cd,\r\n horizonColor: 0xdee4ee,\r\n groundColor: 0xb0c6dc,\r\n },\r\n cloudy: {\r\n spaceColor: 0x202020,\r\n skyColor: 0x504060,\r\n horizonColor: 0xf0e0d0,\r\n groundColor: 0x202020,\r\n },\r\n night: {\r\n spaceColor: 0x090a0d,\r\n skyColor: 0x14151f,\r\n horizonColor: 0x2b2d40,\r\n groundColor: 0x14151f,\r\n },\r\n };\r\n\r\n const skyTheme: \"day\" | \"night\" | \"cloudy\" = theme.sky;\r\n\r\n const spaceColor = hexToRgb(skyThemes[skyTheme].spaceColor);\r\n const skyColor = hexToRgb(skyThemes[skyTheme].skyColor);\r\n const horizonColor = hexToRgb(skyThemes[skyTheme].horizonColor);\r\n const groundColor = hexToRgb(skyThemes[skyTheme].groundColor);\r\n\r\n for (let y = 0; y < textureHeight; y++) {\r\n for (let x = 0; x < textureWidth; x++) {\r\n const pos = (y * textureWidth + x) * 4;\r\n\r\n let color = {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n };\r\n\r\n const i = getTextureColorIndexes(y, theme);\r\n\r\n color = {\r\n r:\r\n spaceColor.r * i.space +\r\n skyColor.r * i.sky +\r\n horizonColor.r * i.horizon +\r\n groundColor.r * i.ground,\r\n g:\r\n spaceColor.g * i.space +\r\n skyColor.g * i.sky +\r\n horizonColor.g * i.horizon +\r\n groundColor.g * i.ground,\r\n b:\r\n spaceColor.b * i.space +\r\n skyColor.b * i.sky +\r\n horizonColor.b * i.horizon +\r\n groundColor.b * i.ground,\r\n };\r\n\r\n buffer[pos] = color.r;\r\n buffer[pos + 1] = color.g;\r\n buffer[pos + 2] = color.b;\r\n buffer[pos + 3] = 255;\r\n }\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = textureWidth;\r\n canvas.height = textureHeight;\r\n\r\n const imageData = ctx!.createImageData(textureWidth, textureHeight);\r\n imageData.data.set(buffer);\r\n ctx!.putImageData(imageData, 0, 0);\r\n\r\n if (skyTheme === \"night\") {\r\n ctx!.fillStyle = \"#ffffff\";\r\n for (let i = 0; i < 2500; i++) {\r\n const x = Math.floor(Math.random() * textureWidth);\r\n const y = Math.floor((Math.random() * textureHeight) / 2);\r\n const r = Math.pow(Math.random() * 1.1, 4);\r\n\r\n ctx!.beginPath();\r\n ctx!.arc(x, y, r, 0, Math.PI * 2);\r\n ctx!.fill();\r\n }\r\n }\r\n\r\n const texture = canvas.toDataURL();\r\n return texture;\r\n}\r\n\r\nfunction createSky(theme: TrackTheme) {\r\n const sky = new THREE.Mesh(\r\n new THREE.SphereGeometry(),\r\n createSkyMaterial(theme)\r\n );\r\n\r\n return sky;\r\n}\r\n\r\nexport { createSky };\r\n","import { TrackTheme } from \"@/types/track\";\r\nimport * as THREE from \"three\";\r\n\r\nfunction createSunMaterial(theme: TrackTheme) {\r\n const manager = new THREE.LoadingManager();\r\n\r\n const themeSuns = {\r\n day: \"day.png\",\r\n night: \"night.png\",\r\n cloudy: \"day.png\",\r\n };\r\n\r\n const sunTexture = new THREE.TextureLoader(manager).load(\r\n `/assets/images/sun/${themeSuns[theme.sky]}`\r\n );\r\n\r\n const sunMaterial = new THREE.MeshBasicMaterial({\r\n transparent: true,\r\n map: sunTexture,\r\n fog: false,\r\n blending: THREE.AdditiveBlending,\r\n });\r\n\r\n return sunMaterial;\r\n}\r\n\r\nfunction createSun(theme: TrackTheme) {\r\n const sun = new THREE.Mesh(\r\n new THREE.PlaneGeometry(),\r\n createSunMaterial(theme)\r\n );\r\n\r\n return sun;\r\n}\r\n\r\nexport { createSun };\r\n","import {\r\n AdditiveBlending,\r\n Box2,\r\n BufferGeometry,\r\n Color,\r\n FramebufferTexture,\r\n InterleavedBuffer,\r\n InterleavedBufferAttribute,\r\n Mesh,\r\n MeshBasicMaterial,\r\n RawShaderMaterial,\r\n Vector2,\r\n Vector3,\r\n Vector4,\r\n RGBAFormat,\r\n} from \"three\";\r\n\r\nclass Lensflare extends Mesh {\r\n constructor(opacity) {\r\n super(\r\n Lensflare.Geometry,\r\n new MeshBasicMaterial({ opacity: 0, transparent: true })\r\n );\r\n\r\n this.isLensflare = true;\r\n\r\n this.type = \"Lensflare\";\r\n this.frustumCulled = false;\r\n this.renderOrder = Infinity;\r\n\r\n //\r\n\r\n const positionScreen = new Vector3();\r\n const positionView = new Vector3();\r\n\r\n // textures\r\n\r\n const tempMap = new FramebufferTexture(16, 16, RGBAFormat);\r\n const occlusionMap = new FramebufferTexture(16, 16, RGBAFormat);\r\n\r\n // material\r\n\r\n const geometry = Lensflare.Geometry;\r\n\r\n const material1a = new RawShaderMaterial({\r\n uniforms: {\r\n scale: { value: null },\r\n screenPosition: { value: null },\r\n },\r\n vertexShader: /* glsl */ `\r\n\r\n\t\t\t\tprecision highp float;\r\n\r\n\t\t\t\tuniform vec3 screenPosition;\r\n\t\t\t\tuniform vec2 scale;\r\n\r\n\t\t\t\tattribute vec3 position;\r\n\r\n\t\t\t\tvoid main() {\r\n\r\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\r\n\r\n\t\t\t\t}`,\r\n\r\n fragmentShader: /* glsl */ `\r\n\r\n\t\t\t\tprecision highp float;\r\n\r\n\t\t\t\tvoid main() {\r\n\r\n\t\t\t\t\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 1.0 );\r\n\r\n\t\t\t\t}`,\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: false,\r\n });\r\n\r\n const material1b = new RawShaderMaterial({\r\n uniforms: {\r\n map: { value: tempMap },\r\n scale: { value: null },\r\n screenPosition: { value: null },\r\n },\r\n vertexShader: /* glsl */ `\r\n\r\n\t\t\t\tprecision highp float;\r\n\r\n\t\t\t\tuniform vec3 screenPosition;\r\n\t\t\t\tuniform vec2 scale;\r\n\r\n\t\t\t\tattribute vec3 position;\r\n\t\t\t\tattribute vec2 uv;\r\n\r\n\t\t\t\tvarying vec2 vUV;\r\n\r\n\t\t\t\tvoid main() {\r\n\r\n\t\t\t\t\tvUV = uv;\r\n\r\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\r\n\r\n\t\t\t\t}`,\r\n\r\n fragmentShader: /* glsl */ `\r\n\r\n\t\t\t\tprecision highp float;\r\n\r\n\t\t\t\tuniform sampler2D map;\r\n\r\n\t\t\t\tvarying vec2 vUV;\r\n\r\n\t\t\t\tvoid main() {\r\n\r\n\t\t\t\t\tgl_FragColor = texture2D( map, vUV );\r\n\r\n\t\t\t\t}`,\r\n depthTest: false,\r\n depthWrite: false,\r\n transparent: false,\r\n });\r\n\r\n // the following object is used for occlusionMap generation\r\n\r\n const mesh1 = new Mesh(geometry, material1a);\r\n\r\n //\r\n\r\n const elements = [];\r\n\r\n const shader = LensflareElement.Shader;\r\n\r\n const material2 = new RawShaderMaterial({\r\n uniforms: {\r\n map: { value: null },\r\n occlusionMap: { value: occlusionMap },\r\n color: { value: new Color(0xffffff) },\r\n scale: { value: new Vector2() },\r\n screenPosition: { value: new Vector3() },\r\n },\r\n vertexShader: shader.vertexShader,\r\n fragmentShader: shader.fragmentShader,\r\n blending: AdditiveBlending,\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n\r\n const mesh2 = new Mesh(geometry, material2);\r\n\r\n this.addElement = function (element) {\r\n elements.push(element);\r\n };\r\n\r\n //\r\n\r\n const scale = new Vector2();\r\n const screenPositionPixels = new Vector2();\r\n const validArea = new Box2();\r\n const viewport = new Vector4();\r\n\r\n this.onBeforeRender = function (renderer, scene, camera) {\r\n renderer.getCurrentViewport(viewport);\r\n\r\n const invAspect = viewport.w / viewport.z;\r\n const halfViewportWidth = viewport.z / 2.0;\r\n const halfViewportHeight = viewport.w / 2.0;\r\n\r\n let size = 16 / viewport.w;\r\n scale.set(size * invAspect, size);\r\n\r\n validArea.min.set(viewport.x - 500, viewport.y - 500);\r\n validArea.max.set(\r\n viewport.x + (viewport.z + 500),\r\n viewport.y + (viewport.w + 500)\r\n );\r\n\r\n // calculate position in screen space\r\n\r\n positionView.setFromMatrixPosition(this.matrixWorld);\r\n positionView.applyMatrix4(camera.matrixWorldInverse);\r\n\r\n if (positionView.z > 0) return; // lensflare is behind the camera\r\n\r\n positionScreen\r\n .copy(positionView)\r\n .applyMatrix4(camera.projectionMatrix);\r\n\r\n // horizontal and vertical coordinate of the lower left corner of the pixels to copy\r\n\r\n screenPositionPixels.x =\r\n viewport.x +\r\n positionScreen.x * halfViewportWidth +\r\n halfViewportWidth -\r\n 8;\r\n screenPositionPixels.y =\r\n viewport.y +\r\n positionScreen.y * halfViewportHeight +\r\n halfViewportHeight -\r\n 8;\r\n\r\n // screen cull\r\n\r\n if (validArea.containsPoint(screenPositionPixels)) {\r\n // save current RGB to temp texture\r\n\r\n renderer.copyFramebufferToTexture(\r\n screenPositionPixels,\r\n tempMap\r\n );\r\n\r\n // render pink quad\r\n\r\n let uniforms = material1a.uniforms;\r\n uniforms[\"scale\"].value = scale;\r\n uniforms[\"screenPosition\"].value = positionScreen;\r\n\r\n renderer.renderBufferDirect(\r\n camera,\r\n null,\r\n geometry,\r\n material1a,\r\n mesh1,\r\n null\r\n );\r\n\r\n // copy result to occlusionMap\r\n\r\n renderer.copyFramebufferToTexture(\r\n screenPositionPixels,\r\n occlusionMap\r\n );\r\n\r\n // restore graphics\r\n\r\n uniforms = material1b.uniforms;\r\n uniforms[\"scale\"].value = scale;\r\n uniforms[\"screenPosition\"].value = positionScreen;\r\n\r\n renderer.renderBufferDirect(\r\n camera,\r\n null,\r\n geometry,\r\n material1b,\r\n mesh1,\r\n null\r\n );\r\n\r\n // render elements\r\n\r\n const vecX = -positionScreen.x * 2;\r\n const vecY = -positionScreen.y * 2;\r\n\r\n for (let i = 0, l = elements.length; i < l; i++) {\r\n const element = elements[i];\r\n\r\n const uniforms = material2.uniforms;\r\n\r\n uniforms[\"color\"].value.copy(element.color);\r\n uniforms[\"map\"].value = element.texture;\r\n uniforms[\"screenPosition\"].value.x =\r\n positionScreen.x + vecX * element.distance;\r\n uniforms[\"screenPosition\"].value.y =\r\n positionScreen.y + vecY * element.distance;\r\n uniforms[\"themeVisibility\"] = { value: opacity };\r\n size = element.size / viewport.w;\r\n const invAspect = viewport.w / viewport.z;\r\n\r\n uniforms[\"scale\"].value.set(size * invAspect, size);\r\n\r\n material2.uniformsNeedUpdate = true;\r\n\r\n renderer.renderBufferDirect(\r\n camera,\r\n null,\r\n geometry,\r\n material2,\r\n mesh2,\r\n null\r\n );\r\n }\r\n }\r\n };\r\n\r\n this.dispose = function () {\r\n material1a.dispose();\r\n material1b.dispose();\r\n material2.dispose();\r\n\r\n tempMap.dispose();\r\n occlusionMap.dispose();\r\n\r\n for (let i = 0, l = elements.length; i < l; i++) {\r\n elements[i].texture.dispose();\r\n }\r\n };\r\n }\r\n}\r\n\r\n//\r\n\r\nclass LensflareElement {\r\n constructor(texture, size = 1, distance = 0, color = new Color(0xffffff)) {\r\n this.texture = texture;\r\n this.size = size;\r\n this.distance = distance;\r\n this.color = color;\r\n }\r\n}\r\n\r\nLensflareElement.Shader = {\r\n uniforms: {\r\n map: { value: null },\r\n occlusionMap: { value: null },\r\n color: { value: null },\r\n scale: { value: null },\r\n screenPosition: { value: null },\r\n themeVisibility: { value: null },\r\n },\r\n\r\n vertexShader: /* glsl */ `\r\n\r\n\t\tprecision highp float;\r\n\r\n\t\tuniform vec3 screenPosition;\r\n\t\tuniform vec2 scale;\r\n uniform float themeVisibility;\r\n\r\n\t\tuniform sampler2D occlusionMap;\r\n\r\n\t\tattribute vec3 position;\r\n\t\tattribute vec2 uv;\r\n\r\n\t\tvarying vec2 vUV;\r\n\t\tvarying float vVisibility;\r\n\r\n\t\tvoid main() {\r\n\r\n\t\t\tvUV = uv;\r\n\r\n\t\t\tvec2 pos = position.xy;\r\n\r\n\t\t\tvec4 visibility = texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\r\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\r\n\r\n\t\t\tvVisibility = visibility.r / 9.0;\r\n\t\t\tvVisibility *= 1.0 - visibility.g / 9.0;\r\n\t\t\tvVisibility *= visibility.b / 9.0;\r\n\r\n vVisibility *= themeVisibility;\r\n\r\n\t\t\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\r\n\r\n\t\t}`,\r\n\r\n fragmentShader: /* glsl */ `\r\n\r\n\t\tprecision highp float;\r\n\r\n\t\tuniform sampler2D map;\r\n\t\tuniform vec3 color;\r\n\r\n\t\tvarying vec2 vUV;\r\n\t\tvarying float vVisibility;\r\n\r\n\t\tvoid main() {\r\n\r\n\t\t\tvec4 texture = texture2D( map, vUV );\r\n\t\t\ttexture.a *= vVisibility;\r\n\t\t\tgl_FragColor = texture;\r\n\t\t\tgl_FragColor.rgb *= color;\r\n\r\n\t\t}`,\r\n};\r\n\r\nLensflare.Geometry = (function () {\r\n const geometry = new BufferGeometry();\r\n\r\n const float32Array = new Float32Array([\r\n -1, -1, 0, 0, 0, 1, -1, 0, 1, 0, 1, 1, 0, 1, 1, -1, 1, 0, 0, 1,\r\n ]);\r\n\r\n const interleavedBuffer = new InterleavedBuffer(float32Array, 5);\r\n\r\n geometry.setIndex([0, 1, 2, 0, 2, 3]);\r\n geometry.setAttribute(\r\n \"position\",\r\n new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false)\r\n );\r\n geometry.setAttribute(\r\n \"uv\",\r\n new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false)\r\n );\r\n\r\n return geometry;\r\n})();\r\n\r\nexport { Lensflare, LensflareElement };\r\n","import * as THREE from \"three\";\r\nimport { Track, TrackSegment, TrackVertexCoordinates } from \"../types/track\";\r\n\r\ntype Edge = [number, number, number, number, number, number, number];\r\n\r\nclass TrackBody {\r\n body: Edge[][];\r\n\r\n constructor(track: Track, scene?: THREE.Scene) {\r\n this.body = this.createBody(track);\r\n\r\n if (scene) {\r\n const debugMaterial = new THREE.MeshBasicMaterial({\r\n color: 0x000000,\r\n });\r\n for (const segment of this.body) {\r\n for (const coord of segment) {\r\n for (let i = 0; i < 2; i++) {\r\n const mesh = new THREE.Mesh(\r\n new THREE.BoxGeometry(5, 5, 5),\r\n debugMaterial\r\n );\r\n mesh.scale.x = 0.1;\r\n mesh.scale.y = 0.1;\r\n mesh.scale.z = 0.1;\r\n mesh.position.set(\r\n coord[0 + i * 3],\r\n coord[1 + i * 3],\r\n coord[2 + i * 3]\r\n );\r\n scene.add(mesh);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private createBody(track: Track) {\r\n const segments: Edge[][] = [];\r\n\r\n for (const segment of track.segments) {\r\n const bodySegment = this.createSegment(track, segment);\r\n segments.push(bodySegment);\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n private getInterpolationCount(\r\n a: TrackVertexCoordinates,\r\n b: TrackVertexCoordinates\r\n ) {\r\n let interpolationCount = 1;\r\n\r\n const xDiff = Math.abs(a[0] - b[0]);\r\n const yDiff = Math.abs(a[1] - b[1]);\r\n const zDiff = Math.abs(a[2] - b[2]);\r\n const ryDiff =\r\n Math.min(Math.abs(a[3] - b[3]), Math.abs(a[3] - Math.PI - b[3])) /\r\n (Math.PI / 2);\r\n const rxDiff =\r\n Math.min(Math.abs(a[4] - b[4]), Math.abs(a[4] - Math.PI - b[4])) /\r\n (Math.PI / 2);\r\n\r\n interpolationCount +=\r\n 8 * Math.ceil(yDiff) +\r\n 4 * Math.ceil(Math.max(ryDiff, rxDiff)) * Math.ceil(xDiff + zDiff);\r\n\r\n return interpolationCount;\r\n }\r\n\r\n private getInterpolatedCoordinates(\r\n a: TrackVertexCoordinates,\r\n b: TrackVertexCoordinates,\r\n index: number\r\n ): TrackVertexCoordinates {\r\n const smoothIndex = (Math.sin(index * Math.PI - Math.PI / 2) + 1) / 2;\r\n\r\n const angleDifference =\r\n Math.min(b[3] - a[3], b[3] - a[3] + Math.PI) / (Math.PI / 2);\r\n\r\n const diffX = Math.abs(a[0] - b[0]);\r\n const diffZ = Math.abs(a[2] - b[2]);\r\n\r\n const newA = [\r\n a[0] + angleDifference * Math.sin(a[3]) * diffX,\r\n a[1],\r\n a[2] + angleDifference * Math.cos(a[3] + Math.PI) * diffZ,\r\n a[3],\r\n ];\r\n\r\n const newB = [\r\n b[0] + angleDifference * Math.sin(b[3]) * diffX,\r\n b[1],\r\n b[2] + angleDifference * Math.cos(b[3] + Math.PI) * diffZ,\r\n b[3],\r\n ];\r\n\r\n const x =\r\n (a[0] * (1 - index) + newB[0] * index) * (1 - index) +\r\n (newA[0] * (1 - index) + b[0] * index) * index;\r\n\r\n const y = a[1] * (1 - smoothIndex) + b[1] * smoothIndex;\r\n\r\n const z =\r\n (a[2] * (1 - index) + newB[2] * index) * (1 - index) +\r\n (newA[2] * (1 - index) + b[2] * index) * index;\r\n\r\n const ry = a[3] * (1 - index) + b[3] * index;\r\n const rx = a[4] * (1 - smoothIndex) + b[4] * smoothIndex;\r\n\r\n return [x, y, z, ry, rx];\r\n }\r\n\r\n private createSegment(track: Track, segment: TrackSegment): Edge[] {\r\n const edges: Edge[] = [];\r\n\r\n const length = segment.vertices.length;\r\n for (let i = 0; i < length - 1; i++) {\r\n const a = segment.vertices[i];\r\n const b = segment.vertices[i + 1];\r\n\r\n if (b[3] - a[3] < -Math.PI * 2) {\r\n a[3] -= Math.PI * 2;\r\n }\r\n\r\n if (b[3] - a[3] >= Math.PI * 2) {\r\n a[3] += Math.PI * 2;\r\n }\r\n\r\n const interpolationCount = this.getInterpolationCount(a, b);\r\n\r\n const isLastVertex = i === length - 2;\r\n const iterationCount = interpolationCount + (isLastVertex ? 1 : 0);\r\n for (let i = 0; i < iterationCount; i++) {\r\n const interpolatedCoords = this.getInterpolatedCoordinates(\r\n a,\r\n b,\r\n i / interpolationCount\r\n );\r\n\r\n const newEdges = this.createGeometryPositionVertices(\r\n interpolatedCoords,\r\n segment.width\r\n );\r\n\r\n edges.push(newEdges);\r\n }\r\n }\r\n\r\n return edges;\r\n }\r\n\r\n private createGeometryPositionVertices(\r\n coord: TrackVertexCoordinates,\r\n width: number\r\n ): Edge {\r\n const w = width;\r\n const edges: Edge = [\r\n coord[0],\r\n coord[1],\r\n -w + coord[2],\r\n coord[0],\r\n coord[1],\r\n w + coord[2],\r\n coord[3],\r\n ];\r\n\r\n for (let i = 0; i < 2; i++) {\r\n // Coordinates\r\n const isLeft = edges[i * 3 + 2] === -w + coord[2];\r\n\r\n if (isLeft) {\r\n edges[i * 3] += w * Math.sin(coord[3]);\r\n edges[i * 3 + 2] -= w * (Math.cos(coord[3]) - 1);\r\n } else {\r\n edges[i * 3] += w * Math.sin(coord[3] + Math.PI);\r\n edges[i * 3 + 2] += w * (Math.cos(coord[3]) - 1);\r\n }\r\n\r\n if (isLeft) {\r\n edges[i * 3 + 1] += w * Math.sin(coord[4]);\r\n } else {\r\n edges[i * 3 + 1] += w * Math.sin(coord[4] + Math.PI);\r\n }\r\n }\r\n\r\n for (let i = 0; i < edges.length - 1; i++) {\r\n edges[i] *= 8;\r\n }\r\n\r\n return edges;\r\n }\r\n\r\n private sqr(x: number) {\r\n return x * x;\r\n }\r\n private dist2(v: { x: number; y: number }, w: { x: number; y: number }) {\r\n return this.sqr(v.x - w.x) + this.sqr(v.y - w.y);\r\n }\r\n private distToSegmentSquared(\r\n p: { x: number; y: number },\r\n v: { x: number; y: number },\r\n w: { x: number; y: number }\r\n ) {\r\n const l2 = this.dist2(v, w);\r\n if (l2 == 0) return this.dist2(p, v);\r\n let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\r\n t = Math.max(0, Math.min(1, t));\r\n return this.dist2(p, {\r\n x: v.x + t * (w.x - v.x),\r\n y: v.y + t * (w.y - v.y),\r\n });\r\n }\r\n private distToSegment(\r\n p: { x: number; y: number },\r\n v: { x: number; y: number },\r\n w: { x: number; y: number }\r\n ) {\r\n return Math.sqrt(this.distToSegmentSquared(p, v, w));\r\n }\r\n\r\n public isIntersecting(x: number, y: number) {\r\n let heights: [number, number][] = [];\r\n\r\n for (const segment of this.body) {\r\n segmentLoop: for (let i = 0; i < segment.length - 1; i++) {\r\n const square = [\r\n [segment[i + 1][0], segment[i + 1][2]],\r\n [segment[i + 1][3], segment[i + 1][5]],\r\n [segment[i][3], segment[i][5]],\r\n [segment[i][0], segment[i][2]],\r\n ];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const bodyVector = [\r\n square[(i + 1) % 4][0] - square[i][0],\r\n square[(i + 1) % 4][1] - square[i][1],\r\n ];\r\n const playerVector = [x - square[i][0], y - square[i][1]];\r\n\r\n const bodyAngle = Math.atan2(bodyVector[1], bodyVector[0]);\r\n let playerAngle = Math.atan2(\r\n playerVector[1],\r\n playerVector[0]\r\n );\r\n\r\n if (playerAngle < bodyAngle) {\r\n playerAngle += Math.PI * 2;\r\n }\r\n\r\n const deltaAngle = playerAngle - bodyAngle;\r\n if (deltaAngle > Math.PI) {\r\n continue segmentLoop;\r\n }\r\n }\r\n\r\n const playerCoord = { x, y };\r\n\r\n const aCoord1 = { x: segment[i][0], y: segment[i][2] };\r\n const aCoord2 = { x: segment[i][3], y: segment[i][5] };\r\n const bCoord1 = { x: segment[i + 1][0], y: segment[i + 1][2] };\r\n const bCoord2 = { x: segment[i + 1][3], y: segment[i + 1][5] };\r\n\r\n const distA = this.distToSegment(playerCoord, aCoord1, aCoord2);\r\n const distB = this.distToSegment(playerCoord, bCoord1, bCoord2);\r\n const totalABDist = distA + distB;\r\n\r\n const distL = this.distToSegment(playerCoord, aCoord1, bCoord1);\r\n const distR = this.distToSegment(playerCoord, aCoord2, bCoord2);\r\n const totalLRDist = distL + distR;\r\n\r\n const heightA =\r\n (segment[i][1] * distR) / totalLRDist +\r\n (segment[i][4] * distL) / totalLRDist;\r\n const heightB =\r\n (segment[i + 1][1] * distR) / totalLRDist +\r\n (segment[i + 1][4] * distL) / totalLRDist;\r\n\r\n const height: [number, number] = [\r\n heightA * (distB / totalABDist) +\r\n heightB * (distA / totalABDist),\r\n segment[i][6],\r\n ];\r\n\r\n heights.push(height);\r\n }\r\n }\r\n\r\n heights = heights.sort((a, b) => (a[0] < b[0] ? 1 : -1));\r\n return heights;\r\n }\r\n}\r\n\r\nexport { TrackBody };\r\n","import { TrackTheme } from \"../types/track\";\r\n\r\nfunction getInterpolatedCoordinates(\r\n a: LegacyCoordinates,\r\n b: LegacyCoordinates,\r\n index: number\r\n): LegacyCoordinates {\r\n const smoothIndex = (Math.sin(index * Math.PI - Math.PI / 2) + 1) / 2;\r\n\r\n const angleDifference =\r\n Math.min(b.ry - a.ry, b.ry - a.ry + Math.PI) / (Math.PI / 2);\r\n\r\n const diffX = Math.abs(a.x - b.x);\r\n const diffZ = Math.abs(a.z - b.z);\r\n\r\n const newA = {\r\n x: a.x + angleDifference * Math.sin(a.ry) * diffX,\r\n y: a.y,\r\n z: a.z + angleDifference * Math.cos(a.ry + Math.PI) * diffZ,\r\n ry: a.ry,\r\n };\r\n\r\n const newB = {\r\n x: b.x + angleDifference * Math.sin(b.ry) * diffX,\r\n y: b.y,\r\n z: b.z + angleDifference * Math.cos(b.ry + Math.PI) * diffZ,\r\n ry: b.ry,\r\n };\r\n\r\n const x =\r\n (a.x * (1 - index) + newB.x * index) * (1 - index) +\r\n (newA.x * (1 - index) + b.x * index) * index;\r\n\r\n const y = a.y * (1 - smoothIndex) + b.y * smoothIndex;\r\n\r\n const z =\r\n (a.z * (1 - index) + newB.z * index) * (1 - index) +\r\n (newA.z * (1 - index) + b.z * index) * index;\r\n\r\n const ry = a.ry * (1 - index) + b.ry * index;\r\n const rx = a.rx * (1 - smoothIndex) + b.rx * smoothIndex;\r\n\r\n return {\r\n x,\r\n y,\r\n z,\r\n ry,\r\n rx,\r\n };\r\n}\r\n\r\ntype SegmentOptions = {\r\n width: number;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n};\r\n\r\nfunction createInterpolatedGeometryPosition(\r\n a: LegacyCoordinates,\r\n b: LegacyCoordinates,\r\n interpolationCount: number,\r\n theme: TrackTheme,\r\n options: SegmentOptions\r\n) {\r\n const vertices: { [key: string]: number[] } = {};\r\n\r\n if (b.ry - a.ry < -Math.PI) {\r\n a.ry -= Math.PI * 2;\r\n }\r\n\r\n for (let i = 0; i < interpolationCount; i++) {\r\n const interpolatedA = getInterpolatedCoordinates(\r\n a,\r\n b,\r\n i / interpolationCount\r\n );\r\n const interpolatedB = getInterpolatedCoordinates(\r\n a,\r\n b,\r\n (i + 1) / interpolationCount\r\n );\r\n\r\n const newVertices = createGeometryPositionVertices(\r\n interpolatedA,\r\n interpolatedB,\r\n theme,\r\n options.width,\r\n options.isLast && i === interpolationCount - 1,\r\n options.isFirst && i === 0\r\n );\r\n\r\n for (const part in newVertices) {\r\n if (!vertices[part]) {\r\n vertices[part] = [];\r\n }\r\n vertices[part].push(...newVertices[part]);\r\n }\r\n }\r\n\r\n return vertices;\r\n}\r\n\r\ntype LegacyCoordinates = {\r\n x: number;\r\n y: number;\r\n z: number;\r\n ry: number;\r\n rx: number;\r\n};\r\n\r\nfunction createGeometryPositionVertices(\r\n a: LegacyCoordinates,\r\n b: LegacyCoordinates,\r\n theme: TrackTheme,\r\n width: number,\r\n isFront: boolean,\r\n isBack: boolean\r\n): { [key: string]: number[] } {\r\n const vertices: { [key: string]: number[] } = {\r\n top: [],\r\n left: [],\r\n right: [],\r\n bottom: [],\r\n };\r\n\r\n const h = theme.roadHeight ?? 0.25;\r\n\r\n const w = width;\r\n\r\n // Top face\r\n vertices.top.push(-1.0, 0, -w, -1.0, 0, w, 1.0, 0, -w);\r\n vertices.top.push(-1.0, 0, w, 1.0, 0, w, 1.0, 0, -w);\r\n\r\n // Bottom face\r\n vertices.bottom.push(1.0, -h, -w, -1.0, -h, w, -1.0, -h, -w);\r\n vertices.bottom.push(1.0, -h, w, -1.0, -h, w, 1.0, -h, -w);\r\n\r\n // Left face\r\n vertices.left.push(1.0, -h, w, -1.0, 0, w, -1.0, -h, w);\r\n vertices.left.push(-1.0, 0, w, 1.0, -h, w, 1.0, 0, w);\r\n\r\n // Right face\r\n vertices.right.push(-1.0, -h, -w, -1.0, 0, -w, 1.0, -h, -w);\r\n vertices.right.push(-1.0, 0, -w, 1.0, 0, -w, 1.0, -h, -w);\r\n\r\n // Front face\r\n if (isFront) {\r\n vertices.front = [];\r\n vertices.front.push(1.0, 0, w, 1.0, -h, -w, 1.0, 0, -w);\r\n vertices.front.push(1.0, 0, w, 1.0, -h, w, 1.0, -h, -w);\r\n }\r\n\r\n // Back face\r\n if (isBack) {\r\n vertices.back = [];\r\n vertices.back.push(-1.0, 0, w, -1.0, 0, -w, -1.0, -h, -w);\r\n vertices.back.push(-1.0, -h, -w, -1.0, -h, w, -1.0, 0, w);\r\n }\r\n\r\n for (const part in vertices) {\r\n const trianglesCount = vertices[part].length / 3;\r\n\r\n for (let i = 0; i < trianglesCount; i++) {\r\n // Coordinates\r\n const isA = vertices[part][i * 3] === -1;\r\n const isLeft = vertices[part][i * 3 + 2] === -w;\r\n\r\n const current = isA ? a : b;\r\n\r\n vertices[part][i * 3] = current.x;\r\n vertices[part][i * 3 + 1] += current.y;\r\n vertices[part][i * 3 + 2] += current.z;\r\n\r\n if (isLeft) {\r\n vertices[part][i * 3] += w * Math.sin(current.ry);\r\n vertices[part][i * 3 + 2] -= w * (Math.cos(current.ry) - 1);\r\n } else {\r\n vertices[part][i * 3] += w * Math.sin(current.ry + Math.PI);\r\n vertices[part][i * 3 + 2] += w * (Math.cos(current.ry) - 1);\r\n }\r\n\r\n if (isLeft) {\r\n vertices[part][i * 3 + 1] += w * Math.sin(current.rx);\r\n } else {\r\n vertices[part][i * 3 + 1] += w * Math.sin(current.rx + Math.PI);\r\n }\r\n }\r\n\r\n // Scaling up\r\n for (let i = 0; i < vertices[part].length; i++) {\r\n vertices[part][i] *= 8;\r\n }\r\n }\r\n\r\n return vertices;\r\n}\r\n\r\nexport { createInterpolatedGeometryPosition };\r\n","function hexToRgb(hex: number) {\r\n const r = (hex >> 16) & 255;\r\n const g = (hex >> 8) & 255;\r\n const b = hex & 255;\r\n\r\n return { r, g, b };\r\n}\r\n\r\nexport { hexToRgb };\r\n","import { TrackStyle, TrackStyles, TrackTheme } from \"@/types/track\";\r\nimport { hexToRgb } from \"./colors\";\r\nimport * as THREE from \"three\";\r\n\r\nconst textureWidth = 2048;\r\nconst textureHeight = 2;\r\n\r\nfunction getTrackMaterials(theme: TrackTheme, styles: TrackStyles) {\r\n const manager = new THREE.LoadingManager();\r\n\r\n const envMap = new THREE.TextureLoader().load(\"/assets/images/envmap.png\");\r\n envMap.mapping = THREE.EquirectangularReflectionMapping;\r\n\r\n const materials: { [key: string]: any } = {};\r\n\r\n const bumpTexture = new THREE.TextureLoader(manager).load(\r\n \"/assets/images/bump.png\"\r\n );\r\n\r\n for (const style in styles) {\r\n const roadTexture = new THREE.TextureLoader().load(\r\n getRoadTexture(styles[style])\r\n );\r\n const roadMaterial = new THREE.MeshPhongMaterial({\r\n color: 0xffffff,\r\n depthWrite: true,\r\n map: roadTexture,\r\n bumpMap: bumpTexture,\r\n bumpScale: 0.08 * (styles[style].bump ?? 1),\r\n specular: 0x202020,\r\n shininess: styles[style].shininess ?? 100,\r\n envMap,\r\n combine: THREE.AddOperation,\r\n reflectivity: 0.4,\r\n });\r\n\r\n const sideTexture = new THREE.TextureLoader(manager).load(\r\n getSideTexture(styles[style])\r\n );\r\n const sideMaterial = new THREE.MeshPhongMaterial({\r\n color: 0xffffff,\r\n depthWrite: true,\r\n map: sideTexture,\r\n bumpMap: bumpTexture,\r\n bumpScale: 0.06 * (styles[style].bump ?? 1),\r\n specular: 0x202020,\r\n shininess: styles[style].shininess ?? 100,\r\n envMap,\r\n combine: THREE.AddOperation,\r\n reflectivity: 0.4,\r\n });\r\n\r\n const glassTexture = new THREE.TextureLoader(manager).load(\r\n getGlassTexture(styles[style])\r\n );\r\n\r\n const glassRoadMaterial = new THREE.MeshPhongMaterial({\r\n color: styles[style].glassColor,\r\n depthWrite: true,\r\n specular: 0xffffff,\r\n shininess: 50,\r\n transparent: true,\r\n alphaMap: glassTexture,\r\n });\r\n\r\n const glassSideMaterial = new THREE.MeshPhongMaterial({\r\n color: styles[style].glassColor,\r\n depthWrite: true,\r\n specular: 0xffffff,\r\n shininess: 50,\r\n transparent: true,\r\n opacity: 0.75,\r\n });\r\n\r\n materials[style] = {\r\n road: roadMaterial,\r\n side: sideMaterial,\r\n glass_road: glassRoadMaterial,\r\n glass_side: glassSideMaterial,\r\n };\r\n }\r\n\r\n return materials;\r\n}\r\n\r\nfunction getRoadTexture(style: TrackStyle) {\r\n const buffer = new Uint8ClampedArray(textureWidth * textureHeight * 4);\r\n\r\n for (let y = 0; y < textureHeight; y++) {\r\n for (let x = 0; x < textureWidth; x++) {\r\n const pos = (y * textureWidth + x) * 4;\r\n\r\n let color = hexToRgb(0xdbe5ee);\r\n\r\n let isStrip = false;\r\n\r\n for (const strip of style.strips) {\r\n if (x >= strip[0] && x < strip[0] + strip[1]) {\r\n isStrip = true;\r\n }\r\n if (\r\n x <= textureWidth - strip[0] &&\r\n x > textureWidth - (strip[0] + strip[1])\r\n ) {\r\n isStrip = true;\r\n }\r\n }\r\n\r\n if (!isStrip) {\r\n const index = Math.pow(x / (textureWidth / 2) - 1, 2);\r\n\r\n const rgbRoadCenterColor = hexToRgb(style.roadCenterColor);\r\n const rgbRoadEdgeColor = hexToRgb(style.roadEdgeColor);\r\n\r\n color = {\r\n r:\r\n rgbRoadCenterColor.r * (1 - index) +\r\n rgbRoadEdgeColor.r * index,\r\n g:\r\n rgbRoadCenterColor.g * (1 - index) +\r\n rgbRoadEdgeColor.g * index,\r\n b:\r\n rgbRoadCenterColor.b * (1 - index) +\r\n rgbRoadEdgeColor.b * index,\r\n };\r\n }\r\n buffer[pos] = color.r;\r\n buffer[pos + 1] = color.g;\r\n buffer[pos + 2] = color.b;\r\n buffer[pos + 3] = 255;\r\n }\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = textureWidth;\r\n canvas.height = textureHeight;\r\n\r\n const imageData = ctx!.createImageData(textureWidth, textureHeight);\r\n imageData.data.set(buffer);\r\n ctx!.putImageData(imageData, 0, 0);\r\n\r\n const texture = canvas.toDataURL();\r\n return texture;\r\n}\r\n\r\nfunction getSideTexture(style: TrackStyle) {\r\n const buffer = new Uint8ClampedArray(textureWidth * textureHeight * 4);\r\n\r\n for (let y = 0; y < textureHeight; y++) {\r\n for (let x = 0; x < textureWidth; x++) {\r\n const pos = (y * textureWidth + x) * 4;\r\n\r\n let color = {\r\n r: 0,\r\n g: 0,\r\n b: 0,\r\n };\r\n\r\n const index = Math.pow(x / (textureWidth / 2) - 1, 2);\r\n\r\n const rgbConcreteColor = hexToRgb(0xdee8f0);\r\n const rgbConcreteDarkColor = hexToRgb(0xa0a8b0);\r\n\r\n color = {\r\n r:\r\n rgbConcreteDarkColor.r * (1 - index) +\r\n rgbConcreteColor.r * index,\r\n g:\r\n rgbConcreteDarkColor.g * (1 - index) +\r\n rgbConcreteColor.g * index,\r\n b:\r\n rgbConcreteDarkColor.b * (1 - index) +\r\n rgbConcreteColor.b * index,\r\n };\r\n\r\n buffer[pos] = color.r;\r\n buffer[pos + 1] = color.g;\r\n buffer[pos + 2] = color.b;\r\n buffer[pos + 3] = 255;\r\n }\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = textureWidth;\r\n canvas.height = textureHeight;\r\n\r\n const imageData = ctx!.createImageData(textureWidth, textureHeight);\r\n imageData.data.set(buffer);\r\n ctx!.putImageData(imageData, 0, 0);\r\n\r\n const texture = canvas.toDataURL();\r\n return texture;\r\n}\r\n\r\nfunction getGlassTexture(style: TrackStyle) {\r\n const buffer = new Uint8ClampedArray(textureWidth * textureHeight * 4);\r\n\r\n for (let y = 0; y < textureHeight; y++) {\r\n for (let x = 0; x < textureWidth; x++) {\r\n const pos = (y * textureWidth + x) * 4;\r\n\r\n let color = {\r\n r: 150,\r\n g: 150,\r\n b: 150,\r\n };\r\n\r\n let isStrip = false;\r\n\r\n for (const strip of style.strips) {\r\n if (x > strip[0] && x < strip[0] + strip[1]) {\r\n isStrip = true;\r\n }\r\n }\r\n\r\n if (isStrip) {\r\n color = {\r\n r: 192,\r\n g: 192,\r\n b: 192,\r\n };\r\n }\r\n\r\n buffer[pos] = color.r;\r\n buffer[pos + 1] = color.g;\r\n buffer[pos + 2] = color.b;\r\n buffer[pos + 3] = 255;\r\n }\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = textureWidth;\r\n canvas.height = textureHeight;\r\n\r\n const imageData = ctx!.createImageData(textureWidth, textureHeight);\r\n imageData.data.set(buffer);\r\n ctx!.putImageData(imageData, 0, 0);\r\n\r\n const texture = canvas.toDataURL();\r\n return texture;\r\n}\r\n\r\nexport {\r\n getTrackMaterials,\r\n getRoadTexture,\r\n getSideTexture as getRoadSideTexture,\r\n};\r\n","import * as THREE from \"three\";\r\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\r\nimport { TrackTheme, TrackStyle, TrackVertexCoordinates } from \"../types/track\";\r\n\r\ntype BeamCoordinates = [number, number, number];\r\n\r\nfunction createBeamUV() {\r\n const uv: number[] = [];\r\n\r\n uv.push(1, 0, 1, 0, 0, 0, 0, 0);\r\n for (let i = 0; i < 5; i++) {\r\n uv.push(1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1);\r\n }\r\n\r\n const uvTypedArray = new Float32Array(uv);\r\n return new THREE.Float32BufferAttribute(uvTypedArray, 2);\r\n}\r\n\r\nfunction createBeamGeometry(pos: BeamCoordinates, theme: TrackTheme) {\r\n const vertices: number[] = [];\r\n\r\n const w = theme.roadHeight / 4 ?? 0.125;\r\n const groundHeight = -15;\r\n\r\n // Top face\r\n vertices.push(-w, 0, w, w, 0, w, w, 0, -w);\r\n vertices.push(-w, 0, -w, -w, 0, w, w, 0, -w);\r\n\r\n // Left face\r\n vertices.push(-w, 0, w, w, groundHeight, w, w, 0, w);\r\n vertices.push(-w, groundHeight, w, w, groundHeight, w, -w, 0, w);\r\n\r\n // Right face\r\n vertices.push(-w, 0, -w, w, 0, -w, w, groundHeight, -w);\r\n vertices.push(-w, 0, -w, w, groundHeight, -w, -w, groundHeight, -w);\r\n\r\n // Back face\r\n vertices.push(w, 0, w, w, groundHeight, -w, w, 0, -w);\r\n vertices.push(w, groundHeight, w, w, groundHeight, -w, w, 0, w);\r\n\r\n // Front face\r\n vertices.push(-w, 0, w, -w, 0, -w, -w, groundHeight, -w);\r\n vertices.push(-w, 0, w, -w, groundHeight, -w, -w, groundHeight, w);\r\n\r\n const trianglesCount = vertices.length / 3;\r\n\r\n for (let i = 0; i < trianglesCount; i++) {\r\n vertices[i * 3] += pos[0];\r\n vertices[i * 3 + 2] += pos[2];\r\n\r\n if (vertices[i * 3 + 1] !== groundHeight) {\r\n vertices[i * 3 + 1] += pos[1];\r\n }\r\n\r\n vertices[i * 3 + 1] -= 0.01;\r\n }\r\n\r\n // Scaling up\r\n for (let i = 0; i < vertices.length; i++) {\r\n vertices[i] *= 16;\r\n }\r\n\r\n const geometryPosition = new Float32Array(vertices);\r\n\r\n const geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute(\r\n \"position\",\r\n new THREE.Float32BufferAttribute(geometryPosition, 3)\r\n );\r\n geometry.computeVertexNormals();\r\n geometry.setAttribute(\"uv\", createBeamUV());\r\n\r\n return geometry;\r\n}\r\n\r\nexport { createBeamGeometry };\r\n","import * as THREE from \"three\";\r\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\r\nimport {\r\n Track,\r\n TrackVertexCoordinates,\r\n TrackSegment,\r\n TrackMaterials,\r\n TrackMaterialType,\r\n} from \"./types/track\";\r\nimport { createInterpolatedGeometryPosition } from \"./utils/trackGeometry\";\r\nimport { getTrackMaterials } from \"./utils/trackMaterials\";\r\nimport { createBeamGeometry } from \"./utils/beam\";\r\n\r\nfunction createSideUV(length: number) {\r\n const uv: number[] = [];\r\n\r\n for (let i = 0; i < length; i++) {\r\n uv.push(1, 0.0001, 0, 0, 1, 0, 0, 0.0001);\r\n }\r\n\r\n const uvTypedArray = new Float32Array(uv);\r\n return new THREE.Float32BufferAttribute(uvTypedArray, 2);\r\n}\r\nfunction createEdgeUV() {\r\n const uv = [0, 0, 1, 0, 1, 1, 0, 1];\r\n\r\n const uvTypedArray = new Float32Array(uv);\r\n return new THREE.Float32BufferAttribute(uvTypedArray, 2);\r\n}\r\n\r\nfunction createRoadUV(length: number) {\r\n const uv: number[] = [];\r\n\r\n for (let i = 0; i < length; i++) {\r\n uv.push(1, 0.0001, 0, 0, 1, 0, 0, 0.0001);\r\n }\r\n\r\n const uvTypedArray = new Float32Array(uv);\r\n return new THREE.Float32BufferAttribute(uvTypedArray, 2);\r\n}\r\n\r\nfunction getTrackSegmentInterpolationCount(\r\n a: TrackVertexCoordinates,\r\n b: TrackVertexCoordinates\r\n) {\r\n let interpolationCount = 1;\r\n\r\n const xDiff = Math.abs(a[0] - b[0]);\r\n const yDiff = Math.abs(a[1] - b[1]);\r\n const zDiff = Math.abs(a[2] - b[2]);\r\n const angleDiff =\r\n Math.min(Math.abs(a[3] - b[3]), Math.abs(a[3] - Math.PI - b[3])) /\r\n (Math.PI / 2);\r\n\r\n interpolationCount +=\r\n 12 * Math.ceil(yDiff) +\r\n 12 * Math.ceil(angleDiff) * Math.ceil(xDiff + zDiff);\r\n interpolationCount += 12;\r\n\r\n return interpolationCount;\r\n}\r\n\r\nfunction getObjectCoordinates(coord: TrackVertexCoordinates) {\r\n return {\r\n x: coord[0],\r\n y: coord[1],\r\n z: coord[2],\r\n ry: coord[3],\r\n rx: coord[4],\r\n };\r\n}\r\n\r\nfunction createTrackSegment(\r\n track: Track,\r\n materials: TrackMaterials,\r\n segment: TrackSegment\r\n) {\r\n const meshes: THREE.Mesh[] = [];\r\n\r\n const vertices: { [key: string]: number[] } = {};\r\n\r\n const verticesCount = segment.vertices.length;\r\n for (let i = 0; i < verticesCount - 1; i++) {\r\n const a = segment.vertices[i];\r\n const b = segment.vertices[i + 1];\r\n\r\n if (Math.abs(a[3] - b[3]) % (Math.PI * 2) === 0) {\r\n a[3] = b[3];\r\n }\r\n\r\n const aLegacy = getObjectCoordinates(a);\r\n const bLegacy = getObjectCoordinates(b);\r\n\r\n const interpolationCount = getTrackSegmentInterpolationCount(a, b);\r\n\r\n const newVertices = createInterpolatedGeometryPosition(\r\n aLegacy,\r\n bLegacy,\r\n interpolationCount,\r\n track.theme,\r\n {\r\n width: segment.width,\r\n isFirst: i === 0,\r\n isLast: i === verticesCount - 2,\r\n }\r\n );\r\n\r\n for (const part in newVertices) {\r\n if (!vertices[part]) {\r\n vertices[part] = [];\r\n }\r\n vertices[part].push(...newVertices[part]);\r\n }\r\n }\r\n\r\n for (const part in vertices) {\r\n const geometryPosition = new Float32Array(vertices[part]);\r\n\r\n let geometry = new THREE.BufferGeometry();\r\n geometry.setAttribute(\r\n \"position\",\r\n new THREE.Float32BufferAttribute(geometryPosition, 3)\r\n );\r\n geometry = BufferGeometryUtils.mergeVertices(geometry, 0.0025);\r\n geometry.computeVertexNormals();\r\n\r\n let uv: THREE.Float32BufferAttribute = createRoadUV(2000);\r\n if (part === \"back\" || part === \"front\") uv = createEdgeUV();\r\n if (part === \"left\" || part === \"right\") uv = createSideUV(2000);\r\n\r\n geometry.setAttribute(\"uv\", uv);\r\n\r\n let materialPart: TrackMaterialType = \"side\";\r\n if (part === \"top\") materialPart = \"road\";\r\n if (\r\n track.theme.isRoadDoubleSided &&\r\n (part === \"bottom\" || part === \"front\" || part === \"back\")\r\n )\r\n materialPart = \"road\";\r\n if (segment.styleType === \"glass\") {\r\n materialPart = `glass_${materialPart}`;\r\n }\r\n\r\n const mesh = new THREE.Mesh(\r\n geometry,\r\n materials[segment.style][materialPart]\r\n );\r\n meshes.push(mesh);\r\n }\r\n\r\n for (const element of track.environment) {\r\n const geometry = createBeamGeometry(element.pos, track.theme);\r\n\r\n const mesh = new THREE.Mesh(geometry, materials[element.style][\"side\"]);\r\n meshes.push(mesh);\r\n }\r\n\r\n return meshes;\r\n}\r\n\r\nfunction createTrack(track: Track) {\r\n const meshes = [];\r\n\r\n const materials = getTrackMaterials(track.theme, track.styles);\r\n\r\n for (const segment of track.segments) {\r\n const segmentMeshes = createTrackSegment(track, materials, segment);\r\n meshes.push(...segmentMeshes);\r\n }\r\n\r\n return meshes;\r\n}\r\n\r\nfunction parseTrack(track: Track) {\r\n const newTrack: Track = JSON.parse(JSON.stringify(track));\r\n for (const segment in newTrack.segments) {\r\n for (const vertex in newTrack.segments[segment].vertices) {\r\n newTrack.segments[segment].vertices[vertex][3] /= 180;\r\n newTrack.segments[segment].vertices[vertex][3] *= Math.PI;\r\n\r\n newTrack.segments[segment].vertices[vertex][4] /= 180;\r\n newTrack.segments[segment].vertices[vertex][4] *= Math.PI;\r\n }\r\n }\r\n\r\n return newTrack;\r\n}\r\n\r\nexport { createTrack, parseTrack };\r\n","import * as THREE from \"three\";\r\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\r\nimport { hexToRgb } from \"./colors\";\r\n\r\n// import { extendMaterial, CustomMaterial } from \"./extendMaterial\";\r\n\r\n// function createPlayerMaterial() {\r\n// const material = extendMaterial(THREE.MeshStandardMaterial, {\r\n// class: CustomMaterial, // In this case ShaderMaterial would be fine too, just for some features such as envMap this is required\r\n\r\n// vertexHeader: \"uniform float offsetScale;\",\r\n// vertex: {\r\n// transformEnd: \"transformed += normal * offsetScale;\",\r\n// },\r\n\r\n// uniforms: {\r\n// roughness: 0.75,\r\n// offsetScale: {\r\n// mixed: true, // Uniform will be passed to a derivative material (MeshDepthMaterial below)\r\n// linked: true, // Similar as shared, but only for derivative materials, so wavingMaterial will have it's own, but share with it's shadow material\r\n// value: Math.random(),\r\n// },\r\n// },\r\n// });\r\n\r\n// return material;\r\n// }\r\n\r\ntype WheelScheme = {\r\n colors: string;\r\n pattern: string;\r\n};\r\n\r\nfunction createPlayerWheelUV() {\r\n const xVerticesCount = 24;\r\n const yVerticesCount = 24;\r\n\r\n const uv: number[] = [];\r\n\r\n for (let x = 0; x < xVerticesCount; x++) {\r\n for (let y = 0; y <= yVerticesCount; y++) {\r\n uv.push(y / yVerticesCount, x / xVerticesCount);\r\n }\r\n }\r\n\r\n const finalUV = new Float32Array(uv);\r\n return finalUV;\r\n}\r\n\r\nconst pattenrs = {\r\n classic: [50, 50],\r\n};\r\n\r\nfunction createPlayerWheelTexture(scheme: WheelScheme) {\r\n const textureWidth = 256;\r\n const textureHeight = 1024;\r\n\r\n const buffer = new Uint8ClampedArray(textureWidth * textureHeight * 4);\r\n\r\n for (let y = 0; y < textureHeight; y++) {\r\n for (let x = 0; x < textureWidth; x++) {\r\n const pos = (y * textureWidth + x) * 4;\r\n\r\n let color = hexToRgb(0x505060);\r\n\r\n const index = y + Math.abs(x - textureWidth / 2) / 4;\r\n\r\n const isSecondary = Math.floor(index / 128) % 2 === 0;\r\n\r\n if (isSecondary) {\r\n color = hexToRgb(0x303040);\r\n }\r\n\r\n buffer[pos] = color.r;\r\n buffer[pos + 1] = color.g;\r\n buffer[pos + 2] = color.b;\r\n buffer[pos + 3] = 255;\r\n }\r\n }\r\n\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n\r\n canvas.width = textureWidth;\r\n canvas.height = textureHeight;\r\n\r\n const imageData = ctx!.createImageData(textureWidth, textureHeight);\r\n imageData.data.set(buffer);\r\n ctx!.putImageData(imageData, 0, 0);\r\n\r\n const texture = canvas.toDataURL();\r\n return texture;\r\n}\r\n\r\nfunction createPlayerWheelGeometry(roundness: number) {\r\n const vertices: number[] = [];\r\n\r\n const xVerticesCount = 24;\r\n const yVerticesCount = 24;\r\n\r\n for (let x = 0; x < xVerticesCount; x++) {\r\n for (let y = 0; y < yVerticesCount; y++) {\r\n const aR = 1 - Math.abs(Math.pow((y - 12) / 12, roundness)) / 5;\r\n const bR = 1 - Math.abs(Math.pow((y - 11) / 12, roundness)) / 5;\r\n\r\n const aX = Math.cos((x / xVerticesCount) * Math.PI * 2);\r\n const bX = Math.cos(((x + 1) / xVerticesCount) * Math.PI * 2);\r\n\r\n const aY = Math.sin((x / xVerticesCount) * Math.PI * 2);\r\n const bY = Math.sin(((x + 1) / xVerticesCount) * Math.PI * 2);\r\n\r\n const aZ = (y - 12) * 0.03;\r\n const bZ = (y - 11) * 0.03;\r\n\r\n vertices.push(\r\n aX * bR,\r\n aY * bR,\r\n bZ,\r\n aX * aR,\r\n aY * aR,\r\n aZ,\r\n bX * aR,\r\n bY * aR,\r\n aZ\r\n );\r\n vertices.push(\r\n aX * bR,\r\n aY * bR,\r\n bZ,\r\n bX * aR,\r\n bY * aR,\r\n aZ,\r\n bX * bR,\r\n bY * bR,\r\n bZ\r\n );\r\n }\r\n }\r\n\r\n const verticesTypedArray = new Float32Array(vertices);\r\n let geometry = new THREE.BufferGeometry();\r\n\r\n geometry.setAttribute(\r\n \"position\",\r\n new THREE.Float32BufferAttribute(verticesTypedArray, 3)\r\n );\r\n geometry = BufferGeometryUtils.mergeVertices(geometry, 0.01);\r\n geometry.computeVertexNormals();\r\n geometry.setAttribute(\r\n \"uv\",\r\n new THREE.Float32BufferAttribute(createPlayerWheelUV(), 2)\r\n );\r\n\r\n return geometry;\r\n}\r\n\r\nfunction createPlayerWheelMaterial() {\r\n const texture = new THREE.TextureLoader().load(\r\n createPlayerWheelTexture({\r\n pattern: \"default\",\r\n colors: \"default\",\r\n })\r\n );\r\n texture.wrapS = THREE.RepeatWrapping;\r\n texture.wrapT = THREE.RepeatWrapping;\r\n\r\n const bumpTexture = new THREE.TextureLoader().load(\r\n \"/assets/images/bump.png\"\r\n );\r\n\r\n const envMap = new THREE.TextureLoader().load(\"/assets/images/envmap.png\");\r\n envMap.mapping = THREE.EquirectangularReflectionMapping;\r\n\r\n const material = new THREE.MeshPhongMaterial({\r\n color: 0xffffff,\r\n specular: 0x222224,\r\n shininess: 50,\r\n map: texture,\r\n bumpMap: bumpTexture,\r\n bumpScale: 0.01,\r\n side: THREE.DoubleSide,\r\n envMap,\r\n reflectivity: 0.2,\r\n combine: THREE.AddOperation,\r\n });\r\n\r\n return material;\r\n}\r\n\r\nconst playerMeshes = new THREE.Group();\r\n\r\nfunction createPlayer() {\r\n const player = new THREE.Group();\r\n\r\n const playerGeometry = new THREE.CylinderGeometry(1, 10, 10);\r\n const playerMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff });\r\n\r\n const playerWheel = new THREE.Mesh(\r\n createPlayerWheelGeometry(16),\r\n createPlayerWheelMaterial()\r\n );\r\n\r\n const ringGeometry = new THREE.TorusGeometry(0.82, 0.04, 6, 32);\r\n const ringMaterial = new THREE.MeshBasicMaterial({ color: 0xeeeeff });\r\n\r\n const playerRightRing = new THREE.Mesh(ringGeometry, ringMaterial);\r\n playerRightRing.position.z = 0.34;\r\n\r\n const playerLeftRing = new THREE.Mesh(ringGeometry, ringMaterial);\r\n playerLeftRing.position.z = -0.34;\r\n\r\n playerMeshes.position.y = 0.48;\r\n playerMeshes.scale.x = 0.5;\r\n playerMeshes.scale.y = 0.5;\r\n playerMeshes.scale.z = 0.5;\r\n\r\n playerMeshes.add(playerWheel);\r\n // playerMeshes.add(playerMain);\r\n playerMeshes.add(playerRightRing);\r\n playerMeshes.add(playerLeftRing);\r\n\r\n const playerPivot = new THREE.Group();\r\n playerPivot.add(playerMeshes);\r\n player.add(playerPivot);\r\n\r\n player.userData = {\r\n isInAir: false,\r\n forward: false,\r\n backward: false,\r\n drift: false,\r\n left: false,\r\n right: false,\r\n speed: 0,\r\n rotationSpeed: 0,\r\n direction: 0,\r\n gravitySpeed: 0,\r\n driftAngle: 0,\r\n wheelSpeed: 0,\r\n };\r\n\r\n document.addEventListener(\"keydown\", (event: KeyboardEvent) => {\r\n if (event.key === \"ArrowUp\") setProperty(\"forward\", true, player);\r\n if (event.key === \"ArrowDown\") setProperty(\"backward\", true, player);\r\n if (event.key === \"ArrowRight\") setProperty(\"right\", true, player);\r\n if (event.key === \"ArrowLeft\") setProperty(\"left\", true, player);\r\n if (event.key === \"Shift\") setProperty(\"drift\", true, player);\r\n });\r\n\r\n document.addEventListener(\"keyup\", (event: KeyboardEvent) => {\r\n if (event.key === \"ArrowUp\") setProperty(\"forward\", false, player);\r\n if (event.key === \"ArrowDown\") setProperty(\"backward\", false, player);\r\n if (event.key === \"ArrowRight\") setProperty(\"right\", false, player);\r\n if (event.key === \"ArrowLeft\") setProperty(\"left\", false, player);\r\n if (event.key === \"Shift\") setProperty(\"drift\", false, player);\r\n });\r\n\r\n return player;\r\n}\r\n\r\nfunction setProperty(property: string, value: unknown, player: THREE.Object3D) {\r\n player.userData[property] = value;\r\n}\r\n\r\nexport { createPlayer };\r\n","import { Track, TrackStyle, TrackTheme } from \"./types/track\";\r\n\r\nfunction createTheme(): TrackTheme {\r\n const sky = Math.random() > .5 ? \"day\" : \"night\";\r\n const roadHeight = 0.3 + Math.random() * 0.3;\r\n const lensFlareOpacity = 0.5 + Math.random() * 0.5;\r\n const particlesOpacity = Math.random();\r\n const isRoadDoubleSided = true;\r\n return {\r\n sky,\r\n roadHeight,\r\n lensFlareOpacity,\r\n particlesOpacity,\r\n isRoadDoubleSided\r\n }\r\n}\r\n\r\n// {\r\n// roadCenterColor: 0x2070b8,\r\n// roadEdgeColor: 0x80f0ff,\r\n// strips: [\r\n// [0, 300],\r\n// [350, 50],\r\n// [950, 50],\r\n// ],\r\n// glassColor: 0xccddee,\r\n// bump: 0.1,\r\n// shininess: 1000,\r\n// },\r\n\r\nfunction createColor() {\r\n const light = Math.random();\r\n const hsl = Math.random();\r\n}\r\n\r\nfunction color(hue: number, light: number) {\r\n let color = 0x000000;\r\n if (hue < 60) {\r\n color = (0xc0 << 16) + (Math.floor(0xa0 * (hue / 60)) << 8)\r\n } else if (hue < 120) {\r\n color = (0xa0 << 8) + (Math.floor(0xc0 * ((120 - hue) / 60)) << 16);\r\n } else if (hue < 180) {\r\n color = (0xa0 << 8) + (Math.floor(0xc0 * ((hue - 120) / 60)) << 0)\r\n } else if (hue < 240) {\r\n color = (0xc0 << 0) + (Math.floor(0xa0 * ((240 - hue) / 60)) << 8);\r\n } else if (hue < 300) {\r\n color = (0xc0 << 0) + (Math.floor(0xc0 * ((hue - 240) / 60)) << 16)\r\n } else {\r\n color = (0xc0 << 16) + (Math.floor(0xc0 * ((360 - hue) / 60)) << 0);\r\n }\r\n const lightValue = 0xd0 * light;\r\n color += (lightValue << 16) + (lightValue << 8) + (lightValue << 0)\r\n return color\r\n}\r\n\r\nconst roadWidth = 0.7 + Math.random() * 0.6\r\nconst width = Math.random();\r\nconst bump = Math.random();\r\nconst shininess = Math.random() * 1500\r\nfunction createStyle(): TrackStyle {\r\n const hue = Math.floor(Math.random() * 360);\r\n return {\r\n roadCenterColor: color(hue, 0),\r\n roadEdgeColor: color(hue, 1),\r\n strips: [\r\n [0, 200 + width * 200],\r\n [200 + width * 200 + 40 + width * 60, 40 + width * 60],\r\n [1050, 40 + width * 60],\r\n ],\r\n glassColor: 0x000000,\r\n bump: bump,\r\n shininess: shininess,\r\n }\r\n}\r\n\r\nconst track: Track = {\r\n gamePlay: {\r\n lapCount: 5,\r\n speed: 1,\r\n },\r\n theme: createTheme(),\r\n styles: {\r\n red: createStyle(),\r\n blue: createStyle(),\r\n },\r\n segments: [\r\n {\r\n style: \"blue\",\r\n width: roadWidth,\r\n vertices: [\r\n [0, 0, 0, 0, 0],\r\n [7, 0, 0, 0, 0],\r\n [9, 0, -2, -90, 0],\r\n [9, 0, -3, -90, 0],\r\n [9, 0.5, -5, -90, 0],\r\n ],\r\n },\r\n {\r\n style: \"red\",\r\n width: roadWidth,\r\n vertices: [\r\n [9, 0, -5.5, -90, 0],\r\n [9, 0, -6, -90, 0],\r\n [6, 0, -8, -180, 0],\r\n [5, 0, -8, -180, 0],\r\n [3.5, 0, -8.5, -135, 0],\r\n [2, 0, -9, -180, 0],\r\n [1, 0, -9, -180, 0],\r\n [0, 0, -8.5, -225, 0],\r\n [-1.5, 0, -8, -180, 0],\r\n [-3, 0, -8, 180, 0],\r\n [-8, 0, 0, 90, 0],\r\n [-8, 0.5, 2.5, 90, 0],\r\n ],\r\n },\r\n {\r\n style: \"blue\",\r\n width: roadWidth,\r\n vertices: [\r\n [-8, 0, 3, 90, 0],\r\n [-8, 0, 4, 90, 0],\r\n [-4, 0, 8, 0, 0],\r\n [-1, 0.75, 8, 0, 0],\r\n ],\r\n },\r\n {\r\n style: \"red\",\r\n width: roadWidth,\r\n vertices: [\r\n [0, 0, 8, 0, 0],\r\n [6, 0.5, 8, 0, 0],\r\n [8, 1.5, 4, -90, 0],\r\n [6, 2.25, 0, -180, 0],\r\n [4, 2.5, 0, -180, 0],\r\n [2, 3, 0, -180, 0],\r\n ],\r\n },\r\n {\r\n style: \"red\",\r\n width: roadWidth,\r\n vertices: [\r\n [1, 2.25, 0, -180, 0],\r\n [-2, 2.25, 0, -180, 0],\r\n [-4, 2.75, 0, -180, 0],\r\n ],\r\n },\r\n {\r\n style: \"blue\",\r\n width: roadWidth,\r\n vertices: [\r\n [-5, 2, 0, -180, 0],\r\n [-10, 2, 0, -180, 0],\r\n [-12, 2, -2, -90, 0],\r\n [-15, 1.5, -4, -180, 0],\r\n [-18, 1, -2, -270, 0],\r\n [-18, 0.5, 0, -270, 0],\r\n [-18, 0, 2, 90, 0],\r\n [-15, -0.5, 4, 0, 0],\r\n [-12, -1, 2, -90, 0],\r\n [-9, -1.5, 0, 0, 0],\r\n [-4.5, -1, 0, 0, 0],\r\n [0, 0, 0, 0, 0],\r\n ],\r\n },\r\n ],\r\n environment: [],\r\n startingPoint: [\r\n [0, 0, 0, 0, 0],\r\n [1, 1],\r\n ],\r\n};\r\n\r\nfor (const sg in track.segments) {\r\n for (const p in track.segments[sg].vertices) {\r\n // track.segments[sg].vertices[p][4] += 20;\r\n\r\n }\r\n}\r\n\r\nexport default track;\r\n","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createElementVNode(\"canvas\", {\n class: \"overlay\",\n id: \"particles\"\n}, null, -1)\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"div\", {\n id: \"speed\",\n class: \"overlay\"\n}, null, -1)\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"div\", {\n id: \"vignette\",\n class: \"overlay\"\n}, null, -1)\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"canvas\", { id: \"canvas\" }, null, -1)\n\nimport { onMounted, reactive } from \"vue\";\nimport * as THREE from \"three\";\nimport { OrbitControls } from \"three/addons/controls/OrbitControls.js\";\nimport { EffectComposer } from \"three/addons/postprocessing/EffectComposer.js\";\nimport { RenderPass } from \"three/addons/postprocessing/RenderPass.js\";\nimport { UnrealBloomPass } from \"three/addons/postprocessing/UnrealBloomPass.js\";\nimport { settings } from \"./settings\";\nimport { createSky } from \"./utils/sky\";\nimport { createSun } from \"./utils/sun\";\nimport { Lensflare, LensflareElement } from \"./Lensflare.js\";\nimport { initParticles, renderParticles } from \"./utils/particles\";\nimport { initLighting } from \"./utils/lighting\";\nimport { TrackBody } from \"./modules/TrackBody\";\n\nimport { SavePass } from \"three/examples/jsm/postprocessing/SavePass\";\nimport { ShaderPass } from \"three/examples/jsm/postprocessing/ShaderPass\";\nimport { GlitchPass } from \"three/addons/postprocessing/GlitchPass.js\";\nimport { BlendShader } from \"three/examples/jsm/shaders/BlendShader\";\nimport { createTrack, parseTrack } from \"./track.ts\";\nimport { createPlayer } from \"./utils/player\";\nimport { createTrackBody } from \"./utils/trackBody\";\nimport { Track } from \"./types/track\";\n\nimport track from \"./lowTrick\";\n\ntype RaceSettings = any;\n\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'App',\n setup(__props) {\n\nconst state = reactive({\n lapCount: 0,\n});\n\nonMounted(() => {\n const race = new RollesiaRace(settings);\n});\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nclass RollesiaRace {\n private canvas: HTMLCanvasElement;\n private camera: THREE.PerspectiveCamera;\n private scene: THREE.Scene;\n private renderer;\n private controls;\n private sun!: THREE.Mesh;\n private sky!: THREE.Mesh;\n private composer!: EffectComposer;\n private settings;\n private player;\n private trackBody: TrackBody;\n private track: Track;\n private cameraGroup: THREE.Group;\n private isRunning = true;\n\n constructor(settings: RaceSettings) {\n this.settings = settings;\n\n this.canvas = document.getElementById(\"canvas\")! as HTMLCanvasElement;\n\n this.renderer = new THREE.WebGLRenderer({\n canvas: this.canvas,\n antialias: true,\n });\n this.renderer.setPixelRatio(window.devicePixelRatio);\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n\n if (settings.shadows) {\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n }\n\n this.scene = new THREE.Scene();\n\n this.track = parseTrack(track);\n\n this.player = createPlayer(this.camera);\n this.scene.add(this.player);\n\n this.initCamera();\n this.initLighting();\n this.initSun();\n this.initSky();\n this.initLensFlare();\n this.initPostProcessing();\n this.initTrack();\n\n this.trackBody = new TrackBody(this.track);\n\n // const particlesCanvas = document.getElementById(\n // \"particles\"\n // ) as HTMLCanvasElement;\n // initParticles(particlesCanvas);\n\n const startingPointPosition = track.segments[0].vertices[0];\n\n this.player.position.x = startingPointPosition[0] * 8;\n this.player.position.y = startingPointPosition[1] * 8;\n this.player.position.z = startingPointPosition[2] * 8;\n\n this.startScene();\n }\n\n private resetPlayer() {\n const startingPointPosition = track.segments[0].vertices[0];\n\n this.player.position.x = startingPointPosition[0] * 8;\n this.player.position.y = startingPointPosition[1] * 8;\n this.player.position.z = startingPointPosition[2] * 8;\n this.player.rotation.y = 0;\n this.player.userData.speed = 0;\n }\n\n private initCamera() {\n this.camera = new THREE.PerspectiveCamera(\n settings.cameraFov,\n window.innerWidth / window.innerHeight,\n 0.1,\n 1000\n );\n this.camera.position.set(-2, 1.2, 0);\n this.camera.rotation.x = -Math.PI / 2;\n this.camera.rotation.y = -Math.PI / 2.25;\n this.camera.rotation.z = -Math.PI / 2;\n\n // this.camera.position.set(-2.5, 1.4, 0);\n // this.camera.rotation.y = -Math.PI / 2.1;\n\n this.scene.add(this.camera);\n\n this.cameraGroup = new THREE.Group();\n this.cameraGroup.add(this.camera);\n\n this.scene.add(this.cameraGroup);\n }\n\n private initLighting() {\n const hemisphereLight = new THREE.HemisphereLight(\n 0x708090,\n 0x506070,\n 1\n );\n this.scene.add(hemisphereLight);\n const light = new THREE.PointLight(0xddeeff, 0.15);\n light.position.set(-250, 400, -200);\n this.scene.add(light);\n\n for (let i = 0; i < this.settings.lightCount; i++) {\n const light = new THREE.PointLight(\n 0xffffff,\n 0.35 / this.settings.lightCount\n );\n const xRandom = Math.random() * this.settings.lightRadius;\n const yRandom = Math.random() * this.settings.lightRadius;\n const zRandom = Math.random() * this.settings.lightRadius;\n light.position.set(100 + xRandom, 220 + yRandom, 200 + zRandom);\n light.shadow.radius = this.settings.lightRadius;\n light.castShadow = true;\n light.shadow.mapSize.width = this.settings.shadowMapRes;\n light.shadow.mapSize.height = this.settings.shadowMapRes;\n // light.shadow.bias = -0.005;\n this.scene.add(light);\n }\n }\n\n private initSun() {\n this.sun = createSun(track.theme);\n this.sun.position.set(120, 260, 220);\n this.sun.scale.x = 500;\n this.sun.scale.y = 500;\n this.scene.add(this.sun);\n }\n\n private initSky() {\n this.sky = createSky(track.theme);\n this.sky.scale.x = 600;\n this.sky.scale.y = 600;\n this.sky.scale.z = 600;\n this.scene.add(this.sky);\n }\n\n private initPostProcessing() {\n const renderScene = new RenderPass(this.scene, this.camera);\n\n this.composer = new EffectComposer(this.renderer);\n this.composer.addPass(renderScene);\n\n // const glitchPass = new GlitchPass(8);\n // this.composer.addPass(glitchPass);\n\n if (!settings.bloom) return;\n const bloomPass = new UnrealBloomPass(\n new THREE.Vector2(window.innerWidth, window.innerHeight),\n 0.075,\n 1.25,\n 0.6\n );\n this.composer.addPass(bloomPass);\n const bloomPass2 = new UnrealBloomPass(\n new THREE.Vector2(window.innerWidth, window.innerHeight),\n 0.175,\n 1.25,\n 0.85\n );\n this.composer.addPass(bloomPass2);\n if (track.theme.sky === \"night\") {\n const bloomPass3 = new UnrealBloomPass(\n new THREE.Vector2(window.innerWidth, window.innerHeight),\n 0.5,\n 1,\n 0.98\n );\n this.composer.addPass(bloomPass3);\n }\n }\n\n private initLensFlare() {\n const light = new THREE.PointLight(0x000000, 0);\n light.position.set(80, 150, 180);\n\n const textureLoader = new THREE.TextureLoader();\n const textureFlare = textureLoader.load(\"/assets/images/lens.png\");\n const lensflare = new Lensflare(\n parseFloat(track.theme.lensFlareOpacity)\n );\n lensflare.addElement(new LensflareElement(textureFlare, 75, 0.2));\n lensflare.addElement(new LensflareElement(textureFlare, 256, 0.5));\n lensflare.addElement(new LensflareElement(textureFlare, 512, 0.7));\n lensflare.addElement(new LensflareElement(textureFlare, 100, 1));\n light.add(lensflare);\n this.scene.add(light);\n }\n\n public async startScene() {\n this.animate();\n // this.renderer.shadowMap.autoUpdate = false;\n\n document.addEventListener(\n \"visibilitychange\",\n () => {\n this.isRunning = true;\n },\n false\n );\n }\n\n private animate() {\n requestAnimationFrame(() => this.animate.call(this));\n if (this.isRunning) {\n this.updatePlayer();\n this.updateCamera();\n // renderParticles(this.player.userData.speed * 0.1);\n this.render();\n }\n }\n\n private lerp(a: number, b: number, index: number) {\n return a * (1 - index) + b * index;\n }\n\n private updatePlayer() {\n const data = this.player.userData;\n const playerPivot = this.player.children[0];\n const playerMesh = playerPivot.children[0];\n const playerWheel = playerMesh.children[0];\n\n const lastUpdate = data.lastUpdate;\n const currentUpdate = Date.now();\n data.lastUpdate = currentUpdate;\n\n const deltaT = Math.floor((currentUpdate - lastUpdate) / 2);\n const deltaTMaxed = Math.min(deltaT, 10000);\n for (let i = 0; i < deltaTMaxed; i++) {\n const inAirSpeedIndex = data.isInAir ? 0.8 : 1;\n if (data.forward) {\n let maxSpeed = 0.6;\n if (data.left || data.right) {\n let maxSpeedBoost = Math.min(\n 0.15,\n 8 * Math.abs(data.rotationSpeed)\n );\n maxSpeedBoost *= data.drift && !data.isInAir ? 5 : 1;\n maxSpeed += maxSpeedBoost;\n maxSpeed *= inAirSpeedIndex;\n }\n data.speed = this.lerp(data.speed, maxSpeed, 0.002);\n } else if (data.backward) {\n data.speed = this.lerp(data.speed, -0.5, 0.002);\n } else {\n const slowDownSpeed = data.isInAir ? 0.0005 : 0.001;\n data.speed = this.lerp(data.speed, 0, slowDownSpeed);\n }\n\n const inAirRotationIndex = data.isInAir ? 0.6 : 1;\n const isDriftingRotationINdex = data.drift ? 0.5 : 1;\n const maxRotationSpeed = (isDriftingRotationINdex * Math.PI) / 40;\n if (data.left && !data.right) {\n data.rotationSpeed = this.lerp(\n data.rotationSpeed,\n maxRotationSpeed,\n 0.004 * inAirRotationIndex\n );\n if (data.drift) {\n data.driftAngle = this.lerp(\n data.driftAngle,\n -data.rotationSpeed * 20,\n 0.01\n );\n }\n } else if (data.right && !data.left) {\n data.rotationSpeed = this.lerp(\n data.rotationSpeed,\n -maxRotationSpeed,\n 0.004 * inAirRotationIndex\n );\n if (data.drift) {\n data.driftAngle = this.lerp(\n data.driftAngle,\n -data.rotationSpeed * 20,\n 0.01\n );\n }\n } else {\n data.rotationSpeed = this.lerp(data.rotationSpeed, 0, 0.01);\n }\n if (!data.drift) {\n data.driftAngle = this.lerp(data.driftAngle, 0, 0.01);\n }\n\n const xLambda = 0.1 * data.speed * Math.cos(-data.direction);\n const zLambda = 0.1 * data.speed * Math.sin(-data.direction);\n\n const rotLambda =\n 0.1 *\n (Math.sign(data.speed + 0.05) * 0.45 + data.speed / 3.5) *\n data.rotationSpeed;\n\n data.direction += rotLambda;\n this.player.position.x += xLambda;\n this.player.position.z += zLambda;\n this.player.rotation.y = data.direction;\n playerMesh.rotation.y = -data.driftAngle;\n\n const intersection = this.trackBody.isIntersecting(\n this.player.position.x,\n this.player.position.z\n );\n\n let currentLevel = -50;\n if (intersection) {\n for (const level of intersection) {\n const yPos = this.player.position.y;\n const deltaY = level[0] - yPos;\n\n const deltaRY = data.direction - level[1];\n\n if (deltaY > 4) continue;\n if (deltaY > 1) {\n this.player.position.x -= xLambda;\n this.player.position.z -= zLambda;\n\n continue;\n }\n currentLevel = level[0];\n\n break;\n }\n }\n let deltaY = currentLevel - this.player.position.y;\n\n let newDeltaY = 0;\n\n if (currentLevel === -50) {\n data.gravitySpeed -= 0.0001;\n newDeltaY = data.gravitySpeed;\n data.isInAir = true;\n } else if (deltaY > 0) {\n data.gravitySpeed = deltaY * 0.2;\n data.gravitySpeed = Math.min(data.gravitySpeed, 0.02);\n newDeltaY = Math.max(data.gravitySpeed, deltaY);\n data.isInAir = false;\n data.speed = this.lerp(data.speed, 0.25, newDeltaY / 80);\n } else if (deltaY >= -0.05 && deltaY <= 0) {\n // data.gravitySpeed = 0;\n newDeltaY = data.gravitySpeed;\n data.isInAir = false;\n } else if (deltaY < -0.05) {\n data.gravitySpeed -= 0.0001;\n if (data.gravitySpeed > 0) {\n newDeltaY = data.gravitySpeed;\n } else {\n newDeltaY = Math.max(data.gravitySpeed, deltaY * 1.2);\n }\n data.isInAir = true;\n }\n\n this.player.position.y += newDeltaY;\n }\n\n this.camera.fov = 75 + data.speed * 40;\n\n this.camera.fov = this.lerp(\n this.camera.fov,\n this.camera.fov + 10 * data.isInAir,\n 0.05\n );\n\n this.camera.rotation.x = this.lerp(\n this.camera.rotation.x,\n data.speed * -data.rotationSpeed * 12 - Math.PI / 2,\n 0.016\n );\n\n playerPivot.rotation.x = this.lerp(\n playerPivot.rotation.x,\n -data.rotationSpeed * 10 * data.speed,\n 0.1\n );\n\n if (data.isInAir) {\n data.wheelSpeed = this.lerp(data.wheelSpeed, 0, 0.01);\n } else {\n data.wheelSpeed = this.lerp(data.wheelSpeed, data.speed * 0.06, 1);\n }\n\n playerWheel.material.map.offset.y =\n (playerWheel.material.map.offset.y + data.wheelSpeed) % 1;\n\n if (this.player.position.y < -50) {\n this.resetPlayer();\n }\n }\n\n private updateCamera() {\n this.cameraGroup.position.x = this.player.position.x;\n this.cameraGroup.position.y = this.player.position.y;\n this.cameraGroup.position.z = this.player.position.z;\n\n this.cameraGroup.rotation.y = this.lerp(\n this.cameraGroup.rotation.y,\n this.player.rotation.y,\n 1\n );\n }\n\n private render() {\n this.sun.lookAt(this.camera.position);\n\n this.camera.updateProjectionMatrix();\n\n // this.controls.update();\n this.composer.render();\n }\n\n private initTrack() {\n const trackMeshes = createTrack(this.track);\n\n for (const mesh in trackMeshes) {\n trackMeshes[mesh].castShadow = true;\n trackMeshes[mesh].receiveShadow = true;\n this.scene.add(trackMeshes[mesh]);\n }\n }\n\n private onWindowResize() {\n this.camera.aspect = window.innerWidth / window.innerHeight;\n this.renderer.setSize(window.innerWidth, window.innerHeight);\n }\n}\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _hoisted_1,\n _hoisted_2,\n _hoisted_3,\n _hoisted_4\n ], 64))\n}\n}\n\n})","import script from \"./App.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./App.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=b30aa220&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready () {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n )\n },\n registered () {\n console.log('Service worker has been registered.')\n },\n cached () {\n console.log('Content has been cached for offline use.')\n },\n updatefound () {\n console.log('New content is downloading.')\n },\n updated () {\n console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error (error) {\n console.error('Error during service worker registration:', error)\n }\n })\n}\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\nimport _imports_0 from '../assets/logo.png'\n\n\nconst _hoisted_1 = { class: \"home\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"img\", {\n alt: \"Vue logo\",\n src: _imports_0\n}, null, -1)\nconst _hoisted_3 = [\n _hoisted_2\n]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, _hoisted_3))\n}","\nimport { defineComponent } from \"vue\";\n\nexport default defineComponent({\n name: \"HomeView\",\n});\n","import { render } from \"./HomeView.vue?vue&type=template&id=b24fde1c&ts=true\"\nimport script from \"./HomeView.vue?vue&type=script&lang=ts\"\nexport * from \"./HomeView.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"/root/wheel-game/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from \"vue-router\";\nimport HomeView from \"../views/HomeView.vue\";\n\nconst routes: Array = [\n {\n path: \"/\",\n name: \"home\",\n component: HomeView,\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(process.env.BASE_URL),\n routes,\n});\n\nexport default router;\n","import { createApp } from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\n\ncreateApp(App).use(router).mount('#app')\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkrollesia\"] = self[\"webpackChunkrollesia\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(3493); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["SETTINGS","DISPLAY","CAMERA","DEFAULT","cameraShaking","cameraRotation","cameraFov","CHILL","CINEMATIC","FIXED","STREAMER_MODE","ON","streamerMode","OFF","OVERLAY","overlayElements","overlayVignette","overlayDebug","DEBUG","GRAPHICS","LIGHTING","lightCount","lightRadius","shadows","shadowMapRes","LOW","MEDIUM","HIGH","ULTRA","ambientOcclusion","BLOOM","bloom","getLocalStorageSettings","category","setting","savedSettings","localStorage","getItem","settings","textureWidth","textureHeight","hexToRgb","hex","r","g","b","createSkyMaterial","theme","manager","THREE","skyTexture","load","createSkyTexture","skyMaterial","color","map","side","fog","getTextureColorIndexes","y","horizonHeight","spaceLimit","groundLimit","spaceIndex","Math","pow","space","sky","horizon","ground","groundIndex","buffer","Uint8ClampedArray","skyThemes","day","spaceColor","skyColor","horizonColor","groundColor","cloudy","night","skyTheme","x","pos","i","canvas","document","createElement","ctx","getContext","width","height","imageData","createImageData","data","set","putImageData","fillStyle","floor","random","beginPath","arc","PI","fill","texture","toDataURL","createSky","createSunMaterial","themeSuns","sunTexture","sunMaterial","transparent","blending","createSun","sun","Lensflare","Mesh","constructor","opacity","super","Geometry","MeshBasicMaterial","this","isLensflare","type","frustumCulled","renderOrder","Infinity","positionScreen","Vector3","positionView","tempMap","FramebufferTexture","RGBAFormat","occlusionMap","geometry","material1a","RawShaderMaterial","uniforms","scale","value","screenPosition","vertexShader","fragmentShader","depthTest","depthWrite","material1b","mesh1","elements","shader","LensflareElement","Shader","material2","Color","Vector2","AdditiveBlending","mesh2","addElement","element","push","screenPositionPixels","validArea","Box2","viewport","Vector4","onBeforeRender","renderer","scene","camera","getCurrentViewport","invAspect","w","z","halfViewportWidth","halfViewportHeight","size","min","max","setFromMatrixPosition","matrixWorld","applyMatrix4","matrixWorldInverse","copy","projectionMatrix","containsPoint","copyFramebufferToTexture","renderBufferDirect","vecX","vecY","l","length","distance","uniformsNeedUpdate","dispose","themeVisibility","BufferGeometry","float32Array","Float32Array","interleavedBuffer","InterleavedBuffer","setIndex","setAttribute","InterleavedBufferAttribute","TrackBody","track","body","createBody","debugMaterial","segment","coord","mesh","position","add","segments","bodySegment","createSegment","getInterpolationCount","a","interpolationCount","xDiff","abs","yDiff","zDiff","ryDiff","rxDiff","ceil","getInterpolatedCoordinates","index","smoothIndex","sin","angleDifference","diffX","diffZ","newA","cos","newB","ry","rx","edges","vertices","isLastVertex","iterationCount","interpolatedCoords","newEdges","createGeometryPositionVertices","isLeft","sqr","dist2","v","distToSegmentSquared","p","l2","t","distToSegment","sqrt","isIntersecting","heights","segmentLoop","square","bodyVector","playerVector","bodyAngle","atan2","playerAngle","deltaAngle","playerCoord","aCoord1","aCoord2","bCoord1","bCoord2","distA","distB","totalABDist","distL","distR","totalLRDist","heightA","heightB","sort","createInterpolatedGeometryPosition","options","interpolatedA","interpolatedB","newVertices","isLast","isFirst","part","isFront","isBack","top","left","right","bottom","h","roadHeight","front","back","trianglesCount","isA","current","getTrackMaterials","styles","envMap","mapping","materials","bumpTexture","style","roadTexture","getRoadTexture","roadMaterial","bumpMap","bumpScale","bump","specular","shininess","combine","reflectivity","sideTexture","getSideTexture","sideMaterial","glassTexture","getGlassTexture","glassRoadMaterial","glassColor","alphaMap","glassSideMaterial","road","glass_road","glass_side","isStrip","strip","strips","rgbRoadCenterColor","roadCenterColor","rgbRoadEdgeColor","roadEdgeColor","rgbConcreteColor","rgbConcreteDarkColor","createBeamUV","uv","uvTypedArray","createBeamGeometry","groundHeight","geometryPosition","computeVertexNormals","createSideUV","createEdgeUV","createRoadUV","getTrackSegmentInterpolationCount","angleDiff","getObjectCoordinates","createTrackSegment","meshes","verticesCount","aLegacy","bLegacy","BufferGeometryUtils","materialPart","isRoadDoubleSided","styleType","environment","createTrack","segmentMeshes","parseTrack","newTrack","JSON","parse","stringify","vertex","createPlayerWheelUV","xVerticesCount","yVerticesCount","finalUV","createPlayerWheelTexture","scheme","isSecondary","createPlayerWheelGeometry","roundness","aR","bR","aX","bX","aY","bY","aZ","bZ","verticesTypedArray","createPlayerWheelMaterial","pattern","colors","wrapS","wrapT","material","playerMeshes","createPlayer","player","playerWheel","ringGeometry","ringMaterial","playerRightRing","playerLeftRing","playerPivot","userData","isInAir","forward","backward","drift","speed","rotationSpeed","direction","gravitySpeed","driftAngle","wheelSpeed","addEventListener","event","key","setProperty","property","createTheme","lensFlareOpacity","particlesOpacity","hue","light","lightValue","roadWidth","createStyle","gamePlay","lapCount","red","blue","startingPoint","sg","_hoisted_1","_createElementVNode","class","id","_hoisted_2","_hoisted_3","_hoisted_4","_defineComponent","__name","setup","__props","reactive","onMounted","RollesiaRace","getElementById","antialias","setPixelRatio","window","devicePixelRatio","setSize","innerWidth","innerHeight","shadowMap","enabled","initCamera","initLighting","initSun","initSky","initLensFlare","initPostProcessing","initTrack","trackBody","startingPointPosition","startScene","resetPlayer","rotation","cameraGroup","hemisphereLight","xRandom","yRandom","zRandom","shadow","radius","castShadow","mapSize","renderScene","RenderPass","composer","EffectComposer","addPass","bloomPass","UnrealBloomPass","bloomPass2","bloomPass3","textureLoader","textureFlare","lensflare","parseFloat","async","animate","isRunning","requestAnimationFrame","call","updatePlayer","updateCamera","render","lerp","children","playerMesh","lastUpdate","currentUpdate","Date","now","deltaT","deltaTMaxed","inAirSpeedIndex","maxSpeed","maxSpeedBoost","slowDownSpeed","inAirRotationIndex","isDriftingRotationINdex","maxRotationSpeed","xLambda","zLambda","rotLambda","sign","intersection","currentLevel","level","yPos","deltaY","newDeltaY","fov","offset","lookAt","updateProjectionMatrix","trackMeshes","receiveShadow","onWindowResize","aspect","_ctx","_cache","_openBlock","_createElementBlock","_Fragment","__exports__","register","ready","console","log","registered","cached","updatefound","updated","offline","error","alt","src","_imports_0","$props","$setup","$data","$options","defineComponent","name","routes","path","component","HomeView","router","createRouter","history","createWebHistory","process","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","fulfilled","j","Object","keys","every","splice","n","getter","__esModule","d","definition","o","defineProperty","enumerable","get","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""}