{"version":3,"file":"js/app.js","mappings":"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B,KAAW,CACnDnJ,IAAKmJ,EAAK1H,OACT,EACD,SAAgB,IAAAb,GAAoB,QAAS,CAC3CmL,GAAIlM,EAAK+d,SAAW,IAAMzU,EAAK1H,MAC/BS,KAAMrC,EAAKqC,KACXtD,MAAO,qBACPpH,KAAM,QACN,sBAAuBsI,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,GACnFX,MAAO0H,EAAK1H,MACZsc,QAAS9mB,EAAMwK,QAAU0H,EAAK1H,OAC7B,KAAM,EAAG,IAAa,CACvB,CAAC,KAAcxK,EAAMwK,UAEvB,IAAAb,GAAoB,QAAS,CAC3BhC,OAAO,QAAgB,CAC5B,sBAAsB,EACtB,6BAA8B3H,EAAMwK,QAAU0H,EAAK1H,QAE9CuY,IAAKna,EAAK+d,SAAW,IAAMzU,EAAK1H,QAC/B,QAAiB0H,EAAK7I,OAAQ,GAAI,KACpC,OACD,OAGR,IEtEA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCRO,MAAM0d,GAAc,CAC1B,gBACA,sBACA,mBACA,oBACA,0BACA,gBACA,eACA,qBACA,2BACA,uBACA,wBACA,aACA,mBACA,eACA,gBACA,YACA,kBACA,cACA,oBACA,mBACA,oBACA,aACA,mBACA,iBACA,oBACA,qBACA,gBACA,oBACA,yBACA,qBACA,aACA,WACA,iBACA,YACA,kBACA,cACA,eACA,sBACA,sBACA,qBACA,YACA,eACA,mBACA,sBACA,mBACA,yBACA,sBACA,uBACA,aACA,YACA,kBACA,gBACA,kBACA,uBACA,wBACA,8BACA,0BACA,2BACA,kBACA,wBACA,eACA,qBACA,mBACA,yBACA,kBACA,wBACA,gBACA,sBACA,iBACA,cACA,oBACA,gBACA,sBACA,qBACA,2BACA,oBACA,0BACA,yBACA,sBACA,4BACA,2BACA,iCACA,wBACA,uBACA,6BACA,yBACA,+BACA,qCACA,oCACA,0CACA,iCACA,gCACA,sCACA,kCACA,iBACA,gBACA,kBACA,mBACA,cACA,iBACA,cACA,iBACA,gBACA,sBACA,eACA,qBACA,oBACA,0BACA,iBACA,iBACA,uBACA,kBACA,mBACA,yBACA,mBACA,oBACA,iBACA,oBACA,eACA,kBACA,sBACA,kBACA,wBACA,oBACA,qBACA,mBACA,oBACA,eACA,kBACA,UACA,qBACA,2BACA,uBACA,wBACA,eACA,qBACA,iBACA,kBACA,oBACA,0BACA,sBACA,uBACA,cACA,oBACA,gBACA,gBACA,sBACA,iBACA,0BACA,kBACA,wBACA,oBACA,qBACA,sBACA,gBACA,sBACA,mBACA,wBACA,4BC3JK,GAAa,CAAC,YACd,GAAa,CAAC,MAAO,OAO3B,QAA4B,QAAiB,CAC3Cve,OAAQ,aACRF,MAAO,CACL,WAAc,CAAEse,UAAU,GAC1B,eAAkB,CAAC,GAErBtE,MAAO,CAAC,qBACR,KAAA5Z,CAAMC,GCdR,MAAMW,GAAQ,UAERtJ,GAAQ,QAAY,EAAD,cACnBgnB,GAAS,QAAI,MACbC,EAAcxoB,OAAOC,6BACrBwoB,GAAgB,QAAIlnB,IAE1B,QAAOknB,GAAiB9O,IACvB+O,EAAa/O,EAAU,IAGxB,MAAM+O,EAAcngB,MAAOoR,UACpBnR,EAASmR,GACfpY,EAAMwK,MAAQ4N,CAAQ,EAGvBpR,eAAeogB,UACR,UACN,MAAMlc,EAAS8b,EAAOxc,MAAM6c,IAAIrM,cAC/B,qDAGG9P,GACHoc,YAAW,KACVpc,EAAOqc,eAAe,CAAEC,SAAU,SAAUC,MAAO,OAAQ,GACzD,IAEL,CAEAzgB,eAAeC,EAASI,GACvB,MAAMqgB,EAAape,EAAMkJ,QAAQmV,sBAEjC,QAAoBC,IAAfF,EACJ,OAAOA,QAGFpe,EAAMkP,SAAU,WAAYnR,EAAM,CAAEwgB,MAAM,GACjD,CDmBA,MAAO,CAACjf,EAAUC,KAChB,MAAMif,GAAsB,QAAkB,YAE9C,OAAQ,WAAc,QAAaA,EAAqB,CACtDpE,WAAYwD,EAAc1c,MAC1B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAgBX,MAAQW,GAC3F1I,SAAS,QAAOskB,IAChBpf,MAAO,qCACPogB,QAAS,oCACTC,YAAapf,EAAKkQ,MAAMnN,KAAKsc,WAC7Bld,QAAS,SACTC,IAAKgc,EACLkB,OAAQd,GACP,CACDe,QAAQ,SAAS,EAAGC,aAAYC,YAAa,EAC3C,IAAA1e,GAAoB,SAAS,QAAY,CACvChC,MAAO,aACPif,UAAW5mB,EAAMwK,OAChB4d,GAAY,QAAYC,GAAQ,IAAQ,KAAM,GAAI,OAEvDC,QAAQ,SAAUA,GAAW,EAC3B,IAAA3e,GAAoB,MAAO,CACzB4B,KAAK,QAAO0b,GAAasB,WAAaD,EAAOjf,MAAQ,UACrDpB,IAAKqgB,EAAOjf,MACZmf,QAAS,QACR,KAAM,EAAG,OAEd7e,EAAG,GACF,EAAG,CAAC,aAAc,UAAW,eAAgB,CAElD,IErFA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,qBAQT,QAA4B,QAAiB,CAC3Ca,OAAQ,aACRF,MAAO,CACLmgB,SAAU,CAAC,GAEb,KAAA/f,CAAMC,GCdR,MAAML,EAAQ,EAERogB,EAAa,KAClB,MAAMC,EAAU,CACf,eAOD,OAJIrgB,EAAMmgB,UACTE,EAAQnoB,KAAK,gBAAgB8H,EAAMmgB,YAG7BE,CAAO,EDoBf,MAAO,CAAC/f,EAAUC,MACR,WAAc,QAAoB,MAAO,CAC/ClB,OAAO,QAAgB+gB,MACtB,CACA9f,EAAKwC,OAAW,OACZ,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAYxC,EAAKwC,OAAQ,YAE3B,QAAoB,IAAI,IAC5B,QAAa4U,GAAW,KAAM,CAC5B7Y,SAAS,SAAS,IAAM,EACtB,QAAYyB,EAAKwC,OAAQ,cAE3BzB,EAAG,KAEJ,GAEL,IE/CA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,U,iECPMxB,MAAM,KAAKC,OAAO,KAAKC,QAAQ,YAAYH,MAAM,8B,YAA6B,OAAymB,KAAtmBF,KAAK,OAAO,YAAU,W,EAAU,OAAgC,UAAxBiB,GAAG,KAAKC,GAAG,KAAKC,EAAE,QAAM,OAAkiB,QAA5hBpB,EAAE,ogBAAqgB,YAAU,c,SAA1lB,I,mCAAnF,QAAksB,MAAlsB,GADD,G,CCCA,MAAM,GAAS,CAAC,EAKV,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCLA,MACM,GAAa,CAAEJ,MAAO,+BAiB5B,QAA4B,QAAiB,CAC3Ca,OAAQ,sBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCjBR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,EAAM,eAAEE,GAAmB,EAE/CmE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CG,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D+C,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,OAAQnE,KACnEiH,GAAY,SAAS,IAAMxc,EAAMkJ,QAAQuT,aAAclH,KACvDnI,GAAY,SAAS,IAAMpN,EAAMkJ,QAAQoE,gBAEzCvP,GAAO,QAAS,CACrBic,IAAK,IAAMwC,EAAUtb,MAAMnD,KAC3B+L,IAAKpM,MAAMwD,IACVlB,EAAME,OAAO,sBAAsB,GACnCF,EAAME,OAAOsV,EAAgB,CAAEwH,SAAU,OAAQ9b,UACjDlB,EAAME,OAAO,kBAAmBgB,GAChClB,EAAME,OAAO,sBAAsB,EAAM,IAIrCmC,GAAO,QAAS,CACrB2X,IAAK,IAAMwC,EAAUtb,MAAMmB,KAC3ByH,IAAKpM,MAAMwD,IACVlB,EAAME,OAAO,sBAAsB,GACnCF,EAAME,OAAOsV,EAAgB,CAAEwH,SAAU,OAAQ9b,UACjDlB,EAAME,OAAO,sBAAsB,EAAM,IAIrCof,GAAgB,QAAS,CAC9BtF,IAAK,IACC,IAAawC,EAAUtb,MAAMmB,OAAS,IAAaiW,EAAWpX,OAC3D,GAGDoX,EAAWpX,MAAMqe,eAEzBzV,IAAKpM,MAAMwD,IACVlB,EAAME,OAAO,sBAAsB,SAC7BF,EAAMkP,SAASmG,EAAQ,CAAE4B,UAAW,iBAAkB/V,MAAOA,IACnElB,EAAME,OAAO,sBAAsB,EAAM,IAIrCsf,GAAmB,QAAS,CACjCxF,IAAK,IAAMwC,EAAUtb,MAAMue,kBAC3B3V,IAAKpM,MAAMwD,IACVlB,EAAME,OAAO,sBAAsB,GACnCF,EAAME,OAAOsV,EAAgB,CAAEwH,SAAU,oBAAqB9b,UAC9DlB,EAAME,OAAO,sBAAsB,EAAM,IDwB3C,MAAO,CAACZ,EAAUC,MACR,WAAc,QAAa0a,GAAyB,CAAE5b,MAAO,yBAA2B,CAC9FR,SAAS,SAAS,IAAM,EACtB,IAAAwC,GAAoB,MAAO,GAAY,EACrC,QAAamZ,GAAY,CACvBC,IAAK,yBACLpb,MAAO,gCACN,CACDR,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8b,EAAezY,MAAM,OAAQ,SAAU,MAE3Eb,EAAG,KAEL,QAAaqf,GAAY,CACvBlU,GAAI,yBACJ4O,WAAYrc,EAAKmD,MACjB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAOX,MAAQW,GAClFF,KAAM,gCACNlC,IAAK,aACJ,KAAM,EAAG,CAAC,kBAEf,QAAaya,GAAgB,CAC3B7b,MAAO,8BACPmN,GAAI,yBACJ7J,KAAM,gCACN5B,MAAO4Z,EAAezY,MAAM,OAAQ,QACpCkZ,WAAY/X,EAAKnB,MACjB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAOX,MAAQW,GAClFgX,OAAS,KAAM,QAAO7B,GAAP,CAA2B,QAAS3U,EAAKnB,MAAO,QAC/DyX,SAAUmB,EAAiB5Y,MAAM,aACjCkM,UAAWA,EAAUlM,MACrB4X,UAA8B,IAApB1L,EAAUlM,MACpB0X,UAAW,OACXG,MAAO,GACN,KAAM,EAAG,CAAC,QAAS,aAAc,SAAU,UAAW,YAAa,cACtE,QAAamB,GAAgB,CAC3B1O,GAAI,mCACJ7J,KAAM,2CACN5B,MAAO4Z,EAAezY,MAAMse,EAAiBte,MAAO,QACpDkZ,WAAYkF,EAAcpe,MAC1B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAgBX,MAAQW,GAC3FgX,OAAS,KAAM,QAAO7B,GAAP,CAA2B,kBAAmBsI,EAAcpe,MAAO,QAClFyX,SAAUmB,EAAiB5Y,MAAM,uBACjC6K,KAAM,MACL,KAAM,EAAG,CAAC,QAAS,aAAc,SAAU,aAC9C,IAAA1L,GAAoB,MAAO,KAAM,EAC/B,QAAamZ,GAAY,CACvBC,IAAK,6CACLpb,MAAO,gCACN,CACDR,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8b,EAAezY,MAAM,oBAAqB,SAAU,MAExFb,EAAG,KAEL,QAAasf,GAAY,CACvBhe,KAAM,6CACN0b,SAAU,sCACVJ,OAAQ,SACRC,OAAQ,QACR9C,WAAYoF,EAAiBte,MAC7B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAmBX,MAAQW,GAC9Fsb,OAAQ7d,EAAKkQ,MAAM0H,eAAepY,OAClCse,OAAQ9d,EAAKkQ,MAAM0H,eAAerY,OACjC,KAAM,EAAG,CAAC,aAAc,SAAU,cAEvC,QAAa+gB,GAAY,CACvBvhB,MAAO,8BACP8gB,SAAU,UACT,CACD7W,MAAM,SAAS,IAAM,EACnB,QAAauX,OAEfhiB,SAAS,SAAS,IAAM,EACtB,QAAiB,KAAM,QAAiByB,EAAKkQ,MAAMnN,KAAKyd,eAAgB,MAE1Ezf,EAAG,OAGPA,EAAG,IAGP,IEpKA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCGA,IAA4B,QAAiB,CAC3CnB,OAAQ,iCACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,mBAAoBnE,KAC/EoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D1W,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEpC,GAAS,QAAS,CACvBkb,IAAK,IAAM1B,EAAWpX,MAAMpC,OAC5BgL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,IDoBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,yBACV3O,GAAI,GAAGlM,EAAKgW,4CACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,QAAS,oBACrC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,gCACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,oBAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,0BACV3O,GAAI,GAAGlM,EAAKgW,6CACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAAU,oBACtC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,UAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,iCACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWlY,EAAOoC,MAAO,oBAClEkZ,WAAYtb,EAAOoC,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IEhFA,MAAM,GAAc,GAEpB,U,mCCJC,QAEM,aADL,OAAqC,kBAA/BmP,EAAAA,MAAMuQ,oBAAkB,I,CCDhC,MAAM,GAAS,CAAC,EAGV,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCLMnhB,MAAM,6BAA6BG,QAAQ,a,IAAY,OAAkW,QAA5VN,EAAE,qUAAqUC,KAAK,gB,aAAlV,I,mCAA5D,QAAoa,MAApa,GADD,G,CCCA,MAAM,GAAS,CAAC,EAGV,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCHA,MAAM,GAAa,CAAC,MAYpB,QAA4B,QAAiB,CAC3CQ,OAAQ,oBACRF,MAAO,CACLyf,QAAS,CAAC,EACVxnB,KAAM,CAAE4G,QAAS,UAEnB,KAAAuB,CAAMC,GAIR,MAAO,CAACC,EAAUC,MACR,WAAc,QAAoB,MAAO,CAC/ClB,MAAO,qBACP,YAAa,YACbmN,GAAIlM,EAAKmf,QAAU,GAAGnf,EAAKmf,6BAA+B,MACzD,EACD,QAAamB,GAAY,CAAET,SAAU7f,EAAKrI,MAAQ,CAChDqR,MAAM,SAAS,IAAM,CACJ,WAAdhJ,EAAKrI,OACD,WAAc,QAAa4oB,GAAgB,CAAEpgB,IAAK,MACnD,QAAoB,IAAI,GACb,UAAdH,EAAKrI,OACD,WAAc,QAAa+oB,GAAa,CAAEvgB,IAAK,MAChD,QAAoB,IAAI,MAE9B5B,SAAS,SAAS,IAAM,EACtB,QAAYyB,EAAKwC,OAAQ,cAE3BzB,EAAG,GACF,EAAG,CAAC,cACN,EAAG,IAER,IC5CA,MAAM,GAAc,GAEpB,UCFA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,QAEH,GAAa,CACjBoB,IAAK,EACLpB,MAAO,QAYT,QAA4B,QAAiB,CAC3Ca,OAAQ,0BACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCxBR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAC/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,YAAanE,KACxEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAC9D0K,GAAU,SAAS,IAAMjgB,EAAMkJ,QAAQgX,8BAEvCrhB,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEoZ,GAAS,QAAS,CACvBN,IAAK,IAAM1B,EAAWpX,MAAMoZ,OAC5BxQ,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,ID+BJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,kBACV3O,GAAI,GAAGlM,EAAKgW,qCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,yBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,aAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,mBACV3O,GAAI,GAAGlM,EAAKgW,sCACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,UAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,UAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,0BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWsD,EAAOpZ,MAAO,aAClEkZ,WAAYE,EAAOpZ,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,eACxEoe,EAAQ/e,MAAM,QAAS,SAAU5B,EAAKiW,YAClC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,QAAS,SAAU5B,EAAKiW,WAAY,MAEtFlV,EAAG,QAGP,QAAoB,IAAI,GAC3B4f,EAAQ/e,MAAM,SAAU,QAAS5B,EAAKiW,YAClC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,SAAU,QAAS5B,EAAKiW,WAAY,MAEtFlV,EAAG,QAGP,QAAoB,IAAI,MAE9BA,EAAG,IAGP,IE7GA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCGA,IAA4B,QAAiB,CAC3CnB,OAAQ,yBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,UAAWnE,KACtEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9DuG,GAAa,QAAS,CAC3B9B,IAAK,IAAM1B,EAAWpX,MAAM6a,YAC5BjS,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,cACX/V,MAAOA,GACN,IDqBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,sBACV3O,GAAI,GAAGlM,EAAKgW,yCACZ3T,KAAM,GAAGrC,EAAKgW,8CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,cAAe,WAC3C4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,eAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,6BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,eAAgB8E,EAAW5a,MAAO,WAC3EkZ,WAAY0B,EAAW5a,MACvB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAaX,MAAQW,IACvF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IE3DA,MAAM,GAAc,GAEpB,UCFA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,QAEH,GAAa,CACjBoB,IAAK,EACLpB,MAAO,QAYT,QAA4B,QAAiB,CAC3Ca,OAAQ,yBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCxBR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,UAAWnE,KACtEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CG,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAC9DqE,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDoG,GAAU,SAAS,IAAMjgB,EAAMkJ,QAAQgX,8BAEvCphB,GAAS,QAAS,CACvBkb,IAAK,IAAM1B,EAAWpX,MAAMpC,OAC5BgL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,IAIErC,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,ID8BJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,gBACV3O,GAAI,GAAGlM,EAAKgW,mCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,uBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,WAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,iBACV3O,GAAI,GAAGlM,EAAKgW,oCACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,UAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,UAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,wBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWlY,EAAOoC,MAAO,WAClEkZ,WAAYtb,EAAOoC,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,eACxEoe,EAAQ/e,MAAM,QAAS,SAAU5B,EAAKiW,YAClC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,QAAS,SAAU5B,EAAKiW,WAAY,MAEtFlV,EAAG,QAGP,QAAoB,IAAI,GAC3B4f,EAAQ/e,MAAM,SAAU,QAAS5B,EAAKiW,YAClC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,SAAU,QAAS5B,EAAKiW,WAAY,MAEtFlV,EAAG,QAGP,QAAoB,IAAI,MAE9BA,EAAG,IAGP,IE7GA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCIA,IAA4B,QAAiB,CAC3CnB,OAAQ,yBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,EAAM,eAAEE,GAAmB,EAE/C8C,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,UAAWnE,KACtEiH,GAAY,SAAS,IAAMxc,EAAMkJ,QAAQuT,aAAclH,KACvDoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D1W,GAAQ,QAAS,CACtBmb,IAAK,IAAM5B,GAAoBE,EAAWpX,MAAM,UAChD4I,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEkf,GAAa,QAAS,CAC3BpG,IAAK,IAAM5B,GAAoBoE,EAAUtb,MAAM,gBAC/C4I,IAAM5I,IACLlB,EAAME,OAAOsV,EAAgB,CAC5BwH,SAAU,cACV9b,MAAOA,GACN,IDoBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,gBACV3O,GAAI,GAAGlM,EAAKgW,mCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,QAAS,WACrC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,uBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,WAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,sBACV3O,GAAI,GAAGlM,EAAKgW,yCACZ3T,KAAM,GAAGrC,EAAKgW,6CACdsD,UAAW,UACX3hB,KAAM,SACNlB,IAAK,EACLF,IAAK,GACLgV,KAAM,EACN9K,MAAO4Z,EAAezY,MAAM,cAAe,WAC3C4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,eAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,6BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,eAAgBoJ,EAAWlf,MAAO,WAC3EkZ,WAAYgG,EAAWlf,MACvB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAaX,MAAQW,IACvF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IEtFA,MAAM,GAAc,GAEpB,UCMA,IAA4B,QAAiB,CAC3CnB,OAAQ,qBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,MAAOnE,KAClEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D1W,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEpC,GAAS,QAAS,CACvBkb,IAAK,IAAM1B,EAAWpX,MAAMpC,OAC5BgL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,IDoBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,YACV3O,GAAI,GAAGlM,EAAKgW,+BACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,QAAS,OACrC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,mBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,OAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,aACV3O,GAAI,GAAGlM,EAAKgW,gCACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAAU,OACtC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,UAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,oBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWlY,EAAOoC,MAAO,OAClEkZ,WAAYtb,EAAOoC,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IEhFA,MAAM,GAAc,GAEpB,UCMA,IAA4B,QAAiB,CAC3CnB,OAAQ,sBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,OAAQnE,KACnEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D1W,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEmf,GAAY,QAAS,CAC1BrG,IAAK,IAAM1B,EAAWpX,MAAMof,WAC5BxW,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,aACX/V,MAAOA,GACN,IAIEqf,GAAe,QAAS,CAC7BvG,IAAK,IAAM1B,EAAWpX,MAAMsf,cAC5B1W,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,gBACX/V,MAAOA,GACN,IDqBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,kBACV3O,GAAI,GAAGlM,EAAKgW,qCACZ3T,KAAM,GAAGrC,EAAKgW,6CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,aAAc,QAC1C4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,cAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,yBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,cAAeqJ,EAAUnf,MAAO,QACzEkZ,WAAYiG,EAAUnf,MACtB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAYX,MAAQW,IACtF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,qBACV3O,GAAI,GAAGlM,EAAKgW,wCACZ3T,KAAM,GAAGrC,EAAKgW,gDACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,gBAAiB,QAC7C4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,iBAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,4BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,iBAAkBuJ,EAAarf,MAAO,QAC/EkZ,WAAYmG,EAAarf,MACzB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAeX,MAAQW,IACzF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,aACV3O,GAAI,GAAGlM,EAAKgW,gCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,QAAS,QACrC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,oBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,QAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IEvGA,MAAM,GAAc,GAEpB,UCFA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,QAEH,GAAa,CACjBoB,IAAK,EACLpB,MAAO,QAYT,QAA4B,QAAiB,CAC3Ca,OAAQ,wBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCxBR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,SAAUnE,KACrEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAC9D0K,GAAU,SAAS,IAAMjgB,EAAMkJ,QAAQgX,8BAEvCrhB,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEpC,GAAS,QAAS,CACvBkb,IAAK,IAAM1B,EAAWpX,MAAMpC,OAC5BgL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,IAIEuf,GAAa,QAAS,CAC3BzG,IAAK,IAAM1B,EAAWpX,MAAMwf,YAC5B5W,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,cACX/V,MAAOA,GACN,ID+BJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,eACV3O,GAAI,GAAGlM,EAAKgW,kCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,sBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,UAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,gBACV3O,GAAI,GAAGlM,EAAKgW,mCACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,UAC5B4T,aAAcxV,EAAKiW,SAAW,GAAIqE,EAAkB1Y,MAAM,UAC1DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,uBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWlY,EAAOoC,MAAO,UAClEkZ,WAAYtb,EAAOoC,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,qBACV3O,GAAI,GAAGlM,EAAKgW,wCACZ3T,KAAM,GAAGrC,EAAKgW,8CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,eAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,eAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,4BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,eAAgByJ,EAAWvf,MAAO,UAC3EkZ,WAAYqG,EAAWvf,MACvB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAaX,MAAQW,IACvF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,eACxEoe,EAAQ/e,MAAM,SAAU,cAAe5B,EAAKiW,YACxC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,SAAU,cAAe5B,EAAKiW,WAAY,MAE5FlV,EAAG,QAGP,QAAoB,IAAI,GAC3B4f,EAAQ/e,MAAM,cAAe,SAAU5B,EAAKiW,YACxC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,cAAe,SAAU5B,EAAKiW,WAAY,MAE5FlV,EAAG,QAGP,QAAoB,IAAI,MAE9BA,EAAG,IAGP,IEpIA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,QAYT,QAA4B,QAAiB,CAC3Ca,OAAQ,uBACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCpBR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAgB,QAASnE,KACnEoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAaxE,KAC7D0K,GAAU,SAAS,IAAMjgB,EAAMkJ,QAAQgX,8BAEvC5E,GAAW,QAAS,CACzBtB,IAAK,IAAM1B,EAAWpX,MAAMqa,UAC5BzR,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,YACX/V,MAAOA,GACN,IAIEsa,GAAc,QAAS,CAC5BxB,IAAK,IAAM1B,EAAWpX,MAAMua,aAC5B3R,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,eACX/V,MAAOA,GACN,IAIEmf,GAAY,QAAS,CAC1BrG,IAAK,IAAM1B,EAAWpX,MAAMof,WAC5BxW,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,aACX/V,MAAOA,GACN,IAIEqf,GAAe,QAAS,CAC7BvG,IAAK,IAAM1B,EAAWpX,MAAMsf,cAC5B1W,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,gBACX/V,MAAOA,GACN,ID2BJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,mBACV3O,GAAI,GAAGlM,EAAKgW,sCACZ3T,KAAM,GAAGrC,EAAKgW,6CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,cAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,cAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,0BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,cAAeqJ,EAAUnf,MAAO,SACzEkZ,WAAYiG,EAAUnf,MACtB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAYX,MAAQW,IACtF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,sBACV3O,GAAI,GAAGlM,EAAKgW,yCACZ3T,KAAM,GAAGrC,EAAKgW,gDACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,iBAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,iBAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,6BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,iBAAkBuJ,EAAarf,MAAO,SAC/EkZ,WAAYmG,EAAarf,MACzB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAeX,MAAQW,IACzF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,kBACV3O,GAAI,GAAGlM,EAAKgW,qCACZ3T,KAAM,GAAGrC,EAAKgW,4CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,aAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,aAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,yBACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,aAAcsE,EAASpa,MAAO,SACvEkZ,WAAYkB,EAASpa,MACrB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAWX,MAAQW,IACrF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,qBACV3O,GAAI,GAAGlM,EAAKgW,wCACZ3T,KAAM,GAAGrC,EAAKgW,+CACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,gBAC5B4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,gBAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,4BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,gBAAiBwE,EAAYta,MAAO,SAC7EkZ,WAAYoB,EAAYta,MACxB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAcX,MAAQW,IACxF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,eACxEoe,EAAQ/e,MAAM,YAAa,eAAgB5B,EAAKiW,YAC5C,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAa4K,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBoiB,EAAQ/e,MAAM,YAAa,eAAgB5B,EAAKiW,WAAY,MAEhGlV,EAAG,QAGP,QAAoB,IAAI,MAE9BA,EAAG,IAGP,IE5IA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCGA,IAA4B,QAAiB,CAC3CnB,OAAQ,+BACRF,MAAO,CACLkW,eAAgB,CAAC,EACjBC,iBAAkB,CAAC,EACnBC,kBAAmB,CAAC,EACpBC,OAAQ,CAAC,EACTC,OAAQ,CAAC,EACTC,SAAU,CAAEte,KAAM4J,SAClB2U,eAAgB,CAAC,GAEnB,KAAApW,CAAMC,GCdR,MAAMW,GAAQ,WACR,SAAEuV,EAAQ,OAAEF,EAAM,OAAEC,GAAW,EAE/BgD,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQwQ,gBAAiB,gBAAiBnE,KAC5EoE,GAAiB,SAAS,IAAM3Z,EAAMkJ,QAAQyQ,iBAC9CC,GAAoB,SAAS,IAAM5Z,EAAMkJ,QAAQ2Q,0BACjDC,GAAmB,SAAS,IAAM9Z,EAAMkJ,QAAQ6Q,aAAcxE,KAE9D1W,GAAQ,QAAS,CACtBmb,IAAK,IAAM1B,EAAWpX,MAAMrC,MAC5BiL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,QACX/V,MAAOA,GACN,IAIEpC,GAAS,QAAS,CACvBkb,IAAK,IAAM1B,EAAWpX,MAAMpC,OAC5BgL,IAAM5I,IACLlB,EAAMkP,SAASmG,EAAQ,CACtB4B,UAAW,SACX/V,MAAOA,GACN,IDoBJ,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAa0a,GAAyB,KAAM,CAChEpc,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,sBACV3O,GAAI,GAAGlM,EAAKgW,yCACZ3T,KAAM,GAAGrC,EAAKgW,wCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,QAAS,iBACrC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,SAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,6BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,SAAUnY,EAAMqC,MAAO,iBAChEkZ,WAAYvb,EAAMqC,MAClB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAQX,MAAQW,IAClF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,gBACzE,QAAaqY,GAAgB,CAC3BC,SAAU,uBACV3O,GAAI,GAAGlM,EAAKgW,0CACZ3T,KAAM,GAAGrC,EAAKgW,yCACdvJ,KAAM,KACNhM,MAAO4Z,EAAezY,MAAM,SAAU,iBACtC4T,aAAcxV,EAAKiW,SAAW,GAAKqE,EAAkB1Y,MAAM,UAC3DyX,SAAUmB,EAAiB5Y,MAAM,GAAG5B,EAAKgW,8BACzCuD,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,UAAWlY,EAAOoC,MAAO,iBAClEkZ,WAAYtb,EAAOoC,MACnB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAASX,MAAQW,IACnF,KAAM,EAAG,CAAC,KAAM,OAAQ,QAAS,eAAgB,UAAW,SAAU,kBAE3ExB,EAAG,IAGP,IEhFA,MAAM,GAAc,GAEpB,UCyBO,MAAMsgB,GAAiCvU,IAC7C,OAAQA,GACP,IAAK,YACJ,OAAOwU,GACR,IAAK,oBACJ,OAAOC,GACR,IAAK,SACJ,OAAOC,GACR,IAAK,cACJ,OAAOC,GACR,IAAK,iBACJ,OAAOC,GACR,IAAK,MACJ,OAAOC,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,YACJ,OAAOC,GACR,IAAK,mBACJ,OAAOC,GACR,IAAK,yBACJ,OAAOC,GACR,IAAK,wBACJ,OAAOC,GACR,IAAK,iCACJ,OAAOC,GACR,IAAK,qBACJ,OAAOC,GACR,IAAK,YACJ,OAAOC,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,QACJ,OAAOC,GACR,IAAK,QACJ,OAAOC,GACR,IAAK,OACJ,OAAOC,GACR,IAAK,OACJ,OAAOC,GACR,IAAK,mBACJ,OAAO,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,OACJ,OAAOC,GACR,IAAK,SACJ,OAAOC,GACR,IAAK,QACJ,OAAOC,GACR,IAAK,gBACJ,OAAOC,GACR,QACC,OAAOC,G,EClFH,SAASC,GAAeC,EAA+BxjB,EAAa,CAAC,GAC3E,OAAQyjB,GAAYD,EAAMxjB,EAC3B,CAEO,SAASyjB,GAAYD,EAA+BxjB,EAAa,CAAC,GACxE,OAAO0jB,GAAaF,IAAOxjB,GAC5B,CACO,SAAS2jB,GAAWC,GAC1B,OAAOvoB,MAAMC,QAAQsoB,GAAOA,EAAc,OAARA,EAAe,CAACA,GAAO,EAC1D,CAEO,SAASF,GAAaG,GAC5B,OACEA,GACDF,GAAQE,GAAOC,OACbD,GACAA,EAAM5rB,OAAS,MACd4rB,EAAM5rB,OAAS,OAAS4rB,EAAM/lB,UAAU1I,QACxCyuB,EAAM5rB,OAAS,OAAa4rB,EAAM/lB,UAAU1I,QAGjD,CCvBA,MACM,GAAa,CACjBqL,IAAK,EACLpB,MAAO,qBAKT,QAA4B,QAAiB,CAC3Ca,OAAQ,mBACR,KAAAE,CAAMC,GAGR,MAAO,CAACC,EAAUC,KACR,QAAOgjB,GAAR,CAAwBjjB,EAAKwC,OAAOjE,WACtC,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAYyB,EAAKwC,OAAQ,eAE3B,QAAoB,IAAI,EAE9B,ICjBA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCEA,IAA4B,QAAiB,CAC3C5C,OAAQ,cACR,KAAAE,CAAMC,GCLR,MAAMW,GAAQ,UACRoM,GAAQ,SAAS,IAAMpM,EAAMkJ,QAAQkD,QACrCkM,GAAa,SAAS,IAAMtY,EAAMkJ,QAAQoP,aAC1CkE,GAAY,SAAS,IAAMxc,EAAMkJ,QAAQsT,YACzCuG,GAAqC,SAC1C,IAAM/iB,EAAMkJ,QAAQ6Z,qCAEfC,GAAuC,SAC5C,IAAMhjB,EAAMkJ,QAAQ8Z,uCAEfC,GAAwB,SAAS,IAAMjjB,EAAMkJ,QAAQ+Z,wBACrDC,GAA8B,SAAS,KAC5C,MAAMC,EAAanjB,EAAMkJ,QAAQka,4BACjC,OAAOD,EAAW3pB,KAAK6pB,IACf,CACN5jB,IAAK4jB,EAAUC,MACf9X,GAAI,gBAAgB6X,EAAUC,QAC9BrD,QAASoD,EAAUE,gBAEnB,IAGHzoB,SAAS4F,iBAAiB,WAAY4N,GAAUtO,EAAME,OAAO,uBAAwBoO,KACrFxT,SAAS4F,iBAAiB,YAAY,IAAMV,EAAME,OAAO,uBAAwB,OAEjF,SAAgB,KACfpF,SAAS6F,oBAAoB,YAAY,IAAMX,EAAME,OAAO,0BAC5DpF,SAAS6F,oBAAoB,WAAW,IAAMX,EAAME,OAAO,yBAAwB,IAGpF,MAAMsjB,GAAe,SAAS,KAC7B,OAAQpX,EAAMlL,OACb,IAAK,YACL,IAAK,oBACL,IAAK,SACL,IAAK,cACL,IAAK,iBACL,IAAK,MACL,IAAK,UACL,IAAK,YACL,IAAK,mBACL,IAAK,yBACL,IAAK,wBACL,IAAK,iCACL,IAAK,qBACL,IAAK,YACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,gBACL,IAAK,mBACJ,MAAO,CACNmU,OAAQ,uBACRG,eAAgB,iBAChBD,UAAU,EACVD,OAAQ,IAEV,QACC,MAAO,CACNpU,MAAOoX,EAAWpX,MAClBsb,UAAWA,EAAUtb,O,IDYzB,MAAO,CAAC5B,EAAUC,MACR,WAAc,QAAoB,MAAO,KAAM,GACpD,WAAc,SAAa,SAAyB,QAAOohB,GAAP,CAAsCvU,EAAMlL,SAAS,SAAgB,QAAoBsiB,EAAatiB,QAAS,KAAM,MAC1K,QAAauiB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,GACrB,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYqlB,EAA4BhiB,OAAQoiB,KAC9F,WAAc,QAAanD,GAAmB,CACpD1gB,IAAK6jB,EAAM7jB,IAAM,sBACjB,WAAY6jB,EAAM9X,IACjB,CACD3N,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBylB,EAAMrD,SAAU,MAEpD5f,EAAG,GACF,KAAM,CAAC,gBACR,MACH4iB,EAA2B,QACvB,WAAc,QAAa9C,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMkU,0BAA2B,MAE1ErjB,EAAG,MAEL,QAAoB,IAAI,GAC3B0iB,EAAwC,QACpC,WAAc,QAAa5C,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,8BACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBmlB,EAAqC9hB,OAAQ,MAEjFb,EAAG,MAEL,QAAoB,IAAI,MAE9BA,EAAG,MAIT,IE/HA,MAAM,GAAc,GAEpB,UCFA,MACM,GAAa,CAAEhC,MAAO,kBAQ5B,QAA4B,QAAiB,CAC3Ca,OAAQ,gBACR,KAAAE,CAAMC,GCRR,MAAMW,GAAQ,UACR0T,GAAmB,SAAS,IAAM1T,EAAMkJ,QAAQwK,mBAChDtH,GAAQ,SAAS,IAAMpM,EAAMkJ,QAAQkD,QDa3C,MAAO,CAAC9M,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,CAC/B,WAA3BmU,EAAiBxS,QACb,WAAc,QAAayiB,GAAW,CACrClkB,IAAK,EACLyV,eAAgB,CAAC,MAAO,OAAQ,aAChCC,iBAAkB,QAClBC,kBAAmB,uBAErB,QAAoB,IAAI,GACX,KAAhBhJ,EAAMlL,QACF,WAAc,QAAa0iB,GAAa,CAAEnkB,IAAK,MAChD,QAAoB,IAAI,KAGhC,IE9BA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCNA,MAAM,GAAa,CCDbpB,MAAM,2CDEN,GAAa,CCHnB,MAKIA,MAAM,8CDEJ,GAAa,CCAVA,MAAM,oFDCT,GAAa,CCRnB,MAQsCA,MAAM,sBDItC,GAAa,CCDVA,MAAM,4EDET,GAAa,CCbnB,MAYsCA,MAAM,sBDKtC,GAAa,CCAZA,MAAM,0CDCP,GAAa,CCAZA,MAAM,8CDCPwlB,GAAa,CCMPxlB,MAAM,aDLZylB,GAAc,CCQRzlB,MAAM,aDPZ,GAAc,CCWVA,MAAM,yCDVV,GAAc,CCgBVA,MAAM,yCDfV0lB,GCvBN,gBDwBM,GAAc,CCxBpB,MA8CY1lB,MAAM,wCDlBZ2lB,GAAc,CC5BpB,OD6BMC,GAAc,CC7BpB,OD8BMC,GAAc,CC9BpB,MAoEuC7lB,MAAM,kDDlCvC,ICkCwF,OAAS,mBDjCjG8lB,ICiCiG,OAAS,mBDhC1G,ICgC0G,OAAS,mBD/BnHC,GAAc,CC+B0E,GAAS,GAAS,ID1B1GC,GAAc,CC1CpB,OD2CMC,GAAc,CC3CpB,OD4CMC,IC+BE,OAAS,mBD9BXC,GAAc,CC7CpB,MAoFuCnmB,MAAM,kDDnCvComB,ICmCwF,OAAS,mBDlCjGC,ICkCiG,OAAS,mBDjC1GC,ICiC0G,OAAS,mBDhCnHC,GAAc,CCgC0E,GAAS,GAAS,ID3B1GC,GAAc,CCzDpB,OD0DMC,GAAc,CC1DpB,MA8FMzmB,MAAM,wCDhCN0mB,GAAc,CCoCR1mB,MAAM,0CDnCZ2mB,GC/DN,cDiEO,SAAS,GAAO1lB,EAAUC,EAAY0lB,EAAYC,EAAYC,EAAWC,GAC9E,MAAMC,GAA4B,QAAkB,kBAC9CC,GAA8B,QAAkB,oBAChDC,GAAyB,QAAkB,eAC3CC,GAAwB,QAAkB,cAC1CC,GAAyB,QAAkB,eAC3CC,GAAwB,QAAkB,cAC1CC,GAAqC,QAAkB,2BACvDC,GAA4C,QAAkB,kCAC9DC,GAA4B,QAAkB,kBAEpD,OAAQ,WC3ET,QAoHM,MApHN,GAoHM,GDxCF,WC3EH,QAcW,MAdDvc,GAAG,wCAAsC,CAE3C,EAAA6D,iBAAmB,EAAA2Y,oBD2ElB,WC5ER,QAYM,MAZN,GAYM,EARL,OAGM,MAHN,GAGM,CDuEKrxB,KCzEqB,oBD0EjB,WC1Ed,QAAgE,IAAhE,OD2Ec,WC1Ed,QAAmD,GATxD,MAS6BsxB,MAAO,EAAAC,kBD6Ef,KAAM,EAAG,CAAC,cC3E3B,OAGM,MAHN,GAGM,CD2EKvxB,KC7EqB,oBD8EjB,WC9Ed,QAAgE,IAAhE,OD+Ec,WC9Ed,QAAkD,GAbvD,MAa6BsxB,MAAO,EAAAE,iBDiFf,KAAM,EAAG,CAAC,YC9F/B,QAauD,KAAC,QAAG,EAAA7c,KAAK8c,aAAW,SAb3E,mBAiBE,OAyFM,MAzFN,GAyFM,EAxFL,OAyBK,KAzBL,GAyBK,EAxBJ,OAWK,MAXD7nB,OAnBR,SAmBc,kDAAiD,2DAAsE8nB,EAAAA,uBDqF1H,CCnFC,EAAe,kBDqFZ,WCtFV,QASS,UA7Bd,MAsBM9nB,MAAM,uDACNpH,KAAK,SACJ,QAAK,gBAAEkvB,EAAAA,oBAAuBA,EAAAA,mBAAoB,EAAAC,mBAAmB,IDuF3D,ECtFX,OAEO,OAFP,GAEO,EADN,QAA6G,GAA3F/nB,MAAM,gEAAgE,cAAY,YAErG,OAAqH,OAArH,IAAqH,QAA1F8nB,EAAAA,mBAAqB,EAAA/c,KAAKid,KAAKC,mBAAqB,EAAAld,KAAKid,KAAKF,oBAAkB,OA5BjH,gBDyHW,IC1FP,OAKK,MALD9nB,OA/BR,SA+Bc,kDAAiD,0DAAqE8nB,EAAAA,uBD6FzH,EC5FN,OAGM,MAHN,GAGM,EAFL,QAAe,IACf,QAAc,MD+FT,IC5FP,OAKK,MALD9nB,OArCR,SAqCc,kDAAiD,0DAAqE8nB,EAAAA,uBD+FzH,EC9FN,OAGM,MAHN,GAGM,EAFL,QAAe,IACf,QAAc,MDiGT,MC7FR,QA6DiC,GA7DD1c,OAAA,GAAOC,KAAK,UDkGtC,CC9IT,kBA6CI,IA2DM,EDwCA,SCnGN,OA2DM,OA3DDrL,MAAM,iCAAkC,eAAc8nB,EAAAA,oBDsGlD,CCrGmD,EAAAhZ,iBAAmB,EAAA2Y,oBDuGlE,WCvGZ,QA6CQ,QA7CR,GA6CQ,EA5CP,OA2CQ,eA1CP,OAIK,YAHJ,OAAsC,mBAA/B,EAAA1c,KAAKid,KAAKE,eAAa,IAC9B,QAA8G,GAApFR,MAAK,KAAOS,aAAaC,SAAWC,MAAM,EAAQC,YAAa,EAAAb,mBD2GxE,KAAM,EAAG,CAAC,QAAS,iBC1GpC,QAA4G,GAAlFC,MAAK,KAAOa,YAAYH,SAAWC,MAAM,EAAOC,YAAa,EAAAb,mBD+GtE,KAAM,EAAG,CAAC,QAAS,mBC7GrC,OAIK,YAHJ,OAAoC,mBAA7B,EAAA1c,KAAKid,KAAKQ,aAAW,IAC5B,QAA4G,GAAlFd,MAAK,KAAOS,aAAaM,OAASJ,MAAM,EAAQC,YAAa,EAAAb,mBDmHtE,KAAM,EAAG,CAAC,QAAS,iBClHpC,QAA0G,GAAhFC,MAAK,KAAOa,YAAYE,OAASJ,MAAM,EAAOC,YAAa,EAAAb,mBDuHpE,KAAM,EAAG,CAAC,QAAS,kBCrH3B,EAAc,iBDwHN,WCxHlB,QAIK,KA9DZ,KA2DQ,OAAwC,mBAAjC,EAAA1c,KAAKid,KAAKU,iBAAe,IAChC,QAAqH,GAA3FhB,MAAK,KAAOS,aAAaO,gBAAkBL,MAAM,EAAQC,YAAa,EAAAb,mBD4H3E,KAAM,EAAG,CAAC,QAAS,iBC3HxC,QAAmH,GAAzFC,MAAK,KAAOa,YAAYG,gBAAkBL,MAAM,EAAOC,YAAa,EAAAb,mBDgIzE,KAAM,EAAG,CAAC,QAAS,oBC7LhD,eA+DiB,EAAAkB,eAAiB,EAAAR,aAAaS,aAAe,IDkIrC,WClIlB,QAIK,KAnEZ,KAgEQ,OAAqC,mBAA9B,EAAA7d,KAAKid,KAAKY,cAAY,IAC7B,QAAkH,GAAxFlB,OAAK,EAAO,EAAAS,aAAaS,aAAeP,MAAM,EAAQC,YAAa,EAAAb,mBDsIxE,KAAM,EAAG,CAAC,QAAS,iBCrIxC,QAAgH,GAAtFC,OAAK,EAAO,EAAAa,YAAYK,aAAeP,MAAM,EAAOC,YAAa,EAAAb,mBD0ItE,KAAM,EAAG,CAAC,QAAS,oBC5MhD,eAoEiB,EAAoB,uBD4IZ,WC5IlB,QAAuH,KAAvH,GApEP,qBAqEiB,EAAoB,uBD8IZ,WC9IlB,QAIK,KAzEZ,KAsEQ,OAAkC,mBAA3B,EAAA1c,KAAKid,KAAKa,WAAS,IAC1B,QAA8G,GAApFnB,MAAO,EAAAS,aAAaW,cAAgBT,MAAM,EAAQC,YAAa,EAAAb,mBDkJpE,KAAM,EAAG,CAAC,QAAS,iBCjJxC,QAA4G,GAAlFC,MAAO,EAAAa,YAAYO,cAAgBT,MAAM,EAAOC,YAAa,EAAAb,mBDsJlE,KAAM,EAAG,CAAC,QAAS,oBC9NhD,eA0EiB,EAAoB,uBDwJZ,WCxJlB,QAIK,KA9EZ,IA2EQ,IACA,OAA8B,UAA1B,MAAE,aAAQsB,UAAQ,IACtB,OAA8B,UAA1B,MAAE,aAAQA,UAAQ,OA7E9B,gBA+EO,OAIK,YAHJ,OAAiC,mBAA1B,EAAAhe,KAAKid,KAAKgB,UAAQ,IACzB,QAAyG,GAA/EtB,MAAK,KAAOS,aAAac,IAAMZ,MAAM,EAAQC,YAAa,EAAAb,mBD6JnE,KAAM,EAAG,CAAC,QAAS,iBC5JpC,QAAuG,GAA7EC,MAAK,KAAOa,YAAYU,IAAMZ,MAAM,EAAOC,YAAa,EAAAb,mBDiKjE,KAAM,EAAG,CAAC,QAAS,kBC/J3B,EAAoB,uBDkKZ,WClKlB,QAAuH,KAAvH,GApFP,qBAqFiB,EAAoB,uBDoKZ,WCpKlB,QAIK,KAzFZ,KAsFQ,OAA8B,mBAAvB,EAAA1c,KAAKid,KAAKkB,OAAK,IACtB,QAAyG,GAA/ExB,MAAK,KAAOC,iBAAmBU,MAAM,EAAQC,YAAa,EAAAb,mBDwK/D,KAAM,EAAG,CAAC,QAAS,iBCvKxC,QAAuG,GAA7EC,MAAK,KAAOE,gBAAkBS,MAAM,EAAOC,YAAa,EAAAb,mBD4K7D,KAAM,EAAG,CAAC,QAAS,oBCpQhD,sBDyQiB,WC7KZ,QAWQ,QAXR,GAWQ,EAPP,OAMQ,eALP,OAIK,YAHJ,OAEK,KAFL,GAEK,EADJ,OAA0C,uBAA/B,EAAA0B,qBAAmB,aD+K1B,EClRb,KDmRY,CAAC,KCtO8ErB,EAAAA,yBA7C3F,UDyRK,WC9KH,QAEW,MAFD7c,GAAG,uCAAqC,CACM,EAAY,eD+K3D,WC/KR,QAAiG,OA5GpG,MA4GQjL,MAAM,sCAA0D,UAAQ,EAAAopB,cDmLnE,KAAM,EC/RnB,yBA8GE,QAME,GALA1B,MAAO,EAAA2B,mBACPtb,MAAO,EAAAA,MACPN,WAAY,EAAAA,WACR,kBAAkB,EAAA6b,sBAClB,WAAU,EAAAC,gBDqLX,KAAM,EAAG,CAAC,QAAS,QAAS,aAAc,oBAAqB,gBAEtE,CE1SO,SAASC,GAAY9B,GAC3B,OAAOjwB,KAAKO,MAAe,IAAR0vB,GAAgB,GACpC,C,UCFA,MAESva,GAAG,wB,IAGJnN,MAAM,iB,IACNA,MAAM,c,IACNA,MAAM,iB,IACNA,MAAM,c,IAGJmN,GAAG,6B,8EAVZ,QAmBW,MAnBDlC,GAAG,kCAAkCwe,OAAO,Q,CACd,EAAAC,iBAAmBC,EAAAA,WAAW5zB,OAAS,I,WAA9E,QAiBQ,QAjBR,GAiBQ,EAhBP,OAOQ,eANR,OAKK,YAJJ,OAAkD,KAAlD,IAAkD,QAArBgV,EAAAA,KAAKge,UAAQ,IAC1C,OAAgD,KAAhD,IAAgD,QAAtBhe,EAAAA,KAAK8d,WAAS,IACxC,OAAkD,KAAlD,IAAkD,QAArB9d,EAAAA,KAAKge,UAAQ,IAC1C,OAAgD,KAAhD,IAAgD,QAAtBhe,EAAAA,KAAK8d,WAAS,QAGzC,OAOQ,QAPR,GAOQ,G,aANP,QAKK,WAjBT,QAY2B,EAAAe,YAZ3B,CAYgB5U,EAAK9b,M,WAAjB,QAKK,MAL+BkI,IAAK4T,EAAI+T,U,EAC5C,OAAuC,mBAAhC,EAAAa,WAAY1wB,GAAI6vB,UAAQ,IAC/B,OAA0D,YAAtD,QAAiD,GAAhCrB,MAAO,EAAAkC,WAAY1wB,GAAIwuB,O,qBAC5C,OAAkD,oBAAzC,EAAAmC,YAAa3wB,IAAO,CAAC,GAAI6vB,UAAQ,IAC1C,OAAqE,YAAjE,QAA4D,GAA3CrB,OAAS,EAAAmC,YAAa3wB,IAAO,CAAC,GAAIwuB,O,qCAhB5D,gB,2BCAO,SAASoC,GAAyBC,EAAgEC,EAAY,IACpH,MAAMC,EAAuBluB,OAAOD,KAAMiuB,EAAItc,YAAatS,KAAOyd,GAC1D,GAAGA,KAAamR,EAAItc,WAAYmL,OACpCzb,KAAM,KAEV,MAAO,GAAG4sB,EAAIhc,SAASkc,KAAwBD,KAAaD,EAAIG,YACjE,C,2CCLC,QAAgC,qBAAvB,EAAAC,eAAa,E,CAIvB,QACCxpB,MAAO,CACN+mB,MAAOxvB,QAER8a,SAAU,CACT,IAAAjI,GAAS,OAAO3U,KAAK+a,KAAO,EAC5B,QAAAiZ,GAAa,OAAOh0B,KAAKi0B,YAAc,EACvC,SAAAC,GACC,QAAUl0B,KAAKsxB,QAAW9N,MAAOxjB,KAAKsxB,MACvC,EACA,aAAAyC,GACC,IAAO/zB,KAAKk0B,UACX,MAAO,GAGR,MAAMC,EAAkB,IAAIC,KAAKC,aAAcr0B,KAAKg0B,SAASpzB,KAAKH,OAAOI,QAAS,IAAK,KAAO,CAC7F8Z,MAAO,WACP2Z,SAAUt0B,KAAKg0B,SAASpzB,KAAK0zB,WAG9B,OAAOH,EAAgBI,OAAQv0B,KAAKsxB,MACrC,ICrBF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UHwBA,IACCnT,WAAY,CAAEqW,eAAc,IAC5BjqB,MAAO,CACN+mB,MAAOxvB,OACP6V,MAAOnN,OACP6M,WAAY1R,OACZ8uB,UAAWjqB,QAEZ+Z,MAAO,CAAC,mBAAoB,YAC5Bpc,KAAM,WACL,MAAO,CACNwM,KAAM3U,KAAK+a,MACXmO,YAAalpB,KAAKi0B,aAClBS,aAAc,EACdnB,WAAY,GACZoB,YAAa,GACbhC,SAAU,EAEZ,EACA,OAAAxW,GACCnc,KAAK40B,kBAAoB,KAAS50B,KAAK40B,kBAAmB50B,KAAK60B,YAChE,EACA,OAAA7Y,GACCe,QAAQ,KACP,MAAM+X,EAAiB/X,OAAQ,qCAC/B,GAA6B,IAA1B+X,EAAen1B,OACjB,OAED,MAAMo1B,EAAO/0B,KAEb+0B,EAAKpC,SAAW3O,SAAU8Q,EAAeE,MAAO,IAChDF,EAAevX,GAAI,UAAU,KAC5BwX,EAAKpC,SAAW3O,SAAU8Q,EAAeE,MAAO,GAAI,GAClD,GAEL,EACApY,SAAU,KACN,QAAY,CACd,qBAED,eAAA0W,GACC,MAAM2B,EAAepS,WAAY7iB,KAAKkpB,YAAY8K,SAASiB,cAE3D,OAAO,IAAMA,GAAgBj1B,KAAKsxB,QAAU2D,CAC7C,EACA,aAAAC,GACC,OAAOl1B,KAAKuzB,WAAW5zB,OAAS,CACjC,EACA,SAAAw1B,GACC,OAAO9zB,KAAKyd,KAAM9e,KAAKuzB,WAAW5zB,OAAS,EAC5C,EACA,UAAA6zB,GACC,OAAOxzB,KAAKk1B,cAAgBl1B,KAAKuzB,WAAW6B,MAAO,EAAGp1B,KAAKm1B,WAAan1B,KAAKuzB,UAC9E,EACA,WAAAE,GACC,OAAOzzB,KAAKk1B,cAAgBl1B,KAAKuzB,WAAW6B,MAAOp1B,KAAKm1B,WAAc,EACvE,EACA,IAAAzW,GAGC,OAAK1e,KAAKuzB,WAAW5zB,QAAU,EACvBK,KAAKuzB,WAEN,EACR,EACA,eAAA8B,GACC,IAAOr1B,KAAKszB,gBACX,OAAOtzB,KAAKsxB,MAIb,GAAgC,IAA3BtxB,KAAKuzB,WAAW5zB,QAAgBK,KAAK2yB,SAAW3yB,KAAKuzB,WAAY,GACrE,OAAOvzB,KAAKsxB,MAIb,GAAKtxB,KAAK2yB,UAAY3yB,KAAKuzB,WAAYvzB,KAAKuzB,WAAW5zB,OAAS,GAAIgzB,SACnE,OAAO3yB,KAAKuzB,WAAYvzB,KAAKuzB,WAAW5zB,OAAS,GAAI2xB,MAItD,IAAM,IAAIxuB,EAAI,EAAGA,EAAI9C,KAAKuzB,WAAW5zB,OAAS,EAAGmD,IAChD,GACC9C,KAAK2yB,UAAY3yB,KAAKuzB,WAAYzwB,GAAI6vB,UACtC3yB,KAAK2yB,SAAW3yB,KAAKuzB,WAAYzwB,EAAI,GAAI6vB,SAEzC,OAAO3yB,KAAKuzB,WAAYzwB,GAAIwuB,MAI9B,OAAOtxB,KAAKsxB,KACb,GAEDzU,QAAS,CACR,kBAAMyY,CAAc3d,EAAON,GAG1B,IAAOrX,KAAKszB,gBAGX,OAFAtzB,KAAKu1B,MAAO,mBAAoBv1B,KAAKq1B,sBACrCr1B,KAAKu1B,MAAO,WAAYv1B,KAAK2yB,UAI9B,MAAM6C,EAAcx1B,KAAK60B,YAAald,EAAON,EAAYrX,KAAKy1B,kBAC9Dz1B,KAAK20B,YAAca,EAEnB,MAAME,QAAiB11B,KAAK40B,kBAAmBjd,EAAON,EAAYrX,KAAKy1B,kBAIlEz1B,KAAK20B,cAAgBa,IACzBx1B,KAAKuzB,WAAamC,EAASC,QAAU,GACrC31B,KAAKu1B,MAAO,mBAAoBv1B,KAAKq1B,iBACrCr1B,KAAKu1B,MAAO,WAAYv1B,KAAK2yB,UAE/B,EACA,uBAAMiC,CAAmBjd,EAAON,EAAYyc,GAC3C9zB,KAAK00B,eAELrd,EAAa,KAAWA,GAAY,CAAEue,EAAgBC,IAChD,qBAAuBA,EACpBD,EAGD/1B,EAAOM,QAASy1B,GAAiB30B,UAGzC,MAAM60B,EAASnwB,OAAOD,KAAM2R,GAAatS,KAAOyd,GACxC,gBAAiBA,MAAgBnL,EAAYmL,OAErDsT,EAAOrzB,KAAM,uBAAwBkV,KACrCme,EAAOrzB,KAAM,iBAAiBqxB,KAC9BgC,EAAOrzB,KAAM,WAAYzC,KAAKkpB,YAAY6M,cAC1CD,EAAOrzB,KAAM,cAAezC,KAAK00B,gBAEjC,MAAMsB,EAAa,GAAIh2B,KAAKkpB,YAAY+M,2BAA8BH,EAAO/uB,KAAM,KAEnF/G,KAAKk2B,+BAA+B,GAGpC,MAAM1xB,QAAgB2xB,QAAQC,QAASrZ,OAAOwI,IAAKyQ,IAInD,OAFAh2B,KAAKk2B,+BAA+B,GAE7B1xB,CACR,EACA,WAAAqwB,CAAald,EAAON,GACnB,OAAOqc,GAAyB,CAAE/b,QAAON,aAAYyc,WAAY9zB,KAAKy1B,kBACvE,MACG,QAAc,CAChB,mCAGFhZ,MAAO,CACN,gBAAAgZ,CAAkBY,EAAUC,GACtBD,IAAaC,GACjBt2B,KAAKs1B,aAAct1B,KAAK2X,MAAO3X,KAAKqX,WAEtC,EACA,KAAAM,CAAO0e,EAAUC,GACXD,IAAaC,GACjBt2B,KAAKs1B,aAAct1B,KAAK2X,MAAO3X,KAAKqX,WAEtC,EACA,UAAAA,CAAYkf,EAAeC,GACrBD,IAAkBC,GACtBx2B,KAAKs1B,aAAct1B,KAAK2X,MAAO3X,KAAKqX,WAEtC,EACA,KAAAia,CAAOmF,EAAUC,GACXD,IAAaC,GACjB12B,KAAKs1B,aAAct1B,KAAK2X,MAAO3X,KAAKqX,WAEtC,EACA,QAAAsb,CAAUgE,EAAaC,GACjBD,IAAgBC,GACpB52B,KAAKs1B,aAAct1B,KAAK2X,MAAO3X,KAAKqX,WAEtC,II5MF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCPA,MAGMzN,MAAM,sB,IAHZ,O,IAAA,O,8EACC,QAaK,WAZY,EAAW,c,WAC1B,QAAkC,IAAlC,O,WAED,QAQW,MAbb,QAMmB,EAAM,S,WACrB,QAAqC,SAPzC,YAOe,EAAA+K,KAAKid,KAAKiF,MAAI,M,WAE1B,QAGO,OAZV,KAUI,OAAkD,gBAA1C,QAAiC,GAAhBvF,MAAO,EAAAA,OAAK,qBAVzC,QAUsD,KAClD,QAAG,EAAAW,KAAO,EAAAtd,KAAKid,KAAKkF,KAAO,EAAAniB,KAAKid,KAAKmF,MAAI,O,OAQ7C,QACC5Y,WAAY,CAAEqW,eAAc,IAC5BjqB,MAAO,CACN+mB,MAAOxvB,OACPmwB,KAAM7lB,QACN8lB,YAAa9lB,SAEdwQ,SAAU,CACT,IAAAjI,GACC,OAAO3U,KAAK+a,KACb,EACA,QAAAiZ,GACC,OAAOh0B,KAAKi0B,YACb,EACA,MAAA+C,GACC,OAAsB,IAAfh3B,KAAKsxB,KACb,IC9BF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCLO,MAAM2F,GACJC,uBACAC,cACAC,8BAER,WAAAt3B,CAAao3B,EAAgCC,EAAuBC,GACnEp3B,KAAKk3B,uBAAyBA,EAC9Bl3B,KAAKm3B,cAAgBA,EACrBn3B,KAAKo3B,8BAAgCA,CACtC,CAEA,wBAAAC,CAA0B1f,GACzB,MAAM2f,EAAoB3f,EAAM4f,wBAC1BjG,EAAQtxB,KAAKk3B,uBAAyBI,EAAkBE,WAAWC,QACzE,OAAOnG,CACR,CAEA,sBAAAoG,CAAwB/f,GACvB,OAAO3X,KAAKo3B,8BAAgCzf,EAAMggB,oBAAoBr3B,MACvE,CAEA,SAAAs3B,CAAWjgB,GACV,IAAI2Z,EAAQtxB,KAAKq3B,yBAA0B1f,GAO3C,OANA2Z,GAAStxB,KAAK03B,uBAAwB/f,GAEjC2Z,EAAQtxB,KAAKm3B,gBACjB7F,EAAQtxB,KAAKm3B,eAGP7F,CACR,E,SChCD,e,IAUQ1nB,MAAM,a,IAGNA,MAAM,a,yEAZb,QAaS,UAZRA,MAAM,uCACNpH,KAAK,SACJ,aAAY,EAAAmS,KAAKkjB,MAClB5qB,IAAI,YACJ,cAAY,QACZ,cAAY,8BACP,QAAK,oBAAE,EAAA6qB,WAAA,EAAAA,aAAA,K,EAEZ,OAEO,OAFP,GAEO,EADN,QAAyF,GAA9EluB,MAAM,mDAAmD,cAAY,YAEjF,OAA4D,OAA5D,IAA4D,QAAjC,EAAA+K,KAAKojB,oBAAkB,I,EAbpD,G,WCEE3tB,MAAM,KACNC,OAAO,KACPF,MAAM,6BACNG,QAAQ,a,IACP,OAAm3B,QAA72BL,KAAK,UAAUD,EAAE,21B,aAAvB,I,2CALF,QAMM,MANN,GADD,G,CAWA,QAAiB,ECNjB,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,WFcA,IACCmU,WAAY,CACX6Z,UAAS,IAEVpb,SAAU,CACTjI,KAAM,WAAa,OAAO3U,KAAK+a,KAAO,GAEvC8B,QAAS,CACRib,UAAW,WACV,MAAMG,EAASj4B,KAAKk4B,MAAMC,UAE1B,IAAI,MAASF,EAAQ,CAAC,GAEtBA,EAAOhsB,iBAAkB,eAAe,SACxCgsB,EAAOhsB,iBAAkB,gBAAgB,QAC1C,IG/BF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCNMrC,MAAM,+BAA+BmN,GAAG,cAAc,cAAY,OAAOqhB,KAAK,U,IAClF,OAAwD,OAAnDxuB,MAAM,wCAAsC,S,IAC5CA,MAAM,sCAAsCwuB,KAAK,Y,IAChDxuB,MAAM,uC,IACNA,MAAM,sC,GALd,e,IAOK,OAEO,QAFDA,MAAM,aAAW,EACtB,OAAqC,QAA/BA,MAAM,sB,OADb,I,IAKGA,MAAM,qC,IAZd,MAaSA,MAAM,yC,IAbf,O,IAeM,OAAkC,KAA/BA,MAAM,sBAAoB,S,GAfnC,e,IAyBYA,MAAM,a,IAzBlB,MA8BSA,MAAM,qC,GA9Bf,U,GAAA,e,IA6CYA,MAAM,a,IA7ClB,MAkDSA,MAAM,qC,GAlDf,sB,IA0DYA,MAAM,a,IAGNA,MAAM,a,GA7DlB,sB,IAwEYA,MAAM,a,IAGNA,MAAM,a,gGA1EjB,QAiFM,MAjFN,GAiFM,CAhFL,IACA,OA8EM,MA9EN,GA8EM,EA7EL,OAOM,MAPN,GAOM,EANL,OAAiF,KAAjF,IAAiF,QAA/B,EAAA+K,KAAKojB,oBAAkB,IACzE,OAII,KAJDnuB,MAAM,gGAAiG,aAAY,EAAA+K,KAAKC,YAN/H,YAYG,OAoEM,MApEN,GAoEM,EAnEqD,EAAAyjB,cAAgBC,EAAAA,0B,WAA1E,QAgBM,MAhBN,GAgBM,CAfOC,EAAgB,mB,WAA5B,QAEO,OAhBZ,IAeM,IAfN,QAewC,KAAC,QAAG,EAAA5jB,KAAK6jB,gBAAc,Q,WAG1D,QAUS,UA5Bd,MAoBM5uB,MAAM,gCACNpH,KAAK,SACA,QAAK,eAAE,EAAAi2B,yBACX,aAAY,EAAA9jB,KAAK+jB,c,EAElB,OAEO,OAFP,IAEO,QADH,EAAA/jB,KAAK+jB,cAAY,I,EA1B3B,wBA8ByD,EAAAL,eAAkBC,EAAAA,0B,WAAvE,QAmBM,MAnBN,GAmBM,EAlBL,OAOE,SANA1uB,MAAM,yCACNpH,KAAK,OACL0K,KAAK,gBACJT,MAAOksB,EAAAA,UACR1rB,IAAI,eACJoX,SAAA,I,OArCP,KAuCK,OASS,UARPza,MAAM,0CACNpH,KAAK,SACA,QAAK,eAAE,EAAAo2B,qBACX,aAAY,EAAAjkB,KAAKkkB,U,EAEnB,OAEO,OAFP,IAEO,QADH,EAAAlkB,KAAKkkB,UAAQ,I,EA9CvB,uBAkDyD,EAAAR,eAAkBC,EAAAA,0B,WAAvE,QA6BM,MA7BN,GA6BM,EA5BL,OAaI,KAZF1uB,MAAM,mFACLmK,KAAM,EAAA+kB,YACN,aAAY,EAAAnkB,KAAKokB,cAClB,cAAY,uBACZC,OAAO,U,EAER,OAEO,OAFP,GAEO,EADN,QAA2F,GAAjFpvB,MAAM,sDAAsD,cAAY,YAEnF,OAEO,OAFP,IAEO,QADH,EAAA+K,KAAKokB,eAAa,I,EA9D5B,KAkEK,OAYI,KAXFnvB,MAAM,+DACLmK,KAAM,EAAAklB,SACN,aAAY,EAAAtkB,KAAKukB,UAClBF,OAAO,U,EAER,OAEO,OAFP,GAEO,EADN,QAAyF,GAA9EpvB,MAAM,mDAAmD,cAAY,YAEjF,OAEO,OAFP,IAEO,QADH,EAAA+K,KAAKukB,WAAS,I,EA5ExB,4B,WCCM/uB,MAAM,6BAA6BG,QAAQ,a,IAAY,OAA8iB,QAAxiBN,EAAE,siBAAoiB,S,IAA5iB,I,2CAA5D,QAAgnB,MAAhnB,GADD,G,CAKA,QAAiB,ECAjB,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCNMG,MAAM,6BAA6BG,QAAQ,a,IAAY,OAAmjC,QAA7iCN,EAAE,2iCAAyiC,S,IAAjjC,I,2CAA5D,QAAqnC,MAArnC,GADD,G,CAKA,QAAiB,ECAjB,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,WJqFA,IACCmU,WAAY,CACXgb,UAAS,GACTC,SAAQ,IAETxc,SAAU,CACTjI,KAAM,WAAa,OAAO3U,KAAK+a,KAAO,EACtC+d,YAAa,WAAa,MAAO,yBAAyB,EAAAO,GAAAA,SAASr5B,KAAK2U,KAAK2kB,oBAAqB54B,OAAOC,6BAA6BC,KAAKsM,SAASlN,KAAK24B,WAAY,EACrKM,SAAU,WACT,OAAO,EAAAI,GAAAA,SACN,6BACAE,oBAAoB,EAAAF,GAAAA,SAASr5B,KAAK2U,KAAK2kB,oBAAqB54B,OAAOC,6BAA6BC,KAAKsM,OACrGqsB,mBAAoB,GAAGv5B,KAAK24B,aAE9B,EACAN,aAAc,WACb,MAA0B,KAAnBr4B,KAAK24B,gBAAuC9O,IAAnB7pB,KAAK24B,SACtC,MACG,QAAY,CACd,mBACA,YACA,gCAEE,QAAY,CACd,yBAGF9b,QAAS,CACR+b,kBAAmB,WAClB,MAAMzvB,EAAMnJ,KAAKk4B,MAAMsB,aAEvBrwB,EAAI8f,SAEJ5iB,SAASozB,YAAa,OACvB,EACAhB,sBAAuB,WACtBz4B,KAAK05B,OAAOjf,SAAU,sBACvB,IK5HF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,SCPA,6B,IAWQ7Q,MAAM,a,IAGNA,MAAM,a,iEAZN,EAAU,a,WADjB,QAcS,UAfV,MAGEA,MAAM,uCACNpH,KAAK,SACJ,aAAY,EAAAmS,KAAKglB,mBAClB1sB,IAAI,YACJ,cAAY,QACX,cAAa,EAAA2sB,aACT,QAAK,oBAAE,EAAA9B,WAAA,EAAAA,aAAA,K,EAEZ,OAEO,OAFP,GAEO,EADN,QAA4F,GAA9EluB,MAAM,mDAAmD,cAAY,YAEpF,OAA4D,OAA5D,IAA4D,QAAjC,EAAA+K,KAAKglB,oBAAkB,I,EAdpD,oB,CAsBA,QACC,IAAAxxB,GACC,MAAO,CACN0xB,WAAYn5B,OAAOC,6BAA6Bm5B,aAElD,EACArd,MAAO,CACN,mDAAoD,SAASsd,GAC5D/5B,KAAK65B,WAAaE,CACnB,GAEDnd,SAAU,CACTjI,KAAM,WAAa,OAAO3U,KAAK+a,KAAO,GAEvC8B,QAAS,CACRib,UAAW,WACV,MAAMG,EAASj4B,KAAKk4B,MAAM8B,UAE1B,IAAI,MAAS/B,EAAQ,CAAC,GAEtBA,EAAOhsB,iBAAkB,eAAe,SACxCgsB,EAAOhsB,iBAAkB,gBAAgB,QAC1C,EACA2tB,WAAY,WACX,MAAMK,EAA+D,KAArDv5B,OAAOC,6BAA6Bm5B,aAAsB,8BAAgC,2CAC1G,OAAOG,CACR,IC3CF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCNSrwB,MAAM,+BAA+BmN,GAAG,cAAc,cAAY,OAAOqhB,KAAK,U,IAC/E,OAAwD,OAAnDxuB,MAAM,wCAAsC,S,IAC5CA,MAAM,sCAAsCwuB,KAAK,Y,IAC7CxuB,MAAM,uC,IACHA,MAAM,sC,GAL1B,e,IAOoB,OAEO,QAFDA,MAAM,aAAW,EACnB,OAAqC,QAA/BA,MAAM,sB,OADhB,I,IAKHA,MAAM,qC,IAZvB,O,IAc2Bob,IAAI,qC,IAGNpb,MAAM,gC,GAjB/B,e,IAiCkCA,MAAM,a,IAjCxC,MA6CqBA,MAAM,qC,GA7C3B,S,kFACI,QAsDM,MAtDN,GAsDM,CArDF,IACA,OAmDM,MAnDN,GAmDM,EAlDF,OAOM,MAPN,GAOM,EANF,OAAiF,KAAjF,IAAiF,QAA/B,EAAA+K,KAAKglB,oBAAkB,IACzE,OAII,KAJD/vB,MAAM,gGAAiG,aAAY,EAAA+K,KAAKC,YAN3I,YAYY,OAyCM,MAzCN,GAyCM,EAxCU,EAAAyjB,cAAgBC,EAAAA,0B,WAA5B,QAyBM,MAtCtB,KAcoB,OAEQ,QAFR,IAEQ,QADD,EAAA3jB,KAAKulB,wBAAsB,IAElC,OAoBM,MApBN,GAoBM,E,SAnBF,OAQE,SAPEnjB,GAAG,oCACHnN,MAAM,oCACNpH,KAAK,OACL0K,KAAK,oBACLD,IAAI,kBAvBhC,qCAwBqC,EAAI,QACb4b,SAAA,I,iBADS,EAAA3b,SAGb,OASS,UARLtD,MAAM,gCACNpH,KAAK,SACA,QAAK,eAAE,EAAA23B,eACX,aAAY,EAAAxlB,KAAKylB,0B,EAElB,OAEO,OAFP,IAEO,QADA,EAAAzlB,KAAKylB,0BAAwB,I,EAlChE,yBAwC0B,EAAW,c,WADrB,QAKqB,GA5CrC,MAyCoB,WAAS,qC,CAzC7B,kBA2CoB,IAAyC,EA3C7D,iBA2CuB,EAAAzlB,KAAK0lB,gCAA8B,MA3C1D,uBA6CqE,EAAAhC,eAAiBC,EAAAA,0B,WAAtE,QAEM,MAFN,IAEM,QADC,EAAA3jB,KAAK2lB,0BAAwB,KA9CpD,gBAgDI,OAIM,aAHL,OAEI,KAFAvmB,KAAM,EAAAwmB,2BAAwB,QAC9B,EAAA5lB,KAAK6lB,wBAAsB,EAlDpC,W,CA6DA,QACC,IAAAryB,GACC,MAAO,CACN+E,KAAM,GACNqtB,yBAA0B75B,OAAOC,6BAA6B85B,wBAC9DC,aAAa,EAEf,EACA9d,SAAU,CACT,IAAAjI,GAAS,OAAO3U,KAAK+a,KAAO,EAC5B,YAAAsd,GACC,MAA0B,KAAnBr4B,KAAK24B,gBAAuC9O,IAAnB7pB,KAAK24B,SACtC,MACG,QAAW,CACb,0BACA,qBACA,oBACA,oBACA,eAGF9b,QAAS,KACL,QAAW,CACb,gCAEE,QAAa,CACf,4BAED,iBAAMsd,GACDn6B,KAAKkN,MACRlN,KAAK06B,aAAc,EACnB16B,KAAK05B,OAAOjuB,OAAO,0BAA2BzL,KAAKkN,YAC7ClN,KAAK26B,8BAEX36B,KAAK06B,aAAc,EACnB16B,KAAKk4B,MAAM0C,gBAAgBC,QAE7B,EACA,+BAAMF,SACC36B,KAAK05B,OAAOjf,SAAS,0BAC5B,IChGF,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,UCNMrQ,MAAM,KAAKC,OAAO,KAAKC,QAAQ,YAAYL,KAAK,OAAOE,MAAM,8B,IACjE,OAA2O,QAArO,YAAU,UAAU,YAAU,UAAUH,EAAE,2KAA2KC,KAAK,W,aAAhO,I,2CADD,QAEM,MAFN,GADD,G,CAOA,QACCM,MAAO,CACNL,IAAKM,SCJP,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UzBiIA,IACCD,MAAO,CACNmO,gBAAiBtM,QACjB4mB,aAAcxoB,OACdmN,MAAOnN,OACPspB,WAAYtpB,OACZ6M,WAAY1R,OACZquB,SAAUruB,OACV2uB,SAAU9pB,OACV/J,OAAQ+J,OACRswB,cAAen1B,QAEhBwC,KAAM,WACL,MAAO,CACN4yB,qBAAsB,KACtBrJ,oBAAoB,EACpBsJ,0BAA0B,EAC1BrI,SAAU,EAEZ,EACA/V,SAAU,CACT,cAAAqe,GACC,OAA6B,IAAtBj7B,KAAKi1B,cAC8B,IAAzCj1B,KAAKmyB,YAAY+I,qBACjBl7B,KAAKi1B,aAAej1B,KAAKmyB,YAAY+I,mBACvC,EACAjG,aAAc,WACb,OAAO5zB,KAAKD,IACXpB,KAAKg0B,SAASiB,aACdj1B,KAAKm7B,gBAAgBC,0BAA2Bp7B,KAAK2X,OAEvD,EACA0jB,WAAY,WACX,OAAO,IAAIpE,GACVj3B,KAAKg0B,SAASsH,uBACdt7B,KAAKi1B,aACLj1B,KAAKm7B,gBAAgBI,+BAAgCv7B,KAAKy1B,iBAAkBz1B,KAAK2X,OAEnF,EACAhD,KAAM,WAAa,OAAO3U,KAAK+a,KAAO,EACtCmO,YAAa,WAAa,OAAOlpB,KAAKi0B,YAAc,EACpDuH,WAAY,WACX,MAAoB,KAAfx7B,KAAK2X,QAIH3X,KAAKy7B,wBAA0Bz7B,KAAK0Y,iBAAmB1Y,KAAK07B,wBACpE,EACA,oBAAAC,GACC,OAAO37B,KAAK2yB,SAAW,CACxB,EACA,aAAAJ,GACC,MAAMqJ,EAAuB,GAE7B,OACC57B,KAAKizB,qBAAuBjzB,KAAK+6B,uBAA0B/6B,KAAK07B,yBAEhE17B,KAAKizB,qBAAuBjzB,KAAK+6B,sBAAwB/6B,KAAK07B,yBAA2B17B,KAAK2yB,UAAYiJ,CAE5G,EACA,iBAAAvK,GACC,OAASrxB,KAAK67B,oBAAsB77B,KAAKy7B,wBAA4Bz7B,KAAK07B,uBAC3E,EACA3I,oBAAqB,WACpB,OAAO/yB,KAAK2U,KAAKuN,WAAYliB,KAAK2X,QAAW,EAC9C,EACAmkB,WAAY,WACX,OAAO,OAAS97B,KAAK+6B,qBAAuB/6B,KAAKizB,mBAAqBjzB,KAAK+6B,oBAC5E,EACA9H,mBAAoB,WACnB,OAAOjzB,KAAK0Y,gBAIP1Y,KAAK67B,mBACF77B,KAAK86B,eAAexJ,OAAS,EAG9BtxB,KAAKq7B,WAAWzD,UAAW53B,KAAK+7B,aAP/B,CAQT,EACA,QAAAnJ,GACC,MAAsB,cAAf5yB,KAAK2X,MAAwB,EAAI3X,KAAKm7B,gBAAgBa,4BAC9D,EACAC,gBAAiB,WAChB,IAAOj8B,KAAK0Y,gBACX,MAAO,CACNsZ,SAAU,EACVK,OAAQ,EACRQ,IAAK,EACLoC,aAAcj1B,KAAKi1B,aACnBiG,oBAAqB,GAIvB,GAAKl7B,KAAK67B,mBAAqB,CAC9B,MAAM,SAAE7J,EAAQ,OAAEK,GAAWryB,KAAK86B,eAAenF,QAAU,CAAE3D,SAAU,EAAGK,OAAQ,GAClF,MAAO,CACNL,WACAK,SACAQ,IAAK7yB,KAAK4yB,SACVqC,aAAcj1B,KAAKi1B,aACnBiG,oBAAqBlJ,EAAWK,E,CAIlC,MAAML,EAAWhyB,KAAKq7B,WAAWhE,yBAA0Br3B,KAAK+7B,aAC1D1J,EAAWryB,KAAKq7B,WAAW3D,uBAAwB13B,KAAK+7B,aAE9D,MAAO,CACN/J,SAAUA,EACVK,OAAQA,EACRQ,IAAK7yB,KAAK4yB,SACVqC,aAAcj1B,KAAKi1B,aACnBiG,oBAAqBlJ,EAAWK,EAElC,EACA,WAAAF,GACC,MAAMwD,EAAShwB,OAAOu2B,OAAO,CAAC,EAAGl8B,KAAKi8B,iBAetC,OAbAtG,EAAOlD,UAAYpxB,KAAKD,IAAKu0B,EAAOV,aAAcU,EAAOuF,qBACzDvF,EAAOjD,cAAgB1yB,KAAK+6B,qBAE5BpF,EAAOrD,gBAAkB,EACpBqD,EAAOuF,oBAAsBvF,EAAOV,eACxCU,EAAOrD,gBAAkBqD,EAAOV,aAAeU,EAAOuF,qBAGvDvF,EAAOnD,aAAe,EACQ,OAAzBmD,EAAOjD,eAA0BiD,EAAOjD,cAAgBiD,EAAOlD,YACnEkD,EAAOnD,aAAemD,EAAOlD,UAAYkD,EAAOjD,eAG1CiD,CACR,EACA,YAAA5D,GACC,OAAO,KAAW/xB,KAAKmyB,aAAeb,GAC9BA,EAAQtxB,KAAKg0B,SAASmI,SAE/B,EACA,WAAAC,GAIC,OAAOhJ,GAAYA,GAAWpzB,KAAK87B,YAAc97B,KAAKg0B,SAASmI,QAChE,EACA,eAAA3K,GACC,MAAMF,EAAQ8B,GAAYpzB,KAAK87B,YAAe97B,KAAK2yB,SAAW3yB,KAAK4yB,SAEnE,OADA5yB,KAAKq8B,kBAAmB/K,GACjBA,CACR,EACA,gBAAAC,GACC,MAAM+K,EAAMlJ,GAAYpzB,KAAK87B,WAAa97B,KAAK2yB,WAAe3yB,KAAKg0B,SAASmI,QAAU,GAChFI,EAAQv8B,KAAK87B,WAAa97B,KAAK2yB,SAC/BrB,EAAQ8B,GAAYmJ,EAAQD,GAAUt8B,KAAK4yB,SAAW5yB,KAAKg0B,SAASmI,QAE1E,OADAn8B,KAAKw8B,kBAAmBlL,GACjBA,CACR,MACG,QAAY,CACd,qBACA,yBACA,0BACA,mBACA,kBACA,iBAGFzU,QAAS,CACR8G,oBAAmB,GACnBR,qBAAoB,GACpB,qBAAA+P,CAAuBmC,GACjB,IAAMA,IAIXr1B,KAAK+6B,qBAAuB1F,EAC7B,EACA,cAAAlC,CAAgBR,GACf3yB,KAAK2yB,SAAWA,CACjB,EACA,iBAAAhB,GACQ3xB,KAAKg7B,2BACXt6B,OAAOif,UAAUld,KAAM,CACtBoX,MAAO,yBACP+F,cAAe,yBACfC,YAAaxZ,SAASsH,QAGvB3N,KAAKg7B,0BAA2B,EAElC,MACG,QAAc,CAChB,oBACA,uBAGF7c,WAAY,CACXqW,eAAc,GACdiI,eAAc,GACdC,wBAAuB,GACvBC,WAAU,GACVC,YAAW,GACXC,WAAU,GACVC,YAAW,GACXhmB,6BAA4B,GAC5BimB,iBAAgB,K0B/UlB,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCJA,MACM,GAAa,CAAEnzB,MAAO,gBAW5B,QAA4B,QAAiB,CAC3Ca,OAAQ,cACRF,MAAO,CACL+T,cAAe,CAAC,EAChBC,aAAc,CAAC,EACfC,aAAc,CAAC,GAEjB,KAAA7T,CAAMC,IAER,SAAYC,IAAQ,CAClB,WAAaA,EAAiB,aAC9B,WAAa8T,EAAS,UCjBxB,MAAMpU,EAAQ,EACRkU,GAAa,QAAI,GAEjBE,GAAM,SAAS,IAAMpU,EAAMiU,aAAejU,EAAM+T,gBD2BtD,OCzBA,QAAO/T,GAAO,EAAGiU,mBAChBC,EAAWhS,MAAQ+R,CAAY,IDwBzB,CAAC3T,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,EAC3D,QAAYD,EAAKwC,OAAQ,aAG7B,IEtCA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCNe,MAAM2vB,GACpB,cAAAC,GACC,MAAO,CACN,wBACA,oBACA,0BACA,yBACA,yBAEF,ECTc,MAAMC,GACpB,cAAAD,GACC,MAAO,CACN,oBACA,kBACA,4BACA,0BAEF,ECRc,MAAME,GACpB,cAAAF,GACC,MAAO,CACN,kBACA,oBAEF,ECNc,MAAMG,GACpB,cAAAH,GACC,MAAO,EACR,ECCc,MAAMI,GACpB,iBAAAC,CAAmBC,GAClB,OAAQA,GACP,IAAK,SACJ,OAAO,IAAIP,GACZ,IAAK,OACJ,OAAO,IAAIE,GACZ,IAAK,OACJ,OAAO,IAAIC,GACZ,QACC,OAAO,IAAIC,GAEd,E,SClBD,Q,IAAA,oS,IAME,I,2CALD,QAYM,OAXJlzB,IAAK,EAAAA,IACNC,MAAM,6BACNG,QAAQ,aAJV,Q,CAiBA,QACCC,MAAO,CACNL,IAAKM,SCdP,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,SCPA,Q,IAAA,8b,IAME,I,2CALD,QAgBM,OAfJN,IAAK,EAAAA,IACNC,MAAM,6BACNG,QAAQ,aAJV,Q,CAqBA,QACCC,MAAO,CACNL,IAAKM,SClBP,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,SCPA,Q,IAAA,iX,IAME,I,2CALD,QAcM,OAbJN,IAAK,EAAAA,IACNC,MAAM,6BACNG,QAAQ,aAJV,Q,CAmBA,QACCC,MAAO,CACNL,IAAKM,SChBP,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,U,SCPA,Q,IAAA,iX,IAME,I,2CALD,QAcM,OAbJN,IAAK,EAAAA,IACNC,MAAM,6BACNG,QAAQ,aAJV,Q,CAmBA,QACCC,MAAO,CACNL,IAAKM,SChBP,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCPe,MAAMgzB,GACpBnmB,WACA,WAAAvX,CAAauX,GACZrX,KAAKqX,WAAaA,CACnB,E,ICDWomB,G,sBCDZ,SAASC,GAAqBrmB,GAC7B,MAAMsmB,EAAatmB,EAAWqQ,WAAarQ,EAAWyQ,WAEtD,OAAO,IAAI,YAAelgB,iBACzB,EACA,CACC,CAAE,EAAG,GACL,CAAEyP,EAAWmQ,YAAa,GAC1B,CAAEnQ,EAAWmQ,YAAamW,EAAa,GACvC,CAAEtmB,EAAWmQ,YAAcnQ,EAAWuQ,YAAavQ,EAAWqQ,WAAa,GAC3E,CAAErQ,EAAWmQ,YAAanQ,EAAWqQ,WAAeiW,EAAa,GACjE,CAAEtmB,EAAWmQ,YAAanQ,EAAWqQ,YACrC,CAAE,EAAGrQ,EAAWqQ,aAGnB,CAEA,SAASkW,IAAqB,OAAEvzB,IAC/B,MAAMwzB,EAAIxzB,GAAa,EAAI,EAAIhJ,KAAKy8B,KAAM,GAAQ,IAE5CC,EAAWF,EAAIx8B,KAAKy8B,KAAM,GAC1BE,EAAeD,EAAW,EAEhC,MAAO,CACN77B,MAAO,CACN+7B,WAAY,IAAI,WAAcC,MAAM,CAAE,GAAI,EAAIF,GAAgB,CAAEA,EAAc,IAC9EG,UAAW,IAAI,WAAcD,MAAM,CAAE,GAAI,EAAIF,GAAgB,EAAG,EAAIA,EAAc,IAClFI,UAAW,IAAI,WAAcC,KAAK,CAAEL,EAAe,EAAGA,EAAe,GAAKH,EAAI,GAAI,GAAI,KACtFS,SAAU,IAAI,WAAcD,KAAK,EAAG,EAAIL,EAAe,EAAGA,EAAe,GAAKH,EAAI,EAAG,GAAI,MAE1Fl7B,OAAQ,CAAE,EAAG,GAEf,CAEA,SAAS47B,GAA+B1a,GACvC,MAAMxZ,EAAShJ,KAAKD,IAAKyiB,EAAWxZ,OAAWwZ,EAAWzZ,MAAQ,EAAK,GACvE,MAAO,CACNlI,MAAO,CACNs8B,YAAa,IAAI,WAAcN,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWzZ,MAAO,IACnE+zB,UAAW,IAAI,WAAcD,MAAM,CAAE,EAAG,GAAK,CAAE,EAAG7zB,IAClD4zB,WAAY,IAAI,WAAcC,MAAM,CAAEra,EAAWzZ,MAAO,GAAK,CAAEyZ,EAAWzZ,MAAOC,IACjF3H,IAAK,IAAI,WAAc27B,KACtB,CAAExa,EAAWzZ,MAAQ,EAAGC,GACxBwZ,EAAWzZ,MAAQ,EACnB,EACA,MAGFzH,OAAQ,CAAE,EAAG,GAEf,CAEA,SAAS87B,GAAgC5a,GACxC,MAAM+B,EAAkE,SAA3C/B,EAAY,4BAAoF,IAA3CA,EAAY,2BAGtFlkB,OAAQyK,EAAOA,MAAOzK,EAAM,iBAAEomB,EAAgB,oBAAEE,EAAmB,mBAAEE,EAAkB,gBAAEE,EAAe,OAAER,GAAWhC,EAEvH6a,EAAYr9B,KAAKC,IAAK3B,EAAQyK,GAAU,EAExC0b,EAAiBzkB,KAAKC,IAAKskB,EAAuBG,EAAmBF,EAAQ6Y,GAC7E1Y,EAAoB3kB,KAAKC,IAAKskB,EAAuBK,EAAsBJ,EAAQ6Y,GACnFxY,EAAmB7kB,KAAKC,IAAKskB,EAAuBO,EAAqBN,EAAQ6Y,GACjFtY,EAAgB/kB,KAAKC,IAAKskB,EAAuBS,EAAkBR,EAAQ6Y,GAEjF,MAAO,CACNx8B,MAAO,CACNy8B,WAAY,IAAI,WAAcN,KAAK,CAACnY,EAAkBA,GAAmBA,EAAkB,IAAK,KAChG0Y,YAAa,IAAI,WAAcP,KAAK,CAACj0B,EAAQ4b,EAAmBA,GAAoBA,EAAmB,IAAK,GAC5G6Y,SAAU,IAAI,WAAcR,KAAK,CAACj0B,EAAQ0b,EAAgBnmB,EAASmmB,GAAiBA,EAAgB,EAAG,IACvGgZ,QAAS,IAAI,WAAcT,KAAK,CAACjY,EAAezmB,EAASymB,GAAgBA,EAAe,GAAI,KAC5F2Y,OAAQ,IAAI,WAAcb,MAAM,CAAChY,EAAkB,GAAI,CAAC9b,EAAQ4b,EAAmB,IACnFgZ,IAAK,IAAI,WAAcd,MAAM,CAAC9zB,EAAQ0b,EAAgBnmB,GAAS,CAACymB,EAAezmB,IAC/Es/B,MAAO,IAAI,WAAcf,MAAM,CAAC9zB,EAAO4b,GAAoB,CAAC5b,EAAOzK,EAASmmB,IAC5EoZ,KAAM,IAAI,WAAchB,MAAM,CAAC,EAAGv+B,EAASymB,GAAgB,CAAC,EAAGF,KAEhEvjB,OAAQ,CAAE,EAAG,GAEf,CAEA,SAASw8B,GAAwB/0B,EAAOyb,GACvC,MAAM5jB,EAAQ,IAAI,YAAem9B,MAChCvZ,EACAzb,EAAmB,EAATyb,EACVA,GAMD,OAHA,WAAc/d,UAAW7F,GACzB,WAAc4F,KAAM5F,GAEbA,CACR,CAEA,SAASo9B,GAAuBhY,GAC/B,MAAMiY,EAAQ,EACRC,EAAiBl+B,KAAKm+B,GAAKF,EAC3BG,EAAWp+B,KAAKq+B,IAAKH,GAGrB1Z,EAASwB,GAAe,EAAIoY,GAClC,OAAO,IAAI,YAAeE,SACzBL,EACAzZ,EACA,KAEF,CAGA,SAAS+Z,GAAuBv1B,EAAQD,GACvC,MAAMy1B,EAAcz1B,EAAQ,EAMtB01B,EAAmBD,EACnBE,EAAmB,CAACD,EAAkBA,GACtCE,EAAa,IAAI,WAAcC,QAAQF,EAAkBD,GAWzDI,GAA0B71B,EAASw1B,GAAgB,EACnDM,EAAwB,CAACJ,EAAkB,GAAKA,EAAkB,GAAMG,GACxEE,EAAkB,IAAI,WAAcH,QAAQE,EAAuBD,GAMnEG,EAAqB,UAAaC,aAAcF,EAAiBJ,GAEvE,IAAMK,EACL,MAAO,CACNn+B,MAAO,CACN89B,WAAYA,IAKf,MAAMO,EAAqBF,EAAmBA,mBAAoB,GAC5DG,EAAqBH,EAAmBA,mBAAoB,GAM5DI,EAAgB,CAACZ,EAAax1B,GAC9Bq2B,EAAkB,IAAI,WAAcxC,MAAMqC,EAAoBE,GAC9DE,EAAkB,IAAI,WAAczC,MAAMsC,EAAoBC,GAM9DG,EAAc,IAAI,WAAcvC,KAAK0B,EAAkBD,EAAkBO,EAAmBQ,YAAa,GAAKR,EAAmBQ,YAAa,IAEpJ,MAAO,CACN3+B,MAAQ,CACPw+B,gBAAiBA,EACjBC,gBAAiBA,EACjBC,YAAaA,GAGhB,CAEA,SAASE,GAAmBz2B,EAAQD,GACnC,MAAM22B,EAAa,EACbC,EAAW,IACXC,EAAU52B,EAAS,EACnB62B,EAAU92B,EAAQ,EAElB+2B,EAAS,IAAI,YAAeC,aAAaL,EAAYC,EAAUE,EAAmB,EAAVD,GACxEI,EAAY,IAAI,YAAeD,aAAaL,EAAYC,EAAUE,EAASD,GAE3Eh/B,EAAQ,CACbsD,OAAQ,CACP47B,OAAQA,EACRE,UAAW,WAAcC,OAAQD,GAAY,OAI/C,OAAOp/B,CACR,CAEA,SAASs/B,GAAsBn3B,EAAOC,EAAQ2hB,GAC7C,IAAIwV,EAAYngC,KAAKD,IAAK,GAAKiJ,EAAS2hB,GAAe,GAOvD,OAJkB,IAAdwV,IACHA,EAAY,GAGN,CACNt/B,MAAO,CACNu/B,SAAU,IAAI,WAAcvD,MAAM,CAAC,EAAG,GAAI,CAAC,EAAGlS,IAC9C0V,UAAW,IAAI,WAAcxD,MAAM,CAAC9zB,EAAO,GAAI,CAACA,EAAO4hB,IACvDmV,OAAQ,IAAI,WAAc9C,KAAK,CAAC,EAAGrS,GAAa,CAAC5hB,EAAM,EAAGo3B,EAAYxV,GAAa,CAAC5hB,EAAO4hB,IAC3FqV,UAAW,IAAI,WAAchD,KAAK,CAAC,EAAG,GAAI,CAACj0B,EAAM,GAAIo3B,GAAY,CAACp3B,EAAO,KAG5E,CAEA,SAASu3B,GAA6Bt3B,EAAQD,GAC7C,MAAMw3B,EAAQ,GAGR38B,EAASoF,EAAShJ,KAAKwgC,IAAK,WAAcC,UAAWF,IAG3D,OAAO,IAAI,YAAeh6B,iBAAgB,EAAM,CAC/C,CAAC,EAAG,GACJ,CAACwC,EAAO,GACR,CAACA,EAAQnF,EAAQoF,GACjB,CAACpF,EAAQoF,IAEX,CAEO,SAAS03B,GAAsBpqB,EAAOkM,GAC5C,MAAMme,EAAyB,cAAVrqB,GAA2BkM,EAAWmD,aAAenD,EAAWiD,WAAkBjD,EAAWmD,aAAenD,EAAWiD,WAAc,EAAI,EACxJmb,EAA4B,cAAVtqB,GAA2BkM,EAAWiD,UAAYjD,EAAWmD,cAAqBnD,EAAWiD,UAAYjD,EAAWmD,cAAiB,EAAI,EAEjK,OAASrP,GACT,QACA,IAAK,YACJ,OAAO,IAAI,YAAeuqB,WACzBre,EAAWlkB,OACXkkB,EAAWzZ,OAEb,IAAK,SACJ,MAAO,CACNlI,MAAO,CACN+L,OAAQ,CACPzL,KAAM,SACNG,OAAQ,CAAE,EAAG,GACbkjB,OAAQhC,EAAWyC,SAAW,KAIlC,IAAK,wBACJ,MAAO,CACNpkB,MAAO,CACN27B,EAAG,IAAI,WAAcK,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWoD,KAAM,IACxDkb,EAAG,IAAI,WAAcjE,MAAM,CAAEra,EAAWoD,KAAM,GAAK,CAAEpD,EAAWoD,KAAMpD,EAAWxZ,SACjF+3B,EAAG,IAAI,WAAclE,MAAM,CAAEra,EAAWoD,KAAMpD,EAAWxZ,QAAU,CAAE,EAAG,MAG3E,IAAK,iCACJ,MAAO,CACNnI,MAAO,CACN27B,EAAG,IAAI,WAAcK,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWoD,KAAM,IACxDkb,EAAG,IAAI,WAAcjE,MAAM,CAAEra,EAAWoD,KAAM,GAAK,CAAE,EAAGpD,EAAWxZ,SACnE+3B,EAAG,IAAI,WAAclE,MAAM,CAAE,EAAGra,EAAWxZ,QAAU,CAAE,EAAG,MAG7D,IAAK,mBACJ,OAAOk0B,GAA+B1a,GACvC,IAAK,oBACJ,OAAO4a,GAAgC5a,GACxC,IAAK,MACJ,OAAOid,GAAmBjd,EAAWxZ,OAAQwZ,EAAWzZ,OACzD,IAAK,UACJ,OAAO,IAAI,YAAei4B,SACzBxe,EAAWzZ,MAAQ,EACnByZ,EAAWxZ,OAAS,GAEtB,IAAK,YACJ,OAAO80B,GAAwBtb,EAAWzZ,MAAOyZ,EAAWgC,QAC7D,IAAK,qBACJ,MAAO,CACN3jB,MAAO,CACN27B,EAAG,IAAI,WAAcK,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWoD,KAAM,IACxDkb,EAAG,IAAI,WAAcjE,MAAM,CAAEra,EAAWoD,KAAM,GAAK,CAAEpD,EAAWoD,KAAO,EAAGpD,EAAWxZ,SACrF+3B,EAAG,IAAI,WAAclE,MAAM,CAAEra,EAAWoD,KAAO,EAAGpD,EAAWxZ,QAAU,CAAE,EAAG,MAG/E,IAAK,QACJ,OAAOqzB,GAAqB7Z,GAC7B,IAAK,cACJ,MAAO,CACN3hB,MAAO,CACN+kB,KAAM,IAAI,WAAciX,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWyC,SAAU,IAC/D5jB,IAAK,IAAI,WAAc27B,KACtB,CAAExa,EAAWyC,SAAW,EAAG,GAC3BzC,EAAWyC,SAAW,EACtB,EACA,OAIJ,IAAK,iBACJ,MAAO,CACNpkB,MAAO,CACN+kB,KAAM,IAAI,WAAciX,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWgC,OAAQ,IAC7Dxb,OAAQ,IAAI,WAAc6zB,MAAM,CAAE,EAAG,GAAK,CAAE,EAAGra,EAAWgC,SAC1DnjB,IAAK,IAAI,WAAc27B,KACtB,CAAE,EAAG,GACLxa,EAAWgC,OACX,EACA,MAIJ,IAAK,UACJ,OAAO,IAAI,YAAe8Z,SACzB,EACA9b,EAAWyD,aAEb,IAAK,UACJ,OAAO,IAAI,YAAeqY,UACvB9b,EAAWye,aAAe,GAAM,EAAI,EAAIze,EAAWye,YACrDze,EAAWzZ,MAAQ,GAErB,IAAK,UACJ,OAAOi1B,GAAuBxb,EAAWyD,aAC1C,IAAK,OACJ,OAAO,IAAI,YAAeib,MACzB1e,EAAWyE,iBACXzE,EAAWuE,aACXvE,EAAWqE,aACX,GAEF,IAAK,mBACJ,MAAO,CACNhmB,MAAO,CACNkI,MAAO,IAAI,WAAc8zB,MAAM,CAAE,EAAG,GAAK,CAAEra,EAAWzZ,MAAO,IAC7Do4B,aAAc,IAAI,WAActE,MAC/B,CAAEra,EAAWzZ,MAAO,GACpB,CAAEyZ,EAAWzZ,MAAOyZ,EAAW+C,eAEhCmX,SAAU,IAAI,WAAcG,MAC3B,CAAEra,EAAWzZ,MAAOyZ,EAAW+C,cAC/B,CAAE,EAAG/C,EAAW6C,cAEjB+b,YAAa,IAAI,WAAcvE,MAC9B,CAAE,EAAGra,EAAW6C,aAChB,CAAE,EAAG,MAIT,IAAK,yBACJ,MAAO,CACNxkB,MAAO,CACN4kB,UAAW,IAAI,WAAcoX,MAAM,CAAE,EAAGra,EAAWxZ,QAAU,CAAEwZ,EAAWiD,UAAWjD,EAAWxZ,SAChG0zB,SAAU,IAAI,WAAcG,MAAM,CAAEra,EAAWiD,UAAWjD,EAAWxZ,QAAU,CAAEwZ,EAAWmD,aAAc,IAC1GA,aAAc,IAAI,WAAckX,MAAM,CAAEra,EAAWmD,aAAc,GAAK,CAAE,EAAG,IAC3E3c,OAAQ,IAAI,WAAc6zB,MAAM,CAAE,EAAG,GAAK,CAAE,EAAGra,EAAWxZ,WAG7D,IAAK,YACJ,MAAO,CACNnI,MAAO,CACN8kB,aAAc,IAAI,WAAckX,MAAM,CAAE+D,EAAe,GAAK,CAAEpe,EAAWmD,aAAeib,EAAe,IACvGS,WAAY,IAAI,WAAcxE,MAC7B,CAAEra,EAAWmD,aAAeib,EAAe,GAC3C,CAAEpe,EAAWiD,UAAYkb,EAAYne,EAAWxZ,SAEjDyc,UAAW,IAAI,WAAcoX,MAC5B,CAAE8D,EAAYne,EAAWxZ,QACzB,CAAEwZ,EAAWiD,UAAYkb,EAAYne,EAAWxZ,SAEjDs4B,UAAW,IAAI,WAAczE,MAC5B,CAAE8D,EAAYne,EAAWxZ,QACzB,CAAE43B,EAAe,MAIrB,IAAK,QACJ,OAAOrE,GAAqB/Z,GAC7B,IAAK,OACJ,MAAO,CACN3hB,MAAO,CACN0gC,QAAS,IAAI,WAAc1E,MAAM,EAAEra,EAAWzZ,MAAM,EAAG,GAAI,CAAC,EAAGyZ,EAAWgI,aAC1EgX,SAAU,IAAI,WAAc3E,MAAM,CAACra,EAAWzZ,MAAM,EAAG,GAAI,CAAC,EAAGyZ,EAAWgI,aAC1EiX,WAAY,IAAI,WAAc5E,MAAM,EAAEra,EAAWzZ,MAAM,EAAG,GAAI,CAAC,GAAIyZ,EAAWkI,gBAC9EgX,YAAa,IAAI,WAAc7E,MAAM,CAACra,EAAWzZ,MAAM,EAAG,GAAI,CAAC,GAAIyZ,EAAWkI,kBAGjF,IAAK,SACJ,OAAOwV,GAAsB1d,EAAWzZ,MAAOyZ,EAAWxZ,OAAQwZ,EAAWoI,aAC9E,IAAK,QACJ,MAAO,CACN/pB,MAAO,CACN8gC,QAAS,IAAI,WAAc9E,MAAM,EAAEra,EAAWiD,UAAU,EAAGjD,EAAWgI,YAAa,CAAChI,EAAWiD,UAAU,EAAGjD,EAAWgI,aACvH+W,QAAS,IAAI,WAAc1E,MAAM,EAAEra,EAAWmD,aAAa,EAAG,GAAI,EAAEnD,EAAWiD,UAAU,EAAGjD,EAAWgI,aACvGgX,SAAU,IAAI,WAAc3E,MAAM,CAACra,EAAWiD,UAAU,EAAGjD,EAAWgI,YAAa,CAAChI,EAAWmD,aAAa,EAAG,IAC/G8b,WAAY,IAAI,WAAc5E,MAAM,EAAEra,EAAWmD,aAAa,EAAG,GAAI,CAAC,GAAInD,EAAWkI,gBACrFgX,YAAa,IAAI,WAAc7E,MAAM,CAACra,EAAWmD,aAAa,EAAG,GAAI,CAAC,GAAInD,EAAWkI,kBAGxF,IAAK,UACJ,OAAO6T,GAAuB/b,EAAWxZ,OAAQwZ,EAAWzZ,OAC7D,IAAK,gBACJ,OAAOu3B,GAA6B9d,EAAWxZ,OAAQwZ,EAAWzZ,OAGpE,EDjZA,SAAYqzB,GACX,uBACA,2BACA,sBACA,EAJD,CAAYA,KAAAA,GAAc,KAMX,MAAMwF,GACHC,WACAC,SACA73B,MACAgM,KACTrS,OACSzC,KAEjB,WAAA1C,CAAaojC,EAAoBC,EAAkB73B,EAAerG,EAAiB,CAAC,EAAG,GAAIzC,EAAOi7B,GAAer0B,QAASkO,EAAO,MAChItX,KAAKkjC,WAAaA,EAClBljC,KAAKmjC,SAAWA,EAChBnjC,KAAKsL,MAAQA,EACbtL,KAAKsX,KAAOA,EACZtX,KAAKiF,OAASA,EACdjF,KAAKwC,KAAOA,CACb,CAEA,QAAA4gC,GACC,MAAMnhC,EAAQ,CAAC,EACTohC,EAAW,CAAC,EAClB,KAAQphC,MAAMqhC,QAAQrhC,EAAO,IAAI,KAAQC,MAAMg8B,MAAKl+B,KAAKkjC,WAAYljC,KAAKmjC,UAAW,QACrF,MAAMt6B,EAAU,KAAQA,QAAQC,aAAa7G,GAE7C,IAAIshC,EAAoBvjC,KAAKkjC,WACzBM,EAAkBxjC,KAAKmjC,SAkB3B,OAfGt6B,GAAYA,EAAQwB,QAAU,IAAMxB,EAAQuB,OAAS,IAAOpK,KAAKkjC,WAAW,GAAK,GAAKljC,KAAKmjC,SAAS,GAAK,IAC3GI,EAAoB,CAACvjC,KAAKkjC,WAAW,GAAK,GAAIljC,KAAKkjC,WAAW,IAC9DM,EAAkB,CAACxjC,KAAKmjC,SAAS,GAAK,GAAInjC,KAAKmjC,SAAS,KAGzD,KAAQlhC,MAAMwhC,WAAWJ,EAAUrjC,KAAKsL,MAAOi4B,EAAmBC,GAClE,KAAQvhC,MAAMgC,SAAShC,EAAOohC,EAAU,OAGtB,YAAdrjC,KAAKwC,OACR6gC,EAASK,MAAQ,SAGlB,KAAQzhC,MAAM0hC,aAAa1hC,EAAOjC,KAAKiF,QAEhChD,CACR,EElDM,SAAS2hC,GAAajkC,GAK5B,OAFAA,EAAS0B,KAAKO,MAAgB,IAATjC,GAAsB,IAEpC0B,KAAKO,MAAgB,IAATjC,GAAiB,GACrC,CAEO,SAASkkC,GAAclkC,EAAgB2X,EAAO,MAGpD,OAFA3X,EAASikC,GAAajkC,GAEfwjB,GAAsBxjB,GAAW,IAAM2X,CAC/C,CAEO,MAAMwsB,GAAkBF,GCXhB,MAAMG,GACpB5hC,EACAC,EACAkkB,SACA0d,KAEA,WAAAlkC,CAAaqC,EAAWC,EAAWkkB,EAAkB0d,EAAO,GAC3DhkC,KAAKmC,EAAIA,EACTnC,KAAKoC,EAAIA,EACTpC,KAAKsmB,SAAWA,EAChBtmB,KAAKgkC,KAAOA,CACb,CAEA,KAAAC,GACC,MAAO,QAAUjkC,KAAKmC,EAAEpC,YAAc,IAAMC,KAAKoC,EAAErC,YAAc,IAAMC,KAAKgkC,IAC7E,CAEA,OAAAE,GACC,MAAM5d,EAAatmB,KAAKsmB,SAAS/lB,QAAU,EAAM,KACjD,OAAO,IAAI,UAAc0/B,QAAQ,CAACjgC,KAAKmC,EAAE5B,QAASP,KAAKoC,EAAE7B,SAAU+lB,EACpE,CAEA,UAAA6d,GACC,MAAO,CACNjiC,MAAO,CACN,CAAElC,KAAKikC,SAAWjkC,KAAKkkC,WAExB1hC,KAAM,YAER,CAEA,cAAA4hC,CAAeC,EAAiB,IAC/B,OAAGA,EAAezkC,SAAS,oBACnB,CACN,IAAIqjC,GACH,CAAEjjC,KAAKmC,EAAElB,QAAS,GAClB,CAAEjB,KAAKmC,EAAElB,QAASjB,KAAKoC,EAAEnB,SACzB4iC,GAAa7jC,KAAKoC,EAAE7B,WAKpB8jC,EAAezkC,SAAS,oBACnB,CACN,IAAIqjC,GACH,CAAE,EAAGjjC,KAAKoC,EAAEnB,SACZ,CAAEjB,KAAKmC,EAAElB,QAASjB,KAAKoC,EAAEnB,SACzB4iC,GAAa7jC,KAAKmC,EAAE5B,WAKhB,EACR,E,ICjDW+jC,G,iCCDG,MAAMC,GACVlgC,YAEV,WAAAvE,CAAauE,GACZrE,KAAKqE,YAAcA,CACpB,CAEA,cAAAmgC,CAAgBv/B,GAGf,OAAKA,EAAO1E,SAAW,EACf,CAAEgF,OAAQ,CAAE,EAAGvF,KAAKqE,cAGrB,UAAcogC,QAASzkC,KAAKqE,YAAaY,EAAO1E,QAAS,GAAG,EACpE,CAEA,OAAA2jC,CAASj/B,GACR,IAAIy/B,EAAc,KAGlB,IAAK,IAAI5hC,EAAI,EAAGA,EAAI,EAAGA,IAGtB,GAFA4hC,EAAc1kC,KAAKwkC,eAAgBv/B,EAAO/D,IAAK,IAAIrB,EAAQ,MAAS0B,SAAUuB,MAEvE,IAAS4hC,EAAYn/B,QAC3B,MAIF,OAAK,IAASm/B,IAAiB,IAASA,EAAYn/B,SAAY,IAASm/B,EAAYn/B,OAAQ,GAAIrD,OACzF,GAGD,IAAKwiC,EAAYn/B,OAAQ,GAAIrD,OAAO,CAAEyiC,EAAO35B,KACnD25B,EAAMz3B,KAAOlC,EAEN25B,IAET,CAEA,UAAAC,CAAY3/B,EAAgBqhB,GAC3B,MAAMue,EAAa7kC,KAAKkkC,QAASj/B,GAEjC,OAAO4/B,EAAW9/B,KAAOC,IACxB,GAAO,KAAKA,EAAO,WAAgB,KAAKA,EAAO,OAI/C,OAAO,IAAI++B,GAAWlkC,EAAOM,QAAS6E,EAAO,UAAY,IAAOnF,EAAOM,QAAS6E,EAAO,UAAY,IAAOshB,EAAU,IACjHhnB,QAAQ8I,IAAa,IAASA,IACnC,CAEA,UAAA08B,CAAY7/B,GACX,MAAM4/B,EAAa7kC,KAAKkkC,QAASj/B,GAEjC,OAAO4/B,EAAWllC,MACnB,CAKA,SAAAolC,CAAWC,EAA2B//B,EAAgBqhB,GACrD,IAAIue,EAAa7kC,KAAKkkC,QAASj/B,GAE/B,GAAK,IAAS4/B,GACb,MAAO,GAGRA,EAAaA,EAAWvhC,UAExB,IAAI2hC,EAAgBJ,EAAWK,QAC/BL,EAAWpiC,KAAMwiC,GACjB,IAAIE,EAAQ,GACRC,EAAY,EAEhB,IAAM,MAAMC,KAAgBR,EAAa,CACxC,MAAQS,EAAOC,GAAUN,EAAe,WAChCO,EAAMC,GAASJ,EAAc,UAE/BK,EAAU,IAAI,KAAmB,KAAM7lC,EAAOM,QAASmlC,GAAQrkC,WAAapB,EAAOM,QAASolC,GAAQtkC,aAAepB,EAAOM,QAASqlC,GAAOvkC,WAAapB,EAAOM,QAASslC,GAAOxkC,WAKpL,GAHAmkC,IACAH,EAAgBI,EAEkB,GAA7BL,EAAYI,EAAU,IAO3B,KAAKJ,EAAYI,EAAU,GAAM,GAIjC,IAAM,IAAIr/B,EAAQ,EAAGA,EAAQi/B,EAAYI,EAAU,GAAKr/B,IAAU,CACjE,MAAM4/B,EAAYX,EAAYI,EAAU,GAClCQ,EAAaF,EAAQG,iBACrBC,EAAYJ,EAAQK,iBAAoBH,GAAaD,EAAU,GAAM5/B,GAC3Eo/B,EAAM1iC,KAAM,IAAIshC,GAAW,IAAIlkC,EAAQimC,EAAU3jC,GAAK,IAAItC,EAAQimC,EAAU1jC,GAAKkkB,EAAU8e,G,MAf5F,CACC,MAAMQ,EAAaF,EAAQG,iBACrBC,EAAYJ,EAAQK,iBAAoBH,EAAa,GAC3DT,EAAM1iC,KAAM,IAAIshC,GAAW,IAAIlkC,EAAQimC,EAAU3jC,GAAK,IAAItC,EAAQimC,EAAU1jC,GAAKkkB,EAAU8e,G,EAgB7F,OADAD,EAAQnlC,KAAKgmC,YAAab,GACnBA,CACR,CAEA,WAAAa,CAAaC,GACZ,MAAMC,EAAQ,GACRC,EAAe,GACrB,IAAM,MAAMC,KAAaH,EAClBC,EAAMtmC,SAAYyB,KAAKO,MAA6B,IAAtBwkC,EAAUjkC,EAAElB,SAAkB,IAAK,IAAKI,KAAKO,MAA6B,IAAtBwkC,EAAUhkC,EAAEnB,SAAkB,OACrHklC,EAAa1jC,KAAM2jC,GACnBF,EAAMzjC,KAAQpB,KAAKO,MAA6B,IAAtBwkC,EAAUjkC,EAAElB,SAAkB,IAAK,IAAKI,KAAKO,MAA6B,IAAtBwkC,EAAUhkC,EAAEnB,SAAkB,MAG9G,OAAOklC,CACR,CAEA,cAAAE,CAAgBrB,EAAsBsB,EAAyBC,EAAyBC,GACvF,IAAI1jC,EAAI,EACR,MAAMT,EAAS,IAAKrC,KAAKqE,YAAYnC,OAAO,CAAEyiC,EAAO35B,KACpD,GAAyB,IAApBg6B,EAAYliC,IAA4B,SAAf6hC,EAAMniC,KACnC,OAAO,EAGR,MAAMikC,EAAWzmC,KAAK0mC,oBAAqB/B,EAAO7hC,EAAGyjC,EAAiBD,EAAiBE,GAMvF,OAJAC,EAAU,QAAWz7B,EAErBlI,IAEO2jC,CAAQ,IACZnnC,QAAU6U,IAAkC,IAATA,IAEjCwyB,EAAS,gBAAqB,CACnCzkC,MAAO,IAAKG,KAGb,OAAK,IAASskC,EAAOzkC,QAAkD,IAAvCyD,OAAOD,KAAMihC,EAAOzkC,OAAQvC,OACpD,CAAC,EAGFgnC,CACR,CAEA,mBAAAD,CAAqBpkC,EAAiByD,EAAewgC,EAAyBD,EAAyBE,GACtG,MAAMG,EAAS,gBAAqBrkC,GAsCpC,OAnCe,IAAVyD,IACJ4gC,EAAOhkC,OAAQ,GAAM6jC,EAAcjmC,QACnComC,EAAOhkC,OAAQ,GAAM2jC,EAAgB/lC,QAErComC,EAAOpkC,IAAK,GAAMokC,EAAOpkC,IAAK,GAAMikC,EAAcjmC,QAClDomC,EAAOpkC,IAAK,GAAM+jC,EAAgB/lC,SAIpB,IAAVwF,IACJ4gC,EAAOhkC,OAAQ,GAAMgkC,EAAOhkC,OAAQ,GAAM4jC,EAAgBhmC,QAC1DomC,EAAOhkC,OAAQ,GAAM6jC,EAAcjmC,QAEnComC,EAAOpkC,IAAK,GAAMokC,EAAOpkC,IAAK,GAAMgkC,EAAgBhmC,QACpDomC,EAAOpkC,IAAK,GAAMokC,EAAOpkC,IAAK,GAAMikC,EAAcjmC,SAIpC,IAAVwF,IACJ4gC,EAAOhkC,OAAQ,GAAMgkC,EAAOhkC,OAAQ,GAAM6jC,EAAcjmC,QACxDomC,EAAOhkC,OAAQ,GAAMgkC,EAAOhkC,OAAQ,GAAM2jC,EAAgB/lC,QAE1DomC,EAAOpkC,IAAK,GAAMikC,EAAcjmC,QAChComC,EAAOpkC,IAAK,GAAMokC,EAAOpkC,IAAK,GAAM+jC,EAAgB/lC,SAItC,IAAVwF,IACJ4gC,EAAOhkC,OAAQ,GAAM4jC,EAAgBhmC,QACrComC,EAAOhkC,OAAQ,GAAMgkC,EAAOhkC,OAAQ,GAAM6jC,EAAcjmC,QAExDomC,EAAOpkC,IAAK,GAAMgkC,EAAgBhmC,QAClComC,EAAOpkC,IAAK,GAAMikC,EAAcjmC,SAG1BomC,CACR,CAEA,QAAAC,CAAU5B,EAAsBsB,EAAyBC,EAAyBjgB,EAAkBkgB,GACnG,IAAIrB,EAAQ,GAEZ,MAAM0B,EAAW7mC,KAAKqmC,eAAgBrB,EAAYsB,EAAiBC,EAAiBC,GAEpF,GAAK,IAASK,GACb,OAAO1B,EAGR,IAAM,MAAQn6B,EAAK87B,KAAUnhC,OAAOohC,QAASF,EAAS3kC,OAAU,CAC/D,MAAM8kC,EAAehC,EAAYh6B,GAC3BpG,EAAS,SAAaqiC,SAAUH,EAAeE,GAErDpiC,EAAOkB,SAAS,SAAWohC,GAC1B/B,EAAM1iC,KAAM,IAAIshC,GAAWlkC,EAAOM,QAAS+mC,EAAa,IAAOrnC,EAAOM,QAAS+mC,EAAa,IAAO5gB,GACpG,G,CAKD,OAFA6e,EAAQnlC,KAAKgmC,YAAab,GAEnBA,CACR,ECrNc,MAAMgC,WAAkB5C,GAEtC,OAAAL,CAASj/B,GACR,MAAMmiC,EAAgBC,MAAMnD,QAASj/B,GAErC,OAAOmiC,EAAcriC,KAAK4/B,IACA,qBAApBA,EAAO,UACXA,EAAO,UAAaA,EAAO,QAGrBA,IAET,ECVc,MAAM,WAAyBJ,GAE7C,cAAAC,CAAgBv/B,GACf,MAAMqiC,EAAW,YAAgBx+B,aAAc9I,KAAKqE,aAC9CkjC,EAAoBxF,GACzB,YACA,CAAEpiC,OAAQ2nC,EAASl9B,MAAOA,MAAOk9B,EAASj9B,SAG3C,OAAKpF,EAAO1E,SAAW,EACf,CAAEgF,OAAQ,CAAE,EAAGgiC,IAGhB,UAAc9C,QAAS8C,EAAmBtiC,EAAO1E,QAAS,GAAG,EACrE,ECbc,MAAMinC,GACpB,0BAAAC,CAA4B9vB,EAAOtT,GAClC,OAAQsT,GACP,IAAK,YACL,IAAK,qBACL,IAAK,wBACL,IAAK,iCACL,IAAK,mBACL,IAAK,yBACJ,OAAO,IAAI4sB,GAAOlgC,GACnB,IAAK,YACJ,OAAO,IAAI8iC,GAAW9iC,GACvB,IAAK,oBACJ,OAAO,IAAI,GAAkBA,GAC9B,QACC,OAAO,IAAIm5B,GAA2Bn5B,GAEzC,GJdD,SAAYigC,GACX,gCACA,uBACA,6BACA,2BACA,8BACA,yBACA,mCACA,EARD,CAAYA,KAAAA,GAAS,KKNrB,MACM,GAAa,CACjBt5B,IAAK,EACLpB,MAAO,QAEH,GAAa,CAAEA,MAAO,UAW5B,QAA4B,QAAiB,CAC3Ca,OAAQ,sBACR,KAAAE,CAAMC,GCZR,MAAMW,GAAQ,UAERoM,GAAQ,SAAS,IAAMpM,EAAMkJ,QAAQkD,QACrC1V,GAAQ,SAAS,IAAMsJ,EAAMkJ,QAAQxS,QACrCylC,GAA6B,SAAS,IAAMn8B,EAAMkJ,QAAQizB,6BAC1DC,GAAqB,SAAS,IAAMp8B,EAAMkJ,QAAQkzB,qBAClDC,GAAkB,SAAU,IAAMr8B,EAAMkJ,QAAQmzB,kBAChDC,GAAoB,SAAU,IAAMt8B,EAAMkJ,QAAQozB,oBAClDvxB,GAAkB,SAAU,IAAM/K,EAAMkJ,QAAQ6B,kBAEtD,SAASwuB,IACR,MAAMgD,GAA0B,IAAKN,IAAkCC,2BAA4B9vB,EAAMlL,MAAOxK,EAAMwK,OAEtH,MAAO,YAAaq7B,EACZA,EAAwB5D,QAAS0D,EAAgBn7B,OAAQ9M,OAG1D,CACR,CAEA,MAAMqR,GAAQ,SAAS,KACtB,MAAMA,EAAQ,GACRsuB,EAAQwF,IAERla,EAAoB,IAAV0U,EAAc,CAAE,MAAO,QAAS,SAAU,QAAW,CAAE,QAAS,SAAU,QAE1F,IAAK,IAAIx8B,EAAI,EAAGA,EAAIw8B,EAAOx8B,IAC1BkO,EAAMvO,KAAM,CAAEqkC,KAAMlc,EAAS9nB,GAAKqiC,MAAO9jC,KAAKO,MAAO+lC,EAAmBl7B,MAAO3J,IAAO,KAGvF,OAAOkO,CAAK,IAKb,SAAS+2B,EAAaluB,GACrBtO,EAAME,OAAO,uBAAwBoO,EAAMmf,OAC5C,CAsBA,SAASgP,EAAqBv7B,EAAO1G,GACpC,MAAMoC,EAAO,IAAIw/B,EAAmBl7B,OACpCtE,EAAKpC,GAAS6c,GAAgBnW,GAE9BlB,EAAME,OAAQ,kBAAmBtD,EAClC,CDgBA,OC/CA9B,SAAS4F,iBAAiB,UAAW87B,IAMrC,SAAU9+B,UAGT,GAA2D,UAAtDy+B,EAA2Bj7B,MAAMw5B,YAAYzjC,MAA8E,WAA1DklC,EAA2Bj7B,MAAMw5B,YAAYgC,SAClH,OAGD,MAAMC,EAAe,IAAItiC,MAAOk/B,KAEhCoD,EAAaj+B,KAAM,GAEnBsB,EAAME,OAAO,kBAAmBy8B,EAAc,KAG/C,SAAgB,KACf38B,EAAME,OAAQ,kBAAmB,IAEjCpF,SAAS6F,oBAAoB,UAAW67B,EAAa,IDwB/C,CAACl9B,EAAUC,KAChB,MAAMq9B,GAA2B,QAAkB,iBAEnD,OAAQN,EAAuB,QAC1B,WAAc,QAAoB,MAAO,GAAY,GACnD,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY72B,EAAMvE,OAAO,CAAC27B,EAAUriC,MAClF,WAAc,QAAoB,MAAO,CAC/CiF,IAAKjF,EACL6D,OAAO,QAAgB,CAAE,CAACw+B,EAAStB,OAAO,KACzC,EACD,QAAarhB,GAAgB,CAC3BC,SAAU,sBAAsB3f,IAChCgR,GAAI,sBAAsBhR,IAC1BmH,KAAM,sBAAsBnH,IAC5Boe,UAAW,UACX3hB,KAAM,OACN4T,KAAM,EACN9U,IAAK,EACLqkB,WAAYyiB,EAASjD,MACrB,sBAAwB/3B,GAAiB46B,EAAqB56B,EAAQrH,GACtEme,SAAS,GACR,KAAM,EAAG,CAAC,WAAY,KAAM,OAAQ,aAAc,yBACpD,MACD,OACJ,IAAAtY,GAAoB,MAAO,GAAY,CACpCi8B,EAAkBp7B,OAAS6J,EAAgB7J,SAAU,QAAO63B,IAAW2B,aACnE,WAAc,QAAakC,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,UAG/B,SAAW,IAAO,QAAoB,KAAW,CAAElC,IAAK,IAAK,QAAYgG,EAAMvE,OAAO,CAAC27B,EAAUriC,MACxF,WAAc,QAAa0f,GAAgB,CACjDza,IAAKjF,EACL2f,SAAU,sBAAsB3f,IAChCgR,GAAI,sBAAsBhR,IAC1BmH,KAAM,sBAAsBnH,IAC5Boe,UAAW,UACX/N,KAAM,EACN9U,IAAK,EACLgK,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBrE,QAAQj+B,EAAO,IAC3D4f,WAAYyiB,EAASjD,MACrB,sBAAwB/3B,GAAiB46B,EAAqB56B,EAAQrH,GACtEme,SAAS,GACR,KAAM,EAAG,CAAC,WAAY,KAAM,OAAQ,QAAS,aAAc,2BAC5D,KAAK,CAEf,IEnIA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCNA,MACM,GAAa,CAAEta,MAAO,sCACtB,GAAa,CAAEA,MAAO,SACtB,GAAa,CAAEA,MAAO,+BACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,mBAEH,GAAa,CAAEA,MAAO,qBAkB5B,QAA4B,QAAiB,CAC3Ca,OAAQ,qBACR,KAAAE,CAAMC,GCfR,MAAMW,GAAQ,UAER+8B,GAAmB,SAAS,IAAM/8B,EAAMkJ,QAAQ6zB,mBAChDC,GAAgC,SAAS,IAAMh9B,EAAMkJ,QAAQ8zB,gCAC7DC,GAA2B,SAAS,IAAMj9B,EAAMkJ,QAAQ+zB,2BACxDd,GAA6B,SAAS,IAAMn8B,EAAMkJ,QAAQizB,6BAC1De,GAAoB,SAAS,IAAMl9B,EAAMkJ,QAAQg0B,oBACjDC,GAAuB,SAAS,IAAMn9B,EAAMkJ,QAAQi0B,uBACpDC,GAAe,SAAS,IAAMp9B,EAAMkJ,QAAQk0B,eAC5CC,GAAc,SAAS,IAAMr9B,EAAMkJ,QAAQm0B,cAE3ChB,GAAkB,QAAS,CAChCriB,IAAK,IAAM5B,GAAqBpY,EAAMkJ,QAAQmzB,gBAAgBrnC,SAC9D8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAQ,wBAAyB5L,EAAOM,QAASyiB,GAAiBnW,IAAUxL,SAClFsK,EAAME,OAAQ,yCAAyC,G,IAIpDo9B,GAAoB,QAAS,CAClCtjB,IAAK,IAAM5B,GAAqBpY,EAAMkJ,QAAQo0B,kBAAkBtoC,SAChE8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAQ,0BAA2B5L,EAAOM,QAASyiB,GAAiBnW,IAAUxL,SACpFsK,EAAME,OAAQ,yCAAyC,G,IAO1D,SAASs8B,EAAaluB,GACrBtO,EAAME,OAAO,uBAAwBoO,EAAMmf,OAC5C,CAEA,SAAS8P,IACR,MAAMC,GAAgB,IAAI1L,IAAgCC,kBAAmB,QAGvE0L,EAAcD,EAAc9L,iBAAiB39B,QAAQuvB,IAAWyZ,EAAiB77B,MAAMoiB,KAG7F,OAAOma,EAAYjkC,KAAK8pB,IAChB,CACN7jB,IAAK6jB,EACLrD,QAAS+c,EAA8B97B,MAAMoiB,MAGhD,CAcA,SAASoa,EAAyBzmC,GACjC+I,EAAME,OAAQ,0BAA2BjJ,EAC1C,CDmBA,OCtDA6D,SAAS4F,iBAAiB,UAAW87B,IAqBrC,SAAU9+B,UAGJy+B,EAA2Bj7B,MAAMw5B,U,KAKvC,SAAgB,KACf5/B,SAAS6F,oBAAoB,UAAW67B,EAAa,IDwB/C,CAACl9B,EAAUC,MACR,WAAc,QAAoB,MAAO,KAAM,EACrD,IAAAc,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,IAAK,IAAY,QAAiBf,EAAKkQ,MAAMmuB,0BAA2B,IAC5F,IAAAt9B,GAAoB,MAAO,GAAY,CACpC88B,EAAqBj8B,MAAM,aACvB,WAAc,QAAoB,SAAU,CAC3CzB,IAAK,EACLxI,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiB67B,EAAwB,UAAU,GACvFr/B,OAAO,QAAgB,CAC/B,sCAAsC,EACtC,4CAA4C,EAC5C,8DAA8D,EAC9D,6CAA0E,YAA5B6+B,EAAkBh8B,SAEvD,EACD,QAAa08B,GAAyB,CAAEj/B,IAAK,MAC7C,QAAiB,KAAM,QAAiBW,EAAKkQ,MAAMquB,mBAAmBC,SAAU,IAC/E,KACH,QAAoB,IAAI,GAC3BX,EAAqBj8B,MAAM,YACvB,WAAc,QAAoB,SAAU,CAC3CzB,IAAK,EACLxI,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiB67B,EAAwB,SAAS,GACtFr/B,OAAO,QAAgB,CAC/B,sCAAsC,EACtC,4CAA4C,EAC5C,6DAA6D,EAC7D,6CAA0E,WAA5B6+B,EAAkBh8B,SAEvD,EACD,QAAa68B,GAAyB,CAAEp/B,IAAK,MAC7C,QAAiB,KAAM,QAAiBW,EAAKkQ,MAAMquB,mBAAmBG,QAAS,IAC9E,KACH,QAAoB,IAAI,GAC3Bb,EAAqBj8B,MAAM,gBACvB,WAAc,QAAoB,SAAU,CAC3CzB,IAAK,EACLxI,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiB67B,EAAwB,aAAa,GAC1Fr/B,OAAO,QAAgB,CAC/B,sCAAsC,EACtC,4CAA4C,EAC5C,iEAAiE,EACjE,6CAA0E,eAA5B6+B,EAAkBh8B,SAEvD,EACD,QAAa+8B,GAA4B,CAAEt/B,IAAK,MAChD,QAAiB,KAAM,QAAiBW,EAAKkQ,MAAMquB,mBAAmBK,YAAa,IAClF,KACH,QAAoB,IAAI,GAC3Bf,EAAqBj8B,MAAM,gBACvB,WAAc,QAAoB,SAAU,CAC3CzB,IAAK,EACLxI,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiB67B,EAAwB,aAAa,GAC1Fr/B,OAAO,QAAgB,CAC/B,sCAAsC,EACtC,4CAA4C,EAC5C,iEAAiE,EACjE,6CAA0E,eAA5B6+B,EAAkBh8B,SAEvD,EACD,QAAai9B,GAA4B,CAAEx/B,IAAK,MAChD,QAAiB,KAAM,QAAiBW,EAAKkQ,MAAMquB,mBAAmBO,YAAa,IAClF,KACH,QAAoB,IAAI,OAGH,OAA5BlB,EAAkBh8B,QACd,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAAb,GAAoB,MAAO,GAAY,EACrC,QAAa6Z,GAAgB,CAC3BC,SAAU,kBACV3O,GAAI,kBACJ7J,KAAM,kBACNiX,UAAW,UACX7M,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuBuB,mBACzC1lB,SAAUokB,EAAiB77B,MAAM,mBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBuB,mBAAoBhC,EAAgBn7B,MAAO,qBACtHkZ,WAAYiiB,EAAgBn7B,MAC5B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAkBX,MAAQW,IAC5F,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqY,GAAgB,CAC3BC,SAAU,oBACV3O,GAAI,oBACJ7J,KAAM,oBACNiX,UAAW,UACX7M,KAAM,KACNhW,IAAKknC,EAAyB/7B,MAC9BnB,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBwB,sBAC5C3lB,SAAUokB,EAAiB77B,MAAM,qBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBwB,oBAAqBhB,EAAkBp8B,MAAO,uBACzHkZ,WAAYkjB,EAAkBp8B,MAC9B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAoBX,MAAQW,IAC9F,KAAM,EAAG,CAAC,MAAO,QAAS,UAAW,SAAU,eACjDs7B,EAAqBj8B,MAAM,WAAyC,WAA5Bg8B,EAAkBh8B,OAAsBk8B,EAAal8B,QACzF,WAAc,QAAaq9B,GAAqB,CAAE9+B,IAAK,MACxD,QAAoB,IAAI,MAE9B,QAAagkB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACC,SAAtBw/B,EAAYn8B,QACR,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMgvB,kBAAmB,MAElEn+B,EAAG,MAEL,QAAoB,IAAI,KAC3B,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYk9B,KAA+Bja,KACzF,WAAc,QAAanD,GAAmB,CACpD1gB,IAAK6jB,EAAM7jB,IAAM,sBACjB,WAAY6jB,EAAM7jB,KACjB,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBylB,EAAMrD,SAAU,MAEpD5f,EAAG,GACF,KAAM,CAAC,gBACR,SAENA,EAAG,QAGP,QAAoB,IAAI,KAGhC,IEpOA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CAAEhC,MAAO,mBACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,iBAEH,GAAa,CAAEoB,IAAK,GACpB,GAAa,CAAEpB,MAAO,gBAiB5B,QAA4B,QAAiB,CAC3Ca,OAAQ,kBACR,KAAAE,CAAMC,GCdR,MAAMse,EAAcxoB,OAAOC,6BAErBqpC,GAAkC,QAAI,CAC3C7nC,EAAG,EACHC,EAAG,EACHkkB,SAAU,IAGL2jB,GAAgC,QAAI,GACpCC,GAAkB,SAAI,GACtBC,GAAuB,SAAI,GAC3BC,GAAwB,SAAI,GAC5BC,GAAe,SAAI,GAEnB9+B,GAAQ,UAER++B,GAAmB,SAAS,IAAM/+B,EAAMkJ,QAAQ61B,mBAChDC,GAA2B,SAAS,IAAMD,EAAiB79B,MAAMnN,QAAQ,CAAEmN,EAAwB1G,IAAmBA,IAAUkkC,EAAYx9B,UAC5Io8B,GAAoB,SAAS,IAAMt9B,EAAMkJ,QAAQo0B,kBAAkBtoC,UACnE+nC,GAAmB,SAAS,IAAM/8B,EAAMkJ,QAAQ6zB,mBAChDC,GAAgC,SAAS,IAAMh9B,EAAMkJ,QAAQ8zB,gCAC7DiC,GAAgC,SAAS,IAAMj/B,EAAMkJ,QAAQ+1B,gCAC7DC,GAAqB,SAAS,IAAMR,EAAYx9B,MAAQ,IAExDtK,GAAI,QAAS,CAClBojB,IAAK,IAAMykB,EAAWv9B,MAAMtK,EAAI,IAAItC,EAAQmqC,EAAWv9B,MAAMtK,GAAG5B,QAASypC,EAAWv9B,MAAMtK,EAC1FkT,IAAM5I,IACDqW,GAAkBrW,KACrBu9B,EAAWv9B,MAAMtK,EAAItC,EAAOM,QAAQ6iB,GAAcJ,GAAgBnW,GAAQ,IAAIxL,Q,IAI3EmB,GAAI,QAAS,CAClBmjB,IAAK,IAAMykB,EAAWv9B,MAAMrK,EAAI,IAAIvC,EAAQmqC,EAAWv9B,MAAM,MAAOlM,QAAUypC,EAAWv9B,MAAMrK,EAC/FiT,IAAM5I,IACDqW,GAAkBrW,KACrBu9B,EAAWv9B,MAAMrK,EAAIvC,EAAOM,QAAQ6iB,GAAcJ,GAAgBnW,GAAQ,IAAIxL,Q,IAI3EqlB,GAAW,QAAS,CACzBf,IAAK,IAAMykB,EAAWv9B,MAAM6Z,SAAW,IAAIzmB,EAAQmqC,EAAWv9B,MAAM,aAAclM,QAAUypC,EAAWv9B,MAAM6Z,SAC7GjR,IAAM5I,IACDqW,GAAkBrW,KACrBu9B,EAAWv9B,MAAM6Z,SAAWzmB,EAAOM,QAAQ6iB,GAAcJ,GAAgBnW,GAAQ,IAAIxL,Q,IAIlFypC,GAAY,SAAS,IAAMn/B,EAAMkJ,QAAQi2B,YAAWj+B,MAE1D,SAAS0P,IACR9V,SAAS4F,iBAAiB,WAAa4N,GACtCtO,EAAME,OAAO,uBAAwBoO,KAGtC,MAAM,kBAAE8wB,GAAsBzhB,EAE9B,IAAI0hB,EAAaD,EAAkBE,oBAMnC,GAJIt/B,EAAMkJ,QAAQizB,2BAA2BzB,YAAYjS,WACxD4W,EAAar/B,EAAMkJ,QAAQizB,2BAA2BzB,YAAYjS,WAG7D,IAAQ4W,GAQb,OALAV,EAAgBz9B,OAAQ,EACxBw9B,EAAYx9B,MAAQ,UAEpBq+B,IAKDC,IAEAf,EAAWv9B,MAAQ69B,EAAiB79B,MAAMw9B,EAAYx9B,MACvD,CAEA,SAASu+B,EAAcv+B,GACtB,OAAO,IAAI5M,EAAO4M,GAAOjM,YAC1B,CAEA,SAASyqC,EAAWllC,GACnBwF,EAAME,OAAO,mBAAoB1F,GACjCkkC,EAAYx9B,MAAQ,KAEpBq+B,GACD,CAEA,SAASC,IACR,MAAM/hC,EAAS0hC,GAAU,EAAM,MAE/Bn/B,EAAME,OAAO,gBAAiB,CAC7BtJ,EAAG6G,EAAO7G,EACVC,EAAG4G,EAAO5G,EACVkkB,SAAUzmB,EAAOM,QAAS0oC,EAAkBp8B,OAAQxL,SAEtD,CAEA,SAASiqC,EAAUC,GAClBjB,EAAgBz9B,OAAQ,EACxB29B,EAAsB39B,OAAQ,EAC9Bw9B,EAAYx9B,MAAQ0+B,CACrB,CAEA,SAASC,IACRN,IAEAZ,EAAgBz9B,OAAQ,EACxBw9B,EAAYx9B,MAAQ,IACrB,CAEA,SAAS4+B,IACRnB,EAAgBz9B,OAAQ,EACxB29B,EAAsB39B,OAAQ,EAC9Bw9B,EAAYx9B,MAAQ69B,EAAiB79B,MAAM9M,OAE3CorC,GACD,CAEA,SAASD,IACRX,EAAqB19B,MAAQ69B,EAAiB79B,MAAM9M,OAAS,CAC9D,CAEA,SAAS2rC,EAAgBvlC,GAGxB,GAAIA,EAAQ,GAAe,OAAVA,EAChB,OAAOukC,EAAiB79B,MAAM9M,OAAS,EAIxC,MAAMwlC,EAAQ,IAAImF,EAAiB79B,OAGnC,OAFA04B,EAAMoG,OAAOxlC,EAAO,GAEbo/B,EAAMxlC,OAAS,CACvB,CDkDA,OChDA,QAAMsqC,GAAahhC,MAAMlD,IACxBikC,EAAWv9B,MAAkB,OAAV1G,EAAiBukC,EAAiB79B,MAAM1G,GAAS,CAAC,EACrEskC,EAAa59B,MAAQ6+B,EAAgBvlC,GAErCwF,EAAME,OAAO,+BAAgC1F,EAAM,KAGpD,QAAMikC,GAAY/gC,MAAOoR,EAA2BC,KACnD,IAAK,MAAMtP,KAAOqP,EACX,IAAYC,EAAStP,KAC1BO,EAAME,OAAO,yCAAyC,GAGvD6+B,EAAiB79B,MAAOw9B,EAAYx9B,OAASzB,GACnB,kBAAlBqP,EAASrP,GACbiY,GAAgB5I,EAAUrP,IAC1BqP,EAASrP,E,KAIf,SAAgB,KACf3E,SAAS6F,oBAAoB,WAAW,IACvCX,EAAME,OAAO,0BAGdF,EAAME,OAAO,oBACbF,EAAME,OAAO,eAAe,IAG7B0Q,IDmBO,CAACtR,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,CAC1Du/B,EAAkB,QACd,WAAc,QAAoB,KAAM,GAAY,GAClD,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYE,EAAyB99B,OAAO,CAAC++B,EAAMzlC,MACjG,WAAc,QAAoB,KAAM,CAC9C6D,MAAO,sBACPoB,IAAK,QAAQjF,KACZ,EACD,QAAasc,GAAc,CACzB/B,KAAM,CAAEva,QAAO4H,MAAO9C,EAAKkQ,MAAMstB,uBAAuBoD,UAAW50B,SAAUqzB,EAAgBz9B,MAAOf,QAASw/B,EAAU1qB,QAAQ,GAC/HD,OAAQ,CAAExa,QAAO4H,MAAO9C,EAAKkQ,MAAMstB,uBAAuBqD,YAAa70B,UAAWszB,EAAqB19B,MAAOf,QAASu/B,EAAYzqB,QAAQ,IAC1I,CACDpX,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMstB,uBAAuBsD,eAAiB,KAAM,QAAiB5lC,EAAQ,GAAK,IAAK,IAC9H,IAAA6F,GAAoB,SAAU,KAAM,SAAU,QAAiBo/B,EAAeQ,EAAKrpC,IAAO,WAAY,QAAiB6oC,EAAeQ,EAAKppC,IAAO,OAAQ,QAAiByI,EAAKkQ,MAAMstB,uBAAuBuD,2BAA6B,OAAQ,QAAiBZ,EAAeQ,EAAKllB,WAAa,MAEtS1a,EAAG,GACF,KAAM,CAAC,OAAQ,gBAElB,UAEN,QAAoB,IAAI,GAC3Bs+B,EAAqB,QACjB,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAAt+B,GAAoB,MAAO,GAAY,EACrC,QAAa6Z,GAAgB,CAC3BC,SAAU,mBACV3O,GAAI,mBACJ7J,KAAM,mBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuBwD,wBACzC3nB,SAAUokB,EAAiB77B,MAAM,mBAAoBg+B,EAAmBh+B,OACxEkZ,WAAYxjB,EAAEsK,MACd,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAIX,MAAQW,IAC9E,KAAM,EAAG,CAAC,QAAS,UAAW,gBACjC,QAAaqY,GAAgB,CAC3BC,SAAU,mBACV3O,GAAI,mBACJ7J,KAAM,mBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuByD,0BACzC5nB,SAAUokB,EAAiB77B,MAAM,mBAAoBg+B,EAAmBh+B,OACxEkZ,WAAYvjB,EAAEqK,MACd,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAIX,MAAQW,IAC9E,KAAM,EAAG,CAAC,QAAS,UAAW,gBACjC,QAAaqY,GAAgB,CAC3BC,SAAU,oBACV3O,GAAI,oBACJ7J,KAAM,oBACNoK,KAAM,KACNhM,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBwB,wBAAwBW,EAA8B/9B,SAClGyX,SAAUokB,EAAiB77B,MAAM,oBAAqBg+B,EAAmBh+B,OACzEkZ,WAAYW,EAAS7Z,MACrB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAWX,MAAQW,IACrF,KAAM,EAAG,CAAC,QAAS,UAAW,gBACjC,QAAa0X,GAAY,CAAE,eAAgB,UAAY,CACrD1b,SAAS,SAAS,IAAM,EACtB,IAAAwC,GAAoB,SAAU,CAC5BpJ,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiBg+B,GAAU,GAC/DxhC,MAAO,sCACN,QAAiBwgC,EAAsB39B,MAAQ5B,EAAKkQ,MAAMstB,uBAAuBoD,UAAY5gC,EAAKkQ,MAAMstB,uBAAuB0D,UAAW,MAE/IngC,EAAG,OAGP,QAAaojB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACpBk/B,EAAiB77B,MAAM,qBAAqBg+B,EAAmBh+B,UAU7D,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,qBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBm/B,EAA8B97B,MAAM,qBAAqBg+B,EAAmBh+B,UAAW,MAE3Hb,EAAG,KAGP08B,EAAiB77B,MAAM,mBAAoBg+B,EAAmBh+B,QAU5D,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,oBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBm/B,EAA8B97B,MAAM,mBAAoBg+B,EAAmBh+B,QAAS,MAExHb,EAAG,KAGP08B,EAAiB77B,MAAM,mBAAoBg+B,EAAmBh+B,QAU5D,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,oBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBm/B,EAA8B97B,MAAM,mBAAoBg+B,EAAmBh+B,QAAS,MAExHb,EAAG,QAIXA,EAAG,QAGP,QAAoB,IAAI,GAC1Bs+B,EAAgBz9B,OAcd,QAAoB,IAAI,KAbvB,WAAc,QAAaqY,GAAY,CACtC9Z,IAAK,EACL,eAAgB,UACf,CACD5B,SAAS,SAAS,IAAM,EACtB,IAAAwC,GAAoB,SAAU,CAC5BpJ,KAAM,SACNkJ,QAASZ,EAAO,KAAOA,EAAO,GAAMsC,IAAiBi+B,GAAY,GACjEzhC,MAAO,sCACN,QAAiBiB,EAAKkQ,MAAMstB,uBAAuB2D,eAAgB,MAExEpgC,EAAG,KAGN08B,EAAiB77B,MAAM,mBAAmBg+B,EAAmBh+B,UAO5D,QAAoB,IAAI,KANvB,WAAc,QAAaif,GAAmB,CAAE1gB,IAAK,GAAK,CACzD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBm/B,EAA8B97B,MAAM,mBAAmBg+B,EAAmBh+B,UAAW,MAEzHb,EAAG,KAGN08B,EAAiB77B,MAAM,oBAAoBg+B,EAAmBh+B,UAO7D,QAAoB,IAAI,KANvB,WAAc,QAAaif,GAAmB,CAAE1gB,IAAK,GAAK,CACzD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBm/B,EAA8B97B,MAAM,oBAAoBg+B,EAAmBh+B,UAAW,MAE1Hb,EAAG,OAKb,IEhVA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CAAEhC,MAAO,mBACtB,GAAa,CAAEA,MAAO,qBAa5B,QAA4B,QAAiB,CAC3Ca,OAAQ,0BACR,KAAAE,CAAMC,GCTR,MAAMW,GAAQ,UAER0gC,GAAqB,SAAS,IAAM1gC,EAAMkJ,QAAQw3B,qBAClD3D,GAAmB,SAAS,IAAM/8B,EAAMkJ,QAAQ6zB,mBAChDC,GAAgC,SAAS,IAAMh9B,EAAMkJ,QAAQ8zB,gCAC7DC,GAA2B,SAAS,IAAMj9B,EAAMkJ,QAAQ+zB,2BACxDd,GAA6B,SAAS,IAAMn8B,EAAMkJ,QAAQizB,6BAE1DkB,GAAc,SAAS,IAAMr9B,EAAMkJ,QAAQm0B,cAC3CsD,GAAwB,QAAS,CACtC3mB,IAAK,IAAMha,EAAMkJ,QAAQy3B,sBACzB72B,IAAM5I,IACEqW,GAAmBrW,IAAqB,KAAVA,IACpClB,EAAME,OAAO,8BAA+BsY,GAASnB,GAAgBnW,KACrElB,EAAME,OAAO,yCAAyC,G,IAKnDo9B,GAAoB,QAAS,CAClCtjB,IAAK,IAAMha,EAAMkJ,QAAQo0B,kBAAkBtoC,QAC3C8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,0BAA2B5L,EAAOM,QAAS6iB,GAAeJ,GAAgBnW,GAAQ,IAAMxL,SACrGsK,EAAME,OAAO,yCAAyC,G,IAKnD0gC,GAA0B,QAAS,CACxC5mB,IAAK,IAAMha,EAAMkJ,QAAQ03B,wBAAwBvqC,MAAO,GAAIrB,QAC5D8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,gCAAiC5L,EAAOM,QAAS6iB,GAAeJ,GAAgBnW,GAAQ,IAAMxL,SAC3GsK,EAAME,OAAO,yCAAyC,G,IAKnD2gC,GAAyB,QAAS,CACvC7mB,IAAK,IAAMha,EAAMkJ,QAAQ23B,uBAAuBxqC,MAAO,GAAIrB,QAC3D8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,+BAAgC5L,EAAOM,QAAS6iB,GAAeJ,GAAgBnW,GAAQ,IAAMxL,SAC1GsK,EAAME,OAAO,yCAAyC,G,IAKnD4gC,GAAyB,QAAS,CACvC9mB,IAAK,IAAMha,EAAMkJ,QAAQ43B,uBAAuBzqC,MAAO,GAAIrB,QAC3D8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,+BAAgC5L,EAAOM,QAAS6iB,GAAeJ,GAAgBnW,GAAQ,IAAMxL,SAC1GsK,EAAME,OAAO,yCAAyC,G,IAInDi/B,GAAY,SAAS,IAAMn/B,EAAMkJ,QAAQi2B,YAAWj+B,MAG1D,SAASs7B,EAAaluB,GACrBtO,EAAME,OAAO,uBAAwBoO,EAAMmf,OAC5C,CAEA,SAAS8P,IACR,MAAMC,GAAgB,IAAI1L,IAAgCC,kBAAmB,UAGvE0L,EAAcD,EAAc9L,iBAAiB39B,QAAQuvB,IAAWyZ,EAAiB77B,MAAMoiB,KAG7F,OAAOma,EAAYjkC,KAAK8pB,IAChB,CACN7jB,IAAK6jB,EACLrD,QAAS+c,EAA8B97B,MAAMoiB,MAGhD,CDwCA,OC3DAxoB,SAAS4F,iBAAiB,UAAW87B,IAqBrC,SAAc9+B,UAGb,GAA2D,WAAtDy+B,EAA2Bj7B,MAAMw5B,YAAYzjC,KACjD,OAGD,MAAM8pC,EAAiBzsC,EAAOM,QAAS8rC,EAAmBx/B,MAAMrC,OAAQ9I,IAAKzB,EAAOM,QAAS8rC,EAAmBx/B,MAAMpC,SAAWlJ,SAAU,IAAItB,EAAQ,KACjJmJ,EAAS0hC,GAAU,EAAM,YAEzBn/B,EAAMkP,SAAU,6BAA8B,CACnDjY,KAAM,SACN8jB,SAAUzmB,EAAOM,QAAS0oC,EAAkBp8B,OAAQ7K,MAAO,GAAIX,QAC/DsrC,OAAQL,EAAsBz/B,MAC9B+/B,SAAU,CACThpC,KAAMwF,EAAO7G,EACbsqC,OAAQzjC,EAAO5G,GAEhBkqC,eAAgBA,EAAe7qC,OAAQ,GAAIG,MAAO,GAAIX,SACpD,KAGJ,SAAgB,KACfoF,SAAS6F,oBAAoB,UAAW67B,EAAa,IDe/C,CAACl9B,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,EAC3D,IAAAc,GAAoB,MAAO,GAAY,EACrC,QAAa6Z,GAAgB,CAC3BC,SAAU,wBACV3O,GAAI,wBACJ7J,KAAM,wBACNiX,UAAW,UACX7iB,IAAK,EACLgK,MAAOT,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOq7B,OAChDroB,SAAUokB,EAAiB77B,MAAM,yBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOq7B,OAAQL,EAAsBz/B,MAAO,qBACvHkZ,WAAYumB,EAAsBz/B,MAClC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAwBX,MAAQW,GACnGgJ,KAAM,GACL,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqP,GAAgB,CAC3BC,SAAU,oBACV3O,GAAI,oBACJ7J,KAAM,oBACNoK,KAAM,KACNhW,IAAKknC,EAAyB/7B,MAC9BnB,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBwB,sBAC5C3lB,SAAUokB,EAAiB77B,MAAM,qBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBwB,oBAAqBhB,EAAkBp8B,MAAO,qBACzHkZ,WAAYkjB,EAAkBp8B,MAC9B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAoBX,MAAQW,IAC9F,KAAM,EAAG,CAAC,MAAO,QAAS,UAAW,SAAU,gBAClD,QAAaqY,GAAgB,CAC3BC,SAAU,0BACV3O,GAAI,0BACJ7J,KAAM,0BACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOw7B,qBAChDxoB,SAAUokB,EAAiB77B,MAAM,2BACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOw7B,qBAAsBP,EAAwB1/B,MAAO,qBACvIkZ,WAAYwmB,EAAwB1/B,MACpC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAA0BX,MAAQW,IACpG,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqY,GAAgB,CAC3BC,SAAU,yBACV3O,GAAI,yBACJ7J,KAAM,yBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOy7B,SAChDzoB,SAAUokB,EAAiB77B,MAAM,0BACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBn3B,OAAOy7B,SAAUP,EAAuB3/B,MAAO,qBAC1HkZ,WAAYymB,EAAuB3/B,MACnC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAyBX,MAAQW,GACpGxD,MAAO,cACN,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAa6b,GAAgB,CAC3BC,SAAU,yBACV3O,GAAI,yBACJ7J,KAAM,yBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMstB,uBAAuBn3B,OAAO07B,SAChD1oB,SAAUokB,EAAiB77B,MAAM,0BACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBn3B,OAAO07B,SAAUP,EAAuB5/B,MAAO,qBAC1HkZ,WAAY0mB,EAAuB5/B,MACnC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAyBX,MAAQW,GACpGxD,MAAO,cACN,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,kBAE7C,QAAaolB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACC,SAAtBw/B,EAAYn8B,QACR,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMgvB,kBAAmB,MAElEn+B,EAAG,MAEL,QAAoB,IAAI,KAC3B,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYk9B,KAA+Bja,KACzF,WAAc,QAAanD,GAAmB,CACpD1gB,IAAK6jB,EAAM7jB,IAAM,sBACjB,WAAY6jB,EAAM7jB,KACjB,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBylB,EAAMrD,SAAU,MAEpD5f,EAAG,GACF,KAAM,CAAC,gBACR,SAENA,EAAG,MAIT,IExNA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CAAEhC,MAAO,mBACtB,GAAa,CAAEA,MAAO,qBAa5B,QAA4B,QAAiB,CAC3Ca,OAAQ,wBACR,KAAAE,CAAMC,GCTR,MAAMW,GAAQ,UAERq9B,GAAc,SAAS,IAAMr9B,EAAMkJ,QAAQm0B,cAC3CN,GAAmB,SAAS,IAAM/8B,EAAMkJ,QAAQ6zB,mBAChDC,GAAgC,SAAS,IAAMh9B,EAAMkJ,QAAQ8zB,gCAC7DC,GAA2B,SAAS,IAAMj9B,EAAMkJ,QAAQ+zB,2BACxDd,GAA6B,SAAS,IAAMn8B,EAAMkJ,QAAQizB,6BAG1DmB,IAF8B,SAAS,IAAMt9B,EAAMkJ,QAAQo4B,+BAEvC,QAAS,CAClCtnB,IAAK,IAAMha,EAAMkJ,QAAQo0B,kBAAkBtoC,QAC3C8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,0BAA2B5L,EAAOM,QAAS6iB,GAAevW,EAAO,IAAMxL,SACpFsK,EAAME,OAAO,yCAAyC,G,KAInDqhC,GAA4B,QAAS,CAC1CvnB,IAAK,IAAMha,EAAMkJ,QAAQq4B,0BACzBz3B,IAAM5I,IACEqW,GAAmBrW,IAAqB,KAAVA,IACpClB,EAAME,OAAO,kCAAmCgB,GAChDlB,EAAME,OAAO,yCAAyC,G,IAInDshC,GAA0B,QAAS,CACxCxnB,IAAK,IAAMha,EAAMkJ,QAAQs4B,wBACzB13B,IAAM5I,IACEqW,GAAmBrW,IAAqB,KAAVA,IACpClB,EAAME,OAAO,gCAAiCgB,GAC9ClB,EAAME,OAAO,yCAAyC,G,IAInDm8B,GAAkB,QAAS,CAChCriB,IAAK,IAAMha,EAAMkJ,QAAQmzB,gBAAgBrnC,QACzC8U,IAAM5I,IACEqW,GAAmBrW,KACzBlB,EAAME,OAAO,wBAAyB5L,EAAOM,QAAS6iB,GAAevW,EAAO,IAAMxL,SAClFsK,EAAME,OAAO,yCAAyC,G,IAOzD,SAASs8B,EAAaluB,GACrBtO,EAAME,OAAO,uBAAwBoO,EAAMmf,OAC5C,CAEA,SAAS8P,IACR,MAAMC,GAAgB,IAAI1L,IAAgCC,kBAAmB,QAGvE0L,EAAcD,EAAc9L,iBAAiB39B,QAAQuvB,IAAWyZ,EAAiB77B,MAAMoiB,KAG7F,OAAOma,EAAYjkC,KAAK8pB,IAChB,CACN7jB,IAAK6jB,EACLrD,QAAS+c,EAA8B97B,MAAMoiB,MAGhD,CD0BA,OC7CAxoB,SAAS4F,iBAAiB,UAAW87B,IAqBrC,SAAU9+B,UAGJy+B,EAA2Bj7B,MAAMw5B,U,KAKvC,SAAgB,KACf5/B,SAAS6F,oBAAoB,UAAW67B,EAAa,IDe/C,CAACl9B,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,EAC3D,IAAAc,GAAoB,MAAO,GAAY,EACrC,QAAa6Z,GAAgB,CAC3BC,SAAU,4BACV3O,GAAI,4BACJ7J,KAAM,4BACNiX,UAAW,UACX7iB,IAAK,EACLF,IAAK,IACLkK,MAAOT,EAAKkQ,MAAMstB,uBAAuBj3B,KAAK47B,0BAC9C9oB,SAAUokB,EAAiB77B,MAAM,6BACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBj3B,KAAK47B,0BAA2BF,EAA0BrgC,MAAO,mBAC5IkZ,WAAYmnB,EAA0BrgC,MACtC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAA4BX,MAAQW,GACvGgJ,KAAM,GACL,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqP,GAAgB,CAC3BC,SAAU,0BACV3O,GAAI,0BACJ7J,KAAM,0BACNiX,UAAW,UACX7iB,IAAK,EACLF,IAAK,IACLkK,MAAOT,EAAKkQ,MAAMstB,uBAAuBj3B,KAAK67B,wBAC9C/oB,SAAUokB,EAAiB77B,MAAM,2BACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBj3B,KAAK67B,wBAAyBF,EAAwBtgC,MAAO,mBACxIkZ,WAAYonB,EAAwBtgC,MACpC,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAA0BX,MAAQW,GACrGgJ,KAAM,GACL,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqP,GAAgB,CAC3BC,SAAU,oBACV3O,GAAI,oBACJ7J,KAAM,oBACNoK,KAAM,KACNhW,IAAKknC,EAAyB/7B,MAC9BnB,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBwB,sBAC5C3lB,SAAUokB,EAAiB77B,MAAM,qBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBwB,oBAAqBhB,EAAkBp8B,MAAO,mBACzHkZ,WAAYkjB,EAAkBp8B,MAC9B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAoBX,MAAQW,IAC9F,KAAM,EAAG,CAAC,MAAO,QAAS,UAAW,SAAU,gBAClD,QAAaqY,GAAgB,CAC3BC,SAAU,kBACV3O,GAAI,kBACJ7J,KAAM,kBACNoK,KAAM,KACNhW,IAAKknC,EAAyB/7B,MAC9BnB,MAAO,GAAGT,EAAKkQ,MAAMstB,uBAAuBuB,qBAC5C1lB,SAAUokB,EAAiB77B,MAAM,mBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B1X,EAAKkQ,MAAMstB,uBAAuBuB,mBAAoBhC,EAAgBn7B,MAAO,mBACtHkZ,WAAYiiB,EAAgBn7B,MAC5B,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAkBX,MAAQW,IAC5F,KAAM,EAAG,CAAC,MAAO,QAAS,UAAW,SAAU,kBAEpD,QAAa4hB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACC,SAAtBw/B,EAAYn8B,QACR,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMgvB,kBAAmB,MAElEn+B,EAAG,MAEL,QAAoB,IAAI,KAC3B,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYk9B,KAA+Bja,KACzF,WAAc,QAAanD,GAAmB,CACpD1gB,IAAK6jB,EAAM7jB,IAAM,sBACjB,WAAY6jB,EAAM7jB,KACjB,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBylB,EAAMrD,SAAU,MAEpD5f,EAAG,GACF,KAAM,CAAC,gBACR,SAENA,EAAG,MAIT,IErLA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MAAM,GAAa,CAAEhC,MAAO,sCAW5B,QAA4B,QAAiB,CAC3Ca,OAAQ,kBACR,KAAAE,CAAMC,GCPR,MAAMmQ,EAAQra,OAAOC,6BAA6BgU,KAE5CpJ,GAAQ,UACRs9B,GAAoB,SAAS,IAAMt9B,EAAMkJ,QAAQo0B,kBAAkBtoC,UACnE+nC,GAAmB,SAAS,IAAM/8B,EAAMkJ,QAAQ6zB,mBAChD4E,GAA6B,SAAS,IAAM3hC,EAAMkJ,QAAQ8zB,gCAC1DC,GAA2B,SAAS,IAAMj9B,EAAMkJ,QAAQ+zB,2BACxDgC,GAAgC,SAAS,IAAMj/B,EAAMkJ,QAAQ+1B,gCAEnE,SAAS2C,EAAU1gC,GACXqW,GAAmBrW,KACzBlB,EAAME,OAAQ,0BAA2B5L,EAAOM,QAAS6iB,GAAevW,EAAO,IAAMxL,SACrFsK,EAAME,OAAQ,yCAAyC,GAEzD,CDsBA,OCpBApF,SAAS4F,iBAAiB,WAAY4N,GACrCtO,EAAME,OAAO,uBAAwBoO,MAGtC,SAAgB,KACfxT,SAAS6F,oBAAoB,WAAW,IACvCX,EAAME,OAAO,yBACb,IDaK,CAACZ,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,EAC3D,QAAa2a,GAAgB,CAC3B7b,MAAO,mBACP8b,SAAU,oBACV3O,GAAI,iCACJ7J,KAAM,oBACNoK,KAAM,KACNhW,IAAKknC,EAAyB/7B,MAC9BnB,MAAO,IAAG,QAAOyP,GAAOstB,uBAAuBwB,wBAAwBW,EAA8B/9B,SACrGyX,SAAUokB,EAAiB77B,MAAM,qBACjC2X,OAAQ,KAAM,QAAO7B,GAAP,CAA4B,oBAAqBsmB,EAAkBp8B,MAAO,sBACxFkZ,WAAYkjB,EAAkBp8B,MAC9B,sBAAuB,CACrB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAoBX,MAAQW,GACxEtC,EAAO,KAAOA,EAAO,GAAMsC,GAAiB+/B,EAAS//B,MAEtD,KAAM,EAAG,CAAC,MAAO,QAAS,UAAW,SAAU,eAChDk7B,EAAiB77B,MAAM,sBAUrB,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,qBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8jC,EAA2BzgC,MAAM,sBAAuB,MAE5Fb,EAAG,OAKb,IEzEA,MAAM,GAAc,GAEpB,UCaA,IAA4B,QAAiB,CAC3CnB,OAAQ,aACR,KAAAE,CAAMC,GCJR,MAAMW,GAAQ,UAERwP,EAAQra,OAAOC,6BAA6BgU,KAE5Ci0B,GAAc,SAAS,IAAMr9B,EAAMkJ,QAAQm0B,cAC3CjxB,GAAQ,SAAS,IAAMpM,EAAMkJ,QAAQkD,QACrCN,GAAa,SAAS,IAAM9L,EAAMkJ,QAAQ4C,aAC1C+1B,GAAoB,SAAS,IAAM7hC,EAAMkJ,QAAQ24B,oBACjDC,GAAiC,SAAS,IAAM9hC,EAAMkJ,QAAQ44B,iCAC9DC,GAA2B,SAAS,IAAM/hC,EAAMkJ,QAAQ64B,2BACxDC,GAAuB,SAAS,IAAM,CAAE,OAAQ,SAAU,SAAU3tC,SAAUgpC,EAAYn8B,SAC1F0S,GAAkB,SAAS,KAChC,MAAMpZ,EAAQunC,EAAyB7gC,MAAM2S,WAAajL,IAEpC,IAAhBA,EAAKhH,SAEX,OAAkB,IAAXpH,EAAe,EAAIA,CAAK,IAE1BynC,GAA0B,SAAS,KACZ,IAA5BJ,EAAkB3gC,OACf8gC,EAAqB9gC,QACoB,IAAzC4gC,EAA+B5gC,QAE7BghC,GAAuB,SAAS,IACf,SAAtB7E,EAAYn8B,OACa,WAAtBm8B,EAAYn8B,OACU,SAAtBm8B,EAAYn8B,OACU,UAAtBm8B,EAAYn8B,QAGhB,SAASihC,EAAmBnjB,GAC3Bhf,EAAME,OAAO,oBAAqB8e,EACnC,CDUA,MAAO,CAAC1f,EAAUC,MACR,WAAc,QAAoB,KAAW,KAAM,EACzD,QAAa6iC,GAAa,CACxB,gBAAiBL,EAAyB7gC,MAAM9M,OAChD,kBAAmB,EACnB,gBAAiBwf,EAAgB1S,OAChC,CACDrD,SAAS,SAAS,IAAM,GACrB,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYkkC,EAAyB7gC,OAAO,CAAC0H,EAAMpO,MACjG,WAAc,QAAama,GAAiB,CAClD,WAAY,IAAMwtB,EAAkBv5B,EAAKiM,WACzCvM,KAAMM,EAAKN,KACXjG,KAAMuG,EAAKvG,KACX7H,MAAOA,EACP,YAAaoO,EAAKiM,YAAcwoB,EAAYn8B,OAC3C,KAAM,EAAG,CAAC,WAAY,OAAQ,OAAQ,QAAS,iBAChD,SAENb,EAAG,GACF,EAAG,CAAC,gBAAiB,mBACxB,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACC,UAAtBw/B,EAAYn8B,QACR,WAAc,QAAamhC,GAAoB,CAC9C5iC,IAAK,EACL2M,MAAOA,EAAMlL,MACb4K,WAAYA,EAAW5K,OACtB,KAAM,EAAG,CAAC,QAAS,iBACtB,QAAoB,IAAI,MAE9Bb,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACC,WAAtBw/B,EAAYn8B,QACR,WAAc,QAAa,GAAiB,CAC3CzB,IAAK,EACL2M,MAAOA,EAAMlL,MACb4K,WAAYA,EAAW5K,OACtB,KAAM,EAAG,CAAC,QAAS,iBACtB,QAAoB,IAAI,MAE9Bb,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACC,WAAtBw/B,EAAYn8B,QACR,WAAc,QAAaohC,GAAyB,CAAE7iC,IAAK,MAC5D,QAAoB,IAAI,MAE9BY,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACC,SAAtBw/B,EAAYn8B,QACR,WAAc,QAAaqhC,GAAuB,CAAE9iC,IAAK,MAC1D,QAAoB,IAAI,MAE9BY,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACC,WAAtBw/B,EAAYn8B,QACR,WAAc,QAAashC,GAAiB,CAAE/iC,IAAK,MACpD,QAAoB,IAAI,MAE9BY,EAAG,KAEL,QAAaojB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACrBqkC,EAA0B,QACtB,WAAc,QAAa/hB,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,SAAiB,QAAO2R,GAAOgvB,kBAAmB,MAErEn+B,EAAG,MAEL,QAAoB,IAAI,GAC3B4hC,EAA6B,QACzB,WAAc,QAAa9hB,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,SAAiB,QAAO2R,GAAOizB,qBAAsB,MAExEpiC,EAAG,MAEL,QAAoB,IAAI,MAE9BA,EAAG,KAEJ,IAEL,IEvKA,MAAM,GAAc,GAEpB,UCSA,IAA4B,QAAiB,CAC3CnB,OAAQ,iBACR,KAAAE,CAAMC,GCLR,MAAMW,GAAQ,UAER0iC,GAAgB,SAAS,IAAM1iC,EAAMkJ,QAAQw5B,gBAC7CC,GAA6B,SAAS,IAAM3iC,EAAMkJ,QAAQy5B,6BAC1DC,GAA6B,SAAS,IAAM5iC,EAAMkJ,QAAQ05B,6BAC1DC,GAAqB,SAAS,IAAM7iC,EAAMkJ,QAAQ25B,qBAClD1G,GAA6B,SAAS,IAAMn8B,EAAMkJ,QAAQizB,6BAC1D2G,GAAmB,SAAU,IAAM9iC,EAAMkJ,QAAQ45B,mBACjDC,GAAqB,SAAU,IAAM/iC,EAAMkJ,QAAQ65B,qBACnDC,GAAc,SAAU,IAAMhjC,EAAMkJ,QAAQ85B,cAC5CC,GAAiB,SAAU,IAAMjjC,EAAMkJ,QAAQ+5B,iBAE/Ct1B,GAAW,SAAU,KACnB,CACNqM,IAAK,IAAMipB,EAAe/hC,MAC1B4I,IAAM5I,IACiB,IAAjBA,EAAM9M,SAEX4L,EAAME,OAAO,uBAAwBmX,GAAiBnW,IACtDlB,EAAME,OAAO,sCAAsC,GAAM,MAKtD0b,GAAa,SAAU,KACrB,CACN5B,IAAK,IAAM5B,GAAqB,IAAI9jB,EAAQwuC,EAAiB5hC,OAAQlM,SACrE8U,IAAM5I,IACLlB,EAAME,OAAO,yBAA0B5L,EAAOM,QAASyiB,GAAgBnW,IAASxL,SAChFsK,EAAME,OAAO,sCAAsC,EAAO,MAKvDgjC,GAAe,SAAU,KACvB,CACNlpB,IAAK,IAAM5B,GAAqB,IAAI9jB,EAAQyuC,EAAmB7hC,OAAQlM,SACvE8U,IAAM5I,IACLlB,EAAME,OAAO,2BAA4B5L,EAAOM,QAASyiB,GAAgBnW,IAASxL,SAClFsK,EAAME,OAAO,sCAAsC,EAAO,MDgC7D,OC3BA,QAAM8iC,GAAatlC,MAAOqtB,EAAUoY,KAC9BpY,IAAaoY,GACjBnjC,EAAME,OAAO,uBAAwBijC,E,IAInChH,EAA2Bj7B,MAAM6V,QACpC/W,EAAME,OAAO,sCAAsC,GAGpDpF,SAAS4F,iBAAiB,WAAY4N,GACrCtO,EAAME,OAAO,uBAAwBoO,MAGtC,SAAgB,KACfxT,SAAS6F,oBAAoB,WAAW,IACvCX,EAAME,OAAO,yBACb,IDUK,CAACZ,EAAUC,MACR,WAAc,QAAoB,MAAO,KAAM,EACrD,QAAa0a,GAAyB,KAAM,CAC1CmpB,QAAQ,SAAS,IAAM,EACrB,SAAiB,QAAiB9jC,EAAKkQ,MAAMuH,OAAOkqB,SAAS7+B,OAAQ,MAEvEvE,SAAS,SAAS,IAAM,EACtB,QAAaqc,GAAgB,CAC3BC,SAAU,mBACV3O,GAAI,mBACJ7J,KAAM,mBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMuH,OAAOkqB,SAASplB,YAClClD,SAAU+pB,EAAcxhC,MAAM,sBAAwBwhC,EAAcxhC,MAAM,gBAC1E2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,oBAAqB4E,EAAW1a,MAAO,GAAG8hC,EAAY9hC,kBAC/FkZ,WAAYwB,EAAW1a,MACvB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAaX,MAAQW,IACvF,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,gBAC3C,QAAaqY,GAAgB,CAC3BC,SAAU,qBACV3O,GAAI,qBACJ7J,KAAM,qBACNoK,KAAM,KACNhM,MAAOT,EAAKkQ,MAAMuH,OAAOkqB,SAASvK,cAClC/d,SAAU+pB,EAAcxhC,MAAM,wBAA0BwhC,EAAcxhC,MAAM,gBAC5E2X,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,sBAAuBksB,EAAahiC,MAAO,GAAG8hC,EAAY9hC,kBACnGkZ,WAAY8oB,EAAahiC,MACzB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAeX,MAAQW,IACzF,KAAM,EAAG,CAAC,QAAS,UAAW,SAAU,eAC1C+gC,EAAgC,QAC5B,WAAc,QAAa1oB,GAAgB,CAC1Cza,IAAK,EACL0a,SAAU,iBACV3O,GAAI,iBACJ7J,KAAM,iBACN1K,KAAM,SACN8U,KAAM,IACNhM,MAAOT,EAAKkQ,MAAMuH,OAAOkqB,SAAStzB,SAClCkL,OAAQ,KAAM,QAAO7B,GAAP,CAA2B,kBAAmBrJ,EAASzM,MAAO,GAAG8hC,EAAY9hC,kBAC3FkZ,WAAYzM,EAASzM,MACrB,sBAAuB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAWX,MAAQW,GACtFgJ,KAAM,EACN8N,SAAS,GACR,KAAM,EAAG,CAAC,QAAS,SAAU,iBAChC,QAAoB,IAAI,MAE9BtY,EAAG,KAEL,QAAaojB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACpB6kC,EAAcxhC,MAAM,iBAUlB,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,gBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8kC,EAA2BzhC,MAAM,iBAAkB,MAEvFb,EAAG,KAGPqiC,EAAcxhC,MAAM,qBAUlB,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,oBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8kC,EAA2BzhC,MAAM,qBAAsB,MAE3Fb,EAAG,KAGPqiC,EAAcxhC,MAAM,uBAUlB,QAAoB,IAAI,KATvB,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,sBACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiB8kC,EAA2BzhC,MAAM,uBAAwB,MAE7Fb,EAAG,MAGT,QAAa8f,GAAmB,CAAElpB,KAAM,UAAY,CAClD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAM6zB,cAAe,MAE9DhjC,EAAG,IAEJwiC,EAAwB,QACpB,WAAc,QAAa1iB,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAM8zB,0BAA2B,MAE1EjjC,EAAG,MAEL,QAAoB,IAAI,MAE9BA,EAAG,MAIT,IExLA,MAAM,GAAc,GAEpB,ICLYkjC,GDKZ,OCLA,SAAYA,GACR,iBACA,mBACA,iBACA,cACH,EALD,CAAYA,KAAAA,GAAW,KCWvB,QAA4B,QAAiB,CAC3CrkC,OAAQ,aACR,KAAAE,CAAMC,GCLR,MAAMW,GAAQ,UACRwjC,GAAa,SAAS,IAAMxjC,EAAMkJ,QAAQs6B,aAC1CC,GAAwB,SAAS,IAAMzjC,EAAMkJ,QAAQu6B,wBACrD7vB,GAAkB,SAAS,KAChC,MAAMpZ,EAAQipC,EAAsBviC,MAAM2S,WAAajL,IAEhC,IAAhBA,EAAKhH,SAEZ,OAAkB,IAAXpH,EAAe,EAAIA,CAAK,IAGhCkD,eAAegmC,EAAkBzsC,GAG3BusC,EAAWtiC,QAAUqiC,GAAYI,MAAQ1sC,IAASssC,GAAYI,OAClE3jC,EAAME,OAAO,mBAAoBjJ,SAE3B+I,EAAMkP,SAAS,oCAIjBs0B,EAAWtiC,QAAUqiC,GAAYlhC,MAAQpL,IAASssC,GAAYn3B,cAC5DpM,EAAMkP,SAAU,gBACtBlP,EAAME,OAAO,mBAAoBjJ,SAC3B+I,EAAMkP,SAAS,oCAGjBjY,IAASssC,GAAYlhC,OACzBrC,EAAME,OAAO,oBAAqB,cAC5BF,EAAMkP,SAAU,oBAAoB,EAAM,CAAEqP,MAAM,KAGzDve,EAAME,OAAO,mBAAoBjJ,GAE7BA,IAASssC,GAAYI,YAClB3jC,EAAMkP,SAAU,eAExB,CDUA,MAAO,CAAC5P,EAAUC,MACR,WAAc,QAAa6iC,GAAa,CAC9C,gBAAiBqB,EAAsBviC,MAAM9M,OAC7C,kBAAmB,EACnB,gBAAiBwf,EAAgB1S,OAChC,CACDrD,SAAS,SAAS,IAAM,GACrB,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY4lC,EAAsBviC,OAAO,CAAC0H,EAAMpO,MAC9F,WAAc,QAAama,GAAiB,CAClD,WAAY,IAAM+uB,EAAiB96B,EAAKiM,WACxCvM,KAAMM,EAAKN,KACXjG,KAAMuG,EAAKvG,KACX7H,MAAOA,EACP,YAAaoO,EAAKiM,YAAc2uB,EAAWtiC,OAC1C,KAAM,EAAG,CAAC,WAAY,OAAQ,OAAQ,QAAS,iBAChD,SAENb,EAAG,GACF,EAAG,CAAC,gBAAiB,kBAE1B,IExEA,MAAM,GAAc,GAEpB,UCFA,MACM,GAAa,CACjBZ,IAAK,EACLpB,MAAO,SAEH,GAAa,CAAEA,MAAO,iBACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,SAEH,GAAa,CAAEoB,IAAK,GACpB,GAAa,CAAEpB,MAAO,gBACtB,GAAa,CAAEoB,IAAK,GAe1B,QAA4B,QAAiB,CAC3CP,OAAQ,uBACR,KAAAE,CAAMC,GCnBR,MAAMW,GAAQ,UAER2+B,GAAkB,SAAa,GAC/BiF,GAAiB,SAAa,GAC9BC,GAA0B,SAAa,GACvCC,GAAe,QAAwB,MAEvCN,GAAa,SAAS,IAAMxjC,EAAMkJ,QAAQs6B,aAC1CR,GAAc,SAAS,IAAMhjC,EAAMkJ,QAAQ85B,cAC3CnB,GAAoB,SAAS,IAAM7hC,EAAMkJ,QAAQ24B,oBACjD5e,GAAwB,SAAS,IAAMjjB,EAAMkJ,QAAQ+Z,wBACrD8gB,GAA8B,SAAS,IAAM/jC,EAAMkJ,QAAQ66B,8BAC3DC,GAAU,SAAS,IAAMhkC,EAAMkJ,QAAQ86B,UACvCjtB,GAAS,SAAS,IAAM/W,EAAMkJ,QAAQ6N,SACtCktB,GAAqB,SAAS,IAAMjkC,EAAMkJ,QAAQ+6B,qBAClDlhB,GAAqC,SAAS,IAAM/iB,EAAMkJ,QAAQg7B,kCAClElhB,GAAuC,SAAS,IAAMhjB,EAAMkJ,QAAQi7B,oCACpEjhB,GAA8B,SAAS,KAC5C,MAAMC,EAAanjB,EAAMkJ,QAAQk7B,yBAC3BC,EAAiB,CAAC,eAAgB,mBAAoB,sBACtDC,EAAqB,IAAInhB,GAAYpvB,QAAQsvB,IAAeghB,EAAehwC,SAASgvB,EAAUC,SAEpG,OAAOghB,EAAmB9qC,KAAK6pB,IACvB,CACN5jB,IAAK4jB,EAAUC,MACf9X,GAAI,gBAAgB6X,EAAUC,QAC9BrD,QAASoD,EAAUE,gBAEnB,KAGH,QAAMxM,GAAQrZ,MAAMoR,EAAUC,KAGzBD,GAAqC,IAAzBk1B,EAAQ9iC,MAAM9M,SAC7B4L,EAAME,OAAO,YAAa4O,GAC1By1B,EAAW,IAITz1B,GAAYC,GAAwB,MAAZD,GAC1B9O,EAAME,OAAO,sBAAuB,CAAE1F,MAAOypC,EAAmB/iC,MAAO6V,OAAQjI,G,KAKjF,QAAMk0B,GAAatlC,MAAMoR,EAAUC,KAClB,KAAbD,IAICA,IAAaC,GAAY60B,EAAe1iC,QAC3ClB,EAAME,OAAO,oBAAqBF,EAAMkJ,QAAQ86B,QAAQ5vC,QACxD4L,EAAME,OAAO,YAAaF,EAAMkJ,QAAQ6N,SAGzC6sB,EAAe1iC,OAAQ,EAAK,IAG7B,MAAMsjC,GAAyB,SAAS,KACvC,MAAMC,EAA0BtvC,OAAOC,6BAA6BsvC,aAAaC,eAAeC,2BAEhG,OAA8B,OAAzB5kC,EAAMkJ,QAAQ6N,QAAmD,IAAhC/W,EAAMkJ,QAAQ27B,eAAsD,IAA/B7kC,EAAMkJ,QAAQ47B,cAAiD,GAA3BL,GAItGzkC,EAAMkJ,QAAQ27B,cAAgB7kC,EAAMkJ,QAAQ47B,aAAiB,IAAML,CAAuB,IAG9FjhB,GAAe,SAAU,KACvB,CACNjO,UAAU,EACVF,OAAQ,wBACRC,OAAQ,UACRE,eAAgB,2BAKlB9X,eAAeqnC,IACdpG,EAAgBz9B,OAAQ,EACxB2iC,EAAwB3iC,OAAQ,EAChC0iC,EAAe1iC,OAAQ,QAEjBlB,EAAMkP,SAAS,+BAAgC,GACtD,CAEA,SAAS81B,IAIR,GAHArG,EAAgBz9B,OAAQ,EACxB+jC,EAASnB,IAEHD,EAAwB3iC,MAI7B,OAHAlB,EAAME,OAAO,qBAAsB,QACnCF,EAAME,OAAO,sCAAsC,GAKpDF,EAAME,OAAO,sBAAuB,CAAE1F,MAAOypC,EAAmB/iC,MAAO6V,OAAQA,EAAO7V,QACtFlB,EAAME,OAAO,qBAAsB,EACpC,CAEA,SAASqkC,EAAW/pC,GACnBmkC,EAAgBz9B,OAAQ,EACxB2iC,EAAwB3iC,OAAQ,EAEhClB,EAAME,OAAO,oBAAqB1F,GAClCwF,EAAMkP,SAAS,sBAChB,CAEA,SAASg2B,EAAa1qC,GACrBmkC,EAAgBz9B,OAAQ,EACxBlB,EAAMkP,SAAS,eAAgB1U,EAChC,CAEA,SAASyqC,EAASE,GACjBA,EAAKjkC,OAAO+c,eAAe,CAAEC,SAAU,UACxC,CDwBA,MAAO,CAAC5e,EAAUC,MACR,WAAc,QAAoB,MAAO,CAC/ClB,MAAO,oBACPoD,QAAS,eACTC,IAAKoiC,GACJ,EACD,QAAav4B,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,EACtB,QAAaunC,OAEf/kC,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACrBmmC,EAAQ9iC,MAAM9M,OAAS,IACnB,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAAiM,GAAoB,KAAM,GAAY,GACnC,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAY2jC,EAAQ9iC,OAAO,CAAC6V,EAAQvc,MAClF,WAAc,QAAoB,KAAM,CAC9C6D,OAAO,QAAgB,CACpC,uBAAuB,EACvB,8BAA+B4lC,EAAmB/iC,QAAU1G,GAASmkC,EAAgBz9B,QAExEzB,IAAKjF,GACJ,EACD,QAAasc,GAAc,CACzB/B,KAAM,CAAEva,QAAO4H,MAAO9C,EAAKkQ,MAAMuH,OAAOhC,KAAMzJ,UAAU,EAAOnL,QAASokC,EAAYtvB,OAAQgvB,EAAmB/iC,QAAU1G,GAASmkC,EAAgBz9B,OAClJ8T,OAAQ,CAAExa,QAAO4H,MAAO9C,EAAKkQ,MAAMuH,OAAO/B,OAAQ1J,UAAU,EAAOnL,QAAS+kC,EAAcjwB,QAAQ,IACjG,CACDpX,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMuH,OAAO3U,OAAS,KAAM,QAAiB5H,EAAQ,GAAK,MAAO,IACxG,IAAA6F,GAAoB,SAAU,MAAM,QAAiBf,EAAKkQ,MAAMmH,WAAWI,EAAO3K,QAAU,WAAY,SAAiB,QAAOksB,GAAP,CAAqBvhB,EAAOsuB,QAAQ,GAAGrwC,UAAY,WAAY,SAAiB,QAAOsjC,GAAP,CAAqBvhB,EAAOsuB,QAAQ,GAAGrwC,UAAW,MAE7PqL,EAAG,GACF,KAAM,CAAC,OAAQ,YACjB,MACD,YAGR,QAAoB,IAAI,MAE9BA,EAAG,KAEL,QAAakL,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACA,SAArB2lC,EAAWtiC,OAAoBy9B,EAAgBz9B,QAC3C,WAAc,QAAoB,MAAO,GAAY,CAC9B,UAArBsiC,EAAWtiC,QACP,WAAc,QAAayiB,GAAW,CACrClkB,IAAK,EACLyV,eAAgB,CAAC,MAAO,QACxBC,iBAAkB,cAClBC,kBAAmB,+BACnB,aAAa,MAEf,QAAoB,IAAI,GACL,KAAtB4tB,EAAY9hC,OAAsC,QAAtB8hC,EAAY9hC,QACpC,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAAb,GAAoB,MAAO,GAAY,GACpC,WAAc,SAAa,SAAyB,QAAOsgB,GAAP,CAAsCqiB,EAAY9hC,SAAS,SAAgB,QAAoBsiB,EAAatiB,QAAS,KAAM,QAElL,QAAauiB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,GACrB,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYqlB,EAA4BhiB,OAAQoiB,KAC9F,WAAc,QAAanD,GAAmB,CACpD1gB,IAAK6jB,EAAM7jB,IAAM,sBACjB,WAAY6jB,EAAM9X,IACjB,CACD3N,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBylB,EAAMrD,SAAU,MAEpD5f,EAAG,GACF,KAAM,CAAC,gBACR,MACH0iB,EAAwC,QACpC,WAAc,QAAa5C,GAAmB,CAC7C1gB,IAAK,EACL,WAAY,8BACX,CACD5B,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiBmlB,EAAqC9hB,OAAQ,MAEjFb,EAAG,MAEL,QAAoB,IAAI,MAE9BA,EAAG,QAGP,QAAoB,IAAI,GACL,KAAtB2iC,EAAY9hC,QACR,WAAc,QAAaokC,GAAgB,CAAE7lC,IAAK,MACnD,QAAoB,IAAI,GAC3BujC,EAAiB,QACb,WAAc,QAAoB,SAAU,CAC3CvjC,IAAK,EACLU,QAAS6kC,EACT3mC,MAAO,6EACPpH,KAAM,WACL,QAAiBqI,EAAKkQ,MAAMuH,OAAOwuB,MAAO,KAC7C,QAAoB,IAAI,OAE9B,QAAoB,IAAI,MAE9BllC,EAAG,KAEL,QAAaojB,GAAkB,KAAM,CACnC5lB,SAAS,SAAS,IAAM,CACrB2mC,EAA4B,QACxB,WAAc,QAAarkB,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMg2B,mBAAoB,MAEnEnlC,EAAG,MAEL,QAAoB,IAAI,IACC,IAA5BwhC,EAAkB3gC,QAAyD,IAAtC6iC,EAA4B7iC,QAC7D,WAAc,QAAaif,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMizB,qBAAsB,MAErEpiC,EAAG,MAEL,QAAoB,IAAI,GAC3B4iB,EAA2B,QACvB,WAAc,QAAa9C,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMkU,0BAA2B,MAE1ErjB,EAAG,MAEL,QAAoB,IAAI,MAE9BA,EAAG,IAEiB,SAArBmjC,EAAWtiC,OAAqBy9B,EAAgBz9B,OAQ7C,QAAoB,IAAI,KAPvB,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAAb,GAAoB,SAAU,CAC5BF,QAAS4kC,EACT1mC,MAAO,oCACPpH,KAAM,WACL,QAAiBqI,EAAKkQ,MAAMuH,OAAOphB,KAAM,OAGjD,KAEL,IExTA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCRO,MAAM8vC,GAAkB,oBAEhB,MAAMC,GACpBhb,QAEA,WAAAn2B,CAAam2B,GACZj2B,KAAKi2B,QAAUA,CAChB,CAEA,mBAAMib,CAAezc,EAAW0c,EAAMx5B,EAAOmc,GAC5C,MAAM3qB,EAAMnJ,KAAKi2B,QAAU,mCAErBmb,EAAW,IAAIC,SACrBD,EAAS/d,OAAQ,YAAaoB,GAC9B2c,EAAS/d,OAAQ,QAAS1b,GAC1By5B,EAAS/d,OAAQ,aAAcS,GAG1Bqd,aAAgBG,KACpBF,EAAS/d,OAAQ2d,GAAiBG,EAAM,YAExCC,EAAS/d,OAAQ2d,GAAiBG,GAGnC,MAAMzb,QAAiB6b,MAAOpoC,EAAK,CAAEqoC,OAAQ,OAAQC,KAAML,IAErDjpC,QAAautB,EAASgc,OAC5B,IACGhc,EAASic,IACXxpC,EAAKA,MAAQA,EAAKA,KAAKsO,QAA+B,MAArBtO,EAAKA,KAAKsO,OAE3C,MAAM,IAAIm7B,MAAOzpC,EAAKqjB,SAGvB,GAAsB,KAAlBrjB,EAAK0pC,SAER,MAAM,IAAID,MAAOlxC,OAAOC,6BAA6BgU,KAAKm9B,gBAG3D,OAAO3pC,CACR,ECrCD,MAAM,GAAa,CAAEyB,MAAO,oBACtB,GAAa,CAAC,QACd,IAA0B,IAAAgC,GAAoB,OAAQ,CAC1D,cAAe,OACfhC,MAAO,uBACN,MAAO,GACJ,GAAa,CAAEoB,IAAK,GACpB,GAAa,CAAEpB,MAAO,iBACtB,IAA0B,IAAAgC,GAAoB,OAAQ,CAC1D,cAAe,OACfhC,MAAO,oBACN,MAAO,GACJ,GAAa,CAAEA,MAAO,sBACtB,GAAa,CAAEA,MAAO,SACtB,IAA0B,IAAAgC,GAAoB,KAAM,KAAM,MAAO,GACjE,GAAc,CAAEoZ,IAAK,qCACrB,GAAc,CAAEpb,MAAO,uBACvB,GAAc,CAAC,OAAQ,UACvB,GAAc,CAClBoB,IAAK,EACLpB,MAAO,SAEH,IAA2B,IAAAgC,GAAoB,KAAM,KAAM,MAAO,GAClE,GAAc,CAAC,QACf,GAAc,CAAEZ,IAAK,GAQ3B,QAA4B,QAAiB,CAC3CP,OAAQ,cACR,KAAAE,CAAMC,GC/BR,MAAMW,GAAQ,UACR5K,GAA+B,SAAS,IAAMD,OAAOC,gCACrD,mBAAEoxC,EAAkB,aAAEC,EAAY,iBAAEC,EAAgB,KAAEt9B,GAAShU,EAA6B8L,MAC5FylC,IAAqBF,EACrBG,IAA2BF,EAE3BG,GAAiB,SAAI,GACrBC,GAAa,QAAI,MACjBryB,GAAW,SAAS,IAAMzU,EAAMkJ,QAAQ69B,sBACxCC,GAAgB,QAAIvB,IACpBwB,GAAc,SAAS,IAAMjnC,EAAMkJ,QAAQg+B,mBAC3CC,GAAe,SAAS,IAAwC,KAAlCnnC,EAAMkJ,QAAQk+B,kBAC5CnkB,GAAwB,SAAS,IAAMjjB,EAAMkJ,QAAQ+Z,wBAErDokB,EAAqB,CAC1B,kBACA,wBACA,oBACA,gBACA,gBACA,kBACA,cACA,kCAEKC,EAA0B,CAC/B,QAOD,SAASC,EAAqBC,GAG7B,OAAyB,IAApBA,EAASpzC,UAITizC,EAAmBhzC,SAAUmzC,EAInC,CAEA,SAASC,IACR,MAAMC,EAAQZ,EAAW5lC,MAAMwmC,MAE/B,GAAIA,EAAMtzC,OAAS,EAClB,OAGD,MAAMwxC,EAAO8B,EAAM,GAEdH,EAAmB3B,EAAK3uC,OAI7B0wC,EAAW/B,EACZ,CAEA,SAASgC,IACRd,EAAW5lC,MAAMA,MAAQ,EAC1B,CAEA,SAAS4S,IACR8zB,IAEA5nC,EAAME,OAAO,sBAAuB,CAAEsU,QAAS,KAC/CxU,EAAME,OAAO,qBAAsB,CAAClH,OAAQ,GAAIyb,SAAU,IAC3D,CAEA,SAASozB,EAAkB3mC,GAC1B2lC,EAAe3lC,MAAQA,CACxB,CAEA,SAAS4mC,EAAmBx5B,GAG3Bw4B,EAAW5lC,MAAMwmC,MAAQp5B,EAAMy5B,aAAaL,MAE5CD,GACD,CAtDKjB,GAAsBA,EAAmB,SAAgD,QAArCA,EAAmB,QAAQp6B,QACnFqI,EAASvT,MAAQslC,EAAmB,QAAQjX,cAAcyY,mBAuD3D,MAAML,EAAajqC,MAAOkoC,IACzB5lC,EAAMkP,SAAS,wBAAyB02B,EAAK,EDoC9C,MAAO,CAACtmC,EAAUC,KAChB,MAAMq9B,GAA2B,QAAkB,iBAEnD,OAAQ,WAAc,QAAoB,MAAO,GAAY,CAC3D+J,IACK,WAAc,QAAoB,IAAK,CACtClnC,IAAK,EACL+I,MAAM,QAAOi+B,GAAc7oC,IAC3BS,MAAO,aACN,CACD,IACA,QAAiB,KAAM,SAAiB,QAAOooC,GAAcrkC,OAAQ,IACpE,EAAG,MACN,QAAoB,IAAI,GAC3B+kC,EAAkB,QACd,WAAc,QAAoB,MAAO,GAAY,EACpD,IAAA9mC,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,OAAQ,MAAM,QAAiBf,EAAKkQ,MAAMo2B,MAAO,IACrE,IAAAvlC,GAAoB,SAAU,MAAM,QAAiBoU,EAASvT,OAAQ,IACtE,IAAAb,GAAoB,SAAU,CAC5BF,QAASZ,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBiS,KAAU,CAAC,cAC9E,CACD,IACA,IAAAzT,GAAoB,OAAQ,IAAY,QAAiBf,EAAKkQ,MAAMy4B,WAAW3yC,QAAQ,KAAMmf,EAASvT,QAAS,QAGnH,IAAAb,GAAoB,MAAO,KAAM,EAC/B,QAAau8B,EAA0B,CAAEj7B,KAAM,wBAGnD,QAAoB,IAAI,IAC5B,IAAAtB,GAAoB,MAAO,CACzBhC,OAAO,QAAgB,CACzB,gBAAgB,EAChB,yBAA0BwoC,EAAe3lC,QAEvCgnC,WAAY3oC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBgmC,GAAkB,IAAQ,CAAC,aAClGM,YAAa5oC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBgmC,GAAkB,IAAQ,CAAC,aACnGO,YAAa7oC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBgmC,GAAkB,IAAS,CAAC,aACpGQ,UAAW9oC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBgmC,GAAkB,IAAS,CAAC,aAClGS,WAAY/oC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,GAAiBgmC,GAAkB,IAAS,CAAC,aACnGU,OAAQhpC,EAAO,KAAOA,EAAO,IAAK,SAAgBsC,IACpDgmC,GAAkB,GAClBC,EAAmBjmC,EAAO,GACxB,CAAC,cACA,EACD,IAAAxB,GAAoB,IAAK,KAAM,EAC7B,SAAiB,QAAiB8mC,EAAajmC,MAAQ5B,EAAKkQ,MAAMC,SAAS+4B,qBAAuBlpC,EAAKkQ,MAAMC,SAASg5B,mBAAqB,IAAK,IAChJ,IAAApoC,GAAoB,OAAQ,GAAY,KAAM,QAAiBinC,EAAwB9rC,KAAK,MAAQ,IAAK,GACzG,IACA,IAAA6E,GAAoB,OAAQ,MAAM,QAAiBf,EAAKkQ,MAAMk5B,IAAK,MAErE,IAAAroC,GAAoB,QAAS,GAAa,EACxC,IAAAA,GAAoB,OAAQ,IAAa,QAAiBf,EAAKkQ,MAAMm5B,YAAa,MAEpF,IAAAtoC,GAAoB,QAAS,CAC3BhC,MAAO,cACPmN,GAAI,oCACJ/J,QAAS,aACTC,IAAKolC,EACLnlC,KAAMqlC,EAAc9lC,MACpBjK,KAAM,OACN2xC,OAAQ,GAAGtB,EAAwB9rC,KAAK,QAAQ6rC,EAAmB7rC,KAAK,OACxEqtC,SAAUpB,EACV,mBAAoB,wDACnB,KAAM,GAAI,IACbb,IACK,WAAc,QAAoB,MAAO,GAAa,EACrD,SAAiB,QAAiBtnC,EAAKkQ,MAAMs5B,cAAe,GAC5D,IACA,IAAAzoC,GAAoB,IAAK,CACvBmI,MAAM,QAAOk+B,GAAkB9oC,MAC9B,SAAiB,QAAO8oC,GAAkBtkC,OAAQ,EAAG,QAE1D,QAAoB,IAAI,GAC3B6kC,EAAiB,QACb,WAAc,QAAoB,OAAQ,IAAa,QAAiB3nC,EAAKkQ,MAAMu5B,eAAgB,KACpG,QAAoB,IAAI,IAC3B,IACF9lB,EAA2B,QACvB,WAAc,QAAa9C,GAAmB,CAC7C1gB,IAAK,EACLxI,KAAM,UACL,CACD4G,SAAS,SAAS,IAAM,EACtB,SAAiB,QAAiByB,EAAKkQ,MAAMkU,0BAA2B,MAE1ErjB,EAAG,MAEL,QAAoB,IAAI,IAC3B,CAEL,IEtNA,MAAM,GAAc,GAEpB,U,UCJE,OAAM,mB,0EAFP,QASM,aARL,OAAmD,sBAAzC,EAAA+I,KAAK4/B,cAAcC,aAAW,GACxC,IACA,QAKE,GAJA/nC,MAAO8nC,EAAAA,cACRrnC,KAAK,+BACL0b,SAAS,8BACR,QAAK,YAAGnc,GAAUgoC,EAAAA,oBAAoBhoC,K,oBCPnC,MAAMioC,GAAwB,CACpCC,EACAC,KAEA,MAAMC,EAAS,IAAIC,UACbC,EAAMF,EAAOG,gBAAgBL,EAAW,iBACxCM,EAAaF,EAAIG,gBACjBC,EAAWF,EAAWh4B,cAAc,aAE1C,IAAKk4B,EACJ,OAAOR,EAGR,MAAMS,EAAeD,EAASE,iBAAiB,QAC/CD,EAAatvC,SAASsC,IACrB,MAAM2W,EAAW3W,EAAQG,aAAa,UAEhC+sC,EAAW,EAAIV,EACrBxsC,EAAQmtC,aAAa,YAAa,GAAGD,OAElCv2B,IACF3W,EAAQuS,MAAM66B,eAAe,UAC7BptC,EAAQuS,MAAM86B,YAAY,OAAQ,SAClCrtC,EAAQmtC,aAAa,SAAU,SAIhC,MAAMG,EAAUrvC,SAASsvC,gBACxB,6BACA,OAEKC,EAAWxtC,EAAQytC,WAAU,GACnC,IAAID,EAASE,QACZ,OAEDJ,EAAQK,YAAYH,GACpBvvC,SAASorC,KAAKsE,YAAYL,GAE1B,MAAMM,EAAOJ,EAASE,UACtBzvC,SAASorC,KAAKwE,YAAYP,GAE1B,MAAMQ,EAAW,GAAKtB,EAChBuB,EAAW,EAAIvB,EACfxqC,EAAQ4rC,EAAK5rC,MAAQ8rC,EACrB7rC,EAAS2rC,EAAK3rC,OAAS8rC,EACvBh0C,GAAKiG,EAAQG,aAAa,KAAO6B,EAAQ,EACzChI,GAAKgG,EAAQG,aAAa,KAAO8B,EAAS,EAG1C+rC,EAAO/vC,SAASsvC,gBAAgB,6BAA8B,QACpES,EAAKb,aAAa,IAAK,GAAGpzC,KAC1Bi0C,EAAKb,aAAa,IAAK,GAAGnzC,KAC1Bg0C,EAAKb,aAAa,YAAantC,EAAQG,aAAa,cACpD6tC,EAAKb,aAAa,QAAS,GAAGnrC,KAC9BgsC,EAAKb,aAAa,SAAU,GAAGlrC,KAC/B+rC,EAAKb,aAAa,KAAM,GAAG,EAAIX,GAC/BwB,EAAKb,aAAa,SAAU,QAC5Ba,EAAKb,aAAa,OAAQx2B,EAAW,UAAY,SAEjDo2B,EAASp3B,QAAQq4B,EAAK,IAIvB,MAAMC,EAAa,IAAIC,cACvB,OAAOD,EAAWE,kBAAkBtB,EAAW,EAGnCuB,GACZ7B,IAEA,MAAME,EAAS,IAAIC,UACbC,EAAMF,EAAOG,gBAAgBL,EAAW,iBACxCM,EAAaF,EAAIG,gBACjBuB,EAAaxB,EAAWh4B,cAAc,gBAC5C,GAAkB,OAAfw5B,EACF,OAAO9B,EAER,MAAM+B,EAAU,EAChBD,EAAWlB,aAAa,mBAAoB,GAAGmB,KAAWA,KAC1D,MAAML,EAAa,IAAIC,cACvB,OAAOD,EAAWE,kBAAkBtB,EAAW,EAGnC0B,GAAiB,CAC7BhC,EACAiC,EACAC,EACAC,KAEA,MAAMjC,EAAS,IAAIC,UACbC,EAAMF,EAAOG,gBAAgBL,EAAW,iBACxCM,EAAaF,EAAIG,gBACjB6B,EAAY9B,EAAWh4B,cAAc,UACvC65B,GACH7B,EAAWM,aAAa,sBAAuBuB,GAGhD,MAAME,EAAO3wC,SAASsvC,gBAAgB,6BAA8B,QAGpE,GAAsB,aAAnBkB,EAA+B,CACjC,MAAMI,EAAmB5wC,SAASsvC,gBACjC,6BACA,kBAEDsB,EAAiB1B,aAAa,KAAM,oBACpC0B,EAAiB1B,aAAa,KAAM,KACpC0B,EAAiB1B,aAAa,KAAM,KACpC0B,EAAiB1B,aAAa,KAAM,KACpC0B,EAAiB1B,aAAa,KAAM,KACpC0B,EAAiB1B,aAAa,oBAAqB,wBACnD0B,EAAiBzwC,UAAY,omBAW7BwwC,EAAKjB,YAAYkB,GAGjB,MAAMC,EAAaH,EAAUlB,WAAU,GACvCqB,EAAWC,gBAAgB,MAC3BD,EAAW3B,aAAa,SAAU,QAClC2B,EAAW3B,aAAa,OAAQ,0BAChCwB,EAAUK,MAAMF,E,CAIjB,GAAsB,UAAnBL,EAA4B,CAC9BG,EAAKxwC,UAAY,sxBAiBjB,MAAM0wC,EAAaH,EAAUlB,WAAU,GACvCqB,EAAWC,gBAAgB,MAC3BD,EAAW3B,aAAa,SAAU,QAClC2B,EAAW3B,aAAa,OAAQ,8BAChC2B,EAAW3B,aAAa,OAAQ,0BAChCwB,EAAUK,MAAMF,E,CAGjB,GAAsB,gBAAnBL,EAAkC,CACpCG,EAAKxwC,UAAY,8yBAiBjB,MAAM0wC,EAAaH,EAAUlB,WAAU,GACvCqB,EAAWC,gBAAgB,MAC3BD,EAAW3B,aAAa,SAAU,QAClC2B,EAAW3B,aAAa,OAAQ,oCAChC2B,EAAW3B,aAAa,OAAQ,gCAChCwB,EAAUK,MAAMF,E,CAIjB,GAAsB,WAAnBL,GAAkD,YAAnBA,GAAmD,UAAnBA,EAA4B,CAC7FD,EAA+B,WAAnBC,EAA8B,UAAYD,EAEtD,MAAMS,EAAkChxC,SAASsvC,gBAChD,6BACA,kBAED0B,EAAgC9B,aAAa,KAAM,2BACnD8B,EAAgC9B,aAAa,KAAM,KACnD8B,EAAgC9B,aAAa,KAAM,KACnD8B,EAAgC9B,aAAa,KAAM,KACnD8B,EAAgC9B,aAAa,KAAM,KACnD8B,EAAgC9B,aAAa,oBAAqB,wBAClE8B,EAAgC7wC,UAAY,8lBAW5CwwC,EAAKjB,YAAYsB,GAEjB,MAAMC,EAA+BjxC,SAASsvC,gBAC7C,6BACA,UAGD2B,EAA6B/B,aAAa,KAAM,0BAChD+B,EAA6B9wC,UAAY,sVAS7B+wC,GAAqBX,EAAWC,+EAK5C5B,EAAWl3B,QAAQu5B,GAEnB,MAAME,EAA4BnxC,SAASsvC,gBAC1C,6BACA,UAGD6B,EAA0BjC,aAAa,KAAM,uBAC7CiC,EAA0BhxC,UAAY,qKAKtCyuC,EAAWl3B,QAAQy5B,GAGnB,MAAMC,EAA0BV,EAAUlB,WAAU,GACpD4B,EAAwBN,gBAAgB,MACxCM,EAAwBlC,aAAa,SAAU,QAC/CkC,EAAwBlC,aAAa,OAAQ,iCAC7CwB,EAAUK,MAAMK,GAEhB,MAAMC,EAAyBX,EAAUlB,WAAU,GACnD6B,EAAuBP,gBAAgB,MACvCO,EAAuBnC,aAAa,SAAU,QAC9CmC,EAAuBnC,aAAa,OAAQqB,GAC5Cc,EAAuBnC,aAAa,SAAU,gCAC9CwB,EAAUK,MAAMM,GAEhB,MAAMC,EAAsBZ,EAAUlB,WAAU,GAChD8B,EAAoBR,gBAAgB,MACpCQ,EAAoBpC,aAAa,SAAU,QAC3CoC,EAAoBpC,aAAa,OAAQqB,GACzCe,EAAoBpC,aAAa,SAAU,6BAC3CoC,EAAoBpC,aAAa,UAAW,OAC5CwB,EAAUK,MAAMO,E,CAGjB1C,EAAWl3B,QAAQi5B,GAGG,UAAnBH,EACFE,EAAUxB,aAAa,OAAQ,QAE/BwB,EAAUxB,aAAa,OAAQqB,GAGhC,MAAMP,EAAa,IAAIC,cACvB,OAAOD,EAAWE,kBAAkBtB,EAAW,EAGnCsC,GAAuB,CACnCX,EACAC,KAEA,MAAMe,EAA2B,WAAnBf,EAA8B,UAAYD,EAClDiB,EAAMD,EAAM/2C,QAAQ,IAAK,IACzBuK,GAAK4Y,SAAS6zB,EAAIt0B,UAAU,EAAG,GAAI,IAAM,KAAKL,QAAQ,GACtD40B,GAAK9zB,SAAS6zB,EAAIt0B,UAAU,EAAG,GAAI,IAAM,KAAKL,QAAQ,GACtDif,GAAKne,SAAS6zB,EAAIt0B,UAAU,EAAG,GAAI,IAAM,KAAKL,QAAQ,GAE5D,MAAO,CAAC9X,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG0sC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG3V,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAGp7B,KAAK,IAAI,EAOjEgxC,GAAcpD,IAC1B,MAAME,EAAS,IAAIC,UACbC,EAAMF,EAAOG,gBAAgBL,EAAW,iBACxCM,EAAaF,EAAIG,gBACjB8C,EAAiB/C,EAAWh4B,cAAc,oBAC1Ck4B,EAAWF,EAAWh4B,cAAc,aAE1C,GAAsB,OAAnB+6B,GAAwC,OAAb7C,EAC7B,OAAOR,EAKRQ,EAAS8C,WAAWC,aAAaF,EAAgB7C,GAEjD,MAAMkB,EAAa,IAAIC,cACvB,OAAOD,EAAWE,kBAAkBtB,EAAW,EAGnCkD,GACZxD,IAEA,MAAME,EAAS,IAAIC,UACbC,EAAMF,EAAOG,gBAAgBL,EAAW,iBACxCM,EAAaF,EAAIG,gBAEjBkD,EAAenD,EAAWh4B,cAAc,kBAC3Cm7B,IACFA,EAAa7C,aAAa,SAAU,WACpC6C,EAAa7C,aAAa,OAAQ,YAGnC,MAAM8C,EAAkBpD,EAAWh4B,cAAc,qBAC9Co7B,IACFA,EAAgB9C,aAAa,SAAU,WACvC8C,EAAgB9C,aAAa,OAAQ,YAGtC,MAAM+C,EAAkBrD,EAAWh4B,cAAc,qBAC9Cq7B,IACFA,EAAgB/C,aAAa,OAAQ,QACrC+C,EAAgB/C,aAAa,SAAU,SAGxC,MAAMc,EAAa,IAAIC,cACvB,OAAOD,EAAWE,kBAAkBtB,EAAW,ECtV1C,GAAa,CAAC,KAAM,OAAQ,QAAS,WACrC,GAAa,CAAC,OACd,GAAa,CAAC,aACd,GAAa,CAAC,OACd,GAAa,CACjBjqC,IAAK,EACLpB,MAAO,SAEH,GAAa,CAAEA,MAAO,QAc5B,QAA4B,QAAiB,CAC3Ca,OAAQ,iBACRF,MAAO,CACLwU,SAAU,CAAEvc,KAAM4J,SAClBK,MAAO,CAAC,EACRa,MAAO,CAAC,EACRirC,SAAU,CAAE/1C,KAAM4J,SAClBosC,MAAO,CAAC,EACRltC,MAAO,CAAC,EACR4B,KAAM,CAAC,EACPurC,QAAS,CAAEj2C,KAAM2V,UACjBugC,YAAa,CAAC,GAEhB,KAAA/tC,CAAMC,GAIR,MAAO,CAACC,EAAUC,MACR,WAAc,QAAoB,MAAO,CAC/ClB,OAAO,QAAgB,CACxB,mBAAmB,EACnB,0BAA2BiB,EAAKkU,YAE9B,EACD,IAAAnT,GAAoB,QAAS,CAC3BhC,MAAO,QACPpH,KAAM,QACNuU,GAAIlM,EAAK4B,MACTS,KAAMrC,EAAKqC,KACXT,MAAO5B,EAAK4B,MACZgsC,QAAS3tC,EAAO,KAAOA,EAAO,GAEpC,IAAIkU,IAAUnU,EAAK4tC,SAAW5tC,EAAK4tC,WAAWz5B,IACxC+J,QAASle,EAAK6tC,cAAgB7tC,EAAK4B,OAClC,KAAM,GAAI,KACb,IAAAb,GAAoB,QAAS,CAC3BoZ,IAAKna,EAAK4B,MACV7C,MAAO,SACN,CACAiB,EAAa,WACT,WAAc,QAAoB,MAAO,CACxCG,IAAK,EACLpB,MAAO,QACPpD,UAAWqE,EAAKyC,OACf,KAAM,EAAG,OACX,WAAc,QAAoB,MAAO,CACxCtC,IAAK,EACLpB,MAAO,QACP4D,IAAK3C,EAAKyC,MACVpD,IAAK,GACLE,MAAO,MACPC,OAAQ,OACP,KAAM,EAAG,KACfQ,EAAU,QACN,WAAc,QAAoB,OAAQ,IAAY,QAAiBA,EAAK2tC,OAAQ,KACrF,QAAoB,IAAI,IAC5B,IAAA5sC,GAAoB,OAAQ,IAAY,QAAiBf,EAAKS,OAAQ,IACrE,EAAG,KACL,GAEL,IChFA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,U,UCPM1B,MAAM,2B,mCAAX,QAEM,MAFN,GAEM,EADL,QAAa,kC,CCDf,MAAM,GAAS,CAAC,EAKV,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,IAAQ,CAAC,YAAY,qBAEzF,UCEA,IAA4B,QAAiB,CAC3Ca,OAAQ,aACRF,MAAO,CACLkC,MAAO,CAAC,EACRS,KAAM,CAAC,EACP0b,SAAU,CAAC,GAEb,KAAAje,CAAMC,GCVR,MAMM+J,EAAOjU,OAAOC,6BAA6BgU,KAC3CgkC,GAAQ,SAAS,IACfhkC,EAAK4/B,cAAcvgB,SAAS4kB,UAE9BC,GAAO,SAAS,IACdlkC,EAAK4/B,cAAcvgB,SAAS8kB,WAG9BC,GAAW,SAAS,IAClBpC,GACNqC,IACAL,EAAMlsC,MAAMmrC,MACZe,EAAMlsC,MAAMwsC,WACZ,oBAIIC,GAAU,SAAS,IACjBvC,GACNqC,IACAH,EAAKpsC,MAAMmrC,MACXiB,EAAKpsC,MAAMwsC,WACX,oBAIF,SAASD,IACR,MAAMjpC,EAAY,IAAI,KAAQxK,OAAO28B,WAAU,IAAK,KAIpD,OADAnyB,EAAU2zB,MAAQ,QACX,KAAQyV,SAASC,MAAMrpC,EAAW,CACxCspC,gBAAgB,EAChBvrC,OAAQ,QAEV,CDUA,MAAO,CAACjD,EAAUC,MACR,WAAc,QAAawuC,GAAuB,KAAM,CAC9DlwC,SAAS,SAAS,IAAM,EACtB,QAAamwC,GAAgB,CAC3B,YAA4B,YAAf1uC,EAAK4B,MAClBA,MAAO,UACPa,MAAOyrC,EAAStsC,MAChB8rC,UAAU,EACVjtC,MAAOqtC,EAAMlsC,MAAMnB,MACnBmtC,QAAS,IAAM5tC,EAAK0qB,MAAM,QAAS,WACnCroB,KAAM,+BACNwrC,YAAa7tC,EAAK4B,OACjB,KAAM,EAAG,CAAC,YAAa,QAAS,QAAS,UAAW,iBACvD,QAAa8sC,GAAgB,CAC3B,YAA4B,aAAf1uC,EAAK4B,MAClBA,MAAO,WACPa,MAAO4rC,EAAQzsC,MACf8rC,UAAU,EACVjtC,MAAOutC,EAAKpsC,MAAMnB,MAClBmtC,QAAS,IAAM5tC,EAAK0qB,MAAM,QAAS,YACnCroB,KAAM,+BACNwrC,YAAa7tC,EAAK4B,OACjB,KAAM,EAAG,CAAC,YAAa,QAAS,QAAS,UAAW,mBAEzDb,EAAG,IAGP,IElFA,MAAM,GAAc,GAEpB,URYA,IACCuS,WAAY,CAAEq7B,WAAU,IACxB58B,SAAU,CACT,IAAAjI,GAAS,OAAO3U,KAAK+a,KAAO,MACzB,QAAY,CACd,mBAGF8B,QAAS,KACL,QAAc,CAChB,0BStBH,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCEA,IAA4B,QAAiB,CAC3CpS,OAAQ,aACR,KAAAE,CAAMC,GCLR,MAAM+J,EAAOjU,OAAOC,6BAA6BgU,KAC3CuU,EAAcxoB,OAAOC,6BACrB4K,GAAQ,UAERkuC,GAAc,SAAS,IAAMluC,EAAMkJ,QAAQglC,cAC3ChkB,GAAmB,SAAS,IAAMlqB,EAAMkJ,QAAQghB,mBAChDikB,GAAuB,SAAS,IAAMnuC,EAAMkJ,QAAQilC,uBACpDC,GAAuB,SAAS,IAAMpuC,EAAMkJ,QAAQklC,uBACpD9d,GAAqB,SAAS,IAAMtwB,EAAMkJ,QAAQonB,qBAWxD,SAAS+d,EAAiB5tC,GACzB,MAAMgtB,EAAUhtB,EAAEgtB,OAClBztB,EAAME,OAAO,yBAA0ButB,EAAOvsB,MAC/C,CAEA,SAASotC,EAASptC,GACjB,OAAIktC,EAAqBltC,QAAUA,GAA+B,cAAtBgtC,EAAYhtC,MAChDkI,EAAKmf,WAAWlC,KAAKiF,KAClB8iB,EAAqBltC,QAAUA,EAClCkI,EAAKmf,WAAWlC,KAAKkoB,aADtB,CAGR,CDSA,OC7BA,QAAMrkB,GAAkBxsB,MAAOoR,EAAkBC,KAC3CuhB,EAAmBpvB,OAGpB4N,IAAaC,GAChB/O,EAAMkP,SAAS,iC,IDwBV,CAAC5P,EAAUC,MACR,WAAc,QAAawuC,GAAuB,KAAM,CAC9DlwC,SAAS,SAAS,IAAM,GACrB,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYswC,EAAqBjtC,OAAO,EAAGA,QAAOnB,aAChG,WAAc,QAAaiuC,GAAgB,CACjDrsC,KAAM,cACNlC,IAAKyB,EACLsS,SAAU0W,EAAiBhpB,QAAUA,EACrCisC,YAAajjB,EAAiBhpB,MAC9BA,MAAOA,EACPa,MAAO,IAAG,QAAO4b,GAAa6wB,iBAAiBttC,cAC/C+rC,MAAOqB,EAASptC,GAChBnB,MAAOA,EACPmtC,QAASmB,GACR,KAAM,EAAG,CAAC,WAAY,cAAe,QAAS,QAAS,QAAS,aACjE,SAENhuC,EAAG,IAGP,IE9DA,MAAM,GAAc,GAEpB,U,sBCFA,MACM,GAAa,CAAEhC,MAAO,sBACtB,GAAa,CAAEA,MAAO,+BACtB,GAAa,CAAC,OAAQ,cACtB,GAAa,CAAC,cASpB,QAA4B,QAAiB,CAC3Ca,OAAQ,oBACR,KAAAE,CAAMC,GCXR,MAAMW,GAAQ,UACRoJ,EAAOjU,OAAOC,6BAA6BgU,KAE3CqlC,GAAmB,SAAS,IAAMzuC,EAAMkJ,QAAQwlC,0BAChDC,GAAc,SAAS,IAAM,KAAQ,CAAEF,EAAiBvtC,SAAUlB,EAAMkJ,QAAQ0lC,sBAAwB,CAAE,gBAC1GC,GAAyB,SAAS,IAAM7uC,EAAMkJ,QAAQ4lC,kBAAkBp4C,QAE9E,SAAS8c,EAAUu7B,GAClB,OAAON,EAAiBvtC,MAAM6tC,YAAcA,CAC7C,CACA,SAASC,EAAQpmC,GAChB,OAAK4K,EAAU5K,EAAKmmC,WACZ,IAGDnmC,EAAKqmC,SACb,CACA,MAAMC,EAAwBxxC,MAAQmE,IAC9B,IAASgtC,EAAuB3tC,OAMvCiuC,SAAS3mC,KAAO3G,EAAO4rB,OAAOjlB,KAL7B2mC,SAAS3mC,WAAaxI,EAAMkP,SAAU,wBAAyB,CAAEtR,IAAKiE,EAAO4rB,OAAOjlB,KAAM4mC,aAAa,GAKtE,EDgBnC,MAAO,CAAC9vC,EAAUC,MACR,WAAc,QAAoB,MAAO,GAAY,EAC3D,QAAamX,GAAW,CAAErY,MAAO,YAAc,CAC7CR,SAAS,SAAS,IAAM,EACtB,SAAiB,SAAiB,QAAOuL,GAAMimC,iBAAkB,MAEnEhvC,EAAG,KAEL,IAAAA,GAAoB,KAAM,GAAY,GACnC,SAAW,IAAO,QAAoB,KAAW,MAAM,QAAYsuC,EAAYztC,OAAO,CAAC0H,EAAMpO,MACpF,WAAc,QAAoB,KAAM,CAC9C6D,OAAO,QAAgB,CAC7B,4BAA4B,EAC5B,mCAAoCmV,EAAU5K,EAAKmmC,aAE7CtvC,IAAKjF,GACJ,CACCgZ,EAAU5K,EAAKmmC,aAQZ,WAAc,QAAoB,IAAK,CACtCtvC,IAAK,EACL+I,KAAM,IACNnK,MAAO,gEACP,aAAc,GAAGuK,EAAKmmC,gBACrB,QAAiBnmC,EAAKmmC,WAAY,EAAG,OAZvC,WAAc,QAAoB,IAAK,CACtCtvC,IAAK,EACLU,SAAS,QAAe+uC,EAAuB,CAAC,YAChD1mC,KAAMwmC,EAAQpmC,GACdvK,MAAO,6BACP,aAAc,GAAGuK,EAAKmmC,gBACrB,QAAiBnmC,EAAKmmC,WAAY,EAAG,MAO3C,MACD,UAIV,IE7EA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CAAE1wC,MAAO,4BACtB,GAAa,CAAEA,MAAO,iDACtB,GAAa,CAAC,OACd,GAAa,CAAEA,MAAO,mCACtB,GAAa,CAAEA,MAAO,mCACtB,GAAa,CAAC,aACd,GAAa,CAAEA,MAAO,4BACtB,GAAa,CAAEA,MAAO,iDACtB,GAAa,CAAC,OACd,GAAc,CAAEA,MAAO,mCACvB,GAAc,CAAEA,MAAO,mCACvB,GAAc,CAAC,aAQrB,QAA4B,QAAiB,CAC3Ca,OAAQ,mBACR,KAAAE,CAAMC,GCnBR,MAAM+J,EAAOjU,OAAOC,6BAA6BgU,KAC3CpJ,GAAQ,UACRsvC,GAAyB,SAAS,IAAMtvC,EAAMkJ,QAAQomC,yBACtDC,GAAqB,SAAS,IAAMvvC,EAAMkJ,QAAQqmC,qBAClDT,GAAoB,SAAS,IAAM9uC,EAAMkJ,QAAQ4lC,oBAEvD,SAASU,EAAqBxwB,GAC7B,MAAO,GAAGA,EAAO+G,WAAW/G,EAAOjT,QAAQiT,EAAOywB,QACnD,CAEA/xC,eAAegyC,EAAajpB,GAC3B,GAAKA,EAASjb,KAAO8jC,EAAuBpuC,MAAMsK,GACjD,OAGDxL,EAAME,OAAO,iBAAkBumB,GAC/B,MAAM7oB,QAAYoxC,EAAQvoB,GAEb,KAAR7oB,IAILuxC,SAAS3mC,KAAO5K,EACjB,CAEAF,eAAesxC,EAAQvoB,GACtB,OAAK,IAAAkpB,SAASb,EAAkB5tC,OACxBulB,EAASwoB,gBAGJjvC,EAAMkP,SAAU,wBAAyB,CACrDtR,IAAK6oB,EAASwoB,UACdG,aAAa,GAEf,CDwBA,MAAO,CAAC9vC,EAAUC,KAChB,MAAMif,GAAsB,QAAkB,YAE9C,OAAQ,WAAc,QAAaA,EAAqB,CACtDze,MAAO,QACP1B,MAAO,oBACPogB,QAAS,wCACTrE,WAAYk1B,EAAuBpuC,MACnC,sBAAuB,CACrB3B,EAAO,KAAOA,EAAO,GAAMsC,GAAiB,EAAyBX,MAAQW,GAC7E6tC,GAEFv2C,QAASo2C,EAAmBruC,MAC5B0uC,WAAW,EACXlxB,aAAa,QAAOtV,GAAMqd,SAASopB,gBAClC,CACD7wB,QAAQ,SAAUA,GAAW,EAC3B,IAAA3e,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,MAAO,GAAY,CACpC2e,EAAY,QACR,WAAc,QAAoB,MAAO,CACxCvf,IAAK,EACLpB,MAAO,kCACP4D,IAAK+c,EAAOjd,MACZpD,IAAK,GACLE,MAAO,KACPC,OAAQ,KACRogB,QAAS,QACR,KAAM,EAAG,MACZ,QAAoB,IAAI,MAE9B,IAAA7e,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,OAAQ,IAAY,QAAiB2e,EAAO5c,OAAQ,GACvE4c,EAAY,QACR,WAAc,QAAoB,OAAQ,CACzCvf,IAAK,EACLpB,MAAO,qCACPpD,UAAWu0C,EAAqBxwB,IAC/B,KAAM,EAAG,MACZ,QAAoB,IAAI,UAIlC,mBAAmB,SAAUA,GAAW,EACtC,IAAA3e,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,MAAO,GAAY,CACpC2e,EAAY,QACR,WAAc,QAAoB,MAAO,CACxCvf,IAAK,EACLpB,MAAO,kCACP4D,IAAK+c,EAAOjd,MACZpD,IAAK,GACLE,MAAO,KACPC,OAAQ,KACRogB,QAAS,QACR,KAAM,EAAG,MACZ,QAAoB,IAAI,MAE9B,IAAA7e,GAAoB,MAAO,GAAa,EACtC,IAAAA,GAAoB,OAAQ,IAAa,QAAiB2e,EAAO5c,OAAQ,GACxE4c,EAAY,QACR,WAAc,QAAoB,OAAQ,CACzCvf,IAAK,EACLpB,MAAO,qCACPpD,UAAWu0C,EAAqBxwB,IAC/B,KAAM,EAAG,MACZ,QAAoB,IAAI,UAIlC3e,EAAG,GACF,EAAG,CAAC,aAAc,UAAW,eAAgB,CAElD,IEnIA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CAAEhC,MAAO,+FACtB,GAAa,CAAEA,MAAO,oFACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,sBAEH,GAAa,CAAEA,MAAO,oFACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,sBAEH,GAAa,CAAEA,MAAO,gGACtB,GAAa,CACjBoB,IAAK,EACLpB,MAAO,sBAEH,GAAa,CACjBoB,IAAK,EACLpB,MAAO,wCAEH,GAAa,CACjBoB,IAAK,EACLpB,MAAO,sBAQT,QAA4B,QAAiB,CAC3Ca,OAAQ,2BACR,KAAAE,CAAMC,GC/BR,MAAMW,GAAQ,UACRoJ,EAAOjU,OAAOC,6BAA6BgU,KAE3C0c,GAAoB,SAAS,IAAO9lB,EAAMkJ,QAAQonB,oBAAsBtwB,EAAMkJ,QAAQgnB,wBAA2BlwB,EAAMkJ,QAAQinB,0BAC/HnK,GAAmB,SAAS,IAAMhmB,EAAMkJ,QAAQ4mC,iBAChD7pB,GAAkB,SAAS,IAAMjmB,EAAMkJ,QAAQ6mC,iBDoCrD,MAAO,CAACzwC,EAAUC,MACR,WAAc,QAAoB,KAAW,KAAM,GACxD,WAAc,QAAa,KAAW,CAAE+J,GAAI,wCAA0C,EACrF,IAAAjJ,GAAoB,MAAO,GAAY,EACrC,IAAAA,GAAoB,MAAO,GAAY,CACpCylB,EAAuB,QACnB,WAAc,QAAoB,IAAK,OACvC,WAAc,QAAamD,GAAgB,CAC1CxpB,IAAK,EACLsmB,MAAOC,EAAiB9kB,OACvB,KAAM,EAAG,CAAC,cAEnB,IAAAb,GAAoB,MAAO,GAAY,CACpCylB,EAAuB,QACnB,WAAc,QAAoB,IAAK,OACvC,WAAc,QAAamD,GAAgB,CAC1CxpB,IAAK,EACLsmB,MAAOE,EAAgB/kB,OACtB,KAAM,EAAG,CAAC,YACjB,QAAiB,KAAM,SAAiB,QAAOkI,GAAM8c,aAAc,YAIxE,WAAc,QAAa,KAAW,CAAE5c,GAAI,uCAAyC,EACpF,IAAAjJ,GAAoB,MAAO,GAAY,CACpCylB,EAAuB,QACnB,WAAc,QAAoB,IAAK,OACvC,WAAc,QAAoB,OAAQ,GAAY,EACrD,QAAamD,GAAgB,CAAElD,MAAOC,EAAiB9kB,OAAS,KAAM,EAAG,CAAC,cAEhF,QAAiB,KAAM,SAAiB,QAAOkI,GAAM4mC,aAAe,MAAO,GAC1ElqB,EAAuB,QACnB,WAAc,QAAoB,IAAK,OACvC,WAAc,QAAamD,GAAgB,CAC1CxpB,IAAK,EACLsmB,MAAOE,EAAgB/kB,OACtB,KAAM,EAAG,CAAC,YACjB,QAAiB,KAAM,SAAiB,QAAOkI,GAAM8c,aAAc,SAGtE,IAEL,IElFA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,U,UCNEtnB,MAAM,6BACNG,QAAQ,YACRF,MAAM,KACNC,OAAO,KACP,cAAY,Q,IACZ,OAAgN,QAA1MJ,KAAK,OAAO6D,OAAO,UAAU9D,EAAE,2K,aAArC,I,mCAND,QAOM,MAPN,GADD,G,CCCA,MAAM,GAAS,CAAC,EAGV,IAA2B,OAAgB,GAAQ,CAAC,CAAC,SAAS,MAEpE,UCHA,MACM,GAAa,CAAEJ,MAAO,6BAU5B,QAA4B,QAAiB,CAC3Ca,OAAQ,qBACRF,MAAO,CACLc,UAAW,CAAC,EACZC,MAAO,CAAC,GAEV,KAAAX,CAAMC,GCXR,MAAML,EAAQ,EAERgB,GAAQ,UAEd,SAASC,IACRD,EAAME,OAAO,yBAA0BlB,EAAMc,UAC9C,CDeA,MAAO,CAACR,EAAUC,MACR,WAAc,QAAoB,SAAU,CAClDlB,MAAO,sBACPpH,KAAM,SACNkJ,QAASF,GACR,EACD,QAAagwC,KACb,IAAA5vC,GAAoB,OAAQ,IAAY,QAAiBf,EAAKS,OAAQ,KAG1E,IElCA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,UCLA,MACM,GAAa,CACjBN,IAAK,EACLpB,MAAO,+BAEH,GAAa,CAAC,SACd,GAAa,CAAC,SACd,GAAa,CAAC,SACd,GAAa,CAAC,SACd,GAAa,CAAC,SCmBd6xC,GAAe,KDQrB,QAA4B,QAAiB,CAC3ChxC,OAAQ,MACR,KAAAE,CAAMC,GClBR,MAAMW,GAAQ,UACRoJ,EAAOjU,OAAOC,6BAA6BgU,KAC3CxO,EAAOzF,OAAOC,6BAA6BwF,KAC3CvF,EAAOF,OAAOC,6BAA6BC,KAC3CozB,EAAWtzB,OAAOC,6BAA6BqzB,SAC/C0nB,EAAwBh7C,OAAOg7C,sBAC/BrM,GAAe,QAAwB,MAIvC13B,GAAQ,SAAS,IAAMpM,EAAMkJ,QAAQkD,QACrCkwB,GAAoB,SAAS,IAAMt8B,EAAMkJ,QAAQozB,oBACjDxwB,GAAa,SAAS,IAAM9L,EAAMkJ,QAAQ4C,aAC1Cf,GAAkB,SAAS,IAAM/K,EAAMkJ,QAAQ6B,kBAC/CqlC,GAAsB,SAAS,IAAMpwC,EAAMkJ,QAAQknC,sBACnDlT,GAAoB,SAAS,IAAMl9B,EAAMkJ,QAAQg0B,oBACjD0R,GAAuB,SAAS,IAAM5uC,EAAMkJ,QAAQ0lC,uBACpDyB,GAAe,SAAS,IAAMrwC,EAAMkJ,QAAQmnC,eAC5CC,GAAoB,SAAS,IAAMtwC,EAAMkJ,QAAQonC,oBACjDC,GAAqB,SAAS,IAAMvwC,EAAMkJ,QAAQqnC,qBAClDloB,GAAY,SAAS,IAAMroB,EAAMkJ,QAAQmf,YACzC6lB,GAAc,SAAS,IAAMluC,EAAMkJ,QAAQglC,cAC3C/gC,GAAkB,SAAS,IAAMnN,EAAMkJ,QAAQiE,kBAC/CqjC,GAAsB,SAAS,IAAMxwC,EAAMkJ,QAAQsnC,sBACnDC,GAAmB,SAAS,IAAMzwC,EAAMkJ,QAAQunC,mBAChDlB,GAAqB,SAAS,IAAMvvC,EAAMkJ,QAAQqmC,qBAClDmB,GAAoB,SAAS,IAAM1wC,EAAMkJ,QAAQwnC,oBAEvD,SAASC,EAAgB/lC,GACxB,OAAOG,EAAgB7J,QAAU0J,CAClC,CAEA,SAASq6B,EAASE,GACjBA,EAAKjkC,OAAO+c,eAAe,CAAEC,SAAU,UACxC,CD8CA,OC5CA,SAAUxgB,UAGT,MAAMkzC,EAAc,GAAGz7C,OAAOC,6BAA6B6pB,yBACrD4xB,QAAgBlzC,EAASizC,GAE/B5wC,EAAME,OAAO,UAAW,CAAE4wC,SAAU,WAAY/yC,KAAM8yC,IACtD7wC,EAAME,OAAO,wBAAyB2wC,GAEtC17C,QAAQif,WAAWld,KAAM,CACxBoX,MAAO,wBACP+F,cAAe,wBACfC,YAAa,UACbC,WAAYzZ,SAASsH,OACnB,KAGJ,QAAM2I,GAAiBrN,MAAOoR,EAAqBC,KAC9CD,IAAaC,IACXutB,EAAkBp7B,OACtB+jC,EAASnB,G,IDwBL,CAACxkC,EAAUC,KAChB,MAAMwxC,GAAoB,QAAkB,UACtCnU,GAA2B,QAAkB,iBAEnD,OAAQ,WAAc,QAAoB,MAAO,CAC/CpxB,GAAI,4BACJnN,MAAO,wBACPoD,QAAS,eACTC,IAAKoiC,GACJ,EACD,QAAakN,KACb,QAAaC,EAAoB,KAAM,CACrCpzC,SAAS,SAAS,IAAM,EACtB,QAAaqzC,GAAe,CAC1B,aAAa,QAAOnY,IAAWoY,WAC9B,CACDtzC,SAAS,SAAS,IAAM,EACtB,QAAauzC,KACb,QAAaL,EAAmB,CAC9BznC,GAAI,2BACJgC,UAAWgxB,EAAkBp7B,OAC5B,CACDrD,SAAS,SAAS,IAAM,EACtB,QAAawzC,GAAsB,CACjCvlC,WAAYA,EAAW5K,MACvB6K,KAAMmkC,IACL,KAAM,EAAG,CAAC,kBAEf7vC,EAAG,GACF,EAAG,CAAC,aACNi8B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWoY,aACzD,WAAc,QAAavU,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,GACX,QAAhByK,EAAMlL,QACF,WAAc,QAAaowC,GAAe,CAAE7xC,IAAK,MAClD,QAAoB,IAAI,IAC5B,QAAa8L,GAA8B,CACzC9B,OAAQ,GACRC,KAAM,UACL,CACD7L,SAAS,SAAS,IAAM,CACL,QAAhBuO,EAAMlL,QACF,WAAc,QAAaqwC,GAAa,CAAE9xC,IAAK,MAChD,QAAoB,IAAI,MAE9BY,EAAG,KAEJ,QAAO8vC,KAA0B,QAAOA,GAAuB/7C,OAAS,IACpE,WAAc,QAAoB,MAAO,GAAY,EACpD,QAAao9C,GAAoB,CAC/B,aAAc,wBACdzxC,OAAO,QAAOqJ,GAAMqoC,4BACnB,CACD5zC,SAAS,SAAS,IAAM,EACtB,SAAiB,SAAiB,QAAOuL,GAAMqoC,4BAA6B,MAE9EpxC,EAAG,GACF,EAAG,CAAC,WACP,QAAasL,GAAW,CACtB,aAAc,wBACdzQ,SAAS,QAAOi1C,IACf,KAAM,EAAG,CAAC,gBAEf,QAAoB,IAAI,MAE9B9vC,EAAG,GACF,EAAG,CAAC,cACU,KAAhB+L,EAAMlL,OAAgB0tC,EAAqB1tC,MAAM9M,OAAS,IACtD,WAAc,QAAa88C,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAWgW,WAC9B,CACDlxC,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWgW,aACzD,WAAc,QAAanS,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAa+vC,OAEfrxC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,GACX,KAAhB+L,EAAMlL,OAAgBquC,EAAmBruC,MAAM9M,OAAS,IACpD,WAAc,QAAa88C,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAWtS,UAC9B,CACD5oB,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWtS,YACzD,WAAc,QAAamW,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAagwC,OAEftxC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,GAC3B+vC,EAAyB,QACrB,WAAc,QAAac,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAW2B,YAC9B,CACD78B,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAW2B,aAA4C,WAA5BwC,EAAkBh8B,QAC3F,WAAc,QAAa07B,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAaiwC,OAEfvxC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,GAC3BowC,EAAsB,QAClB,WAAc,QAAaS,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAWiL,SAC9B,CACDnmC,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWiL,WACzD,WAAc,QAAapH,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAakwC,OAEfxxC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,GAC3BqwC,EAAuB,QACnB,WAAc,QAAaQ,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAWiQ,eAC9B,CACDnrC,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWiQ,iBACzD,WAAc,QAAapM,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAamwC,OAEfzxC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,GAC3BmwC,EAAyB,QACrB,WAAc,QAAaU,GAAe,CACzCzxC,IAAK,EACL,aAAa,QAAOs5B,IAAWxQ,YAC9B,CACD1qB,SAAS,SAAS,IAAM,CACrBy+B,EAAkBp7B,OAASyvC,GAAgB,QAAO5X,IAAWxQ,cACzD,WAAc,QAAaqU,EAA0B,CACpDn9B,IAAK,EACLkC,KAAM,+BAER,QAAoB,IAAI,IAC5B,QAAaowC,OAEf1xC,EAAG,GACF,EAAG,CAAC,gBACP,QAAoB,IAAI,MAE9BA,EAAG,KAEL,QAAa2xC,GAAiB,CAC5B7kC,gBAAiBA,EAAgBjM,MACjCumB,cAAc,QAAO7sB,GAAM6sB,aAC3Brb,MAAOikC,EAAanvC,MAAMkL,MAC1BN,WAAYA,EAAW5K,MACvBunB,UAAU,QAAOA,GACjBM,UAAU,QAAO1zB,GAAM0zB,SACvB7zB,QAAQ,QAAOG,GAAMH,OACrBq6B,cAAe8gB,EAAanvC,MAAMquB,eACjC,KAAM,EAAG,CAAC,kBAAmB,eAAgB,QAAS,aAAc,WAAY,WAAY,SAAU,kBAClE,KAAtC8gB,EAAanvC,MAAMsb,UAAUze,OACzB,WAAc,QAAoB,QAAS,CAC1C0B,IAAK,EACLxI,KAAM,SACN0K,KAAM,gCACNT,MAAOmvC,EAAanvC,MAAMsb,UAAUze,MACnC,KAAM,EAAG,MACZ,QAAoB,IAAI,IAC5B,IAAAsC,GAAoB,QAAS,CAC3BpJ,KAAM,SACN0K,KAAM,sBACNT,MAAOmvC,EAAanvC,MAAMkL,OACzB,KAAM,EAAG,KACZ,IAAA/L,GAAoB,QAAS,CAC3BpJ,KAAM,SACN0K,KAAM,6BACNT,MAAOgtC,EAAYhtC,OAClB,KAAM,EAAG,IACXqvC,EAAwB,QACpB,WAAc,QAAoB,QAAS,CAC1C9wC,IAAK,EACLxI,KAAM,SACN0K,KAAM,2BACNT,MAAOmnB,EAAUnnB,OAChB,KAAM,EAAG,MACZ,QAAoB,IAAI,IAC5B,IAAAb,GAAoB,QAAS,CAC3BpJ,KAAM,SACN0K,KAAM,sBACNT,MAAOovC,EAAkBpvC,OACxB,KAAM,EAAG,KACX,IAAK,CAEV,IE3TA,MAAM,IAA2B,OAAgB,GAAQ,CAAC,CAAC,YAAY,qBAEvE,ICHY+wC,GCFAC,GFKZ,M,oIGRe,MAAMC,GACpB,WAAA59C,CAAaoD,GACZlD,KAAKkD,KAAOA,CACb,CAEA,eAAOy6C,CAAUz6C,GAChB,OAAO,IAAIw6C,GAAMx6C,EAClB,CAEA,eAAO06C,CAAUC,GAChB,OAAO,IAAIH,GAA4B,IAAtBG,EAClB,CAEA,cAAOC,CAASC,GACf,OAAO,IAAIL,GAAuB,IAAjBK,EAClB,CAEA,qBAAOC,CAAgBr+C,EAAQyK,GAC9B,OAAO,IAAIszC,GAAM/9C,EAAOsB,QAAUmJ,EAAMnJ,QACzC,CAEA,KAAAw2B,GACC,OAAOz3B,KAAKkD,KAAO,GACpB,CAEA,MAAA+6C,GACC,OAAOj+C,KAAKkD,KAAO,GACpB,CAEA,MAAAg7C,GACC,OAAOl+C,KAAKkD,IACb,CAEA,GAAAhC,CAAKgC,GACJ,OAAO,IAAIw6C,GAAM19C,KAAKk+C,SAAWh7C,EAAKg7C,SACvC,GF9BD,SAAYV,GACX,aACA,aACA,UACA,EAJD,CAAYA,KAAAA,GAAK,KAMF,MAAMW,GACZC,cAER,WAAAt+C,CAAa0F,GAGLA,IACNA,EAAa,IAAI,KAAQD,OAAO28B,WAAW,EAAG,IAE/CliC,KAAKo+C,cAAgB,KAAQv1C,QAAQC,aAActD,EACpD,CAEA,MAAAwD,GACC,MAAO,CACNnJ,EAAOM,QAASH,KAAKo+C,cAAcp1C,OAAQ,IAC3CnJ,EAAOM,QAASH,KAAKo+C,cAAcp1C,OAAQ,IAE7C,CAEA,IAAAq1C,GACC,MAAO,CACNx+C,EAAOM,QAASH,KAAKo+C,cAAcC,KAAM,IACzCx+C,EAAOM,QAASH,KAAKo+C,cAAcC,KAAM,IAE3C,CAEA,GAAAC,GACC,MAAO,CACNz+C,EAAOM,QAASH,KAAKo+C,cAAcE,IAAK,IACxCz+C,EAAOM,QAASH,KAAKo+C,cAAcE,IAAK,IAE1C,CAEA,MAAAj0C,GACC,OAAOxK,EAAOM,QAASH,KAAKo+C,cAAc/zC,OAC3C,CAEA,KAAAD,GACC,OAAOvK,EAAOM,QAASH,KAAKo+C,cAAch0C,MAC3C,CAEA,UAAAm0C,CAAYC,EAAiBlnC,GAC5B,OAAOknC,EAAMz5C,KAAKoP,GAAQA,EAAM,MAAMmD,QACvC,CAEA,IAAApU,GACC,OAAOw6C,GAAKM,eAAgBh+C,KAAKqK,SAAUrK,KAAKoK,QACjD,GCvDD,SAAYqzC,GACX,uBACA,2BACA,sBACA,EAJD,CAAYA,KAAAA,GAAiB,KAKd,MAAMgB,GACHvb,WACAC,SACA73B,MACAgM,KACTrS,OACA2vC,MACSpyC,KAEjB,WAAA1C,CAAaojC,EAAoBC,EAAkB73B,EAAerG,EAAgB2vC,EAAQ,EAAGpyC,EAAOi7C,GAAkBr0C,QAASkO,EAAO,MACrItX,KAAKkjC,WAAaA,EAClBljC,KAAKmjC,SAAWA,EAChBnjC,KAAKsL,MAAQA,EACbtL,KAAKsX,KAAOA,EACZtX,KAAKiF,OAASA,EACdjF,KAAK40C,MAAQA,EACb50C,KAAKwC,KAAOA,CACb,CAEA,WAAAk8C,CAAYxZ,GACXllC,KAAKiF,OAAS,CAACjF,KAAKiF,OAAO,GAAGigC,EAAOllC,KAAKiF,OAAO,GAAGigC,EACrD,CAEA,QAAA9B,GACC,MAAMnhC,EAAQ,CAAC,EACTohC,EAAW,CAAC,EAEZsb,EAAW,IAAI,KAAQz8C,MAAMg8B,MAAKl+B,KAAKkjC,WAAYljC,KAAKmjC,UACxDvB,EAAQ,KAAQA,MAAMgd,gBAAgBD,GAGtCE,EAAiB,IAAI,KAAQ38C,MAAMg8B,MAAK,CAACl+B,KAAKkjC,WAAW,GAAIljC,KAAKkjC,WAAW,IAAK,CAACljC,KAAKkjC,WAAW,GAAM,EAAIljC,KAAK40C,MAAQ50C,KAAKkjC,WAAW,KAChJ,KAAQ5gC,KAAKg/B,OAAOud,EAAgBjd,EAAQ,GAAI5hC,KAAKkjC,YACrD,MAAM4b,EAAkB,IAAI,KAAQ58C,MAAMg8B,MAAK,CAACl+B,KAAKkjC,WAAW,GAAIljC,KAAKkjC,WAAW,IAAK,CAACljC,KAAKkjC,WAAW,GAAM,EAAIljC,KAAK40C,MAAQ50C,KAAKkjC,WAAW,KACjJ,KAAQ5gC,KAAKg/B,OAAOwd,EAAiBld,EAAQ,GAAI5hC,KAAKkjC,YAGtD,MAAM6b,EAAe,IAAI,KAAQ78C,MAAMg8B,MAAK,CAACl+B,KAAKmjC,SAAS,GAAInjC,KAAKmjC,SAAS,IAAK,CAACnjC,KAAKmjC,SAAS,GAAM,EAAInjC,KAAK40C,MAAQ50C,KAAKmjC,SAAS,KACtI,KAAQ7gC,KAAKg/B,OAAOyd,EAAcnd,EAAQ,GAAI5hC,KAAKmjC,UACnD,MAAM6b,EAAgB,IAAI,KAAQ98C,MAAMg8B,MAAK,CAACl+B,KAAKmjC,SAAS,GAAInjC,KAAKmjC,SAAS,IAAK,CAACnjC,KAAKmjC,SAAS,GAAM,EAAInjC,KAAK40C,MAAQ50C,KAAKmjC,SAAS,KAoBvI,OAnBA,KAAQ7gC,KAAKg/B,OAAO0d,EAAepd,EAAQ,GAAI5hC,KAAKmjC,UAGpD,KAAQlhC,MAAMqhC,QAAQrhC,EAAO08C,EAAU,aACvC,KAAQ18C,MAAMqhC,QAAQrhC,EAAO48C,EAAgB,oBAC7C,KAAQ58C,MAAMqhC,QAAQrhC,EAAO68C,EAAiB,qBAC9C,KAAQ78C,MAAMqhC,QAAQrhC,EAAO88C,EAAc,kBAC3C,KAAQ98C,MAAMqhC,QAAQrhC,EAAO+8C,EAAe,mBAE5C,KAAQ/8C,MAAMwhC,WAAWJ,EAAUrjC,KAAKsL,MAAOtL,KAAKkjC,WAAYljC,KAAKmjC,UAGnD,YAAdnjC,KAAKwC,OACR6gC,EAASK,MAAQ,SAGlB,KAAQzhC,MAAMgC,SAAShC,EAAOohC,EAAU,OACxC,KAAQphC,MAAM0hC,aAAa1hC,EAAO,CAACjC,KAAKiF,OAAO,GAAKjF,KAAK40C,MAAO50C,KAAKiF,OAAO,GAAKjF,KAAK40C,QAE/E3yC,CACR,CAEA,SAAAg9C,GACC,OAAO,KAAQp2C,QAAQq2C,cAAcl/C,KAAKkjC,WAAYljC,KAAKmjC,SAC5D,EEkBc,MAAegc,GACtBl9C,MAES0V,MACNynC,kBAAsC,CAAC,EACvCC,cAAwC,CAAC,EAE3Ct2C,gBAAkB,CACzB,QACA,cACA,qBACA,iBACA,wBACA,iCACA,mBACA,yBACA,QAWD,YAAuB4O,EAAekM,EAAqBkE,GAC1D/nB,KAAK2X,MAAQA,EAERkM,IACJ7jB,KAAKs/C,gBAAiBz7B,GACtB7jB,KAAKu/C,eAAgBx3B,GAEvB,CAKA,QAAAy3B,GACC,OAAOx/C,KAAK2X,KACb,CAKA,qBAAA8nC,GACC,OAAO,IAAItB,GAAen+C,KAAKiC,MAChC,CAKA,WAAAy9C,GACC,OAAK1/C,KAAK+I,gBAAgBnJ,SAAUI,KAAK2X,OACjCxU,EAAUnD,KAAKiC,OAGhBjC,KAAK2/C,2BAA2B32C,QACxC,CAKA,cAAA42C,GACC,MAAMC,EAAY9d,GAAsB,SAAU,CAAEzb,SAAU,MAI9D,OAFA,UAAcw5B,KAAMD,EAAW7/C,KAAK2/C,2BAA2BpB,WAAYv+C,KAAK0/C,cAAelC,GAAMuC,KAE9FF,CACR,CAOA,MAAAve,CAAQ0e,GACP,UAAc1e,OAAQthC,KAAKiC,MAAO+9C,EAAShgD,KAAK2/C,2BAA2BpB,WAAYv+C,KAAK0/C,cAAelC,GAAMuC,IAClH,CAOA,MAAAh2C,CAAQk2C,GAAe,GAKtB,OAJKA,GACJ,UAAch8C,SAAUjE,KAAKiC,MAAOjC,KAAK4/C,iBAAkB,iBAGrD5/C,KAAKiC,KACb,CAQA,oBAAAi+C,CAAsB19B,EAAmB/V,OAAQod,GAOhD,YANeA,IAAVpd,IACJA,EAAQzM,KAAKo/C,kBAAmBp/C,KAAKmgD,kBAAmB39B,KAGzD/V,EAAUA,aAAiB5M,EAAW4M,EAAMlM,QAAUkM,EAE/C/L,OAAOC,6BAA6BgU,KAAK8N,eAAgBD,GAAc,MAAQqhB,GAAcp3B,EACrG,CAKA,QAAA2zC,GACC,OAAOz6C,OAAOD,KAAM1F,KAAKiC,MAAMC,OAAQvC,OAAS,CACjD,CAQU,eAAA2/C,CAAiBz7B,GAC1B,IAAM,MAAMw8B,KAAYx8B,EAAY7jB,KAAK2X,OAMxC3X,KAAKo/C,kBAAmBiB,GALN,qBAAbA,GAAgD,gBAAbA,EAKHxgD,EAAOM,QAAS0iB,WAAYgB,EAAY7jB,KAAK2X,OAAS0oC,KAJrDx8B,EAAY7jB,KAAK2X,OAAS0oC,EAMlE,CAQU,cAAAd,CAAgBx3B,GACzB,IAAM,MAAMs4B,KAAYt4B,EAClB,CAAE,oBAAqB,OAAQ,QAASnoB,SAAUygD,GACtDrgD,KAAKo/C,kBAAmBiB,GAAat4B,EAAWs4B,GASjDrgD,KAAKo/C,kBAAmBiB,GALN,2BAAbA,EAKgCx9B,WAAYkF,EAAWs4B,KAJI,IAA1Bt4B,EAAWs4B,IAAiD,SAA1Bt4B,EAAWs4B,EAMrF,CAKA,WAAAC,GACC,MAAMjpC,EAAa,KAAWrX,KAAKo/C,mBAAqBmB,GAAeA,aAAqB1gD,EAAS0gD,EAAUhgD,QAAUggD,IAEpH,IAASlpC,KAIdrX,KAAKiC,MAAQ8/B,GAAsB/hC,KAAK2X,MAAON,GAC/CrX,KAAKiC,MAAMO,KAAOxC,KAAK2X,MACxB,CAEA,wBAAAgoC,GACC,OAAO,IAAIxB,GAAen+C,KAAKiC,MAChC,CAEA,sBAAAu+C,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SACvC,CAEA,SAAAC,GACC,MAAO,EACR,CAcA,cAAAvc,CAAewM,EAAmB5nC,EAAgBq7B,EAAiB,IAClE,MAAMuc,EAAU53C,EAAO,GACjB63C,EAAU73C,EAAO,GAEvB,MAAO,CACN,IAAIi6B,GAAW,CAAC2d,EAAUhQ,EAAQ,GAAG3vC,QAAS4/C,GAAU,CAACD,EAASC,GAAUhd,GAAa+M,EAAQ,GAAGrwC,SAAU,CAAC,EAAG,GAAI,qBAAuB8jC,EAAiB5G,GAAegjB,QAAUhjB,GAAer0B,SACtM,IAAI65B,GAAW,CAAC2d,EAASC,EAAUjQ,EAAQ,GAAG3vC,SAAW,CAAC2/C,EAASC,GAAUhd,GAAa+M,EAAQ,GAAGrwC,SAAU,CAAC,EAAG,GAAI,uBAAyB8jC,EAAiB5G,GAAegjB,QAAUhjB,GAAer0B,SAE3M,CAEA,aAAA03C,CAAczc,EAAiB,IAC9B,MAAO,EACR,CAEA,oBAAA0c,CAAqBhqC,EAAYstB,EAAwB2c,GAAc,GACtE,MAAMngC,EAASwjB,EAAezkC,SAAS,wBAA0BohD,EAAc,UAAY,GAC3F,OAAO3c,IAAmB,GAAGxjB,IAAS9J,IAAO0mC,GAAkBgD,QAAUhD,GAAkBr0C,OAC5F,CAKA,mBAAA63C,GACC,MAAO,CAAC,CACT,CAEA,yBAAAC,GACC,MAAO,CAAC,CACT,CAEA,mBAAAC,GACC,MAAO,EACR,CAEA,iBAAAhB,CAAmB39B,GAGlB,IAAO,IAASxiB,KAAKohD,oBAAuB,CAO3C,MAAMC,EAAmB,KAAQrhD,KAAKohD,oBAEtC,OAAOC,EAAkB7+B,IAAeA,C,CAGzC,OAAOA,CACR,CAEA,gBAAA4+B,GAOC,OAAOphD,KAAKq/C,aACb,E,gDC1UM,MAAMiC,WAAanC,GACRoC,MAEjB,WAAAzhD,CAAa+jB,EAAqB09B,EAAgBx5B,GACjDsf,MAAO,OAAQxjB,EAAYkE,GAE3B/nB,KAAKuhD,MAAQA,CACd,CAEA,WAAAjB,GACC,MAAMjpC,EAAa,KAAWrX,KAAKo/C,mBAAqBmB,GAAeA,aAAqB1gD,EAAS0gD,EAAUhgD,QAAUggD,IAEzH,IAAOvgD,KAAKuhD,QAAWlqC,EAAWzJ,OAAUyJ,EAAWyT,eACtD,OAGD,MAAM7oB,EAAQjC,KAAKwhD,gBAAiBxhD,KAAKuhD,MAAOlqC,GAE3C,IAASpV,KAIdjC,KAAKiC,MAAQjC,KAAKyhD,yBAA0Bx/C,GAC5CjC,KAAKiC,MAAMO,KAAO,OACnB,CAEA,eAAAg/C,CAAiBD,GAAO,KAAE3zC,EAAI,KAAEtE,EAAM0hB,kBAAmBD,EAAkBD,eAAgBD,IAC1F,IAAO02B,GAAS,IAASA,IAAW,IAAaj4C,GAChD,OAGD,MAAMqgB,EAAa43B,EAAMG,MAAMtF,GAAWA,EAAQC,WAAa/yC,IACzDsrC,EAAQ50C,KAAK2hD,eAAgBh4B,EAAWrgB,KAAMsE,EAAMid,EAAeE,GACnEuqB,EAAWz1C,EAAOM,QAAS0qB,EAAgB+pB,GAEjD,MAA0B,WAArB7pB,EACG/qB,KAAK4hD,sBAAuBj4B,EAAWrgB,KAAMsE,EAAM0nC,GAGpD,IAAI,WAAegM,MAAM33B,EAAWrgB,KAAM,KAAMsE,GAAQ0nC,EAASr0C,QACzE,CAEU,cAAA0gD,CAAgBr4C,EAAYsE,EAAcid,EAAuBE,GAC1E,MAAM82B,EAAc,IAAI,WAAeP,MAAMh4C,EAAMsE,EAAM/N,EAAOM,QAAS0qB,GAAgB5pB,SACnFgrC,EAAqB,YAAgBnjC,aAAc+4C,GAEnDC,EAAoC,WAArB/2B,EACpBlrB,EAAOM,QAAS8rC,EAAmB5hC,QAAS9J,QAC5CV,EAAOM,QAAS8rC,EAAmB7hC,OAAQ7J,QAE5C,OAAOuhD,EAAej3B,CACvB,CAUA,qBAAA+2B,CAAuBt4C,EAAYsE,EAAc0nC,GAChD,MAAM,cAAEyM,GAAkBrhD,OAAOC,6BAC3BqhD,EAAY,CAAEz8C,OAAQ,CAAC,GACvB08C,EAAQ,EAAI34C,EAAK44C,WAAa5M,EAASr0C,QAEvCkhD,EAAS,KAAe74C,EAAM,KAAMsE,GAAQ,CACjDw0C,MAAO,OACPC,WAAY/4C,EAAK44C,WACjB93C,MAAO,IAAIvK,EAAQkiD,EAAcO,eAAgB/hD,QAAU0hD,IAY5D,OATAE,EAAOI,OAAOz8C,SAAS,CAAE08C,EAAO1/C,KAC/B,MAAM2/C,EAAY,WAAenB,KAAKoB,aAAcF,EAAMr6C,KAAMmtC,EAASr0C,SACzEwhD,EAAU9/C,OAAS,UAAcs/C,MAAOO,EAAMhW,SAAUyV,GAExD,UAAch+C,SAAU+9C,EAAWS,EAAW3/C,EAAG,IAElD,UAAc+E,KAAMm6C,GACpB,UAAcl6C,UAAWk6C,GAElBA,CACR,CAEA,SAAAW,GACC,OAAO3iD,KAAKi/C,WACb,CAEA,SAAAA,GACC,OAAOj/C,KAAKy/C,wBAAwBpB,OAAQ,GAAIl9C,SAAUnB,KAAKy/C,wBAAwBnB,MAAO,IAAM18C,OACrG,CAEA,QAAAghD,GACC,OAAO5iD,KAAKy/C,wBAAwBpB,OAAQ,GAAIl9C,SAAUnB,KAAKy/C,wBAAwBnB,MAAO,IAAM18C,OACrG,CAEA,gBAAAihD,GACC,OAAO7iD,KAAKo/C,kBAAkBt0B,cAC/B,CAEA,iBAAAg4B,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAOhhD,KAAKiC,MAIL,CACN,IAAIw8C,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAKi/C,YAAYh+C,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAKi/C,YAAY1+C,SAAW,EAAE,GAAI,GAAIq0C,GACvI,IAAI6J,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,QAASlgD,KAAK4iD,WAAWriD,SAAW,CAAC,GAAI,IAAKq0C,IAL7H,EAOT,CAEA,wBAAA6M,CAA0BO,GACzB,IAAM,MAAO,CAAE//C,KAAU0D,OAAOohC,QAASib,EAAUz8C,QAClDtD,EAAO,YAAe,IAAIk8C,GAAel8C,GAG1C,OAAO+/C,CACR,CAEA,mBAAAe,GACC,OAAO/iD,KAAKo/C,kBAAkBp0B,iBAC/B,CAEA,oBAAAg4B,GACC,MAAO,CAAEl4B,eAAgB,GAC1B,CAEA,0BAAAm4B,CAA2BC,GAG1B,MAAO,CAAEp4B,eAAgBo4B,EAAYN,WAAWrhD,SAAU,IAAMhB,QACjE,CAEA,yBAAA2gD,GACC,MAAMiC,EAAmBnjD,KAAKihD,sBAE9B,MAAO,IAAKkC,EAAkBn4B,kBAAmB,QAClD,CAEA,mBAAAi2B,GACC,MAAM,aAAEnnB,EAAY,KAAEnlB,GAASjU,OAAOC,6BAChCyiD,EAAgB,IAAStpB,GAAyDnlB,EAAK/G,KAAKxE,QAAlD,GAAGuL,EAAK/G,KAAKxE,WAAW0wB,IAExE,MAAO,CACNxwB,KAAM,WACNsE,KAAMw1C,EACNp4B,kBAAmB,SAErB,EClKM,SAASq4B,IAAcC,KAAgBC,IAC7C,OAAOD,EAAYE,cAAgBD,EAAWx8C,KAAM,GACrD,CCqBO,MAAe08C,GACrB50B,MACArM,UACAkhC,SACAC,cACAC,QACAC,SACAC,QACAC,SACAjjC,SACArU,MAQA,YAAuB/H,GACtBiB,OAAOu2B,OAAQl8B,KAAM0E,EACtB,CAOA,QAAAs/C,GACC,OAAOhkD,KAAKikD,YAAcjkD,KAAK6uB,KAChC,CAOA,gBAAAq1B,GACC,GAAKlkD,KAAK2jD,cACT,OAAO3jD,KAAK2jD,aAEd,CAEA,SAAAM,GACC,OAAOjkD,KAAK8gB,SAAW,UAAY,EACpC,CAEA,YAAAqjC,GAGC,OAAO,IAAankD,KAAK0jD,WAAgB,IAAS1jD,KAAK0jD,SAAStC,oBAIpC,mBAAnBphD,KAAKwiB,WAAkCxiB,KAAK0jD,oBAAoBpC,GAASthD,KAAK0jD,SAASX,sBAAwB/iD,KAAKwiB,UAHrHxiB,KAAK0jD,SAAStC,mBAAoBphD,KAAKwiB,YAAexiB,KAAKwiB,SAIpE,CAEA,qBAAA4hC,GACC,OAAOpkD,KAAKwiB,UAAU6hC,MAAO,KAAMt/C,KAAKu/C,GAAkBjB,GAAYiB,KAAmBv9C,KAAM,GAChG,CAEA,iBAAAw9C,GACC,MAAM93C,EAAQzM,KAAK0jD,SAAU,MAAO1jD,KAAKokD,8BAAkC,KAE3E,MAA+B,qBAAxBpkD,KAAKmkD,gBAAyC13C,GAAmC,gBAAxBzM,KAAKmkD,gBAAoC13C,EACjGA,EAGCA,aAAiB5M,EAAW4M,EAAMlM,QAAU,CACtD,CAEA,iBAAA4/C,GACC,OAAOngD,KAAKwkD,iCAAiC3gC,WAAW4gC,OAAQzkD,KAAKmkD,eACtE,CAEA,8BAAAK,GACC,OAAO9jD,OAAOC,6BAA6BgU,KAAK+Z,UACjD,CAEA,WAAAg2B,GACC,OAAO1kD,KAAK8gB,QACb,EC1FM,MAAM6jC,WAA6BlB,GAExBmB,cAOjB,WAAA9kD,CAAa4E,GACZ2iC,MAAO3iC,GAEP,MAAM+H,EAAQ/H,EAAQ+H,OAASzM,KAAKukD,oBAEpC,GAAsB,kBAAV93C,EACX,MAAM,IAAImlC,MAAO,mEAGlB5xC,KAAKyM,MAAQA,EACbzM,KAAK4kD,cAAgBlgD,EAAQkgD,eAAiB,CAC/C,CAKA,UAAA91B,GACC,GAAKuY,MAAM6c,mBACV,OAAO7c,MAAM6c,mBAGd,MAAM,WAAErgC,GAAe7jB,KAAKwkD,iCAE5B,OAAO,EAAAnrB,GAAAA,SAASxV,EAAWhiB,SAAU7B,KAAKmgD,oBAAqBngD,KAAK4kD,cAAe,KACpF,CAKA,OAAAC,GACC,OAAOliC,GAAe3iB,KAAKyM,QAAWzM,KAAK4kD,aAC5C,EC7CM,MAAME,WAAqBrB,GAOjC,WAAA3jD,CAAY4E,GACX2iC,MAAM3iC,GAEN,MAAM+H,EAAQ/H,EAAQ+H,OAASzM,KAAKukD,oBAEpC,GAAqB,kBAAV93C,EACV,MAAM,IAAImlC,MAAM,2DAGjB5xC,KAAKyM,MAAQA,EACbzM,KAAK4jD,QAAU5jD,KAAK4jD,SAAW5jD,KAAK+kD,YACrC,CAEA,UAAAA,GACC,OAAO/kD,KAAK6jD,SAAS7jD,KAAKwiB,qBAAsB3iB,EAASG,KAAK6jD,SAAS7jD,KAAKwiB,WAAWjiB,QAAUP,KAAK6jD,SAAS7jD,KAAKwiB,UACrH,CAKA,UAAAsM,GACC,GAAIuY,MAAM6c,mBACT,OAAO7c,MAAM6c,mBAGd,MAAM,WAAErgC,GAAe7jB,KAAKwkD,iCAE5B,MAA4B,qBAAxBxkD,KAAKmkD,gBAAiE,gBAAxBnkD,KAAKmkD,gBAC/C,EAAA9qB,GAAAA,SAAQxV,EAAWviB,IAAKtB,KAAKmgD,oBAAqBngD,KAAK4jD,QAAS,KAGjE,EAAAvqB,GAAAA,SAAQxV,EAAWviB,IAAKtB,KAAKmgD,oBAAqBngD,KAAK4jD,QAAS,KACxE,CAKA,OAAAiB,GACC,MAAMp4C,GAASzM,KAAKyM,MACpB,OAAI+W,MAAM/W,IAGHA,GAASzM,KAAK4jD,OACtB,ECpDc,MAAMoB,GACpB,kBAAAC,GACC,MAAO,CACN,cACA,aACA,cACA,aAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,GACC,MAAO,CAAC,CAET,CAEA,UAAAC,GACC,MAAM,YAAEC,EAAW,WAAE39B,EAAU,YAAE49B,EAAW,WAAEx9B,GAAepnB,OAAOC,6BAA6BgU,KAAK8N,eAEtG,MAAO,CACN4iC,cACA39B,aACA49B,cACAx9B,aAEF,CAEA,cAAAy9B,GACC,MAAO,CACN/9B,YAAa,CAAEm9B,GAAsBG,IACrCp9B,WAAY,CAAEi9B,GAAsBG,IACpCl9B,YAAa,CAAE+8B,GAAsBG,IACrCh9B,WAAY,CAAE68B,GAAsBG,IAEtC,CAEA,YAAAU,GACC,MAAO,SACR,ECvCM,MAAMC,WAAqBhC,GAOjC,WAAA3jD,CAAY4E,GACX2iC,MAAM3iC,GAEN,MAAM+H,EAAQ/H,EAAQ+H,OAASzM,KAAKukD,oBAEpC,GAAqB,kBAAV93C,EACV,MAAM,IAAImlC,MAAM,2DAGjB5xC,KAAKyM,MAAQA,EACbzM,KAAK8jD,QAAU9jD,KAAK8jD,SAAW9jD,KAAK0lD,YACrC,CAEA,UAAAA,GACC,OAAO1lD,KAAK+jD,SAAS/jD,KAAKwiB,qBAAsB3iB,EAASG,KAAK+jD,SAAS/jD,KAAKwiB,WAAWjiB,QAAUP,KAAK+jD,SAAS/jD,KAAKwiB,UACrH,CAKA,UAAAsM,GACC,GAAIuY,MAAM6c,mBACT,OAAO7c,MAAM6c,mBAGd,MAAM,WAAErgC,GAAe7jB,KAAKwkD,iCAE5B,MAA4B,qBAAxBxkD,KAAKmkD,gBAAiE,gBAAxBnkD,KAAKmkD,gBAC/C,EAAA9qB,GAAAA,SAAQxV,EAAWziB,IAAKpB,KAAKmgD,oBAAqBngD,KAAK8jD,QAAS,KAGjE,EAAAzqB,GAAAA,SAAQxV,EAAWziB,IAAKpB,KAAKmgD,oBAAqBngD,KAAK8jD,QAAS,KACxE,CAKA,OAAAe,GAGC,GAAK7kD,KAAK0kD,cACT,OAAO,EAGR,MAAMj4C,GAASzM,KAAKyM,MACpB,OAAI+W,MAAM/W,IAGHA,GAASzM,KAAK8jD,OACtB,ECzDc,MAAM6B,GACpB,kBAAAV,GACC,MAAO,CACN,WAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNt/B,SAAUs/B,EAAkBC,oBAE9B,CAEA,UAAAT,GACC,MAAM,SAAE9+B,GAAa5lB,OAAOC,6BAA6BgU,KAAK8N,eAE9D,MAAO,CACN6D,WAEF,CAEA,cAAAi/B,GACC,MAAO,CACNj/B,SAAU,CAAEq+B,GAAsBG,GAAcW,IAElD,CAEA,YAAAD,GACC,MAAO,UACR,ECjCc,MAAMM,GACpB,kBAAAb,GACC,MAAO,CACN,QACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,UAAAT,GACC,MAAM,OAAE/6C,EAAM,MAAED,GAAU1J,OAAOC,6BAA6BgU,KAAK8N,eAEnE,MAAO,CACNpY,SACAD,QAEF,CAEA,cAAAm7C,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,YAAAD,GACC,MAAO,UACR,EClCc,MAAMQ,GACbC,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,WAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAMM,EAAgBN,EAAkBC,oBAClCM,EAAeP,EAAkBG,mBAGvC,MAAO,CACNz/B,SAAU,IAAIzmB,EAAOwB,KAAKC,IAAI6kD,EAAallD,QAASilD,EAAc3kD,SAAS,GAAGN,UAEhF,CAEA,sBAAAmlD,CAAwBxC,GACvB,MAAO,CACNt9B,SAAUzmB,EAAOM,QAAQyjD,GAE3B,CAEA,cAAA2B,GACC,MAAO,CACNj/B,SAAU,CAAEq+B,GAAsBG,GAAcW,IAElD,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,GAC7D,MAAO,CACN,IAAIY,GAAsB,CACzB91B,MAAO,uBACPrM,UAAW,WACXoiC,cAAe,EACflB,aAED,IAAIoB,GAAc,CACjBj2B,MAAO,uBACPrM,UAAW,WACXohC,UACAF,aAED,IAAI+B,GAAc,CACjB52B,MAAO,uBACPrM,UAAW,WACXkhC,WACAK,aAGH,CAEA,qBAAAuC,GACC,MAAO,EACR,CAEA,YAAAd,GACC,MAAO,UACR,EClEc,MAAMe,GACpB,kBAAAtB,GACC,MAAO,CACN,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAMM,EAAgBN,EAAkBC,oBAAoB5kD,QACtDklD,EAAeP,EAAkBG,mBAAmB9kD,QAEpDulD,EAAY,EAAI,EAAInlD,KAAKy8B,KAAM,GAAM,GACrC2oB,EAAYplD,KAAKy8B,KAAM,GAAM,EAAI,EAGjC4oB,EAAcR,EAAgBM,EAAaC,EAGjD,OAAKN,EAAeO,EACZ,CACNr8C,OAAQ,IAAIxK,EAAUsmD,EAAeM,EAAaD,IAI7C,CACNn8C,OAAQ,IAAIxK,EAAQqmD,GAEtB,CAEA,UAAAd,GACC,MAAM,OAAE/6C,GAAW3J,OAAOC,6BAA6BgU,KAAK8N,eAE5D,MAAO,CACNpY,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAEhD,CAEA,YAAAD,GACC,MAAO,SACR,EClDc,MAAMmB,GACpB,kBAAA1B,GACC,MAAO,CACN,cAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GAQvB,MAAMM,EAAgBN,EAAkBC,oBAAoB5kD,QAAU,EAEhE2lD,EAAsBV,GAC3B7kD,KAAKy8B,KAAM,GAAM,GAGlB,MAAO,CACNxW,YAAa,IAAIznB,EAAQ+mD,GAE3B,CAEA,UAAAxB,GACC,MAAM,YAAE99B,GAAgB5mB,OAAOC,6BAA6BgU,KAAK8N,eAEjE,MAAO,CACN6E,cAEF,CAEA,cAAAi+B,GACC,MAAO,CACNj+B,YAAa,CAAEq9B,GAAsBG,GAAcW,IAErD,CAEA,YAAAD,GACC,MAAO,UACR,EC9Cc,MAAMqB,GACpB,kBAAA5B,GACC,MAAO,CACN,OACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACN3+B,KAAM2+B,EAAkBG,mBACxB17C,OAAQu7C,EAAkBG,mBAE5B,CAEA,UAAAX,GACC,MAAM,MAAEh7C,EAAK,OAAEC,GAAW3J,OAAOC,6BAA6BgU,KAAK8N,eAEnE,MAAO,CACNrY,QACAC,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACNt+B,KAAM,CAAE09B,GAAsBG,GAAcW,IAC5Cp7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAEhD,CAEA,YAAAD,GACC,MAAO,UACR,ECxCc,MAAMsB,GACpB,kBAAA7B,GACC,MAAO,EACR,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,GACC,MAAO,CACN/6C,MAAO,IAAIvK,EAAQ,GACnBF,OAAQ,IAAIE,EAAQ,GAEtB,CAEA,UAAAulD,GACC,MAAO,CAAC,CACT,CAEA,cAAAG,GACC,MAAO,CAAC,CACT,CAEA,YAAAC,GACC,MAAO,EACR,ECvBc,MAAMuB,GACpB,kBAAA9B,GACC,MAAO,CACN,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GAGvB,MAAO,CACN//B,OAAQ+/B,EAAkBC,oBAE5B,CAEA,UAAAT,GACC,MAAM,OAAEv/B,GAAWnlB,OAAOC,6BAA6BgU,KAAK8N,eAE5D,MAAO,CACNoD,SAEF,CAEA,cAAA0/B,GACC,MAAO,CACN1/B,OAAQ,CAAE8+B,GAAsBG,GAAcW,IAEhD,CAEA,YAAAD,GACC,MAAO,UACR,ECnCc,MAAMwB,GACpB,kBAAA/B,GACC,MAAO,CACN,SACA,QAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNjmD,OAAQimD,EAAkBqB,aAC1B78C,MAAOw7C,EAAkBsB,YAE3B,CAEA,UAAA9B,GACC,MAAM,OAAEzlD,EAAM,MAAEyK,EAAK,OAAEC,GAAW3J,OAAOC,6BAA6BgU,KAAK8N,eAE3E,MAAO,CACN9iB,SACAyK,QACAC,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACN5lD,OAAQ,CAAEglD,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,YAAAD,GACC,MAAO,UACR,ECtCc,MAAM2B,GACpB,kBAAAlC,GACC,MAAO,CACN,OACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACN3+B,KAAM2+B,EAAkBqB,aACxB58C,OAAQu7C,EAAkBsB,YAE5B,CAEA,UAAA9B,GACC,MAAM,MAAEh7C,EAAK,OAAEC,GAAW3J,OAAOC,6BAA6BgU,KAAK8N,eAEnE,MAAO,CACNrY,QACAC,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACNt+B,KAAM,CAAE09B,GAAsBG,GAAcW,IAC5Cp7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAEhD,CAEA,YAAAD,GACC,MAAO,UACR,ECrCc,MAAM4B,GACpB,sBAAAC,GACC,MAAM,aAAEpX,GAAiBvvC,OAAOC,6BAEhC,OAAOsvC,EAAaqX,eAAgB,qBAAuB,4BAA8B,CAC1F,CAEA,kBAAArC,GACC,OAAKjlD,KAAKqnD,yBACF,CACN,SACA,QACA,kBACA,mBACA,qBACA,uBAIK,CACN,SACA,QACA,SAEF,CAEA,iBAAAnC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,EAAmB/hC,GAC1C,MAAM6a,EAAY7+B,EAAOM,QAAS0jB,EAAWzZ,OAAQ9I,IAAKzB,EAAOM,QAAS0jB,EAAWlkB,SAAW8B,OAAQ,GAExG,MAAO,CACN9B,OAAQimD,EAAkBqB,aAC1B78C,MAAOw7C,EAAkBsB,YACzBrhC,OAAQ6Y,EACR,iBAAoBA,EACpB,oBAAuBA,EACvB,mBAAsBA,EACtB,gBAAmBA,EAErB,CAEA,UAAA0mB,GACC,MAAM,OAAEzlD,EAAM,MAAEyK,EAAK,OAAEyb,EAAM,iBAAEE,EAAgB,oBAAEE,EAAmB,mBAAEE,EAAkB,gBAAEE,EAAe,OAAEhc,GAAW3J,OAAOC,6BAA6BgU,KAAK8N,eAE/J,MAAO,CACN9iB,SACAyK,QACAyb,SACAE,mBACAE,sBACAE,qBACAE,kBACAhc,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACN5lD,OAAQ,CAAEglD,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAC7C5/B,OAAQ,CAAE8+B,GAAsBc,IAChC,iBAAoB,CAAEd,GAAsBc,IAC5C,oBAAuB,CAAEd,GAAsBc,IAC/C,mBAAsB,CAAEd,GAAsBc,IAC9C,gBAAmB,CAAEd,GAAsBc,IAE7C,CAEA,YAAAD,GACC,MAAO,UACR,EChFc,MAAM+B,GACH34B,UACA44B,MACAh8B,QAAkB,GAClBi8B,OAUjB,WAAA3nD,CAAa8uB,EAAqB64B,EAAkBD,EAAeh8B,GAClExrB,KAAKynD,OAASA,EACdznD,KAAK4uB,UAAYA,EACjB5uB,KAAKwnD,MAAQA,EACbxnD,KAAKwrB,QAAUA,CAChB,CAOA,YAAAk8B,GACC,OAAO1nD,KAAK4uB,SACb,CAOA,QAAA+4B,GACC,OAAO3nD,KAAKwnD,KACb,CAOA,UAAA14B,GACC,OAAO9uB,KAAKwrB,OACb,CAOA,SAAAo8B,GACC,OAAO5nD,KAAKynD,MACb,EC/Cc,MAAMI,GACpB,kBAAA5C,GACC,MAAO,CACN,cACA,QACA,eAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBsB,YACzBxgC,YAAak/B,EAAkBG,mBAC/Bn/B,aAAcg/B,EAAkBG,mBAElC,CAEA,UAAAX,GACC,MAAM,MAAEh7C,EAAK,YAAEsc,EAAW,aAAEE,GAAiBlmB,OAAOC,6BAA6BgU,KAAK8N,eAEtF,MAAO,CACNrY,QACAsc,cACAE,eAEF,CAEA,cAAA2+B,GACC,MAAM,aAAEuC,GAAiBpnD,OAAOC,6BAA6BgU,KAAK+Z,WAAW7K,WAE7E,MAAO,CACN6C,YAAa,CAAEi+B,GAAsBc,IACrC7+B,aAAc,CAAE+9B,GAAsBc,IACtCr7C,MAAO,CAAEu6C,GAAsBc,IAC/BsC,QAAS,CACR,IAAIR,GACHzC,GACA,CAAE,cAAe,eAAgB,SACjC,2BACAgD,EAAaxmD,MAIjB,CAEA,YAAAkkD,GACC,MAAO,UACR,EClDM,MAAMwC,WAAqBvE,GACjCwE,OAQA,WAAAnoD,CAAa4E,GACZ2iC,MAAO3iC,GAEP,MAAMujD,EAASjoD,KAAK0jD,SAAS/C,YAE7B,IAAOsH,EAAOtoD,OACb,MAAM,IAAIiyC,MAAO,2EAGlB,MAAMnlC,EAAQ/H,EAAQ+H,OAASzM,KAAKukD,oBAEpC,GAAsB,kBAAV93C,EACX,MAAM,IAAImlC,MAAO,2DAGlB5xC,KAAKyM,MAAQA,EACbzM,KAAKioD,OAASA,CACf,CAEA,gBAAAC,GACC,MAAMC,EAAmBnoD,KAAKioD,OAAO3oD,QAAQs1C,GAASA,EAAMwT,iBAAmBpoD,KAAKmkD,iBAE9EkE,EAAgBF,EAAiB7oD,QAAQs1C,IAC9C,MAAM0T,EAActoD,KAAK0jD,SAAU,MAAO9O,EAAM2T,gBAAgBlE,MAAO,KAAMt/C,KAAKu/C,GAAkBjB,GAAYiB,KAAmBv9C,KAAM,UAAe,KAExJ,KAASuhD,aAAuBzoD,GAC/B,OAAO,EAGR,MAAM2oD,EAAkBxoD,KAAKyM,MAAQ67C,EAAY/nD,QAEjD,OAAOioD,EAAkB5T,EAAMA,KAAK,IAGrC,OAAOyT,CACR,CAKA,UAAAv5B,GACC,GAAKuY,MAAM6c,mBACV,OAAO7c,MAAM6c,mBAGd,MAAMuE,EAAezoD,KAAKkoD,mBAAoB,GAE9C,IAAOO,EACN,MAAO,GAGR,MAAM,WAAE5kC,GAAe7jB,KAAKwkD,iCAE5B,OAAKiE,EAAaL,iBAAmBpoD,KAAKmkD,gBAAyC,KAAvBsE,EAAa7T,OACjE,EAAAvb,GAAAA,SAASxV,EAAW+wB,MAAM8T,KAAM7kC,EAAW4gC,OAAQgE,EAAaL,gBAAkBvkC,EAAW4gC,OAAQgE,EAAaF,iBAAkBI,gBAGrI,EAAAtvB,GAAAA,SAASxV,EAAW+wB,MAAMtzC,IAAKuiB,EAAW4gC,OAAQgE,EAAaL,gBAAiBO,cAAe9kC,EAAW4gC,OAAQgE,EAAaF,iBAAkBI,cAAeF,EAAa7T,MACrL,CAKA,OAAAiQ,GACC,OAAS7kD,KAAKkoD,mBAAmBvoD,MAClC,EC3Ec,MAAMipD,GACpB,kBAAA3D,GACC,MAAO,CACN,QACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBC,oBACzBx7C,OAAQu7C,EAAkBG,mBAE5B,CAEA,UAAAX,GACC,MAAM,OAAE/6C,EAAM,MAAED,GAAU1J,OAAOC,6BAA6BgU,KAAK8N,eAEnE,MAAO,CACNrY,QACAC,SAEF,CAEA,cAAAk7C,GACC,MAAO,CACNn7C,MAAO,CAAEu6C,GAAsBG,GAAcW,GAAcuC,IAC3D39C,OAAQ,CAAEs6C,GAAsBG,GAAcW,GAAcuC,IAE9D,CAEA,YAAAxC,GACC,MAAO,UACR,ECtCc,MAAMqD,GACpB,kBAAA5D,GACC,MAAO,CACN,eACA,eAEF,CAEA,iBAAAC,GACC,MAAO,CACN,mBAEF,CAEA,sBAAAC,CAAwBS,GACvB,MAAMkD,EAAiBlD,EAAkBC,oBAAoBpkD,OAAQ,GAErE,MAAO,CACNymB,aAAa4gC,EACb1gC,aAAa0gC,EACbxgC,iBAAkB,GAEpB,CAEA,UAAA88B,GACC,MAAM,aAAEl9B,EAAY,aAAEE,EAAY,iBAAEE,GAAqB5nB,OAAOC,6BAA6BgU,KAAK8N,eAElG,MAAO,CACNyF,eACAE,eACAE,mBAEF,CAEA,cAAAi9B,GACC,MAAO,CACNr9B,aAAc,CAAEy8B,GAAsBG,GAAcW,IACpDr9B,aAAc,CAAEu8B,GAAsBG,GAAcW,IACpDn9B,iBAAkB,CAAEq8B,GAAsBG,GAAcW,IAE1D,CAEA,YAAAD,GACC,MAAO,SACR,EC5CM,MAAMuD,WAAyBtF,GAQrC,WAAA3jD,CAAa4E,GAGZ,GAFA2iC,MAAO3iC,GAEiB,SAAnB1E,KAAKwiB,UACT,MAAM,IAAIovB,MAAO,0EAGlB,KAAS5xC,KAAK0jD,oBAAoBpC,IACjC,MAAM,IAAI1P,MAAO,gFAGlB5xC,KAAKwiB,UAAYxiB,KAAKmkD,eACtB,MAAM13C,EAAQzM,KAAKukD,oBAEnB,GAAsB,kBAAV93C,EACX,MAAM,IAAImlC,MAAO,+DAGlB5xC,KAAKyM,MAAQA,EACbzM,KAAK8jD,QAAU9jD,KAAK+jD,SAAU/jD,KAAKmkD,gBAAiB5jD,OACrD,CAEA,YAAA4jD,GACC,OAAOnkD,KAAK0jD,SAASX,qBACtB,CAKA,UAAAj0B,GACC,MAAM,WAAEjL,GAAe7jB,KAAKwkD,iCAE5B,OAAO3gC,EAAWjW,KAAKo7C,MAAM5nD,GAC9B,CAKA,OAAAyjD,GACC,MAA2B,kBAAf7kD,KAAKyM,OAIVzM,KAAKyM,OAASzM,KAAK8jD,OAC3B,ECnDM,MAAMmF,WAAyBxF,GAQrC,WAAA3jD,CAAa4E,GAGZ,GAFA2iC,MAAO3iC,GAEiB,SAAnB1E,KAAKwiB,UACT,MAAM,IAAIovB,MAAO,0EAGlB,KAAS5xC,KAAK0jD,oBAAoBpC,IACjC,MAAM,IAAI1P,MAAO,gFAGlB5xC,KAAKwiB,UAAYxiB,KAAKmkD,eACtB,MAAM13C,EAAQzM,KAAKukD,oBAEnB,GAAsB,kBAAV93C,EACX,MAAM,IAAImlC,MAAO,+DAGlB5xC,KAAKyM,MAAQA,CACd,CAEA,YAAA03C,GACC,MAA+C,UAAxCnkD,KAAK0jD,SAASX,sBAAoC,SAAW,OACrE,CAKA,UAAAj0B,GACC,MAAM,WAAEjL,GAAe7jB,KAAKwkD,iCAE5B,OAAO,EAAAnrB,GAAAA,SAASxV,EAAWjW,KAAKo7C,MAAM1nD,IAAKtB,KAAK4jD,QAAS,KAC1D,CAKA,OAAAiB,GACC,MAA2B,kBAAf7kD,KAAKyM,OAIVzM,KAAKyM,OAASzM,KAAK4jD,OAC3B,ECnDc,MAAMsF,GACpB,kBAAAjE,GACC,MAAO,CACN,iBAEF,CAEA,iBAAAC,GACC,MAAO,CACN,OACA,OACA,oBAEF,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBqB,aACzB58C,OAAQu7C,EAAkBsB,YAE5B,CAEA,UAAA9B,GACC,MAAM,KAAE97C,EAAI,KAAEsE,EAAI,iBAAEmd,GAAqBrqB,OAAOC,6BAA6BgU,KAAK/G,MAC5E,OAAEvD,EAAM,MAAED,GAAU1J,OAAOC,6BAA6BgU,KAAK8N,eAEnE,MAAO,CACNnZ,OACAsE,OACAvD,SACAD,QACA4gB,kBAAmBD,EAErB,CAEA,cAAAw6B,GACC,MAAO,CACN33C,KAAM,CAAEq7C,GAAkBF,IAC1Bj+B,eAAgB,CAAE65B,GAAsBG,IAE1C,CAEA,YAAAU,GACC,MAAO,EACR,EC7Cc,MAAM2D,GACpB,kBAAAlE,GACC,MAAO,CACN,YACA,eACA,SACA,cAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACN9+B,UAAW8+B,EAAkBG,mBAC7B/+B,aAAc4+B,EAAkBG,mBAChC17C,OAAQu7C,EAAkBG,mBAC1B3+B,YAAaw+B,EAAkBG,mBAEjC,CAEA,UAAAX,GACC,MAAM,UAAEt+B,EAAS,aAAEE,EAAY,OAAE3c,EAAM,YAAE+c,GAAgB1mB,OAAOC,6BAA6BgU,KAAK8N,eAElG,MAAO,CACNqE,YACAE,eACA3c,SACA+c,cAEF,CAEA,cAAAm+B,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9C3+B,UAAW,CAAE69B,GAAsBG,GAAcW,IACjDz+B,aAAc,CAAE29B,GAAsBG,GAAcW,IAEtD,CAEA,YAAAD,GACC,MAAO,UACR,ECjDM,MAAM4D,GACK16B,WAEjB,WAAA5uB,CAAa4uB,GACZ1uB,KAAK0uB,WAAaA,CACnB,CAEA,UAAAI,GACC,OAAO9uB,KAAK0uB,WAAW3pB,KAAO6pB,GAAmCA,EAAUE,eAAe/nB,KAAM,IAAIrG,OAAOC,6BAA6BgU,KAAKs/B,MAC9I,CAEA,OAAA4Q,GACC,OAAO7kD,KAAK0uB,WAAW26B,MAAQz6B,GAAmCA,EAAUi2B,WAC7E,ECJc,MAAMyE,GACbrD,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,QACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzBlgC,OAAQ+/B,EAAkBG,mBAAmBtkD,OAAO,GAEtD,CAGA,+BAAA8nD,CAAiC1lC,GAChC,MAAM6a,EAAY7a,EAAWzZ,MAAQ,EACrC,MAAO,CACNyb,OAAQhmB,EAAOM,QAAQu+B,GAEzB,CAEA,sBAAA0nB,CAAwBxC,EAAiB//B,GACxC,MAAM2lC,EAA+B,EAApB3lC,EAAWgC,OAC5B,MAAO,CACNzb,MAAOvK,EAAOM,QAAQqpD,GACtB3jC,OAAQhmB,EAAOM,QAAQyjD,GAEzB,CAEA,cAAA2B,GACC,MAAO,CACN1/B,OAAQ,CAAE8+B,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,EAAkClgC,GAC/F,MAAM6a,EAAY7a,EAAWzZ,MAAQ,EAC/Bo/C,EAA+B,EAApB3lC,EAAWgC,OAE5B,MAAO,CACN,IAAIujC,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,mBACPrM,UAAW,SACXkhC,WACAK,SAAU,CACT35C,MAAO25C,EAAS35C,MAChByb,OAAQhmB,EAAOM,QAASu+B,MAG1B,IAAIomB,GAAc,CACjBj2B,MAAO,kBACPrM,UAAW,QACXkhC,WACAG,SAAU,CACTh+B,OAAQhmB,EAAOM,QAAQyjD,GACvBx5C,MAAOvK,EAAOM,QAAQqpD,QAIzB,IAAI7E,GAAsB,CACzB91B,MAAO,mBACPrM,UAAW,SACXoiC,cAAe,EACflB,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,kBACPrM,UAAW,QACXoiC,cAAe,EACflB,aAED,IAAI+B,GAAc,CACjB52B,MAAO,mBACPrM,UAAW,SACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,kBACPrM,UAAW,QACXohC,UACAF,aAED,IAAIoB,GAAc,CACjBj2B,MAAO,mBACPrM,UAAW,SACXohC,UACAF,aAED,IAAI+B,GAAc,CACjB52B,MAAO,kBACPrM,UAAW,QACXkhC,WACAK,aAGH,CAEA,qBAAAuC,CAAuB5C,EAAyB7/B,GAC/C,MAAM6a,EAAY7a,EAAWzZ,MAAQ,EAC/Bo/C,EAA+B,EAApB3lC,EAAWgC,OAE5B,MAAO,CACN,IAAIujC,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,mBACPrM,UAAW,SACXkhC,WACAK,SAAU,CACTl+B,OAAQhmB,EAAOM,QAASu+B,MAG1B,IAAIomB,GAAc,CACjBj2B,MAAO,kBACPrM,UAAW,QACXkhC,WACAG,SAAU,CACTz5C,MAAOvK,EAAOM,QAAQqpD,QAK3B,CAEA,YAAAhE,GACC,MAAO,UACR,EC3Ic,MAAMiE,GACpB,kBAAAxE,GACC,MAAO,CACN,SACA,YACA,eAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNv7C,OAAQu7C,EAAkBsB,YAC1BpgC,UAAW8+B,EAAkBG,mBAC7B/+B,aAAc4+B,EAAkBG,mBAElC,CAEA,UAAAX,GACC,MAAM,OAAE/6C,EAAM,UAAEyc,EAAS,aAAEE,GAAiBtmB,OAAOC,6BAA6BgU,KAAK8N,eAErF,MAAO,CACNpY,SACAyc,YACAE,eAEF,CAEA,cAAAu+B,GACC,MAAM,aAAEuC,GAAiBpnD,OAAOC,6BAA6BgU,KAAK+Z,WAAW7K,WAE7E,MAAO,CACNiD,UAAW,CAAE69B,GAAsBc,IACnCz+B,aAAc,CAAE29B,GAAsBc,IACtCp7C,OAAQ,CAAEs6C,GAAsBc,IAChCsC,QAAS,CACR,IAAIR,GACHzC,GACA,CAAE,YAAa,eAAgB,UAC/B,iCACAgD,EAAaxmD,MAIjB,CAEA,YAAAkkD,GACC,MAAO,UACR,ECnDc,MAAMkE,GACpB,kBAAAzE,GACC,MAAO,CACN,cAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAM+D,EAAiB,EAAItoD,KAAKy8B,KAAK,GAC/B8oB,EAAsBhB,EAAkBC,oBAAoB5kD,QAAU0oD,EAE5E,MAAO,CACNriC,YAAa,IAAIznB,EAAQ+mD,GAE3B,CAEA,UAAAxB,GACC,MAAM,YAAE99B,GAAgB5mB,OAAOC,6BAA6BgU,KAAK8N,eAEjE,MAAO,CACN6E,cAEF,CAEA,cAAAi+B,GACC,MAAO,CACNj+B,YAAa,CAAEq9B,GAAsBG,GAAcW,IAErD,CAEA,YAAAD,GACC,MAAO,UACR,ECjCc,MAAMoE,GACb3D,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,SACA,QAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNv7C,OAAQu7C,EAAkBG,mBAC1B37C,MAAOw7C,EAAkBC,oBAE3B,CAEA,+BAAA0D,CAAiC1lC,GAChC,MAAMgmC,EAAWhmC,EAAWxZ,OAAS,EACrC,MAAO,CACND,MAAOvK,EAAOM,QAAQ0pD,GAExB,CAEA,sBAAAzD,CAAwBxC,EAAiB//B,GACxC,MAAO,CACNxZ,OAAQxK,EAAOM,QAAQ0jB,EAAWzZ,MAAQ,GAC1CA,MAAOvK,EAAOM,QAAQyjD,GAExB,CAEA,cAAA2B,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,EAAkClgC,GAC/F,MAAMimC,EAAYjmC,EAAWzZ,MAAQ,EAC/By/C,EAAWhmC,EAAWxZ,OAAS,EAErC,MAAO,CACN,IAAI++C,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,gBACPrM,UAAW,QACXkhC,WACAK,SAAU,CACT35C,MAAOvK,EAAOM,QAAQ0pD,GACtBx/C,OAAQ05C,EAAS15C,UAGnB,IAAIy6C,GAAc,CACjBj2B,MAAO,iBACPrM,UAAW,SACXqhC,SAAU,CACTx5C,OAAQxK,EAAOM,QAAQ2pD,IAExBpG,eAGF,IAAIiB,GAAsB,CACzB91B,MAAO,iBACPrM,UAAW,SACXoiC,cAAe,EACflB,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,gBACPrM,UAAW,QACXoiC,cAAe,EACflB,aAED,IAAI+B,GAAc,CACjB52B,MAAO,gBACPrM,UAAW,QACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,gBACPrM,UAAW,QACXohC,UACAF,aAED,IAAIoB,GAAc,CACjBj2B,MAAO,iBACPrM,UAAW,SACXohC,UACAF,aAED,IAAI+B,GAAc,CACjB52B,MAAO,iBACPrM,UAAW,SACXkhC,WACAK,aAGH,CAEA,qBAAAuC,CAAuB5C,EAAyB7/B,GAC/C,MAAMimC,EAAYjmC,EAAWzZ,MAAQ,EAC/By/C,EAAWhmC,EAAWxZ,OAAS,EAErC,MAAO,CACN,IAAI++C,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,gBACPrM,UAAW,QACXkhC,WACAK,SAAU,CACT35C,MAAOvK,EAAOM,QAAQ0pD,MAGxB,IAAI/E,GAAc,CACjBj2B,MAAO,iBACPrM,UAAW,SACXqhC,SAAU,CACTx5C,OAAQxK,EAAOM,QAAQ2pD,IAExBpG,eAGF,IAAI+B,GAAc,CACjB52B,MAAO,gBACPrM,UAAW,QACXkhC,WACAK,SAAU,CACT35C,MAAOvK,EAAOM,QAAQ0pD,MAI1B,CAEA,YAAArE,GACC,MAAO,SACR,ECjJc,MAAMuE,GACpB,kBAAA9E,GACC,MAAO,CACN,QAEF,CAEA,iBAAAC,GACC,MAAO,CACN,cAEF,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBC,oBACzBvjB,YAAa,GAEf,CAEA,UAAA8iB,GACC,MAAM,MAAEh7C,EAAK,YAAEk4B,GAAgB5hC,OAAOC,6BAA6BgU,KAAK8N,eAExE,MAAO,CACNrY,QACAk4B,cAEF,CAEA,cAAAijB,GACC,MAAO,CACNn7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAC7CnjB,YAAa,CAAEqiB,GAAsBG,GAAcW,IAErD,CAEA,YAAAD,GACC,MAAO,UACR,ECnCc,MAAMwE,GACb/D,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,QACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,sBAAAO,CAAwBxC,GACvB,MAAO,CACNx5C,MAAOvK,EAAOM,QAASyjD,GACvBv5C,OAAQxK,EAAOM,QAASyjD,GAE1B,CAEA,cAAA2B,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,GAC7D,MAAO,CACN,IAAIY,GAAsB,CACzB91B,MAAO,aACPrM,UAAW,SACXkhC,WACAkB,cAAe,IAEhB,IAAIE,GAAc,CACjBj2B,MAAO,aACPrM,UAAW,SACXkhC,WACAE,YAED,IAAI6B,GAAc,CACjB52B,MAAO,aACPrM,UAAW,SACXkhC,WACAK,aAED,IAAIY,GAAsB,CACzB91B,MAAO,YACPrM,UAAW,QACXkhC,WACAkB,cAAe,IAEhB,IAAIE,GAAc,CACjBj2B,MAAO,YACPrM,UAAW,QACXkhC,WACAE,YAED,IAAI6B,GAAc,CACjB52B,MAAO,YACPrM,UAAW,QACXkhC,WACAK,aAGH,CAEA,qBAAAuC,GACC,MAAO,EACR,CAEA,YAAAd,GACC,MAAO,UACR,ECpFc,MAAMyE,GACpB,kBAAAhF,GACC,MAAO,CACN,QACA,aACA,gBAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAMO,EAAeP,EAAkBG,mBACjCl6B,EAAas6B,EAAa1kD,OAAO,GAAGR,QACpC8qB,EAAgBF,EAAeA,EAAa,EAElD,MAAO,CACNzhB,MAAOw7C,EAAkBC,oBACzBh6B,WAAY,IAAIhsB,EAAOgsB,GACvBE,cAAe,IAAIlsB,EAAOksB,GAE5B,CAEA,UAAAq5B,GACC,MAAM,MAAEh7C,EAAK,WAAEyhB,EAAU,cAAEE,GAAkBrrB,OAAOC,6BAA6BgU,KAAK8N,eAEtF,MAAO,CACNoJ,aACAE,gBACA3hB,QAEF,CAEA,cAAAm7C,GACC,MAAO,CACNn7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAC7C55B,WAAY,CAAE84B,GAAsBG,GAAcW,IAClD15B,cAAe,CAAE44B,GAAsBG,GAAcW,IAEvD,CAEA,YAAAD,GACC,MAAO,SACR,EC1Cc,MAAM0E,GACbjE,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,QACA,SACA,cAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAMuE,EAAevE,EAAkBC,oBACvC,MAAO,CACNz7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQ8/C,EACRl+B,YAAak+B,EAEf,CAEA,+BAAAZ,CAAiC1lC,GAChC,MAAMumC,EAAgBvmC,EAAWxZ,OAAS,EAC1C,MAAO,CACN4hB,YAAapsB,EAAOM,QAAQiqD,GAE9B,CAEA,sBAAAhE,CAAwBxC,EAAiB//B,GACxC,MAAO,CACNzZ,MAAOvK,EAAOM,QAAQyjD,GACtBv5C,OAAQxK,EAAOM,SAAS0jB,EAAWoI,YAAc,GACjDA,YAAapsB,EAAOM,QAAQyjD,GAE9B,CAEA,cAAA2B,GACC,MAAO,CACNn7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAC7Cp7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9Cx5B,YAAa,CAAE04B,GAAsBG,GAAcW,IAErD,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,EAAkClgC,GAC/F,MAAMumC,EAAgBvmC,EAAWxZ,OAAS,EACpCy/C,EAAYjmC,EAAWoI,YAAc,EAE3C,MAAO,CACN,IAAIm9B,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,qBACPrM,UAAW,cACXkhC,WACAK,SAAU,CACT93B,YAAapsB,EAAOM,QAAQiqD,GAC5B//C,OAAQ05C,EAAS15C,UAGnB,IAAIy6C,GAAc,CACjBj2B,MAAO,gBACPrM,UAAW,SACXkhC,WACAG,SAAU,CACTx5C,OAAQxK,EAAOM,QAAQ2pD,QAI1B,IAAInF,GAAsB,CACzB91B,MAAO,eACPrM,UAAW,QACXoiC,cAAe,EACflB,aAED,IAAI+B,GAAc,CACjB52B,MAAO,eACPrM,UAAW,QACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,eACPrM,UAAW,QACXohC,UACAF,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,gBACPrM,UAAW,SACXoiC,cAAe,EACflB,aAED,IAAI+B,GAAc,CACjB52B,MAAO,gBACPrM,UAAW,SACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,gBACPrM,UAAW,SACXohC,UACAF,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,qBACPrM,UAAW,cACXoiC,cAAe,EACflB,aAED,IAAIoB,GAAc,CACjBj2B,MAAO,qBACPrM,UAAW,cACXohC,UACAF,aAED,IAAI+B,GAAc,CACjB52B,MAAO,qBACPrM,UAAW,cACXkhC,WACAK,aAGH,CAEA,qBAAAuC,CAAuB5C,EAAyB7/B,GAC/C,MAAMumC,EAAgBvmC,EAAWxZ,OAAS,EACpCy/C,EAAYjmC,EAAWoI,YAAc,EAE3C,MAAO,CACN,IAAIm9B,GAAY,CACf,IAAI3D,GAAc,CACjB52B,MAAO,qBACPrM,UAAW,cACXkhC,WACAK,SAAU,CACT93B,YAAapsB,EAAOM,QAAQiqD,MAG9B,IAAItF,GAAc,CACjBj2B,MAAO,gBACPrM,UAAW,SACXkhC,WACAG,SAAU,CACTx5C,OAAQxK,EAAOM,QAAQ2pD,QAK5B,CAEA,YAAAtE,GACC,MAAO,UACR,EC5Jc,MAAM6E,GACbpE,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,YACA,eACA,aACA,gBAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAMO,EAAeP,EAAkBG,mBACjCl6B,EAAas6B,EAAa1kD,OAAO,GAAGR,QACpC8qB,EAAgBF,EAAeA,EAAa,EAE5C/E,EAAY8+B,EAAkBC,oBAAoB5kD,QAAU,EAElE,MAAO,CACN6lB,UAAW,IAAIjnB,EAAOinB,GACtBE,aAAc4+B,EAAkBC,oBAChCh6B,WAAY,IAAIhsB,EAAOgsB,GACvBE,cAAe,IAAIlsB,EAAOksB,GAE5B,CAGA,+BAAAw9B,CAAiC1lC,GAChC,MAAMymC,EAAczmC,EAAWmD,aAAe,EAC9C,MAAO,CACNF,UAAWjnB,EAAOM,QAAQmqD,GAE5B,CAEA,sBAAAlE,CAAwBxC,EAAiB//B,GACxC,MAAO,CACNiD,UAAWjnB,EAAOM,QAAQyjD,GAC1B58B,aAAcnnB,EAAOM,QAAQ0jB,EAAWiD,WACxC+E,WAAYhsB,EAAOM,QAAQyjD,GAC3B73B,cAAelsB,EAAOM,QAAQyjD,GAEhC,CAEA,cAAA2B,GACC,MAAO,CACNz+B,UAAW,CAAE69B,GAAsBG,GAAcW,IACjDz+B,aAAc,CAAE29B,GAAsBG,GAAcW,IACpD55B,WAAY,CAAE84B,GAAsBG,GAAcW,IAClD15B,cAAe,CAAE44B,GAAsBG,GAAcW,IAEvD,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,EAAkClgC,GAC/F,MAAMymC,EAAczmC,EAAWmD,aAAe,EACxCujC,EAAiB1mC,EAAWiD,UAAY,EAE9C,MAAO,CACN,IAAIsiC,GAAa,CAChB,IAAI3D,GAAc,CACjB52B,MAAO,kBACPrM,UAAW,YACXkhC,WACAK,SAAU,CACTj9B,UAAWjnB,EAAOM,QAAQmqD,GAC1BtjC,aAAc+8B,EAAS/8B,gBAGzB,IAAI89B,GAAc,CACjBj2B,MAAO,qBACPrM,UAAW,eACXkhC,WACAG,SAAU,CACT78B,aAAcnnB,EAAOM,QAAQoqD,QAIhC,IAAI9E,GAAc,CACjB52B,MAAO,kBACPrM,UAAW,YACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,qBACPrM,UAAW,eACXohC,UACAF,aAED,IAAI+B,GAAc,CACjB52B,MAAO,mBACPrM,UAAW,aACXkhC,WACAK,aAED,IAAIe,GAAc,CACjBj2B,MAAO,sBACPrM,UAAW,gBACXohC,UACAF,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,kBACPrM,UAAW,YACXoiC,cAAe,EACflB,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,qBACPrM,UAAW,eACXoiC,cAAe,EACflB,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,mBACPrM,UAAW,aACXoiC,cAAe,EACflB,aAED,IAAIiB,GAAsB,CACzB91B,MAAO,sBACPrM,UAAW,gBACXoiC,cAAe,EACflB,aAGH,CAEA,qBAAA4C,CAAuB5C,EAAyB7/B,GAC/C,MAAMymC,EAAczmC,EAAWmD,aAAe,EACxCujC,EAAiB1mC,EAAWiD,UAAY,EAE9C,MAAO,CACN,IAAIsiC,GAAa,CAChB,IAAI3D,GAAc,CACjB52B,MAAO,kBACPrM,UAAW,YACXkhC,WACAK,SAAU,CACTj9B,UAAWjnB,EAAOM,QAAQmqD,MAG5B,IAAIxF,GAAc,CACjBj2B,MAAO,qBACPrM,UAAW,eACXkhC,WACAG,SAAU,CACT78B,aAAcnnB,EAAOM,QAAQoqD,QAKlC,CAEA,YAAA/E,GACC,MAAO,SACR,ECjKc,MAAMgF,GACbvE,kBAAmB,EAE1B,kBAAAhB,GACC,MAAO,CACN,QACA,SAEF,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,sBAAAO,CAAwBxC,GACvB,MAAO,CACNx5C,MAAOvK,EAAOM,QAASyjD,GACvBv5C,OAAQxK,EAAOM,QAASyjD,GAE1B,CAEA,cAAA2B,GACC,MAAO,CACNl7C,OAAQ,CAAEs6C,GAAsBG,GAAcW,IAC9Cr7C,MAAO,CAAEu6C,GAAsBG,GAAcW,IAE/C,CAEA,kBAAAY,CAAoB3C,EAAyBE,EAAiBG,GAC7D,MAAO,CACN,IAAIY,GAAsB,CACzB91B,MAAO,uBACPrM,UAAW,SACXkhC,WACAkB,cAAe,IAEhB,IAAIE,GAAc,CACjBj2B,MAAO,uBACPrM,UAAW,SACXkhC,WACAE,YAED,IAAI6B,GAAc,CACjB52B,MAAO,uBACPrM,UAAW,SACXkhC,WACAK,aAED,IAAIY,GAAsB,CACzB91B,MAAO,sBACPrM,UAAW,QACXkhC,WACAkB,cAAe,IAEhB,IAAIE,GAAc,CACjBj2B,MAAO,sBACPrM,UAAW,QACXkhC,WACAE,YAED,IAAI6B,GAAc,CACjB52B,MAAO,sBACPrM,UAAW,QACXkhC,WACAK,aAGH,CAEA,qBAAAuC,GACC,MAAO,EACR,CAEA,YAAAd,GACC,MAAO,UACR,EC/Dc,MAAMiF,GACpB,iBAAAntB,CAAmB3lB,GAClB,OAAQA,GACP,IAAK,QACJ,OAAO,IAAIqtC,GACZ,IAAK,SACJ,OAAO,IAAIW,GACZ,IAAK,MACJ,OAAO,IAAIqE,GACZ,IAAK,UACJ,OAAO,IAAIlE,GACZ,IAAK,YACJ,OAAO,IAAIwD,GACZ,IAAK,cACJ,OAAO,IAAItD,GACZ,IAAK,QACJ,OAAO,IAAIO,GACZ,IAAK,UACJ,OAAO,IAAII,GACZ,IAAK,UACJ,OAAO,IAAI+C,GACZ,IAAK,UACJ,OAAO,IAAIK,GACZ,IAAK,qBACJ,OAAO,IAAIlD,GACZ,IAAK,iBACJ,OAAO,IAAIE,GACZ,IAAK,YACJ,OAAO,IAAIC,GACZ,IAAK,wBACL,IAAK,iCACJ,OAAO,IAAIG,GACZ,IAAK,oBACJ,OAAO,IAAIC,GACZ,IAAK,mBACJ,OAAO,IAAIS,GACZ,IAAK,yBACJ,OAAO,IAAI4B,GACZ,IAAK,mBACJ,OAAO,IAAIb,GACZ,IAAK,OACJ,OAAO,IAAIC,GACZ,IAAK,OACJ,OAAO,IAAIK,GACZ,IAAK,YACJ,OAAO,IAAIC,GACZ,IAAK,OACJ,OAAO,IAAIc,GACZ,IAAK,SACJ,OAAO,IAAIC,GACZ,IAAK,QACJ,OAAO,IAAIG,GACZ,IAAK,UACJ,OAAO,IAAIT,GACZ,IAAK,gBACJ,OAAO,IAAIY,GACZ,QACC,OAAO,IAAI1D,GAEd,ECtFc,MAAM4D,GACpB,eAAAhyC,CAAkBf,EAAeikC,EAAc+O,EAAgB,MAC9D,GAAe,QAAVhzC,EACJ,OAAyB,OAAlBgzC,EAGR,IAAK/O,EAAa/3B,WAAWlM,GAC5B,OAAO,EAGR,MAAMizC,EAAwB5qD,KAAK6qD,mBAAoBlzC,GAAQiK,QAAQ,CAAEhK,EAAYkzC,KACpF,MAAMl1B,EAAiBgmB,EAAa/3B,WAAYlM,GAASmzC,GAEzD,OAAOlzC,IAAgB4L,MAAOoS,EAAgB,GAClC,KAAVje,GAEH,OAAO3X,KAAK+qD,kBAAmBpzC,GAAQiK,QAAQ,CAAEhK,EAAYozC,KAC5D,MAAMp1B,EAAiBgmB,EAAa7zB,UAAWijC,GAE/C,OAAOpzC,KAAiBge,CAAc,GACpCg1B,EACJ,CAEA,kBAAAC,CAAqBlzC,GACpB,OAAO,IAAM8yC,IAA8BntB,kBAAmB3lB,GAAQstC,oBACvE,CAEA,iBAAA8F,CAAmBpzC,GAClB,OAAO,IAAI8yC,IAA4BntB,kBAAkB3lB,GAAOutC,mBACjE,ECnBc,MAAM+F,GACJtzC,MACAi5B,QACAvmB,WACAxG,WACAkE,UACA27B,SAWhB,WAAA5jD,CAAa6X,EAAekM,EAAoBkE,EAAmBsC,EAA8Bq5B,EAA0B,MAC1H1jD,KAAK2X,MAAQA,EACb3X,KAAK6jB,WAAaA,EAAWlM,GAC7B3X,KAAK+nB,UAAYA,EACjB/nB,KAAKqqB,WAAaA,EAClBrqB,KAAK0jD,SAAWA,EAChB1jD,KAAK4wC,QAAU,CACd,IAAI/wC,EAAQwqB,EAAWgkB,kBACvB,IAAIxuC,EAAQwqB,EAAWikB,oBAEzB,CAEO,cAAA4c,GACN,OAAOlrD,KAAK0jD,QACb,CAEA,gBAAAtC,GACC,OAAOphD,KAAKkrD,iBAAiB9J,kBAC9B,ECjCD,SAAS+J,KACR,MAAM3pC,EAAgB9gB,OAAOC,6BAA6B6gB,cACpDqC,EAAa,CAAC,EAMpB,OAJArC,EAAc1b,SAAWslD,IACxBvnC,EAAYunC,GAAiB,CAAC,CAAC,IAGzBvnC,CACR,CAEA,ICjBYwnC,GDiBZ,IACCtzC,MAAO,KAAc,CACpBg3B,WAAYD,GAAYI,KACxBX,YAAa,GACbF,iBAAkB,EAClBC,mBAAoB,EACpBE,eAAgB,EAChB8c,mBAAoB,CACnBznC,WAAYsnC,KACZpjC,UAAW,CAAC,GAEbwjC,yBAAyB,EACzBhc,QAAS,GACTC,mBAAoB,IAErBgc,UAAW,CACV,gBAAAvc,CAAkBl3B,EAAOg3B,GACxBh3B,EAAMg3B,WAAaA,CACpB,EACA,sBAAA0c,CAAwB1zC,EAAOs2B,IACK,IAA9Bt2B,EAAMy3B,oBAA+B,IAAaz3B,EAAMw3B,QAAQx3B,EAAMy3B,uBAC1Ez3B,EAAMw3B,QAAQx3B,EAAMy3B,oBAAoBnB,iBAAmBA,GAG5Dt2B,EAAMs2B,iBAAmBA,CAC1B,EACA,wBAAAqd,CAA0B3zC,EAAOu2B,IACG,IAA9Bv2B,EAAMy3B,oBAA+B,IAAaz3B,EAAMw3B,QAAQx3B,EAAMy3B,uBAC1Ez3B,EAAMw3B,QAAQx3B,EAAMy3B,oBAAoBlB,mBAAqBA,GAG9Dv2B,EAAMu2B,mBAAqBA,CAC5B,EACA,oBAAAqd,CAAsB5zC,EAAOy2B,IACO,IAA9Bz2B,EAAMy3B,oBAA+B,IAAaz3B,EAAMw3B,QAAQx3B,EAAMy3B,uBAC1Ez3B,EAAMw3B,QAAQx3B,EAAMy3B,oBAAoBhB,eAAiBA,GAG1Dz2B,EAAMy2B,eAAiBA,CACxB,EACA,iBAAAod,CAAmB7zC,EAAOw2B,GACzBx2B,EAAMw2B,YAAcA,EAGpBx2B,EAAMuzC,mBAAmBvjC,UAAY,CAAC,CACvC,EACA,qBAAA8jC,CAAuB9zC,GAAO,UAAEyK,EAAS,MAAE/V,IAGf,SAAtBsL,EAAMw2B,cACVx2B,EAAMw2B,YAAc,aAGC,kBAAV9hC,IACXA,EAAQA,EAAM5L,QAAS,IAAK,MAI7BkX,EAAMuzC,mBAAmBznC,WAAa,KAAO9L,EAAMuzC,mBAAmBznC,YAAY,CAACtf,EAAgBunD,EAAsBn0C,KAGxH,MAAMo0C,EAAY,IAAKxnD,GAEvB,GAAIoT,IAAUI,EAAMw2B,YAAa,CAGhC,MAAMl0B,EAAW,IAAKyxC,GACtBzxC,EAASmI,GAAanhB,KAAKO,MAAc,GAAR6K,GAAc,GAC/Cs/C,EAAUp0C,GAAS0C,C,MAInB0xC,EAAUp0C,GAASm0C,EAGpB,OAAOC,CAAS,GACd,CAAC,EACL,EACA,2BAAAC,CAA6Bj0C,GAAO,MAAEJ,EAAK,WAAEkM,IAC5C9L,EAAMuzC,mBAAmBznC,WAAa,IAAK9L,EAAMuzC,mBAAmBznC,WACnE,CAAClM,GAAQkM,EAEX,EACA,kBAAAooC,CAAoBl0C,GAAO,UAAEgQ,IAC5BhQ,EAAMuzC,mBAAmBvjC,UAAY,IAAKhQ,EAAMuzC,mBAAmBvjC,aAAcA,EAClF,EACA,oBAAAmkC,CAAsBn0C,EAAOJ,GAC5BI,EAAMuzC,mBAAmBznC,WAAYlM,GAAU,CAAC,CACjD,EACA,oBAAAw0C,CAAsBp0C,GAAO,SAAEwQ,EAAQ,MAAE9b,IACxCsL,EAAMuzC,mBAAmBvjC,UAAUQ,GAAY9b,CAChD,EACA2/C,mCAAoC,CAAEr0C,EAAOs0C,IAAwBt0C,EAAMwzC,wBAA0Bc,EACrG,SAAA/b,CAAWv4B,EAAOuK,GACjBvK,EAAMw3B,QAAU,IAAIx3B,EAAMw3B,QAASjtB,EACpC,EACA,aAAAgqC,CAAev0C,EAAOw3B,GACrBx3B,EAAMw3B,QAAUA,CACjB,EACA,iBAAAgd,CAAmBx0C,EAAOhS,GACzBgS,EAAMy3B,mBAAqBzpC,CAC5B,EACA,mBAAAymD,CAAqBz0C,GAAO,MAAEhS,EAAK,OAAEuc,IAIpCvK,EAAMw3B,QAAU,IACZx3B,EAAMw3B,QAAQna,MAAM,EAAGrvB,GAC1Buc,KACGvK,EAAMw3B,QAAQna,MAAMrvB,EAAQ,GAEjC,EACA,mBAAA0mD,CAAqB10C,EAAOhS,GAG3BgS,EAAMw3B,QAAU,IACZx3B,EAAMw3B,QAAQna,MAAM,EAAGrvB,MACvBgS,EAAMw3B,QAAQna,MAAMrvB,EAAQ,GAEjC,GAED0O,QAAS,CACRi4C,cAAiB30C,GAAuBhS,GAAmBgS,EAAMw3B,QAASxpC,GAC1E4mD,cAAe,CAAE50C,EAAOtD,IAAqBA,EAAQi4C,cAAe30C,EAAMy3B,oBAC1EnB,iBAAoBt2B,GAAmBA,EAAMs2B,iBAC7CC,mBAAsBv2B,GAAmBA,EAAMu2B,mBAC/CE,eAAkBz2B,GAAmBA,EAAMy2B,eAC3Ce,QAAWx3B,GAAqBA,EAAMw3B,QACtCC,mBAAsBz3B,GAAmBA,EAAMy3B,mBAC/CT,WAAch3B,GAAwBA,EAAMg3B,WAC5CR,YAAex2B,GAAmBA,EAAMw2B,YACxC+c,mBAAsBvzC,GAAmBA,EAAMuzC,mBAC/CsB,gBAAmB70C,GAAmBA,EAAMuzC,mBAAmBvjC,UAC/D8kC,iBAAkB,CAAE90C,GAASw2B,iBAA2Bx2B,EAAMuzC,mBAAmBznC,WAAY0qB,GAC7Fue,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,IAC9Bt4C,EAAQ85B,eAAewe,EAAUC,WAC9Bv4C,EAAS,GAAGA,EAAQ85B,gCAGrB,IACH3qB,GAAcnP,EAAQ62C,mBAAmBznC,WAAYpP,EAAQ85B,iBAC7D95B,EAAQ62C,mBAAmBvjC,WAGhCklC,uBAAwB,CAAEl1C,EAAOtD,KAChC,MAAM86B,EAAU96B,EAAQ86B,QAClB9+B,EAAS,GACTkE,EAAOjU,OAAOC,6BAA6BgU,KAEjD,IAAM,MAAM2N,KAAUitB,EACrB9+B,EAAOhO,KAAKkS,EAAKuN,WAAWI,EAAO3K,QAEpC,OAAOlH,EAAO1J,KAAK,KAAK,EAEzBonC,2BAA4B,CAAEp2B,EAAOtD,KAC5B,CAAC,UAAU7U,SAAU6U,EAAQ85B,aAEtCjsB,OAAQ,EAAIysB,cAAct6B,KACzB,GAAKs6B,IAAeD,GAAYI,KAC/B,OAAO,KAGR,MAAM,YAAEX,EAAW,mBAAE+c,EAAkB,cAAE4B,EAAa,iBAAE7e,EAAgB,mBAAEC,EAAkB,eAAEE,GAAkB/5B,EAE1G04C,EAAiB,IAAIzC,GAE3B,IAAMyC,EAAez0C,gBAAiB61B,EAAa+c,GAClD,OAAO,KAGR,MAAM5H,EAAWwJ,EAAe3e,EAAa+c,GAE7C,GAAK,IAAa5H,GACjB,OAAO,KAGR,MAAM,WAAE7/B,EAAU,UAAEkE,GAAcujC,EAE5B8B,EAAiB,IAAInC,GAAQ1c,EAAa1qB,EAAYkE,EAAW,CACtEsmB,mBACAC,qBACAp1B,SAAUs1B,GACRkV,GAEH,MAAO,IAAK0J,EAAgB,EAE7B,iBAAAC,GACC,MAAMC,EAAmB5sD,OAAOC,6BAA6BsvC,aAAaC,eAAeqd,mBAEzF,OAAS,KAAOD,MAAwBA,CACzC,EACA,UAAAE,CAAWz1C,EAAOtD,EAASs4C,EAAWU,GACrC,MAAqC,aAAjCA,EAAYh4B,iBACR,IAAI51B,EAAO,GAEZ4tD,EAAYC,8BACpB,EACAtd,cAAe,CAAEr4B,EAAOtD,EAASs4C,IAC3Bt4C,EAAQ85B,eAAewe,EAAUC,WAC9Bv4C,EAAS,GAAGA,EAAQ85B,6BAGvB,IAAS95B,EAAQq4C,kBACd,EAGDr4C,EAAQk5C,QACdl5C,EAAQ85B,YACR95B,EAAQ62C,mBAAmBznC,WAAYpP,EAAQ85B,aAC/C95B,EAAQ62C,mBAAmBvjC,WAG7B6lC,cAAe,CAAE71C,EAAOtD,KAOvB,MAAM86B,EAAU96B,EAAQ86B,QAExB,OAAwB,IAAnBA,EAAQ5vC,QAIM,OAAf4vC,EAAQ,GAHJ,GAQDA,EAAQxqC,KAAKud,IACZ,CACN9f,KAAM,QACNmV,MAAO2K,EAAO3K,MACdN,WAAYiL,EAAOuB,WACnBkE,UAAWzF,EAAOyF,UAClBykB,SAAU,CACThpC,KAAM8e,EAAOsuB,QAAQ,GAAG3vC,QACxBwrC,OAAQnqB,EAAOsuB,QAAQ,GAAG3vC,QAC1BiY,SAAUoJ,EAAO+H,WAAWnR,aAG7B,EAEH20C,aAAc,CAAE91C,EAAOtD,KACtB,MAAMtM,EAAO,CACZ3F,KAAMiS,EAAQs6B,YAYf,OATIt6B,EAAQs6B,aAAeD,GAAYI,OACtC/mC,EAAM,SAAYsM,EAAQ85B,YAC1BpmC,EAAM,cAAiBsM,EAAQq4C,iBAC/B3kD,EAAM,YAAe,CACpB3E,KAAMuU,EAAMs2B,iBACZ5B,OAAQ10B,EAAMu2B,mBACdp1B,SAAUnB,EAAMy2B,iBAGXrmC,CAAI,EAEZ2lD,qBAAsB,EAAI/e,eAAgB+d,mBAAkBxqC,SAAQooB,eAC9DqE,IAAeD,GAAYI,MAAQ,IAAS4d,IAAsB,IAASxqC,GACxE,CAAEngB,EAAG,EAAGC,EAAG,GAGZsoC,IAER,qCAAAqjB,GACC,OAAOrtD,OAAOC,6BAA6BsvC,aAAa+d,cACzD,EACA1e,4BAA+Bv3B,GAAoBA,EAAMwzC,wBAKzDnd,mBAAoB,CAAEr2B,EAAOtD,KAC5B,MAAMnP,EAAgBmP,EAAQmE,mBAC9B,OAAS,IAAatT,KAAqB,IAAaA,EAAcC,OAAO+c,UAAcle,EAAqBkB,EAAcC,OAAO+c,OAAQhd,EAAcC,OAAO0oD,WAAW,EAAM,EAEpLjS,iBAAkB,CAAEjkC,EAAOtD,MACtBA,EAAQkD,QAELlD,EAAQy5C,kBAAsC,QAAlBz5C,EAAQkD,OAAqC,SAAlBlD,EAAQkD,QAGxEw2C,QAAS,CACR,mBAAAC,EAAqB,OAAE3iD,EAAM,QAAEgJ,IAC9B,MAAM6N,EAAS7N,EAAQk4C,cAEvBlhD,EAAQ,oBAAqB6W,EAAO3K,OACpClM,EAAQ,yBAA0B6W,EAAOsuB,QAAQ,GAAG3vC,SACpDwK,EAAQ,2BAA4B6W,EAAOsuB,QAAQ,GAAG3vC,SACtDwK,EAAQ,uBAAwB6W,EAAO+H,WAAWnR,UAClDzN,EAAQ,8BAA+B,CAAEkM,MAAO2K,EAAO3K,MAAOkM,WAAYvB,EAAOuB,aACjFpY,EAAQ,qBAAsB,CAAEsc,UAAWzF,EAAOyF,WACnD,EACA,kBAAM0oB,EAAa,OAAEhlC,EAAM,QAAEgJ,EAAO,SAAEgG,GAAY1U,SAC3C0F,EAAO,sBAAuB1F,SAC9B0F,EAAO,oBAAqBgJ,EAAQ86B,QAAQ5vC,OAAS,GAE7B,IAA3B8U,EAAQ86B,QAAQ5vC,OAClB8L,EAAQ,mBAAoB,QAE5BgP,EAAU,sBAEZ,EACA,kCAAM4zC,EAA8B,SAAC5zC,EAAQ,OAAEhP,EAAM,QAAEgJ,GAAUkD,GAChElM,EAAQ,oBAAqBkM,SACvB8C,EAAS,mCAEA,sBAAV9C,GACJlM,EAAQ,uBAAwB,CAAE8c,SAAU,yBAA0B9b,MAAOgI,EAAS,4CAA8C,UAG/HgG,EAAU,wBAEhBhP,EAAQ,sCAAsC,EAC/C,EACA,0BAAM6iD,EAAsB,OAAE7iD,EAAM,QAAEgJ,IACrC,MAAM+3B,EAAW/3B,EAAQq5C,qBAEzBriD,EAAQ,yBAA0B+gC,EAASrqC,GAC3CsJ,EAAQ,2BAA4B+gC,EAASpqC,EAC9C,EACA,2BAAMypD,EAAuB,OAAEpgD,IAAU,UAAE+W,EAAS,MAAE/V,IAChDqW,GAAmBrW,IAIxBhB,EAAQ,wBAAyB,CAAE+W,YAAW/V,SAC/C,EACA,4BAAM8hD,EAAwB,OAAE9iD,IAAU,KAAEjJ,EAAI,MAAEmV,EAAK,WAAEN,EAAU,SAAEm1B,IACpE,MAAMgiB,EAAiB,KAAWn3C,GAAY,CAAImL,EAAWxX,IAC/C,qBAARA,GAAsC,gBAARA,EAC3BwX,EAGD,IAAI3iB,EAAQ2iB,GAAYjiB,UAGhCkL,EAAQ,mBAAoBjJ,GAC5BiJ,EAAQ,oBAAqBkM,GAC7BlM,EAAQ,8BAA+B,CAAEkM,MAAOA,EAAOkM,WAAY2qC,IAEpD,SAAV72C,GACJlM,EAAQ,uBAAwB,CAAE8c,SAAU,mBAAoB9b,MAAO4K,EAAWiR,mBAGpE,YAAV3Q,GACJlM,EAAQ,uBAAwB,CAAE8c,SAAU,cAAe9b,MAAO4K,EAAWirB,cAG9E72B,EAAQ,yBAA0B+gC,EAAShpC,MAC3CiI,EAAQ,2BAA4B+gC,EAASC,QAC7ChhC,EAAQ,uBAAwB+gC,EAAStzB,SAC1C,EACA,6BAAMu1C,EAAyB,OAAEhjD,EAAM,QAAEgJ,EAAO,SAAEgG,GAAY80B,GAC7D9jC,EAAO,gBAAiB,IAExB,IAAM,MAAM6W,KAAUitB,EAAU,CAE/B9jC,EAAQ,mBAAoB6W,EAAO9f,MAGb,SAAjB8f,EAAO3K,aACL8C,EAAS,WAAY6H,EAAOyF,UAAUze,MAG7C,MAAMo6C,EAAWjvC,EAAQy4C,cAAc5qC,EAAO3K,MAAO,CACpDkM,WAAY,CAAE,CAACvB,EAAO3K,OAAS2K,EAAOjL,YACtC0Q,UAAWzF,EAAOyF,YAGnBtc,EAAO,YAAa,IAAIw/C,GACvB3oC,EAAO3K,MACP,CAAE,CAAC2K,EAAO3K,OAAS2K,EAAOjL,YAC1BiL,EAAOyF,UACP,CACCsmB,iBAAkB,IAAIxuC,EAAOyiB,EAAOkqB,SAAShpC,MAAM5B,QAAQX,QAC3DqtC,mBAAoB,IAAIzuC,EAAOyiB,EAAOkqB,SAASC,QAAQ7qC,QAAQX,QAC/DiY,SAAUoJ,EAAOkqB,SAAStzB,UACxBwqC,G,CAILj4C,EAAO,oBAAqBgJ,EAAQ86B,QAAQ5vC,OAAS,GACrD8a,EAAS,sBACV,EACA,+BAAAi0C,EAAiC,OAAEjjD,EAAM,QAAEgJ,EAAO,SAAEgG,IACnD,MAAMyoC,EAAczuC,EAAQkD,MACtB42B,EAAc95B,EAAQ85B,YACtB+c,EAAqB72C,EAAQ62C,mBAAmBznC,WAAW0qB,GAEjE,IAAO2U,IAAiB3U,EACvB,OAGD,MAAMogB,EAAoBl6C,EAAQy4C,cAAehK,EAAa,CAC7Dr/B,WAAYpP,EAAQmnC,aAAa/3B,WACjCkE,UAAWtT,EAAQsT,YAGd6mC,EAAoBn6C,EAAQy4C,cAAe3e,EAAa,CAC7D1qB,WAAYynC,EAAmBznC,WAC/BkE,UAAWujC,EAAmBvjC,YAG/Btc,EAAQ,qBAAsB,CAC7BkM,MAAO42B,EACPxmB,UAAW6mC,EAAkB1N,8BAG9B,MAAM2L,EAAmB+B,EAAkB3L,2BAA2B0L,GAGtE,KAAW9B,GAAkB,CAAE73B,EAAahqB,KAC3C6hD,EAAiB7hD,GAAO3J,KAAKO,MAAa,GAANozB,GAAa,EAAE,IAGpDvpB,EAAO,8BAA+B,CACrCkM,MAAO42B,EACP1qB,WAAYgpC,IAGbpyC,EAAS,uBACV,EACA,kBAAMo0C,EAAc,OAAEpjD,EAAM,SAAEgP,IAC7BhP,EAAQ,mBAAoBqjC,GAAYI,MACxCzjC,EAAQ,gBAAiB,IACzBA,EAAQ,oBAAqB,SAEvBgP,EAAU,+BAAgC,GACjD,IEzca,MAAeq0C,GAGtB,8BAAAtK,GACN,OAAO9jD,OAAOC,6BAA6BgU,KAAK+Z,UACjD,ECGc,MAAMqgC,WAAoCD,GACvCE,gBACAj3C,MACAJ,MACAs3C,iBACArkB,WACAvmC,YAEjB,WAAAvE,CAAakvD,EAAyBj3C,EAAOJ,EAAes3C,EAA0BrkB,EAAoBvmC,GACzGgjC,QAEArnC,KAAKgvD,gBAAkBA,EACvBhvD,KAAK+X,MAAQA,EACb/X,KAAK2X,MAAQA,EACb3X,KAAKivD,iBAAmBA,EACxBjvD,KAAK4qC,WAAaA,EAClB5qC,KAAKqE,YAAcA,CACpB,CAEA,aAAA6qD,GACC,MAAM,UAAEC,GAAcnvD,KAAKwkD,iCAE3B,MAAO,CACN,IAAIM,GAAc,CACjBj2B,MAAO,oBACPrM,UAAW,oBACX/V,MAAOzM,KAAK+X,MAAM8wB,kBAClB+a,QAAS5jD,KAAKgvD,gBAAgB/tD,QAC9B0iD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAAShlB,IAAKtB,KAAKgvD,gBAAgBxuD,gBAEtE,IAAIskD,GAAc,CACjBj2B,MAAO,wBACPrM,UAAW,wBACX/V,MAAOzM,KAAK+X,MAAMm0B,sBAClB0X,QAAS,EACTD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU5iB,OAAOjrC,IAAK,KAE/C,IAAIwjD,GAAc,CACjBj2B,MAAO,0BACPrM,UAAW,0BACX/V,MAAOzM,KAAK+X,MAAMo0B,wBAClByX,QAAS,EACTD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUj+C,OAAOoV,SAAU,KAEpD,IAAIq+B,GAAsB,CACzB91B,MAAO,oBACPrM,UAAW,oBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAM8wB,mBAAoBtoC,QAClDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAASzkB,SAAU,KAEtD,IAAI8iD,GAAsB,CACzB91B,MAAO,0BACPrM,UAAW,0BACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAMo0B,yBAA0B5rC,QACxDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUj+C,OAAOrP,SAASykB,SAAU,KAE7D,IAAIq+B,GAAsB,CACzB91B,MAAO,yBACPrM,UAAW,yBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAMq0B,wBAAyB7rC,QACvDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUj+C,OAAOrP,SAASutD,QAAS,KAE5D,IAAIzK,GAAsB,CACzB91B,MAAO,yBACPrM,UAAW,yBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAMs0B,wBAAyB9rC,QACvDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUj+C,OAAOrP,SAASwtD,QAAS,KAG9D,ECrEc,MAAMC,WAAkCR,GACrCE,gBACAj3C,MACA6yB,WACAvmC,YAEjB,WAAAvE,CAAakvD,EAAyBj3C,EAAO6yB,EAAoBvmC,GAChEgjC,QAEArnC,KAAKgvD,gBAAkBA,EACvBhvD,KAAK+X,MAAQA,EACb/X,KAAK4qC,WAAaA,EAClB5qC,KAAKqE,YAAcA,CACpB,CAEA,aAAA6qD,GACC,MAAM,UAAEC,GAAczuD,OAAOC,6BAA6BgU,KAAK+Z,WAE/D,MAAO,CACN,IAAIo2B,GAAc,CACjBj2B,MAAO,oBACPrM,UAAW,oBACX/V,MAAOzM,KAAK+X,MAAM8wB,kBAClB+a,QAAS5jD,KAAKgvD,gBAAgB/tD,QAC9B0iD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAAShlB,IAAKtB,KAAKgvD,gBAAgBxuD,gBAEtE,IAAIskD,GAAc,CACjBj2B,MAAO,4BACPrM,UAAW,4BACX/V,MAAOzM,KAAK+X,MAAM+0B,0BAClB8W,QAAS,EACTD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU/9C,KAAKm7B,OAAOgjB,WAAY,KAE3D,IAAIzK,GAAc,CACjBj2B,MAAO,0BACPrM,UAAW,0BACX/V,MAAOzM,KAAK+X,MAAMg1B,wBAClB6W,QAAS,EACTD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU/9C,KAAKm7B,OAAOijB,SAAU,KAEzD,IAAI7K,GAAsB,CACzB91B,MAAO,kBACPrM,UAAW,kBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAM6vB,iBAAkBrnC,QAChDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUlqD,OAAOpD,SAAU,KAEpD,IAAI8iD,GAAsB,CACzB91B,MAAO,oBACPrM,UAAW,oBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAM8wB,mBAAoBtoC,QAClDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAASzkB,SAAU,KAGxD,EClDM,MAAM4tD,WAAiBhM,GAEZiM,OAOjB,WAAA5vD,CAAa4E,GACZ2iC,MAAO3iC,GAEP1E,KAAK0vD,OAAShrD,EAAQgrD,MACvB,CAKA,UAAA5gC,GACC,OAAOuY,MAAM6c,oBAAsB,sBACpC,CAKA,OAAAW,GACC,QAAK,IAAS7kD,KAAK0vD,UAIV1vD,KAAK0vD,OAAO9vD,SAAUI,KAAKyM,MACrC,ECnCM,MAAMkjD,WAAwClM,GAG3CwK,UACA2B,cACAC,YAHT,WAAA/vD,CACSmuD,EACA2B,EACAC,EACRnrD,GAEA2iC,MAAM3iC,GALE,KAAAupD,UAAAA,EACA,KAAA2B,cAAAA,EACA,KAAAC,YAAAA,CAIT,CAEA,UAAA/gC,GACC,MAAQqgC,UAAWW,GAAsBpvD,OAAOC,6BAA6BgU,KAAK+Z,WAClF,OAAO,EAAA2K,GAAAA,SAASy2B,EAAkBx+C,OAAOy+C,UAAW,IAAO,kDAC5D,CAEA,OAAAlL,GACC,IAAIA,GAAU,EAEd,MAAMngD,EAAU,CACfd,SAAS,GAGJ6B,EAAczF,KAAK4vD,cAAcrqD,OAAOE,YAExCuqD,EAAkB,KAAQ/tD,MAAM0B,WAAW3D,KAAKiuD,UAAWvpD,GACjE,KAAQzC,MAAMguD,SAASjwD,KAAK4vD,eAC5B,MAAMM,EAAsB,KAAQjuD,MAAM0B,WAAW3D,KAAK4vD,cAAelrD,GAEzE,SAAKkB,MAAMC,QAAQmqD,KAAqBpqD,MAAMC,QAAQqqD,MAKlDlwD,KAAKmwD,kBAAkB1qD,EAAYF,OAAO0oD,UAAU1oD,OAAQvF,KAAK6vD,eACpEhL,GAAU,GAKXqL,EAAoBpqD,SAAQ,CAAC/B,EAAuBgC,KAChDhC,EAAMqsD,WAAaJ,EAAgBjqD,GAAOqqD,aAC5CvL,GAAU,E,IAILA,EACR,CAEA,iBAAAsL,CAAkB5qD,EAAQ8qD,GACzB,IAAK,MAAMC,KAAY/qD,EACtB,GAAII,OAAO4qD,UAAUC,eAAeC,KAAKlrD,EAAQ+qD,GAAW,CAC3D,MAAMpuD,EAAQqD,EAAO+qD,GAAUpuD,MAC/B,GAAIyD,OAAO4qD,UAAUC,eAAeC,KAAKvuD,EAAOmuD,GAC/C,OAAO,C,CAIV,OAAO,CACR,ECtDc,MAAMK,WAAoC5B,GACvCE,gBACAj3C,MACAuyB,iBACAjmC,YACAssD,cACAC,OAEjB,WAAA9wD,CAAakvD,EAAyBj3C,EAAOuyB,EAAqCjmC,EAAqBssD,EAAwB,MAC9HtpB,QAEArnC,KAAKgvD,gBAAkBA,EACvBhvD,KAAK+X,MAAQA,EACb/X,KAAKsqC,iBAAmBtqC,KAAK6wD,eAAgBvmB,GAC7CtqC,KAAKqE,YAAcA,EACnBrE,KAAK2wD,cAAgBA,EAErB3wD,KAAK4wD,OAAS,EACf,CAEA,cAAAC,CAAgBjmB,GACf,OAAOA,EAAW7lC,KAAKymC,GACf,IAAIzH,GAAW,IAAIlkC,EAAQ2rC,EAAKrpC,GAAK,IAAItC,EAAQ2rC,EAAKppC,GAAK,IAAIvC,EAAQ2rC,EAAKllB,YAErF,CAEA,aAAA4oC,GACC,MAAM4B,EAAQ,IACN3B,UAAWW,GAAsBpvD,OAAOC,6BAA6BgU,KAAK+Z,WAuDlF,OApDA1uB,KAAKsqC,iBAAiBxkC,SAAS,CAAE0lC,EAAMzlC,KACtC,MAAMgrD,GAAc,EAAA13B,GAAAA,SAASy2B,EAAkBx+C,OAAO0/C,aAAcjrD,EAAQ,GACtEkrD,EAAYjxD,KAAK4wD,OAAO7rD,KAAKymC,GAAQA,EAAKvH,UAE1CitB,EAAY,CAEjB,IAAIpM,GAAc,CACjBj2B,MAAO,qBAAqB9oB,EAAQ,IACpCyc,UAAW,qBAAqBzc,EAAQ,IACxC0G,MAAO++B,EAAKllB,SAASrlB,QACrB2iD,QAAS5jD,KAAKgvD,gBAAgB/tD,QAC9B0iD,cAAe,GAAGoN,MAAe,EAAA13B,GAAAA,SAASy2B,EAAkBxpC,SAAShlB,IAAKtB,KAAKgvD,gBAAgBxuD,kBAEhG,IAAIivD,GAAU,CACb5gC,MAAO,mBAAmB9oB,EAAQ,IAClCyc,UAAW,mBAAmBzc,EAAQ,IACtC0G,MAAO++B,EAAKvH,QACZyrB,OAAQuB,EACRtN,cAAe,GAAGoN,KAAejB,EAAkBx+C,OAAO6/C,WAE3D,IAAIxM,GAAsB,CACzB91B,MAAO,qBAAqB9oB,EAAQ,IACpCyc,UAAW,qBAAqBzc,EAAQ,IACxC0G,MAAO++B,EAAKllB,SAAS/lB,QACrBojD,eAAe,EAAAtqB,GAAAA,SAASy2B,EAAkBxpC,SAASzkB,SAAU,KAC9D,IAAI8iD,GAAsB,CACzB91B,MAAO,oBAAoB9oB,EAAQ,IACnCyc,UAAW,oBAAoBzc,EAAQ,IACvC0G,MAAO++B,EAAKrpC,EAAE5B,QACdojD,eAAe,EAAAtqB,GAAAA,SAASy2B,EAAkBx+C,OAAOzP,SAAS2B,KAAM,KACjE,IAAImhD,GAAsB,CACzB91B,MAAO,oBAAoB9oB,EAAQ,IACnCyc,UAAW,oBAAoBzc,EAAQ,IACvC0G,MAAO++B,EAAKppC,EAAE7B,QACdojD,eAAe,EAAAtqB,GAAAA,SAASy2B,EAAkBx+C,OAAOzP,SAAS4qC,OAAQ,KACnE,IAAIkjB,GACH3vD,KAAKqE,YACLrE,KAAK2wD,cACLnlB,EAAKvH,QACL,CACCx3B,MAAO++B,EAAKvH,QACZpV,MAAO,oBAAoB9oB,EAAQ,IACnCyc,UAAW,oBAAoBzc,EAAQ,OAK1C+qD,EAAMruD,QAASyuD,GAEflxD,KAAK4wD,OAAOnuD,KAAM+oC,EAAM,IAGlBslB,CACR,ECpFM,MAAMM,WAAsB3N,GACjBjF,MACA6S,UACAC,OAOjB,WAAAxxD,CAAa4E,GACZ2iC,MAAO3iC,GAEP1E,KAAKw+C,MAAQ95C,EAAQ85C,MACrBx+C,KAAKqxD,UAAY3sD,EAAQ2sD,UACzBrxD,KAAKsxD,OAAS5sD,EAAQ4sD,MACvB,CAKA,UAAAxiC,GACC,OAAOuY,MAAM6c,oBAAsB,wCACpC,CAKA,OAAAW,GACC,MAAM0M,EAAevxD,KAAKw+C,MAAMnwB,MAAOruB,KAAKqxD,WAE5C,OAAuB,IAAhBrxD,KAAKsxD,OAAmBC,GAAgC,IAAjBA,CAC/C,ECnCc,MAAMC,WAAkC1C,GACrCE,gBACAj3C,MACA05C,gBACA7mB,WACAvmC,YAEjB,WAAAvE,CAAakvD,EAAyBj3C,EAAO05C,EAAyB7mB,EAAoBvmC,GACzFgjC,QAEArnC,KAAKgvD,gBAAkBA,EACvBhvD,KAAK+X,MAAQA,EACb/X,KAAKyxD,gBAAkBA,EACvBzxD,KAAK4qC,WAAaA,EAClB5qC,KAAKqE,YAAcA,CACpB,CAEA,aAAA6qD,GACC,MAAM,UAAEC,GAAczuD,OAAOC,6BAA6BgU,KAAK+Z,WACzDgjC,EAAuB,GAiB7B,MAfuC,WAAlC1xD,KAAKyxD,gBAAgBxpB,UACzBypB,EAAqBjvD,KACpB,IAAI2uD,GAAe,CAClBviC,MAAO,QACPrM,UAAW,QACXg8B,MAAOx+C,KAAKyxD,gBAAgBzgD,MAC5BqgD,UAAW,SAAWrtB,GACrB,OAAgB,IAATA,CACR,EACA2f,cAAewL,EAAUn+C,MAAM2gD,uBAC/BL,QAAQ,KAKJ,CACN,IAAIxM,GAAc,CACjBj2B,MAAO,oBACPrM,UAAW,oBACX/V,MAAOzM,KAAK+X,MAAM8wB,kBAClB+a,QAAS5jD,KAAKgvD,gBAAgB/tD,QAC9B0iD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAAShlB,IAAKtB,KAAKgvD,gBAAgBxuD,gBAEtE,IAAImkD,GAAsB,CACzB91B,MAAO,kBACPrM,UAAW,kBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAM6vB,iBAAkBrnC,QAChDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAUlqD,OAAOpD,SAAU,KACpD,IAAI8iD,GAAsB,CACzB91B,MAAO,oBACPrM,UAAW,oBACX/V,MAAO,IAAI5M,EAAQG,KAAK+X,MAAM8wB,mBAAoBtoC,QAClDojD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAASzkB,SAAU,QACnD6vD,EAEL,EC9Dc,MAAME,WAAyB9C,GAC7C,aAAAI,GACC,MAAO,EACR,ECAc,MAAM2C,GACpB1vD,EACAC,EACAkkB,SACAgmB,eACAC,OACAN,mBAEA,WAAAnsC,CAAaqC,EAAWC,EAAWkkB,EAAkBgmB,EAAwBC,EAAgBN,GAC5FjsC,KAAKmC,EAAIA,EACTnC,KAAKoC,EAAIA,EACTpC,KAAKsmB,SAAWA,EAChBtmB,KAAKssC,eAAiBA,EACtBtsC,KAAKusC,OAASA,EACdvsC,KAAKisC,mBAAqBA,CAC3B,CAEA,KAAAhI,GACC,MAAO,mBACR,CAEA,OAAAC,GACC,OAAO,IAAIH,GAAW/jC,KAAKssC,eAAe7qC,OAAQ,GAAK,IAAI5B,EAAQ,GAAKG,KAAKsmB,UAAW4d,SACzF,CAEA,aAAA4tB,GACC,OAAO,WAAeA,cAAe9xD,KAAKkkC,UAAWlkC,KAAKusC,OAAQ,IAAMvsC,KAAKusC,OAC9E,CAEA,UAAApI,GACC,MAAMjzB,EAAQlR,KAAK8xD,gBAOnB,OANA5gD,EAAO1O,KAAO,mBAEd,UAAcqF,KAAKqJ,GACnB,UAAc4uC,KAAK5uC,EAAQ,CAAElR,KAAKmC,EAAE5B,QAASP,KAAKoC,EAAE7B,UACpD,UAAcojC,aAAazyB,EAAQ,CAAElR,KAAKisC,mBAAmBqS,IAAK,GAAKt+C,KAAKisC,mBAAmBqS,IAAK,KAE7FptC,CACR,CAEA,cAAAkzB,CAAeC,EAAiB,IAC/B,OAAGA,EAAezkC,SAAS,2BACnB,CACN,IAAIqjC,GACH,CAAEjjC,KAAKmC,EAAEhB,SAASnB,KAAKssC,eAAe7qC,OAAO,IAAIR,QAASjB,KAAKoC,EAAEnB,SACjE,CAAEjB,KAAKmC,EAAEjB,IAAIlB,KAAKssC,eAAe7qC,OAAO,IAAIR,QAASjB,KAAKoC,EAAEnB,SAC5D4iC,GAAa7jC,KAAKssC,eAAe/rC,WAKjC8jC,EAAezkC,SAAS,yBACnB,CACN,IAAIqjC,GACH,CAAC,EAAGjjC,KAAKoC,EAAEnB,SACX,CAACjB,KAAKmC,EAAElB,QAASjB,KAAKoC,EAAEnB,SACxB4iC,GAAa7jC,KAAKmC,EAAE5B,UAErB,IAAI0iC,GACH,CAACjjC,KAAKmC,EAAElB,QAASjB,KAAKoC,EAAEnB,SACxB,CAACjB,KAAKmC,EAAElB,QAAS,GACjB4iC,GAAa7jC,KAAKoC,EAAE7B,WAKhB,EACR,ECnEc,MAAMwxD,GACpBzrC,SACArhB,OACA+sD,iBACAC,eACAhmB,mBAEA,WAAAnsC,CAAawmB,EAAkBrhB,EAAgB+sD,EAA0BC,EAAwBhmB,GAChGjsC,KAAKsmB,SAAWA,EAChBtmB,KAAKiF,OAASA,EACdjF,KAAKgyD,iBAAmBA,EACxBhyD,KAAKiyD,eAAiBA,EACtBjyD,KAAKisC,mBAAqBA,CAC3B,CAEA,KAAAhI,GACC,MAAO,iBACR,CAEA,OAAAC,GACC,OAAO,IAAIH,GAAW/jC,KAAKiF,OAAQjF,KAAKiF,OAAQjF,KAAKsmB,UAAW4d,SACjE,CAEA,WAAAguB,GACC,MAAM,MAAE9nD,EAAK,OAAEC,GAAWrK,KAAKisC,mBAE/B,OAAO,WAAeimB,YACrBlyD,KAAKkkC,UACLlkC,KAAKgyD,iBACLhyD,KAAKiyD,eACL,CACCjyD,KAAKmyD,qBAAsB/nD,EAAOpK,KAAKiF,OAAO1E,QAASP,KAAKsmB,SAAS/lB,QAASP,KAAKgyD,kBACnFhyD,KAAKmyD,qBAAsB9nD,EAAQrK,KAAKiF,OAAO1E,QAASP,KAAKsmB,SAAS/lB,QAASP,KAAKiyD,iBAGvF,CAEA,oBAAAE,CAAsBC,EAAcntD,EAAgBqhB,EAAkB3mB,GACrE,MAAM0yD,EAAaD,EAAkB,EAATntD,EAAiBjF,KAAKsmB,SAAS/lB,QACrD+xD,EAAe3yD,EAAS,EAAMA,EAAS,EAAI,EAEjD,OAAS0yD,EAAa1yD,EAAS2mB,GAAegsC,CAC/C,CAEA,UAAAnuB,GACC,IAAI/yB,EAAO,CAAC,EAYZ,OAVKpR,KAAKgyD,iBAAmB,GAAKhyD,KAAKiyD,eAAiB,IACvD7gD,EAAOpR,KAAKkyD,eAGb9gD,EAAM,QAAW,iBAEjB,UAAcvJ,KAAKuJ,GACnB,UAAc0uC,KAAK1uC,EAAM,CAAEpR,KAAKiF,OAAO1E,QAASP,KAAKiF,OAAO1E,UAC5D,UAAcojC,aAAavyB,EAAM,CAAEpR,KAAKisC,mBAAmBqS,IAAK,GAAKt+C,KAAKisC,mBAAmBqS,IAAK,KAE3FltC,CACR,CAEA,cAAAgzB,CAAeC,EAAiB,IAC/B,OAAGA,EAAezkC,SAAS,mBACnB,CACN,IAAIqjC,GACH,CAAEjjC,KAAKiF,OAAOhE,QAAS,GACvB,CAAEjB,KAAKiF,OAAOhE,QAASjB,KAAKiF,OAAOhE,SACnC4iC,GAAa7jC,KAAKiF,OAAO1E,WAKrB,EACR,GXtED,SAAY8qD,GACX,uBACA,oBACA,EAHD,CAAYA,KAAAA,GAAiB,KAKd,MAAMkH,GACpB56C,MACAN,WAIAiP,SACArhB,OACAzC,KACAooC,WACQvmC,YAER,WAAAvE,CAAa6X,EAAetT,EAAqBiiB,EAAkBrhB,EAAgBzC,EAAyBooC,GAC3G5qC,KAAK2X,MAAQA,EACb3X,KAAKsmB,SAAWA,EAChBtmB,KAAKiF,OAASA,EACdjF,KAAKwC,KAAOA,EACZxC,KAAK4qC,WAAaA,EAClB5qC,KAAKqE,YAAcA,CACpB,CAEA,KAAA4/B,GACC,MAAO,mBAAmBjkC,KAAKwC,MAChC,CAEA,OAAA0hC,GACC,MAAMsuB,EAAiC,IAAIhrB,GACrCM,EAA0B0qB,EAA+B/qB,2BAA4BznC,KAAK2X,MAAO3X,KAAKqE,aAE5G,IAAIumC,EAAa,GAUjB,OARK5qC,KAAKwC,OAAS6oD,GAAkBoH,SAAW,eAAgB3qB,IAC/D8C,EAAa9C,EAAwBlD,WAAY5kC,KAAKiF,OAAQjF,KAAKsmB,WAG7DtmB,KAAKwC,OAAS6oD,GAAkBqH,QAAU,cAAe5qB,IAA+B,IAAS9nC,KAAK4qC,cAC5GA,EAAa9C,EAAwB/C,UAAW/kC,KAAK4qC,WAAY5qC,KAAKiF,OAAQjF,KAAKsmB,WAG7EskB,CACR,CAEA,UAAAzG,GACC,MAAMyG,EAAa5qC,KAAKkkC,UAClByuB,EAAkB,CAAEzwD,MAAO,CAAC,EAAGM,KAAM,kBAM3C,OAJAooC,EAAW9kC,SAAWqpD,IACrBwD,EAAgBzwD,MAAQyD,OAAOu2B,OAAQy2B,EAAgBzwD,MAAOitD,EAAUhrB,aAAajiC,MAAO,IAGtFywD,CACR,CAGA,oBAAAC,GACC,MAAMhoB,EAAa5qC,KAAKkkC,UACxB,GAA0B,IAAtB0G,EAAWjrC,OAAc,OAAO,KAEpC,IAAIkzD,EAAmBjoB,EAAW,GAC9BkoB,EAAczxD,KAAKy8B,KAAKz8B,KAAK0xD,IAAIF,EAAiB1wD,EAAElB,QAAS,GAAKI,KAAK0xD,IAAIF,EAAiBzwD,EAAEnB,QAAS,IAU3G,OARA2pC,EAAW9kC,SAAQqpD,IAClB,MAAM6D,EAAW3xD,KAAKy8B,KAAKz8B,KAAK0xD,IAAI5D,EAAUhtD,EAAElB,QAAS,GAAKI,KAAK0xD,IAAI5D,EAAU/sD,EAAEnB,QAAS,IACxF+xD,EAAWF,IACdD,EAAmB1D,EACnB2D,EAAcE,E,IAITH,CACR,CAEA,cAAAzuB,CAAeC,EAAiB,IAC/B,GAAGA,EAAezkC,SAAS,mBAAoB,CAC9C,MAAMuvD,EAAYnvD,KAAK4yD,uBAEvB,MAAO,CACN,IAAI3vB,GACH,CAAEksB,EAAUhtD,EAAElB,QAAS,GACvB,CAAEkuD,EAAUhtD,EAAElB,QAASkuD,EAAU/sD,EAAEnB,SACnC4iC,GAAa7jC,KAAKiF,OAAO1E,U,CAK5B,MAAO,EACR,CAEA,wBAAA0yD,CAAyB5uB,EAAiB,IACzC,MAAM6uB,EAAiBlzD,KAAKmkC,aAE5B,GAAGnkC,KAAKwC,OAAS6oD,GAAkBqH,QAAUruB,EAAe8uB,WAAW,sBACtE,OAGD,MAAMnvB,GAAQK,EAAeggB,MAAM,KAAK,GAElC+O,EAAqBztD,OAAOD,KAAKwtD,EAAehxD,OACpD5C,QAAO0L,GAAOA,EAAI+X,SAAS,IAAIihB,EAAO,OACtCpiB,QAAO,CAAC+R,EAAK3oB,KACb2oB,EAAI3oB,GAAOkoD,EAAehxD,MAAM8I,GACzB2oB,IACL,CAAC,GAIL,OAFAu/B,EAAehxD,MAAQkxD,EAEhBF,CACR,EYhHc,MAAMG,GACH17C,MACAtT,YACAgT,WACAiP,SACAgtC,UACAC,UACA/sB,cAETgtB,YAER,WAAA1zD,CAAa6X,EAAetT,EAAqBgT,EAAoCiP,EAAkBktC,EAAqBF,EAAmBC,EAAmB/sB,GACjKxmC,KAAK2X,MAAQA,EACb3X,KAAKsmB,SAAWA,EAChBtmB,KAAKqX,WAAaA,EAClBrX,KAAKwzD,YAAcA,EACnBxzD,KAAKszD,UAAYA,EACjBtzD,KAAKuzD,UAAYA,EACjBvzD,KAAKwmC,cAAgBA,EACrBxmC,KAAKqE,YAAcA,CACpB,CAEA,KAAA4/B,GACC,MAAO,mBACR,CAEA,OAAAC,GACC,IAAI0G,EAAa,GAOjB,MAJoB,cAAf5qC,KAAK2X,QACTizB,EAAa5qC,KAAKyzD,uBAGZ7oB,CACR,CAEA,UAAAzG,GACC,MAAMyG,EAAa5qC,KAAKkkC,UAClByuB,EAAkB,CAAEzwD,MAAO,CAAC,EAAGM,KAAM,oBAM3C,OAJAooC,EAAW9kC,SAAWqpD,IACrBwD,EAAgBzwD,MAAQyD,OAAOu2B,OAAQy2B,EAAgBzwD,MAAOitD,EAAUhrB,aAAajiC,MAAO,IAGtFywD,CACR,CAEA,mBAAAc,GACC,MAAM3rB,GAA0B,IAAIN,IAAiCC,2BAA4BznC,KAAK2X,MAAO3X,KAAKqE,aAElH,GAAKyjC,aAAmCtK,GAAY,MAAO,GAG3D,MAAMuJ,EAAU/mC,KAAK0zD,6BAErB,OAAO5rB,EAAwBlB,SAAU,CAAEG,EAAQpnC,OAAQonC,EAAQ38B,MAAO28B,EAAQpnC,OAAQonC,EAAQ38B,OAASpK,KAAKszD,UAAWtzD,KAAKuzD,UAAWvzD,KAAKsmB,SAAUtmB,KAAKwmC,cAChK,CAEA,0BAAAktB,GACC,MAAO,CACN/zD,OAAQK,KAAK2zD,2BAA4B9zD,EAAOM,QAASH,KAAKqX,WAAW1X,SACzEyK,MAAOpK,KAAK2zD,2BAA4B9zD,EAAOM,QAASH,KAAKqX,WAAWjN,QAE1E,CAEA,0BAAAupD,CAA4BlnD,GAC3B,GAAK,IAAaA,IAA6B,IAAlBA,EAAMxL,SAA8C,IAA7BjB,KAAKwzD,YAAYjzD,QACpE,OAAO,EAGR,MAAMZ,EAAS8M,EAAMtL,SAAUnB,KAAKwmC,cAAcjlC,SAAU,IACtDqyD,EAAuBvyD,KAAKyd,KAAMnf,EAAO8B,OAAQzB,KAAKwzD,YAAYjzD,SAAUA,SAC5EszD,EAAel0D,EAAO8B,OAAQmyD,GAEpC,OAAOvyD,KAAKyd,KAAMrS,EAAMhL,OAAQoyD,EAAatzD,SAAUA,QACxD,CAEA,cAAA6jC,GACC,MAAO,EACR,E,IClFW0vB,G,4CAKL,SAASC,GAAyBnlC,EAAqBlqB,GAG7D,MAAMsvD,EAAqB,CAAE,WAAY,YAAa,SACtD,OAAMA,EAAmB3lC,OAAOgyB,GAAYA,KAAY37C,IAMjD,IAAIkqB,EAAWlqB,GALd,IAMT,CAEO,SAASuvD,GAAqBvlC,EAAkCG,EAAgBqlC,GAAgB,GACtG,GAAK,IAAaxlC,GACjB,MAAO,GAGR,MAAMylC,EAAW,KAAQzlC,GAAY,SAAWE,GAC/C,OAAQA,EAAUi2B,SACnB,IAEA,GAAKqP,EACJ,OAASxlC,EAAW/uB,OAAS,GAAKw0D,EAASx0D,OAAS,GAAOw0D,EAASx0D,SAAW+uB,EAAW/uB,OAASw0D,EAAW,GAG/G,GAAKtlC,EAAQ,CACZ,MAAMulC,EAAgB,KAAMD,EAAU,CAAEtlC,UAExC,OAAQ,IAAaulC,GAAsC,GAApB,CAAEA,E,CAG1C,OAAOD,CACR,CAEO,SAASE,GAAqB3lC,EAAkCG,EAAgBqlC,GAAgB,GACtG,MAAMI,EAASL,GAAqBvlC,EAAYG,EAAOqlC,GAEvD,OAAQ,IAASI,EAClB,CAEO,SAASC,GAA8B7lC,EAAkCG,GAC/E,MAAMylC,EAASL,GAAqBvlC,EAAYG,GAEhD,IAAK,IAASylC,GAId,OAAOA,EAAQ,GAAIxlC,YACpB,EAtDA,SAAYglC,GACX,WACA,UACA,EAHD,CAAYA,KAAAA,GAAI,KCCD,MAAMU,WAAoC1F,GACvCE,gBACAj3C,MAEjB,WAAAjY,CAAakvD,EAAyBj3C,GACrCsvB,QAEArnC,KAAKgvD,gBAAkBA,EACvBhvD,KAAK+X,MAAQA,CACd,CAEA,aAAAm3C,GACC,MAAM,UAAEC,GAAczuD,OAAOC,6BAA6BgU,KAAK+Z,WAEzDma,EAAsB7oC,KAAK+X,MAAM8wB,6BAA6BhpC,EAAWG,KAAK+X,MAAM8wB,kBAAkBtoC,QAAUP,KAAK+X,MAAM8wB,kBAEjI,MAAO,CACN,IAAIic,GAAc,CACjBj2B,MAAO,oBACPrM,UAAW,oBACX/V,MAAOo8B,EACP+a,QAAS5jD,KAAKgvD,gBAAgB/tD,QAC9B0iD,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAAShlB,IAAKtB,KAAKgvD,gBAAgBxuD,gBAEtE,IAAIilD,GAAc,CACjB52B,MAAO,oBACPrM,UAAW,oBACX/V,MAAOo8B,EACPib,QAAS9jD,KAAK+X,MAAM08C,yBACpB9Q,eAAe,EAAAtqB,GAAAA,SAAS81B,EAAU7oC,SAASllB,IAAK,IAAIvB,EAAQG,KAAK+X,MAAM08C,0BAA2Bj0D,gBAGrG,EChCc,MAAMk0D,GAEXC,gBACAta,kBAFT,WAAAv6C,CACS60D,EACAta,GADA,KAAAsa,gBAAAA,EACA,KAAAta,kBAAAA,CACN,CAEH,QAAAjX,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAM59B,EAAa,KAAQovD,YAAY50D,KAAKq6C,kBAAkBtwC,UAC9D,YAAkB8f,IAAfrkB,IAIkC,QAAjCxF,KAAKq6C,kBAAkB1iC,OAC1B,KAAQ1V,MAAMggD,MAAMz8C,EAAY,IAAI,GAGrC,KAAQvD,MAAMgC,SAAShC,EAAO,CAAEsD,OAAQ,CAAE0oD,UAAWzoD,IAAgB,eAP7DvD,CAST,EAGM,MAAM4yD,GAGHF,gBAFDG,YACR,WAAAh1D,CACS60D,GAAA,KAAAA,gBAAAA,CACN,CAEH,QAAAvxB,GACC,GAAIpjC,KAAK80D,YACR,OAAO,KAAQF,YAAY50D,KAAK80D,aAEjC,IAAI7yD,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,IAAIwsB,EAAgB,KAAQ3tD,MAAM8yD,mBACjC9yD,EAAMsD,OAAOC,WACb,KAAQvD,MAAM+yD,aAAc/yD,EAAMsD,OAAOE,YAAaxD,EAAMsD,OAAO2tD,iBAYpE,OATAtD,EAAgBvqD,EAAW,CAC1BE,OAAQ,CACPC,WAAYoqD,EAAcrqD,OAAOs4B,EACjCp4B,YAAamqD,EAAcrqD,OAAO48B,KAGpCytB,EAAclsB,MAAQ,QAEtB1jC,KAAK80D,YAAclF,EACZ,KAAQgF,YAAYhF,EAC5B,EAGM,MAAMqF,GAIHN,gBACAtxD,OACAC,QALDwxD,YAER,WAAAh1D,CACS60D,EACAtxD,EACAC,GAAmB,GAFnB,KAAAqxD,gBAAAA,EACA,KAAAtxD,OAAAA,EACA,KAAAC,QAAAA,CACN,CAEH,QAAA8/B,GACC,GAAIpjC,KAAK80D,YACR,OAAO,KAAQF,YAAY50D,KAAK80D,aAEjC,IAAI7yD,EAAQ,CAAEsD,OAAQ,CAAC,GAQvB,OANIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9BnhC,EAAQmB,EAAYnB,EAAOjC,KAAKqD,OAAQrD,KAAKsD,SAC7CtD,KAAK80D,YAAc7yD,EACZ,KAAQ2yD,YAAY3yD,EAC5B,EAGM,MAAMizD,GAEHP,gBACAtxD,OACAC,QAHT,WAAAxD,CACS60D,EACAtxD,EACAC,GAAmB,GAFnB,KAAAqxD,gBAAAA,EACA,KAAAtxD,OAAAA,EACA,KAAAC,QAAAA,CACN,CAEH,QAAA8/B,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,OAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGU,qBAA5BnhC,EAAMsD,OAAOC,aAIzBvD,EAAMsD,OAAOC,WAAWD,OAAO0oD,UAAY7qD,EAAYnB,EAAMsD,OAAOC,WAAWD,OAAO0oD,UAAWjuD,KAAKqD,OAAQrD,KAAKsD,UAH3GrB,CAMT,ECxGc,MAAMkzD,GAEXR,gBACAta,kBACAzF,MACAvQ,eACA2c,YALT,WAAAlhD,CACS60D,EACAta,EACAzF,EAAQ,EACRvQ,EACA2c,GAAuB,GAJvB,KAAA2T,gBAAAA,EACA,KAAAta,kBAAAA,EACA,KAAAzF,MAAAA,EACA,KAAAvQ,eAAAA,EACA,KAAA2c,YAAAA,CACN,CAEH,QAAA5d,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAM4U,EAAiBh4C,KAAKq6C,kBAAkByI,kBAAkB9iD,KAAK40C,MAAO50C,KAAKqkC,eAAgBrkC,KAAKghD,aAQtG,OANAhJ,EAAelyC,SAAQ,CAACsvD,EAA8BrvD,KACrD,MAAMsvD,EAAqBD,EAAchyB,WACzCiyB,EAAmB3xB,MAAQ,kBAC3B,KAAQzhC,MAAMgC,SAAShC,EAAMsD,OAAOC,WAAY6vD,EAAoB,iBAAiBtvD,IAAQ,IAGvF9D,CACR,EAGM,MAAMqzD,GAEHX,gBACAta,kBACA/3B,OACA+hB,eAJT,WAAAvkC,CACS60D,EACAta,EACA/3B,EACA+hB,GAHA,KAAAswB,gBAAAA,EACA,KAAAta,kBAAAA,EACA,KAAA/3B,OAAAA,EACA,KAAA+hB,eAAAA,CACN,CAEH,QAAAjB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAMmyB,EAAgBv1D,KAAKsiB,OAAOohC,SAC5B8R,EAAyB,IAAId,GAAoB,KAAMa,GAAenyB,WACtEp6B,EAASJ,EAAoB4sD,EAAuBjwD,OAAOC,WAAWD,OAAO0oD,WAC7EwH,EAAcz1D,KAAKq6C,kBAAkBjW,eAAepkC,KAAKsiB,OAAOsuB,QAAS5nC,EAAQhJ,KAAKqkC,gBAQ5F,OANAoxB,EAAY3vD,SAAQ,CAAC4vD,EAAwB3vD,KAC5C,MAAM4vD,EAAkBD,EAAWtyB,WACnCuyB,EAAgBjyB,MAAQ,eACxB,KAAQzhC,MAAMgC,SAAShC,EAAMsD,OAAOC,WAAYmwD,EAAiB,cAAc5vD,IAAQ,IAGjF9D,CACR,EAGM,MAAM2zD,GAEHjB,gBACAta,kBACAhW,eAHT,WAAAvkC,CACS60D,EACAta,EACAhW,GAFA,KAAAswB,gBAAAA,EACA,KAAAta,kBAAAA,EACA,KAAAhW,eAAAA,CACN,CAEH,QAAAjB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAMqT,EAAaz2C,KAAKq6C,kBAAkByG,cAAc9gD,KAAKqkC,gBAQ7D,OANAoS,EAAW3wC,SAAQ,CAAC+vD,EAAsB9vD,KACzC,MAAM+vD,EAAiBD,EAAUzyB,WACjC0yB,EAAepyB,MAAQ,cACvB,KAAQzhC,MAAMgC,SAAShC,EAAMsD,OAAOC,WAAYswD,EAAgB,aAAa/vD,IAAQ,IAG/E9D,CACR,ECrFc,MAAM8zD,GAEXpB,gBACAryC,OACA0zC,eAHT,WAAAl2D,CACS60D,EACAryC,EACA0zC,GAFA,KAAArB,gBAAAA,EACA,KAAAryC,OAAAA,EACA,KAAA0zC,eAAAA,CACN,CAEH,QAAA5yB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGU,qBAA5BnhC,EAAMsD,OAAOC,WACxB,OAAOvD,EAGR,MAAM4G,EAAU,KAAQA,QAAQC,aAAa7G,GACvCg0D,EAAmB,KAAQptD,QAAQC,aAAa9I,KAAKg2D,eAAezwD,OAAOC,WAAWD,OAAO0oD,WAE7FjlD,EAASJ,EAAoB3G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WAGlE,GAA6B,IAAtBplD,EAAQ,OAAO,IAAkC,IAAtBA,EAAQ,OAAO,IAAsC,SAAtB7I,KAAKsiB,OAAO3K,MAAqB,CACjG,MAAMipC,EAAU53C,EAAO,GACjB63C,EAAU73C,EAAO,GAEvB,KAAQ/G,MAAM69C,KAAK79C,EAAO,EAAE2+C,GAAUC,G,CAGvC,MAAMjQ,EAAU5wC,KAAKsiB,OAAOsuB,QAE5B,KAAQ3uC,MAAM0hC,aAAa1hC,EAAO,CAAC2uC,EAAQ,GAAG3vC,QAAS2vC,EAAQ,GAAG3vC,UAClE,KAAQgB,MAAM0hC,aAAa1hC,EAAO,CAACg0D,EAAiB,OAAO,GAAIA,EAAiB,OAAO,KAIvF,MAAMC,EAAgB,KAAQrtD,QAAQC,aAAa7G,GAiBnD,OAhBGi0D,EAAc,OAAO,KAAOD,EAAiB,OAAO,IACtD,KAAQh0D,MAAM0hC,aAAa1hC,EAAO,EAAE,GAAK,IAGvCi0D,EAAc,OAAO,KAAOD,EAAiB,OAAO,IACtD,KAAQh0D,MAAM0hC,aAAa1hC,EAAO,CAAC,GAAI,KAGrCi0D,EAAc,QAAQ,KAAOD,EAAiB,QAAQ,IACxD,KAAQh0D,MAAM0hC,aAAa1hC,EAAO,CAAC,GAAK,IAGtCi0D,EAAc,QAAQ,KAAOD,EAAiB,QAAQ,IACxD,KAAQh0D,MAAM0hC,aAAa1hC,EAAO,CAAC,EAAG,KAGhCA,CACR,ECnDM,MAAMk0D,GAEHxB,gBACAyB,kBAFT,WAAAt2D,CACS60D,EACAyB,GADA,KAAAzB,gBAAAA,EACA,KAAAyB,kBAAAA,CACN,CAEH,QAAAhzB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGC,OAA3BpjC,KAAKo2D,kBACR,OAAOn0D,EAGR,IAAIixD,EAAiBlzD,KAAKo2D,kBAAkBjyB,aAM5C,OALA+uB,EAAiB,KAAQ0B,YAAY1B,GAErC,KAAQjxD,MAAMggD,MAAMiR,EAAgB,IAAI,GACxC,KAAQjxD,MAAMgC,SAAShC,EAAOixD,EAAgB,kBAEvCjxD,CACR,EAGM,MAAMo0D,GAEH1B,gBACA/pB,WAFT,WAAA9qC,CACS60D,EACA/pB,GADA,KAAA+pB,gBAAAA,EACA,KAAA/pB,WAAAA,CACN,CAEH,QAAAxH,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAMuvB,EAAkB,CAAEptD,OAAQ,CAAC,GAC7BsD,EAAU,KAAQA,QAAQC,aAAa7G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WAE5EjuD,KAAK4qC,WAAW9kC,SAAS,CAAEqpD,EAAWppD,KACrC,IAAImtD,EAAiB/D,EAAUhrB,aAE/B+uB,EAAiB,KAAQ0B,YAAY1B,GACrC,KAAQjxD,MAAMggD,MAAMiR,EAAgB,IAAI,GACxC,KAAQjxD,MAAMgC,SAAS0uD,EAAiBO,EAAgB,aAAantD,KACrE,KAAQ9D,MAAM0hC,aAAauvB,EAAgB,CAACrqD,EAAQy1C,IAAI,GAAIz1C,EAAQy1C,IAAI,IAAI,IAG7E,IAAIsR,EAAgB,CAAErqD,OAAQ,CAAC,GAS/B,OAPAI,OAAO+pD,OAAOiD,EAAgBptD,QAAQO,SAAS7D,IAC9C2tD,EAAgB,KAAQ3tD,MAAM+yD,aAAapF,EAAe3tD,EAAM,IAGjE2tD,EAAgBvqD,EAAWuqD,GAC3B,KAAQ3tD,MAAMgC,SAAShC,EAAO2tD,EAAe,kBAEtC3tD,CACR,EAOM,MAAMq0D,GAEH3B,gBACAxF,UACA9qB,eAHT,WAAAvkC,CACS60D,EACAxF,EACA9qB,GAFA,KAAAswB,gBAAAA,EACA,KAAAxF,UAAAA,EACA,KAAA9qB,eAAAA,CACN,CAEH,QAAAjB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,aAGzBpjC,KAAKmvD,UACT,OAAOltD,EAGR,MAAM4G,EAAU,KAAQA,QAAQC,aAAa7G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WAE5E,IAAIiF,EAAiBlzD,KAAKmvD,UAAUhrB,aACpC+uB,EAAexvB,MAAQ,mBACvB,KAAQzhC,MAAMggD,MAAMiR,EAAgB,IAAI,GACxCA,EAAiB,KAAQ0B,YAAY1B,GAErC,MAAMuC,EAAcz1D,KAAKmvD,UAAU/qB,eAAepkC,KAAKqkC,gBAYvD,OAVAoxB,EAAY3vD,SAAQ,CAAC4vD,EAAwB3vD,KAC5C,MAAM4vD,EAAkBD,EAAWtyB,WACnCuyB,EAAgBjyB,MAAQ,eACxB,KAAQzhC,MAAMgC,SAASivD,EAAgByC,EAAiB,cAAc5vD,IAAQ,IAG/E,KAAQ9D,MAAM0hC,aAAauvB,EAAgB,CAACrqD,EAAQy1C,IAAI,GAAIz1C,EAAQy1C,IAAI,KAExE,KAAQr8C,MAAMgC,SAAShC,EAAOixD,EAAgB,oBAEvCjxD,CACR,EAGM,MAAMs0D,GAEH5B,gBACAyB,kBACA/xB,eAHT,WAAAvkC,CACS60D,EACAyB,EACA/xB,GAFA,KAAAswB,gBAAAA,EACA,KAAAyB,kBAAAA,EACA,KAAA/xB,eAAAA,CACN,CAEH,QAAAjB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGC,OAA3BpjC,KAAKo2D,kBACR,OAAOn0D,EAGR,IAAIixD,EAAiBlzD,KAAKo2D,kBAAkBjyB,aAG5C,GAFA+uB,EAAiB,KAAQ0B,YAAY1B,GAElClzD,KAAKo2D,6BAA6B7D,GAAgB,CACpD,MAAMiE,EAAwBx2D,KAAKo2D,kBAAkBnD,yBAAyBjzD,KAAKqkC,gBAEhFmyB,IACFtD,EAAiBsD,EACjBtD,EAAexvB,MAAQ,mB,CAOzB,OAHA,KAAQzhC,MAAMggD,MAAMiR,EAAgB,IAAI,GACxC,KAAQjxD,MAAMgC,SAAShC,EAAOixD,EAAgB,kBAEvCjxD,CACR,EAGc,MAAMw0D,GAEX9B,gBACAyB,kBACA/xB,eAHT,WAAAvkC,CACS60D,EACAyB,EACA/xB,GAFA,KAAAswB,gBAAAA,EACA,KAAAyB,kBAAAA,EACA,KAAA/xB,eAAAA,CACN,CAEH,QAAAjB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGC,OAA3BpjC,KAAKo2D,kBACR,OAAOn0D,EAGR,MAAM4G,EAAU,KAAQA,QAAQC,aAAa7G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WACtEwH,EAAcz1D,KAAKo2D,kBAAkBhyB,eAAepkC,KAAKqkC,gBAS/D,OAPAoxB,EAAY3vD,SAAQ,CAAC4vD,EAAwB3vD,KAC5C,MAAM4vD,EAAkBD,EAAWtyB,WACnCuyB,EAAgBjyB,MAAQ,eACxB,KAAQzhC,MAAM0hC,aAAagyB,EAAiB,CAAC9sD,EAAQy1C,IAAI,GAAIz1C,EAAQy1C,IAAI,KACzE,KAAQr8C,MAAMgC,SAAShC,EAAMsD,OAAOC,WAAYmwD,EAAiB,cAAc5vD,IAAQ,IAGjF9D,CACR,ECpLM,MAAMy0D,GAEH/B,gBACAryC,OAFT,WAAAxiB,CACS60D,EACAryC,GADA,KAAAqyC,gBAAAA,EACA,KAAAryC,OAAAA,CACN,CAEH,QAAA8gB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGU,qBAA5BnhC,EAAMsD,OAAOC,WACxB,OAAOvD,EAGR,MAAM+G,EAASJ,EAAoB3G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WAIlE,OAFA,KAAQhsD,MAAMq/B,OAAOr/B,EAAMsD,OAAOC,WAAYxF,KAAKsiB,OAAO+H,WAAWnR,SAAUlQ,GAExE/G,CACR,EAIM,MAAM00D,GAEHhC,gBACAryC,OAFT,WAAAxiB,CACS60D,EACAryC,GADA,KAAAqyC,gBAAAA,EACA,KAAAryC,OAAAA,CACN,CAEH,QAAA8gB,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAEnBvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAG9B,MAAMwzB,EAAgB52D,KAAKsiB,OAAO+H,WAAWnR,SAE7C,GAAsB,IAAlB09C,EACH,OAAO30D,EAGR,MAAM+G,EAASJ,EAAoB3G,EAAMsD,OAAOC,WAAWD,OAAO0oD,WAC5DmE,EAAO,GACPzT,EAAW,IAAI,KAAQz8C,MAAMg8B,MAAKl1B,EAAQ,CAACA,EAAO,GAAKopD,EAAMppD,EAAO,KACpE6tD,EAAe,IAAI,KAAQ30D,MAAMg8B,MAAKl1B,EAAQ,CAACA,EAAO,GAAKopD,EAAMppD,EAAO,KACxE8tD,EAAU,IAAI,KAAQ50D,MAAMm8B,KAAIr1B,EAAQopD,EAAO,GAAI,EAAGwE,GAEtDG,EAAgB,CAAC,EAYvB,OAXA,KAAQz0D,KAAKg/B,OAAOu1B,EAAcD,EAAe5tD,GACjD,KAAQ/G,MAAMqhC,QAAQyzB,EAAepY,EAAU,aAC/C,KAAQ18C,MAAMqhC,QAAQyzB,EAAeF,EAAc,iBACnD,KAAQ50D,MAAMqhC,QAAQyzB,EAAeD,EAAS,YAC9C,KAAQ70D,MAAMwhC,WAAWszB,EAAelzB,GAAa+yB,EAAe,KAAM,CAAC5tD,EAAO,GAAKopD,EAAO,GAAIppD,EAAO,GAAK,KAG9G,KAAQ/G,MAAMq/B,OAAOy1B,GAAgBH,EAAe5tD,GACpD+tD,EAAcrzB,MAAQ,qBAEtB,KAAQzhC,MAAMgC,SAAShC,EAAO80D,EAAe,iBACtC90D,CACR,ECxDM,MAAM+0D,GAEHrC,gBACAplB,QAFT,WAAAzvC,CACS60D,EACAplB,GADA,KAAAolB,gBAAAA,EACA,KAAAplB,QAAAA,CACN,CAEH,QAAAnM,GACC,IAAInhC,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,YAGF,IAAxBpjC,KAAKuvC,QAAQ5vC,OAChB,OAAOsC,EAGR,MAAMg1D,EAAe,CAAE1xD,OAAQ,CAAC,GAEhCvF,KAAKuvC,QAAQzpC,SAAQ,CAACwc,EAAgBvc,KACrC,IAAImxD,EACJA,EAAiB,IAAIxC,GAAoB,KAAMpyC,EAAOohC,UACtDwT,EAAiB,IAAInB,GAAoBmB,EAAgB50C,EAAQrgB,GACjEi1D,EAAiB,IAAIR,GAAwBQ,EAAgB50C,GAE7D,MAAM7c,EAAcyxD,EAAe9zB,WAEnC,KAAQnhC,MAAMgC,SAASgzD,EAAcxxD,EAAa,eAAeM,IAAQ,IAG1E,IAAI6pD,EAAgB,CAAErqD,OAAQ,CAAC,GAS/B,OAPAI,OAAO+pD,OAAOuH,EAAa1xD,QAAQO,SAAS7D,IAC3C2tD,EAAgB,KAAQ3tD,MAAM+yD,aAAapF,EAAe3tD,EAAM,IAGjE2tD,EAAgBvqD,EAAWuqD,GAC3B,KAAQ3tD,MAAMgC,SAAShC,EAAO2tD,EAAe,eAEtC3tD,CACR,EAOM,MAAMk1D,GAEHxC,gBACAryC,OACA+hB,eACAuQ,MACAyY,kBACA7kB,yBACAwtB,eAPT,WAAAl2D,CACS60D,EACAryC,EACA+hB,EACAuQ,EACAyY,EACA7kB,EACAwtB,GANA,KAAArB,gBAAAA,EACA,KAAAryC,OAAAA,EACA,KAAA+hB,eAAAA,EACA,KAAAuQ,MAAAA,EACA,KAAAyY,kBAAAA,EACA,KAAA7kB,yBAAAA,EACA,KAAAwtB,eAAAA,CACN,CAEH,QAAA5yB,GACC,IAUI8zB,EAVAj1D,EAAQ,CAAEsD,OAAQ,CAAC,GAMvB,GAJIvF,KAAK20D,kBACR1yD,EAAQjC,KAAK20D,gBAAgBvxB,aAGzBpjC,KAAKsiB,OACT,OAAOrgB,EAIR,MAAMo4C,EAAoBr6C,KAAKsiB,OAAOohC,SACtCwT,EAAiB,IAAIxC,GAAoB,KAAMra,GAC/C6c,EAAiB,IAAInB,GAAoBmB,EAAgBl3D,KAAKsiB,OAAQtiB,KAAKg2D,gBAE3EkB,EAAiB,IAAI/B,GAAuB+B,EAAgB7c,EAAmBr6C,KAAK40C,MAAO50C,KAAKqkC,gBAChG6yB,EAAiB,IAAItB,GAAmBsB,EAAgB7c,EAAmBr6C,KAAKqkC,gBAE7ErkC,KAAKqkC,gBAAgBzkC,SAAS,oBAChCs3D,EAAiB,IAAIP,GAAiCO,EAAgBl3D,KAAKsiB,SAI5E40C,EAAiB,IAAIR,GAAwBQ,EAAgBl3D,KAAKsiB,QAE/DtiB,KAAKqkC,gBAAgBzkC,SAAS,kBAChCs3D,EAAiB,IAAI5B,GAAoB4B,EAAgB7c,EAAmBr6C,KAAKsiB,OAAQtiB,KAAKqkC,iBAG3FrkC,KAAKqtD,oBACR6J,EAAiB,IAAIhC,GAAkCgC,EAAgBl3D,KAAKwoC,0BAA0B,IAGvG,IAAI/iC,EAAcyxD,EAAe9zB,WAEjC,MAA8C,qBAAlC39B,EAAYF,OAAOC,aAI/BC,EAAYF,OAAOC,WAAWk+B,MAAQ,gBACtCj+B,EAAc,KAAQmvD,YAAYnvD,GAElC,KAAQxD,MAAMgC,SAAShC,EAAOwD,EAAa,iBAE3C,KAAQxD,MAAM4F,KAAK5F,GACnB,KAAQA,MAAM6F,UAAU7F,IAThBA,CAYT,ECpED,QACC8V,MAAO,KAAc,CACpBq/C,yBAA0BrzC,GAAUrjB,OAAOC,6BAA6BsvC,aAAaC,eAAemnB,4BACpGxuB,kBAAmB9kB,GAAUrjB,OAAOC,6BAA6BsvC,aAAaC,eAAemnB,4BAC7FC,qBAAsBvzC,GAAUrjB,OAAOC,6BAA6BsvC,aAAaC,eAAeqnB,wBAA0B,GAC1H3vB,gBAAiB,GACjBsE,sBAAuB,GACvBE,uBAAwB,GACxBC,uBAAwB,GACxBF,wBAAyB,EACzBW,0BAA2B,EAC3BC,wBAAyB,EACzBzC,iBAAkB,GAClBktB,uBAAwB,EACxB5uB,YAAaloC,OAAOC,6BAA6BsvC,aAAaC,eAAeunB,0BAA4B,SAAW,OACpHhvB,kBAAmB,UACnBd,mBAAoB,GACpB+vB,4BAA4B,EAC5BjD,yBAA0B/zD,OAAOC,6BAA6BgqC,kBAAkBgtB,YAAYC,wBAC5FC,uBAAwBn3D,OAAOC,6BAA6BgqC,kBAAkBgtB,YAAYG,uCAC1FC,uBAAwBr3D,OAAOC,6BAA6BgqC,kBAAkBgtB,YAAYK,uCAC1FC,uBAAwBv3D,OAAOC,6BAA6BgqC,kBAAkBgtB,YAAYO,4BAE3F1M,UAAW,CACV2M,4BAA6B,CAAEpgD,EAAOtL,IAAmBsL,EAAMm0B,sBAAwBz/B,EACvF2rD,6BAA8B,CAAErgD,EAAOtL,IAAmBsL,EAAMq0B,uBAAyB3/B,EACzF4rD,6BAA8B,CAAEtgD,EAAOtL,IAAmBsL,EAAMs0B,uBAAyB5/B,EACzF6rD,8BAA+B,CAAEvgD,EAAOtL,IAAmBsL,EAAMo0B,wBAA0B1/B,EAC3F8rD,gCAAiC,CAAExgD,EAAOtL,IAAmBsL,EAAM+0B,0BAA4BrgC,EAC/F+rD,8BAA+B,CAAEzgD,EAAOtL,IAAmBsL,EAAMg1B,wBAA0BtgC,EAC3FgsD,wBAAyB,CAAE1gD,EAAOtL,IAAmBsL,EAAM8wB,kBAAoBp8B,EAC/EisD,sBAAuB,CAAE3gD,EAAOtL,IAAmBsL,EAAM6vB,gBAAkBn7B,EAC3EksD,6BAA8B,CAAE5gD,EAAOquB,IAA+BruB,EAAMy/C,uBAAyBpxB,EACrGwyB,cAAe,CAAE7gD,EAAOtL,IAAkCsL,EAAMuyB,iBAAiB7nC,KAAMgK,GACvFosD,iBAAkB,CAAE9gD,EAAOhS,IAAyBgS,EAAMuyB,iBAAiBiB,OAAOxlC,EAAO,GACzF+yD,iBAAoB/gD,GAA8BA,EAAMuyB,iBAAmB,GAC3EyuB,uBAAwB,CAAEhhD,EAAOtL,IAAiDsL,EAAMuyB,iBAAmB79B,EAC3GihC,kBAAmB,CAAE31B,EAAO6wB,KAC3B7wB,EAAM6wB,YAAcA,EACpB7wB,EAAM2/C,4BAA6B,EAE5B9uB,GAAsC,IAAvBA,EAAYjpC,QAIlCe,QAAQif,WAAWld,KAAM,CACxBoX,MAAO,wBACP+F,cAAe,kBAAoBvZ,SAASsH,MAC5CkS,YAAa,+BACbC,WAAY8oB,GACV,EAEJ,uBAAAK,CAAyBlxB,EAAO0wB,GAC/B1wB,EAAM0wB,kBAAoBA,EAEpBA,GAAqB,IAAMA,EAAkB9oC,QAInDe,QAAQif,WAAWld,KAAM,CACxBoX,MAAO,wBACP+F,cAAe,yBAA2BvZ,SAASsH,MACnDkS,YAAa,sCACbC,WAAY2oB,GAEd,EACAuwB,gBAAiB,CAAEjhD,EAAOkhD,IAAqBlhD,EAAM4vB,mBAAqBsxB,EAC1EC,sCAAuC,CAAEnhD,EAAOs0C,IAAwBt0C,EAAM2/C,2BAA6BrL,EAC3G8M,6BAA8B,CAAEphD,EAAOi7C,IAAoBj7C,EAAM8/C,uBAAyB7E,EAC1FoG,6BAA8B,CAAErhD,EAAOi7C,IAAoBj7C,EAAMggD,uBAAyB/E,GAE3Fv+C,QAAS,CACRm0B,YAAe7wB,GAAmBA,EAAM6wB,YACxCH,kBAAqB1wB,GAAmBA,EAAM0wB,kBAC9Cd,mBAAsB5vB,GAAqBA,EAAM4vB,mBACjD0xB,iBAAkB,CAAEthD,EAAOtD,KAC1B,GAA6B,WAAxBA,EAAQm0B,YACZ,OAAO,KAER,IAEC,OAAO,IAAIipB,GACVp9C,EAAQ23B,uBACR33B,EAAQ43B,uBACR53B,EAAQo0B,kBACRp0B,EAAQ03B,wBACR13B,EAAQy3B,sBACRz3B,EAAQw3B,mB,CAER,MAAQjgC,G,CAIV,OAAO,IAAI,EAEZstD,eAAgB,CAAEvhD,EAAOtD,KACxB,GAA6B,SAAxBA,EAAQm0B,YACZ,OAAO,KAGR,IACC,OAAO,IAAImpB,GACVt9C,EAAQo0B,kBACRp0B,EAAQmzB,gBACRnzB,EAAQq4B,0BACRr4B,EAAQs4B,wBACRt4B,EAAQw3B,mB,CAER,MAAQjgC,G,CAIV,OAAO,IAAI,EAEZutD,eAAgB,CAAExhD,EAAOtD,KACxB,GAA4B,UAAxBA,EAAQm0B,YACX,OAAO,KAGR,GAAmC,OAA9Bn0B,EAAQg0B,kBACZ,OAAO,KAGR,IACC,OAAO,IAAI8pB,GACV99C,EAAQkD,MACRlD,EAAQxS,MACRwS,EAAQo0B,kBACRp0B,EAAQmzB,gBACRnzB,EAAQg0B,kBACRh0B,EAAQkzB,mB,CAER,MAAQ37B,G,CAIV,OAAO,IAAI,EAEZwtD,iBAAkB,CAAEzhD,EAAOtD,KAC1B,GAA6B,WAAxBA,EAAQm0B,YACZ,OAAO,KAGR,IACC,OAAO,IAAIyqB,GACV5+C,EAAQkD,MACRlD,EAAQxS,MACRwS,EAAQ4C,WACR5C,EAAQo0B,kBACRp0B,EAAQggD,yBACRhgD,EAAQojD,uBACRpjD,EAAQsjD,uBACRtjD,EAAQwjD,uB,CAER,MAAQjsD,G,CAIV,OAAO,IAAI,EAEZs+B,iBAAoBvyB,GAA8BA,EAAMuyB,iBACxDmvB,oBAAqB,CAAE1hD,EAAOtD,KAC7B,MAAMm2B,EAAa,GAEnB,IAAM,MAAMY,KAAQ/2B,EAAQ61B,iBAC3BM,EAAWnoC,KACV,IAAIshC,GACH,IAAIlkC,EAAQ2rC,EAAKrpC,GACjB,IAAItC,EAAQ2rC,EAAKppC,GACjB,IAAIvC,EAAQ2rC,EAAKllB,YAKpB,OAAOskB,CAAU,EAElB8uB,uBAAwB,SAAW3hD,EAAOtD,GACzC,MAAMnP,EAAgBmP,EAAQmE,mBAE9B,GAAK,IAASnE,EAAQkD,QAAW,IAASrS,EAAcC,SAAsC,UAAxBkP,EAAQm0B,aAA2B,IAASn0B,EAAQ8kD,gBACzH,MAAO,GAGR,MAAMvK,EAAkB,IAAInvD,EAAQkkB,GAAUrjB,OAAOC,6BAA6BsvC,aAAaC,eAAeqnB,wBAA0B,KAClI,WAAE3sB,GAAetlC,EAAcC,OAE/Bo0D,EAA0BllD,EAAQmlD,2BAClCjJ,EAAiB,IAAIkE,GAA2B,IAAIwB,GAAyBsD,EAAyBllD,EAAQglD,sBAAsBr2B,WACpI6qB,EAAY0C,EAAcprD,OAAOC,WAAWD,OAAO0oD,UAEzD,IAAI4L,EAEJ,OAASplD,EAAQm0B,aAChB,IAAK,SACJixB,EAAe,IAAI9K,GAA6BC,EAAiBj3C,EAAOtD,EAAQkD,MAAOlD,EAAQw6C,iBAAkBrkB,EAAYqjB,GAC7H,MACD,IAAK,OACJ4L,EAAe,IAAIvK,GAA2BN,EAAiBj3C,EAAO6yB,EAAYqjB,GAClF,MACD,IAAK,SACJ4L,EAAe,IAAInJ,GAA6B1B,EAAiBj3C,EAAOtD,EAAQ61B,iBAAkBqvB,EAAwBv2B,WAAYutB,GACtI,MACD,IAAK,QACJkJ,EAAe,IAAIrI,GAA2BxC,EAAiBj3C,EAAOtD,EAAQg9C,gBAAiB7mB,EAAYqjB,GAC3G,MACD,IAAK,SACJ4L,EAAe,IAAIrF,GAA6BxF,EAAiBj3C,GACjE,MACD,QACC8hD,EAAe,IAAIjI,GACnB,MAGF,OAAOiI,EAAa3K,eACrB,EACA4K,4BAA6B,SAAW/hD,EAAOtD,GAC9C,OAAOw/C,GAAqBx/C,EAAQilD,uBACrC,EACA7sB,4BAA6B,CAAE90B,EAAOtD,IAA+B4/C,GAAqB5/C,EAAQilD,wBAClGjI,gBAAiB,CAAE15C,EAAOtD,EAASslD,KAClC,MAAM5xD,EAAO,CACZ3F,KAAMiS,EAAQm0B,aAIf,OAFAmxB,EAAUne,aAAaoe,aAEM,SAAxBvlD,EAAQm0B,cAIgB,UAAxBn0B,EAAQm0B,cACZzgC,EAAM,YAAesM,EAAQg0B,kBAC7BtgC,EAAM,UAAasM,EAAQmzB,gBAAgB3mC,QAC3CkH,EAAM,YAAesM,EAAQo0B,kBAAkB5nC,QACb,WAA9BwT,EAAQg0B,oBACXtgC,EAAM,SAAYsM,EAAQkzB,qBAIC,WAAxBlzB,EAAQm0B,cACZzgC,EAAM,UAAasM,EAAQy3B,sBAC3B/jC,EAAM,YAAe,CAAC,EACtBA,EAAM,YAAc,QAAWsM,EAAQ23B,uBAAuBnrC,QAC9DkH,EAAM,YAAc,UAAasM,EAAQ43B,uBAAuBprC,QAChEkH,EAAM,kBAAqBsM,EAAQ03B,wBAAwBlrC,QAC3DkH,EAAM,YAAesM,EAAQo0B,kBAAkB5nC,SAGnB,SAAxBwT,EAAQm0B,cACZzgC,EAAM,oBAAuBsM,EAAQq4B,0BACrC3kC,EAAM,kBAAqBsM,EAAQs4B,wBACnC5kC,EAAM,UAAasM,EAAQmzB,gBAAgB3mC,QAC3CkH,EAAM,YAAesM,EAAQo0B,kBAAkB5nC,SAGnB,WAAxBwT,EAAQm0B,cACZzgC,EAAM,YAAesM,EAAQ61B,kBAGD,WAAxB71B,EAAQm0B,cACZzgC,EAAM,mBAAsBsM,EAAQsjD,uBAAuB92D,QAC3DkH,EAAM,mBAAsBsM,EAAQojD,uBAAuB52D,QAC3DkH,EAAM,gBAAmBsM,EAAQggD,yBAAyBxzD,QAC1DkH,EAAM,YAAesM,EAAQo0B,kBAAkB5nC,QAC/CkH,EAAM,kBAAqBsM,EAAQwjD,yBArC5B9vD,CAwCG,EAEZ,6BAAA8xD,CAA+BliD,EAAOtD,GACrC,IAAIivC,EAAW,KAkBf,OAhBKjvC,EAAQ8kD,iBACZ7V,EAAWjvC,EAAQ8kD,gBAGf9kD,EAAQ4kD,mBACZ3V,EAAWjvC,EAAQ4kD,kBAGf5kD,EAAQ6kD,iBACZ5V,EAAWjvC,EAAQ6kD,gBAGf7kD,EAAQ+kD,mBACZ9V,EAAWjvC,EAAQ+kD,kBAGb9V,CACR,EACA,sBAAAwW,CAAwBniD,EAAOtD,EAASslD,GACvC,MAAO,CAAEI,GAAY,KACpB,MAAMzW,EAAWjvC,EAAQwlD,8BACzB,IAAIh4D,EAAQ,KAKZ,GAFA83D,EAAUne,aAAaoe,aAEL,OAAbtW,EAAoB,CAGxB,GAFAzhD,EAAQyhD,EAASvf,aAEK,mBAAfliC,EAAMO,MAA6B,IAAaP,EAAMsD,SAA+B,qBAAftD,EAAMO,MAA+B,IAASP,EAAMC,OAChI,OAAO,KAGHi4D,IACJl4D,EAAMyhC,MAAQ,oBAEVjvB,EAAQ6B,kBAAoBguB,GAAU2B,YAAsC,SAAxBxxB,EAAQm0B,cAC/D3mC,EAAMyhC,MAAQ,oB,CAKjB,OAAOzhC,CAAK,CAEd,EACA,gBAAAqmC,CAAkBvwB,EAAOtD,GACxB,MAAO,CAAEoa,EAAO9oB,KACE,qBAAV8oB,GAA0C,qBAAVA,IAAkC9oB,IACxE8oB,EAAQ,GAAGA,KAAS9oB,MAGZsuD,GAAqB5/C,EAAQilD,uBAAwB7qC,GAEhE,EACA,6BAAA0Z,CAA+BxwB,EAAOtD,GACrC,MAAO,CAAEoa,EAAO9oB,KACE,qBAAV8oB,GAA0C,qBAAVA,GAA0C,oBAAVA,IAAiC9oB,IACvG8oB,EAAQ,GAAGA,KAAS9oB,KAGdwuD,GAA8B9/C,EAAQilD,uBAAwB7qC,GAEvE,EACA2oC,uBAA0Bz/C,GAAmBA,EAAMy/C,uBACnD9J,+BAAkC31C,GAAmB,IAAIlY,EAAQkY,EAAMu/C,sBACvE9uB,yBAA0B,CAAEzwB,EAAOtD,IAAqBA,EAAQi5C,+BAA+BntD,QAC/F,6BAAAiqC,CAA+BzyB,EAAOtD,GACrC,OAAO,EAAA4kB,GAAAA,SACN34B,OAAOC,6BAA6BgU,KAAK0zB,uBAAuB+xB,wBAChEv6D,EAAOM,QAASsU,EAAQ+zB,0BAA2BhoC,aAErD,EACA6sC,+BAAkCt1B,GAAoBA,EAAM2/C,2BAC5D5yB,WAAY,IACJ,CAAEntB,EAAO1V,EAAOgD,KACtB,IACC,MAAMutD,EAAiC,IAAIhrB,GACrCM,EAA0B0qB,EAA+B/qB,2BAA4B9vB,EAAO1V,GAElG,MAAS,eAAgB6lC,EAIlBA,EAAwBhD,WAAY7/B,GAHnC,C,CAIP,MAAO+G,GACR,OAAO,C,GAIV68B,kBAAqB9wB,GAAmB,IAAIlY,EAAQkY,EAAM8wB,mBAC1DjB,gBAAmB7vB,GAAmB,IAAIlY,EAAQkY,EAAM6vB,iBACxD6sB,yBAA4B18C,GAAmB,IAAIlY,EAAQkY,EAAM08C,0BACjEoD,uBAA0B9/C,GAAmB,IAAIlY,EAAQkY,EAAM8/C,wBAC/DE,uBAA0BhgD,GAAmB,IAAIlY,EAAQkY,EAAMggD,wBAC/DE,uBAA0BlgD,GAAmB,IAAIlY,EAAQkY,EAAMkgD,wBAC/D/rB,sBAAyBn0B,GAAmB1W,KAAKD,IAAI,EAAG2W,EAAMm0B,uBAC9DC,wBAA2Bp0B,GAAmB,IAAIlY,EAAQkY,EAAMo0B,yBAChEC,uBAA0Br0B,GAAmB,IAAIlY,EAAQkY,EAAMq0B,wBAC/DC,uBAA0Bt0B,GAAmB,IAAIlY,EAAQkY,EAAMs0B,wBAC/DS,0BAA6B/0B,GAAmB1W,KAAKD,IAAI,EAAG2W,EAAM+0B,2BAClEC,wBAA2Bh1B,GAAmB1W,KAAKD,IAAI,EAAG2W,EAAMg1B,yBAChErE,qBAAsB,CAAE3wB,EAAOtD,IACrBjS,IACR,MAAMgwD,EAAiC,IAAIhrB,GACrCM,EAA0B0qB,EAA+B/qB,2BAA4BhzB,EAAQkD,MAAOlD,EAAQxS,OAE5GyC,EAAU,CACf,QAAW,eAAgBojC,EAC3B,OAAU,cAAeA,EACzB,YAAc,EACd,YAAc,GAGf,OAAW,IAAapjC,EAASlC,KAAYkC,EAASlC,EAAQ,EAGhEmmC,aAAc,CAAE5wB,EAAOtD,KACtB,IACC,MAAMqzB,GAA0B,IAAKN,IAAkCC,2BAA4BhzB,EAAQkD,MAAOlD,EAAQxS,OACpHgD,EAASwP,EAAQmzB,gBAEvB,OAAKE,aAAmCtK,GAChC,EAGDsK,EAAwBhD,WAAW7/B,E,CACzC,MAAM+G,GACP,OAAO,C,IAIVmiD,QAAS,CACR,gCAAMkM,EAA4B,OAAE5uD,EAAM,MAAEsM,EAAK,SAAE0C,GAAYwrB,GAK9D,OAJAx6B,EAAQ,oBAAqBw6B,EAAWzjC,MACxCiJ,EAAQ,0BAA2Bw6B,EAAW3f,UAAYvO,EAAMq/C,0BAChE3rD,EAAQ,yCAAyC,GAExCw6B,EAAWzjC,MACnB,IAAK,QACJiY,EAAU,iCAAkCwrB,GAE5C,MACD,IAAK,OACJxrB,EAAU,iCAAkCwrB,GAE5C,MACD,IAAK,SAGoB,WAApBA,EAAWzjC,MAAqBoD,MAAMC,QAAQogC,EAAWjS,YAC5DiS,EAAWjS,SAAWiS,EAAWjS,SAASjvB,KAAIymC,IAAQ,IAClDA,EACHllB,SAAUklB,EAAKllB,UAAYvO,EAAMq/C,8BAInC3rD,EAAQ,yBAA0Bw6B,EAAWjS,UAC7C,MACD,IAAK,SACJvZ,EAAU,mCAAoCwrB,GAE9C,MACD,IAAK,SACJx6B,EAAQ,+BAAgCw6B,EAAWq0B,iBACnD7uD,EAAQ,+BAAgCw6B,EAAWs0B,iBAEnD,MACD,QACC,MAEH,EACA,sCAAMC,EAAkC,OAAE/uD,EAAM,MAAEsM,GAASkuB,GAC1Dx6B,EAAQ,8BAA+Bw6B,EAAWsG,QAClD9gC,EAAQ,+BAAgCw6B,EAAWuG,SAAShpC,MAC5DiI,EAAQ,+BAAgCw6B,EAAWuG,SAASC,QAC5DhhC,EAAQ,gCAAiCw6B,EAAWqG,eACrD,EACA,oCAAMmuB,EAAgC,OAAEhvD,EAAM,MAAEsM,GAASkuB,GACxDx6B,EAAQ,kCAAmCw6B,EAAWy0B,kBACtDjvD,EAAQ,gCAAiCw6B,EAAW00B,gBACpDlvD,EAAQ,wBAAyBw6B,EAAWhhC,OAC7C,EACA,oCAAM21D,EAAgC,OAAEnvD,EAAM,MAAEsM,GAASkuB,GACxDx6B,EAAQ,0BAA2Bw6B,EAAWgC,UAC9Cx8B,EAAQ,wBAAyBw6B,EAAWhhC,QAEf,WAAxBghC,EAAWgC,UACfx8B,EAAQ,kBAAmBw6B,EAAWj1B,MAExC,EACA,qBAAM6pD,EAAiB,OAAEpvD,EAAM,SAAEgP,IAChChP,EAAQ,oBAAqB,QAC7BA,EAAQ,0BAA2B,UACpC,ICpgBF,IACCsM,MAAO,KAAc,CACpB0S,SAAS,EACTqwC,MAAO,KACPvZ,MAAO,GACPwZ,iBAAkB,WAClBC,mBAAoB,CAAC,IAEtBxP,UAAW,CACVyP,mBAAoB,CAAEljD,EAAOtL,IAAoBsL,EAAM0S,QAAUhe,EACjEyuD,YAAa,CAAEnjD,EAAOtL,IAAmBsL,EAAM+iD,MAAQruD,EACvD0uD,gBAAiB,CAAEpjD,EAAOtL,IAAmBsL,EAAMgjD,iBAAmBtuD,EACtE2uD,sBAAuB,CAAErjD,EAAOtL,IAAmBsL,EAAMijD,mBAAqBvuD,EAC9E4uD,QAAS,CAAEtjD,GAASskC,WAAU/yC,gBAC8CugB,IAAvE9R,EAAMwpC,MAAMG,MAAM/3B,GAAcA,EAAW0yB,WAAaA,KAI5DtkC,EAAMwpC,MAAM9+C,KAAM,CACjB45C,WACA/yC,QACE,GAGL6kD,QAAS,CACR,eAAMmN,EAAW,SAAE7gD,EAAQ,QAAEhG,EAAO,OAAEhJ,GAAUqV,GAAW,GAC1D,MAAM,KAAExX,GAAWwX,EAA+BrM,EAAQm4C,gBAA5Bn4C,EAAQsT,UAE/BtT,EAAQ8mD,aAAajyD,UACrBmR,EAAU,WAAYnR,EAE9B,EACA,cAAMJ,EAAU,OAAEuC,GAAU4wC,GAC3B5wC,EAAO,sBAAsB,GAE7B,MAAQrC,QAASC,SAAmB,6BAEpC,IAAMgzC,EACL,OAGD5wC,EAAQ,cAAe,MAEvB,MAAMtC,EAAMzI,OAAOC,6BAA6B6pB,WAAa6xB,EAAW,OAExE,IAGC,MAAM/yC,QAAaD,EAASE,KAAMJ,GAClCsC,EAAQ,UAAW,CAAE4wC,WAAU/yC,SAC/BmC,EAAQ,wBAAyBnC,GACjCmC,EAAO,sBAAsB,E,CAC5B,MAAOjC,GACRiC,EAAQ,cAAejC,EAAIG,YAC3B8B,EAAO,sBAAsB,E,CAE/B,GAEDgJ,QAAS,CACR8mD,aAAexjD,GAAsBzO,GAAkByO,EAAMwpC,MAAM8H,MAAM11B,GAAOA,EAAI0oB,WAAa/yC,IACjGuP,cAAiBd,GAAoBA,EAAM0S,QAC3C+wC,oBAAuBzjD,GAAmBA,EAAMgjD,iBAChDC,mBAAsBjjD,GAAmBA,EAAMijD,mBAC/CS,YAAe1jD,GAAmBA,EAAMwpC,MACxC33B,sBAAuB,CAAE7R,EAAOtD,KAC/B,MAAMnL,EAAOyO,EAAMwpC,MAAMG,MAAM/3B,GAAcA,EAAW0yB,WAAa5nC,EAAQ+mD,sBAE7E,QAAc3xC,IAATvgB,EAIL,OAAOA,EAAKA,IAAI,ICpEnB,MAAMqL,GAAOjU,OAAOC,6BAA6BgU,KAEjD,QACCoD,MAAO,KAAc,CACpB2jD,kBAAmB,CAClBziD,KAAM,EACNC,SAAU,EACVJ,YAAa,CAAE,EAAG,IAEnBmG,iBAAkB,YAClBolB,eAAgB,GAChB/tB,gBAAiB,KACjB9B,iBAAkB,KAClBmnD,wBAAyB,KACzBC,WAAY,GACZC,cAAe,GACfC,eAAgB,GAChBC,gBAAiB,CAAC,EAClBC,mBAAmB,EACnBC,YAAa,EACb7/B,YAAa,EACb8/B,MAAO,CACN,CACCnlD,GAAIutB,GAAUoY,UACd/uC,MAAOgH,GAAKhH,MAAMgK,MAAMwkD,KACxBxlD,WAAYhC,GAAKhH,MAAMgK,MAAMykD,MAC7BxuD,KAAM,GACN6I,OAAQ,GACRU,YAAa,IAEd,CACCJ,GAAIutB,GAAUiL,QACd5hC,MAAOgH,GAAKhH,MAAM4hC,QAAQ4sB,KAC1BxlD,WAAYhC,GAAKhH,MAAM4hC,QAAQ6sB,MAC/BxuD,KAAM,GACN6I,OAAQ,GACRU,YAAa,IAEd,CACCJ,GAAIutB,GAAU2B,WACdt4B,MAAOgH,GAAKhH,MAAMi9B,WAAWuxB,KAC7BxlD,WAAYhC,GAAKhH,MAAMi9B,WAAWwxB,MAClCxuD,KAAM,GACN6I,OAAQ,GACRU,YAAazW,OAAO27D,2BAA6B37D,OAAO27D,2BAA2B,cAAgB,IAEpG,CACCtlD,GAAIutB,GAAUgW,UACd3sC,MAAOgH,GAAK2nD,iBACZ3lD,WAAYhC,GAAK2lC,UACjB1sC,KAAM,GACN6I,OAAQ,GACRU,YAAa,IAEd,CACCJ,GAAIutB,GAAUxQ,WACdnmB,MAAOgH,GAAKmf,WAAWnmB,MAAMwuD,KAC7BxlD,WAAYhC,GAAKmf,WAAWnmB,MAAMyuD,MAClCxuD,KAAM,GACN6I,OAAQ,GACRU,YAAazW,OAAO27D,2BAA6B37D,OAAO27D,2BAA2B,kBAAoB,IAExG,CACCtlD,GAAIutB,GAAUtS,SACdrkB,MAAOgH,GAAKqd,SAASopB,eACrBzkC,WAAYhC,GAAKqd,SAASA,SAC1BpkB,KAAM,GACN6I,OAAQ,GACRU,YAAa,IAEd,CACCJ,GAAIutB,GAAUiQ,cACd5mC,MAAOgH,GAAK4/B,cAAc5mC,MAAMwuD,KAChCxlD,WAAYhC,GAAK4/B,cAAc5mC,MAAMyuD,MACrCxuD,KAAM,GACN6I,OAAQ,GACRU,YAAa,OAIhBq0C,UAAW,CACVnwC,WAAY,CAAEtD,EAAOkB,IAAgBlB,EAAM2jD,kBAAkBziD,KAAOA,EACpEqC,eAAgB,CAAEvD,EAAOmB,IAAoBnB,EAAM2jD,kBAAkBxiD,SAAWA,EAChFqjD,kBAAmB,CAAExkD,EAAOe,IAAuBf,EAAM2jD,kBAAkB5iD,YAAcA,EACzF0jD,sBAAuB,CAAEzkD,EAAO5B,IAAoB4B,EAAMzB,gBAAkBH,EAC5EsmD,uBAAwB,CAAE1kD,EAAO1M,IAAqB0M,EAAMvD,iBAAmBnJ,EAC/EqxD,8BAA+B,CAAE3kD,EAAO1M,IAAqB0M,EAAM4jD,wBAA0BtwD,EAC7FsxD,eAAgB,CAAE5kD,EAAO2H,IAAoB3H,EAAMkH,iBAAmBS,EACtEk9C,qBAAsB,CAAE7kD,EAAO8B,KAC9B9B,EAAMssB,eAAmBxqB,EAAY,OAAKA,EAAMmf,OAAOjiB,GAAK8C,EAAM9C,EAAE,EAErE8lD,6BAA8B,CAAE9kD,EAAOs0C,IAAwBt0C,EAAMikD,kBAAoB3P,EACzFhwB,kBAAmB,CAAEtkB,EAAOkkD,IAAuBlkD,EAAMkkD,YAAcA,EACvEz/B,kBAAmB,CAAEzkB,EAAOqkB,IAAuBrkB,EAAMqkB,YAAcA,GAExE3nB,QAAS,CACR4B,YAAa,CAAC0B,EAAOtD,IAAasC,IACjC,MAAMX,EAAO2B,EAAMmkD,MAAMxa,MAAMtrC,GAAeA,EAAKW,KAAOA,IAC1D,IAAI+lD,EAAc,CAAC,EAEnB,OAAQ/lD,GACP,KAAKutB,GAAUoY,UACdogB,EAAc,CACblvD,KAAM,GAAG6G,EAAQ6M,iBAAiB7M,EAAQsoD,mBAC1CtmD,OAAQhC,EAAQuoD,4BAA8B,UAAY,aAE3D,MAED,KAAK14B,GAAUiL,QACdutB,EAAc,CACblvD,KAAM6G,EAAQw4C,uBACdx2C,OAAShC,EAAQw4C,uBAA+Bx4C,EAAQwoD,yBAA2B,UAAY,YAArD,IAE3C,MAED,KAAK34B,GAAU2B,WACd62B,EAAc,CACblvD,KAA8B,SAAxB6G,EAAQm0B,YAAyB,GAAKj0B,GAAKuoD,aAAazoD,EAAQm0B,aACtEnyB,OAAgC,SAAxBhC,EAAQm0B,YAAyB,GAAMn0B,EAAQo4B,4BAA8B,UAAY,aAElG,MAED,KAAKvI,GAAUgW,UACd,MAAMN,EAAmBvlC,EAAQwlC,wBACjC6iB,EAAc,CACblvD,KAAM,GAAGosC,EAAiBM,cAC1B7jC,OAAQujC,EAAmB,YAAc,IAE1C,MAED,KAAK1V,GAAUxQ,WACdgpC,EAAc,CACblvD,KAAM+G,GAAKmf,WAAWjX,QAAQpI,EAAQghB,kBACtChf,OAAQhC,EAAQghB,iBAAmB,YAAc,IAElD,MAED,KAAK6O,GAAUtS,SACd8qC,EAAc,CACblvD,KAAM6G,EAAQomC,wBAAwBltC,MACtC8I,OAAQhC,EAAQomC,uBAAyB,YAAc,IAExD,MAED,KAAKvW,GAAUiQ,cACduoB,EAAc,CACblvD,KAAM6G,EAAQ0oD,UACd1mD,OAAQhC,EAAQ0oD,UAAY,YAAc,IAE3C,MAGF,MAAO,IACH/mD,KACA0mD,EACH,EAEF,YAAAx7C,CAAcvJ,EAAOtD,GACpB,MAAM,MAAEkD,EAAK,YAAEqJ,GAAgBvM,EAC/B,MAAuB,KAAhBuM,EAAqBrM,GAAKyN,aAAapB,GAAerM,GAAKuN,WAAWvK,EAC9E,EACA2jC,eAAkBvjC,GAAmBA,EAAMkkD,YAC3C5gB,eAAkBtjC,GAAmBA,EAAMqkB,YAC3C,iBAAAyL,GACC,MAAM7pB,EAAQtd,OAAOud,WAAY,sBAEjC,OAAOD,EAAM3e,OACd,EACA4Z,KAAQlB,GAAmBA,EAAM2jD,kBAAkBziD,KACnDC,SAAYnB,GAAmBA,EAAM2jD,kBAAkBxiD,SACvDJ,YAAef,GAAqBA,EAAM2jD,kBAAkB5iD,YAC5DmG,iBAAoBlH,GAAmBA,EAAMkH,iBAC7C3I,gBAAmByB,GAAsBA,EAAMzB,gBAC/C9B,iBAAoBuD,GAAmBA,EAAMvD,iBAC7CmnD,wBAA2B5jD,GAAmBA,EAAM4jD,wBACpDC,WAAc7jD,GAAqBA,EAAM6jD,WACzCE,eAAkB/jD,GAAqBA,EAAM+jD,eAC7CC,gBAAmBhkD,GAAoCA,EAAMgkD,gBAC7D13B,eAAkBtsB,GAAmBA,EAAMssB,eAC3C3nB,sBAAyB3E,GAAoBA,EAAMikD,kBACnD,YAAAoB,CAAcrlD,EAAOtD,GACpB,OAAiC,OAA7BA,EAAQD,iBACJC,EAAQknD,wBAER,IAET,EACA,oBAAAz8C,CAAsBnH,EAAOtD,GAC5B,IAAI4oD,EAAU,CAAE,YAAa,SAAU,OAAQ,OAC/C,MAAM1oD,EAAOjU,OAAOC,6BAA6BgU,KAG3C2oD,EAAoB7oD,EAAQ+M,cAAcliB,QAASqY,GAAmB,cAAVA,IAWlE,OARA0lD,EAAUA,EAAQ/9D,QAAU24B,GACtBqlC,EAAkB39D,OAAS,GAAgB,WAAXs4B,GAI9BxjB,EAAQ+M,cAAc5hB,SAAUq4B,KAGjColC,EAAQt4D,KAAKkzB,IACnB,MAAMslC,EAAkB,CACvBn9C,UAAW6X,EACX9X,QAAS8X,EACTpkB,KAAMokB,EACN5Y,OAAO,EACPzR,KAAM,GACNT,OAAQsH,EAAQwK,mBAAqBgZ,GAGtC,OAAQA,GACP,IAAK,YACJ,MAAO,IACHslC,EACH3vD,KAAM+G,EAAKuN,WAAWnS,WAExB,IAAK,MACJ,MAAO,IACHwtD,EACH3vD,KAAM+G,EAAK/D,OACXyO,OAAO,GAET,IAAK,SACJ,MAAO,IACHk+C,EACH3vD,KAAM+G,EAAKlE,QAEb,IAAK,OACJ,MAAO,IACH8sD,EACH3vD,KAAM+G,EAAK/G,KAAKD,OAElB,QACC,OAAO4vD,E,GAGX,EACA,wBAAAjwB,CAA0Bv1B,EAAOtD,GAChC,IAAI4oD,EAAU,CAAE,OAAQ,QAAS,SAAU,OAAQ,SAAU,UAC7D,MAAM1oD,EAAOjU,OAAOC,6BAA6BgU,MAE3C,MAACgD,EAAK,MAAE1V,GAASwS,EACjB+9C,EAAiC,IAAIhrB,GAyB3C,OAtBA61B,EAAUA,EAAQ/9D,QAAU24B,IAC3B,IAAOtgB,EACN,OAAO,EAGR,MAAM,UAAE6lD,EAAS,YAAE7F,GAAgBj3D,OAAOC,6BAA6BgqC,kBAEjE7C,EAA0B0qB,EAA+B/qB,2BAA4B9vB,EAAO1V,GAC5Fw7D,EAAcD,GAAa,aAAc11B,IAA4B,IAAS6vB,GAE9EjzD,EAAU,CACf,MAAS+4D,EACT,OAAUA,IAAiB,eAAgB31B,GAA2B,cAAeA,GACrF,QAAW21B,EACX,MAASA,EACT,QAAWA,EACX,OAAUA,GAGX,MAAmC,qBAApB/4D,EAAQuzB,IAA2BvzB,EAAQuzB,EAAe,IAGnEolC,EAAQt4D,KAAKkzB,IACnB,MAAMslC,EAAkB,CACvBn9C,UAAW6X,EACX9X,QAAS8X,EACTpkB,KAAMokB,EACNrqB,KAAM+G,EAAKuoD,aAAcjlC,GACzB9qB,OAAQsH,EAAQm0B,cAAgB3Q,GAGjC,OAAQA,GACP,IAAK,OACJ,MAAO,IACHslC,EACH1pD,KAAM,SAGR,QACC,OAAO0pD,E,GAGX,EACA,qBAAAvuB,CAAuBj3B,EAAOtD,GAC7B,IAAI4oD,EAAU,CAAE,OAAQ,QAAS,OAAQ,OACzC,MAAM1oD,EAAOjU,OAAOC,6BAA6BgU,KAcjD,OAXA0oD,EAAUA,EAAQ/9D,QAAU24B,IAC3B,MAAMvzB,EAAU,CACf,CAACoqC,GAAYI,OAAO,EACpB,CAACJ,GAAYn3B,QAAQ,EACrB,CAACm3B,GAAYlhC,OAAO,EACpB,CAACkhC,GAAY7nC,MAAM,GAGpB,MAAmC,qBAApBvC,EAAQuzB,IAA2BvzB,EAAQuzB,EAAe,IAGnEolC,EAAQt4D,KAAKkzB,IACnB,MAAMslC,EAAkB,CACvBn9C,UAAW6X,EACX9X,QAAS8X,EACTpkB,KAAMokB,EACNrqB,KAAM,GACNT,OAAQsH,EAAQs6B,aAAe9W,GAGhC,OAAQA,GACP,IAAK,OACJ,MAAO,IACHslC,EACH1pD,KAAM,QACNjG,KAAM+G,EAAK2N,OAAOo7C,MAAMxuB,MAE1B,IAAK,MACJ,MAAO,IACHquB,EACH3vD,KAAM+G,EAAK2N,OAAOo7C,MAAM9sD,QAE1B,IAAK,QACJ,MAAO,IACH2sD,EACH1pD,KAAM,SACNjG,KAAM+G,EAAK2N,OAAOo7C,MAAM/lD,OAE1B,IAAK,OACJ,MAAO,IACH4lD,EACH3vD,KAAM+G,EAAK2N,OAAOo7C,MAAM9vD,MAE1B,QACC,OAAO2vD,E,GAGX,GAEDpP,QAAS,CAAC,G,sBC5VJ,MAAMwP,GAAY,IACjB,GAAIj9D,OAAOC,6BAA6Bs1B,8BAOnC2nC,GAAqB30D,MAAQ40D,EAAiB90B,EAAuB4R,GAAc,EAAO/5B,EAAgB1T,UACzG,UAAY,GAAGywD,eAAuB,CAAEE,UAAS90B,gBAAe4R,cAAa/5B,SAAQ1T,QAAQ,CACzG4wD,QAAS,CACR,aAAcp9D,OAAOC,6BAA6Bo9D,aCJrD,QACChmD,MAAO,KAAc,CACpBimD,uBAAuB,EACvBrlC,UAAW,GACXslC,kBAAmB,CAAC,EACpBhkB,wBAAyBv5C,OAAOC,6BAA6B25C,UAC7DO,uBAAwBn6C,OAAOC,6BAA6BqxB,SAC5DmoB,qBAAsBz5C,OAAOC,6BAA6Bw5C,qBAC1DW,mBAAoBp6C,OAAOC,6BAA6Bm6C,mBACxDojB,kBAAmB,KAEpB1S,UAAW,CACV2S,mBAAoB,CAAEpmD,EAAOtL,IAA6BsL,EAAMimD,sBAAwBvxD,EACxF2xD,gBAAiB,CAAErmD,EAAOtL,IAA2BsL,EAAM4gB,UAAYlsB,EACvE4xD,wBAAyB,CAAEtmD,EAAOtL,IAA2BsL,EAAMkmD,kBAAoBxxD,EACvF6xD,gBAAiB,CAAEvmD,EAAOuiC,IAA+BviC,EAAMkiC,wBAA0BK,EACzFikB,eAAgB,CAAExmD,EAAOia,IAA8Bja,EAAM8iC,uBAAyB7oB,EACtFwsC,wBAAyB,CAAEzmD,EAAO7K,IAA0B6K,EAAMmmD,kBAAoBhxD,GAEvFuH,QAAS,CACRgqD,qBAAwB1mD,GAAmBA,EAAMmmD,kBACjDnsB,mBAAoB,CAAEh6B,EAAOtD,KAC5B,MAAMiqD,EAAS,CACdz3C,KAAM,CACLtP,MAAOlD,EAAQkD,MACfqJ,YAAavM,EAAQuM,YACrB3J,WAAY5C,EAAQ4C,WACpByc,WAAYrf,EAAQghB,iBACpBkpC,eAAgBC,KAAKnqD,EAAQk+B,iBAC7BksB,iBAAkBpqD,EAAQ69B,oBAC1BwsB,iBAAkBrqD,EAAQsqD,qBAE3B94B,WAAYxxB,EAAQg9C,gBACpBnvC,OAAQ7N,EAAQo5C,aAChBte,QAAS96B,EAAQm5C,cACjBtT,UAAW,CACV7tC,MAAOgI,EAAQwlC,wBAAwBK,WAExC0kB,QAAS,GAOV,OAJKvqD,EAAQqmB,gBACZ4jC,EAAOz3C,KAAM,iBAAoBxS,EAAQqmB,eAGnC4jC,CAAM,EAEd7iB,kBAAmB,CAAE9jC,EAAOtD,IACpBwqD,KAAKC,UAAWzqD,EAAQs9B,oBAEhCotB,qBAAsB,CAAEpnD,EAAOtD,IACvBmqD,KAAMrlC,mBAAoB9kB,EAAQonC,oBAE1CujB,4BAA6B,CAAErnD,EAAOtD,IAC9B,GAAG/T,OAAOg6C,SAAS3mC,KAAKswC,MAAO,KAAO,0BAA2B5vC,EAAQ0qD,uBAEjF5mC,iBAAoBxgB,GACZA,EAAMimD,sBAEdt2B,2BAA8B3vB,GACtBA,EAAMkmD,kBAEdtlC,UAAa5gB,GAAmBA,EAAM4gB,UACtCwhB,qBAAwBpiC,GAAmBA,EAAMoiC,qBACjDW,mBAAoB,CAAE/iC,EAAOtD,IACzBA,EAAQ4qD,iBACH5qD,EAAQ4qD,iBAAiBvkB,mBAG1B/iC,EAAM+iC,mBAEdb,wBAA2BliC,GAAmBA,EAAMkiC,wBACpDY,uBAA0B9iC,GAAmBA,EAAM8iC,uBACnDviB,wBAAyB,CAAEvgB,EAAOtD,KACoD,IAA9E,KAASA,EAAQs9B,mBAAoBt9B,EAAQizB,4BAErD43B,eAAgB,KACf,MAAM51C,EAAQrjB,SAAS4W,cAAc,gCACrC,IAAIyM,EAAO,OAAO,KAElB,MAAM61C,EAAa71C,EAAMnhB,aAAa,eAEtC,IAAIg3D,EAAY,OAAO,KAEvB,MAAMb,EAASO,KAAKO,MAAMD,GAE1B,OAAqB,IAAlBb,EAAO/+D,OAAqB,KAExB++D,EAAO,GAAG31B,aAAa,EAE/Bs2B,iBAAkB,KACjB,MAAM31C,EAAQrjB,SAAS4W,cAAc,gCACrC,IAAIyM,EAAO,OAAO,KAElB,MAAM+1C,EAAc/1C,EAAMnhB,aAAa,iBACvC,OAAO02D,KAAKO,MAAMC,EAAY,EAE/BvR,iBAAkB,CAAEn2C,EAAOtD,KACvBA,EAAQ4qD,kBAAkBK,iBAEtBjrD,EAAQ0mB,gBAAgBwkC,mBAEhCC,oBAAqB,CAAE7nD,EAAOtD,KAC1BA,EAAQ4qD,kBAAkBQ,oBAEtBprD,EAAQ0mB,gBAAgB2kC,sBAEhCnkB,oBAAqB,CAAE5jC,EAAOtD,MACzBA,EAAQkD,QAELlD,EAAQmrD,qBAAyC,QAAlBnrD,EAAQkD,OAAqC,SAAlBlD,EAAQkD,QAG3Ew2C,QAAS,CACR,+BAAMxzB,EAA2B,QAAElmB,IAAW,IAAEtL,EAAG,YAAEwxC,GAAc,IAClE,MAAM5R,EAAgBt0B,EAAQs9B,mBACxBksB,EAAoBxpD,EAAQizB,2BAGlC,GAAK,KAASqB,EAAek1B,IAA+C,KAAtBxpD,EAAQkkB,gBAA0C9O,IAAtBpV,EAAQkkB,UACzF,MAAO,GAGR,MAAM/X,EAAS,OACT1T,EAAOuH,EAAQgqD,qBAEfsB,QAAgBnC,GAAoBz0D,EAAK4/B,EAAe4R,EAAa/5B,EAAQ1T,GAEnF,OAAO,IAAS6yD,EAAQ53D,KAAK63D,aAA4C,KAA5BD,EAAQ53D,KAAK63D,WAInD,GAHCD,EAAQ53D,KAAK63D,UAItB,EACA,6BAAMC,EAAyB,OAAEx0D,EAAM,SAAEgP,EAAQ,QAAEhG,IAClDhJ,EAAQ,sBAAsB,GAE9B,MAAM,SAAEumB,GAAatxB,OAAOC,6BACtB4D,QAAekW,EAAU,4BAA6B,CAC3DtR,IAAK6oB,EAASwoB,UAAU6J,MAAO,KAAO,GACtC1J,aAAa,IAGE,KAAXp2C,IACJkH,EAAQ,kBAAmBlH,GAC3BkH,EAAQ,0BAA2BgJ,EAAQs9B,qBAG5CtmC,EAAQ,sBAAsB,EAC/B,EACA,2BAAMgtB,EAAuB,QAAEhkB,IAAW,IAAEtL,EAAG,YAAEwxC,GAAc,IAC9D,MAAM5R,EAAgBt0B,EAAQs9B,mBACxBksB,EAAoBxpD,EAAQizB,2BAGlC,GAAK,KAASqB,EAAek1B,IAA+C,KAAtBxpD,EAAQkkB,gBAA0C9O,IAAtBpV,EAAQkkB,UACzF,MAAO,GAGR,MAAMonC,QAAgBnC,GAAoBz0D,EAAK4/B,EAAe4R,EAAa,QAAS,IAEpF,OAAO,IAASolB,EAAQ53D,KAAK63D,aAA4C,KAA5BD,EAAQ53D,KAAK63D,WAInD,GAHCD,EAAQ53D,KAAK63D,UAItB,EACA,yBAAME,EAAqB,OAAEz0D,EAAM,SAAEgP,EAAQ,QAAEhG,IAC9ChJ,EAAQ,sBAAsB,GAE9B,MAAM,SAAEumB,GAAatxB,OAAOC,6BACtB4D,QAAekW,EAAU,wBAAyB,CACvDtR,IAAK6oB,EAASwoB,UAAU6J,MAAO,KAAO,GACtC1J,aAAa,IAGE,KAAXp2C,IACJkH,EAAQ,kBAAmBlH,GAC3BkH,EAAQ,0BAA2BgJ,EAAQs9B,qBAG5CtmC,EAAQ,sBAAsB,EAC/B,EACA,uBAAM00D,EAAmB,OAAE10D,EAAM,SAAEgP,EAAQ,QAAEhG,IAC5C,MAAM,mBAAEs9B,EAAkB,oBAAEquB,GAAwB1/D,OAAOC,6BAC3D,IAAI0/D,EAAgBtuB,EAGpBsuB,EAAgB5rD,EAAQ6qD,eAAiB7qD,EAAQ6qD,eAAiBe,GAG7D3/D,OAAO4/D,QAAQC,eAA6E,IAA3D7/D,OAAOg6C,SAAS3mC,KAAKrU,QAAS,yBAAkF,IAAhDgB,OAAOg6C,SAAS3mC,KAAKrU,QAAS,aACnIgB,OAAO4/D,QAAQC,aAAc,CAAC,EAAG,GAAI7/D,OAAOg6C,SAAS/3C,OAASjC,OAAOg6C,SAAS8lB,UAG/E/0D,EAAQ,kBAAmB20D,GAC3B30D,EAAQ,0BAA2B40D,GACnC5lD,EAAU,mBAAoB4lD,EAC/B,EACA,0BAAMI,EAAsB,OAAEh1D,EAAM,SAAEgP,GAAYwM,GACjD,MAAM,MAAEtP,EAAK,WAAEN,EAAU,YAAE2J,GAAgBiG,EAE5B,QAAVtP,GACJlM,EAAQ,qBAAsB,CAAElH,OAAQm8D,KAAKz5C,EAAK03C,gBAAiB3+C,SAAUiH,EAAK43C,iBAAkB7qD,SAAUiT,EAAK63C,mBAGrG,SAAVnnD,IACJlM,EAAQ,iBAAkB,CAAE8c,SAAU,oBAAqB9b,MAAO4K,EAAW2T,oBAC7Evf,EAAQ,iBAAkB,CAAE8c,SAAU,OAAQ9b,MAAO4K,EAAW/N,OAChEmC,EAAQ,iBAAkB,CAAE8c,SAAU,OAAQ9b,MAAO4K,EAAWzJ,QAGlD,sBAAV+J,GACJlM,EAAQ,iBAAkB,CAAE8c,SAAU,yBAA0B9b,MAAO4K,EAAWgwC,yBAGpE,YAAV1vC,GACJlM,EAAQ,iBAAkB,CAAE8c,SAAU,cAAe9b,MAAO4K,EAAWirB,cAGzD,SAAV3qB,GACJlM,EAAQ,iBAAkB,CAAE8c,SAAU,mBAAoB9b,MAAO4K,EAAWiR,mBAI7E,IAAIzE,EAAa,KAAWxM,GAAckpC,IACzC,GAA0B,kBAAdA,EAIZ,OAAOA,EAAU52C,UAAU,IAI5Bka,EAAa,KAAQA,EAAY,KAKhCpY,EAAQ,iBAHW,IAAfuV,GAAgC,cAAVrJ,GAAmC,SAAVA,GAA8B,QAAVA,EAG7C,SAFAA,SAIrB8C,EAAU,cAAe9C,GAC/BlM,EAAQ,oBAAqBuV,GAE7BvV,EAAQ,wBAAyB,CAAEkM,QAAOkM,cAC3C,EACA,sBAAM88C,EAAkB,SAAElmD,EAAQ,QAAEhG,EAAO,OAAEhJ,IAAU,KAAEwb,EAAI,OAAE3E,EAAM,WAAE2jB,EAAU,QAAEsJ,IAClF,MAAM,eAAEW,EAAc,eAAE8d,GAAmBttD,OAAOC,6BAA6BsvC,aACzE2wB,EAAyF,MAA/DlgE,OAAOC,6BAA6BigE,wBAC9D,oBAAE/1B,GAAwBnqC,OAAOC,6BAA6BgqC,kBAsBpE,GApBK1jB,GAAQA,EAAKtP,OAAS,CAAE,eAAgBq2C,GAAiBpuD,SAAUqnB,EAAKtP,eACtE8C,EAAU,uBAAwBwM,GACxCxb,EAAQ,gCAAgC,IAIpCgJ,EAAQy5C,kBAAoB5rC,GAA0B,SAAhBA,EAAO9f,MAAmB,CAAE,eAAgBiS,EAAQs5C,uCAAwCnuD,SAAU0iB,EAAO3K,cACjJ8C,EAAU,yBAA0B6H,GAGxC7N,EAAQy5C,kBAAoB3e,GAAWA,EAAQ5vC,OAAS,QACpD8a,EAAU,0BAA2B80B,SAErC90B,EAAU,gBAGZhG,EAAQmrD,0BAAsC/1C,IAAfoc,SAC7BxrB,EAAU,6BAA8BwrB,GAG1CxxB,EAAQmrD,qBAAuB/0B,EAAoBlrC,OAAS,EAAI,CAGpE,MAAMkhE,EAA4B,IAAKh2B,GAAuBskB,GACtD,KAAWA,GAAan6B,GAAiBhR,SAAUgR,aAGrDva,EAAU,6BAA8B,CAAEjY,KAAM,SAAUwxB,SAAU6sC,EAA2Bv6C,SAAU4pB,EAAemnB,4B,CAG3HuJ,GAA0B35C,GAAQA,EAAK6M,YAC1CroB,EAAQ,yBAA0Bwb,EAAK6M,WAEzC,I,sBC3RK,MAAMgtC,WAAerd,GACVsd,OACAC,OACAC,cAETC,mBACDj8D,OAEP,WAAAnF,CAAa4E,GACZ2iC,MAAO3iC,GAEP1E,KAAK+gE,OAASr8D,EAAQy8D,oBACtBnhE,KAAKghE,OAASt8D,EAAQ08D,cACtBphE,KAAKihE,cAAgBv8D,EAAQu8D,eAAiB,GAE9CjhE,KAAKqhE,0BACN,CAEA,wBAAAA,GACC,MAAMC,EAAQ,gBAAqBthE,KAAK+gE,QAGlCt8B,EAAU,UAAcA,QAAS68B,EAAOthE,KAAKihE,cAAgB,GAAI,GAAG,GAC1E,UAAch9D,SAAUq9D,EAAO78B,EAAS,WACxCzkC,KAAKkhE,mBAAqBI,CAC3B,CAEA,sBAAAC,GACC,MAAMh9D,EAAS,UAAci9D,QAAQ,gBAAoBxhE,KAAKghE,QAAS,gBAAoBhhE,KAAKkhE,qBAAqB,GAAM,GAAO,GAAO,GACzI,IAAI9gB,GAAW,EAOf,OANA,UAAch7C,KAAKb,EAAOgB,OAAOs4B,EAAG,CACnCl5B,OAAS88D,IACRrhB,GAAW,CAAI,IAIVA,CACR,CAEA,UAAAtxB,GACC,MAAM,QAAE4yC,GAAYhhE,OAAOC,6BAA6BgU,KAAK+Z,WAE7D,OAAO2Y,MAAM6c,oBAAsBwd,EAAQz8D,OAAO08D,GACnD,CAEA,OAAA9c,GACC,OAAyC,IAAlC7kD,KAAKuhE,wBACb,CAEA,gBAAAK,GACC,OAMmC,IAN5B,CACN,iBACA,mBACA,yBACA,0BACA,aACChiE,SAAUI,KAAKghE,OAAOx+D,KACzB,EC/DM,MAAMq/D,GAGH5T,UACA2B,cAFT,WAAA9vD,CACSmuD,EACA2B,GADA,KAAA3B,UAAAA,EACA,KAAA2B,cAAAA,CACN,CAEH,UAAA9gC,GACC,MAAQxM,OAAQw/C,GAA4BphE,OAAOC,6BAA6BgU,KAAK+Z,WAErF,OAAOozC,EAAwBC,iBAAmB,kDACnD,CAEA,OAAAld,GACC,IAAIA,GAAU,EACd,MAAMngD,EAAU,CACfd,SAAS,GAGJosD,EAAkB,KAAQ/tD,MAAM0B,WAAW3D,KAAKiuD,UAAWvpD,GACjE,KAAQzC,MAAMguD,SAASjwD,KAAK4vD,eAC5B,MAAMM,EAAsB,KAAQjuD,MAAM0B,WAAW3D,KAAK4vD,cAAelrD,GAEzE,SAAKkB,MAAMC,QAAQmqD,KAAqBpqD,MAAMC,QAAQqqD,MAItDA,EAAoBpqD,SAAQ,CAAC/B,EAAuBgC,KAGhDhC,GAAOC,MAAMrE,OAASqwD,EAAgBjqD,IAAQ/B,MAAMrE,SACtDklD,GAAU,GAIR9gD,EAAMG,UAAYH,EAAMG,SAASvE,OAAS,IAC5CklD,GAAU,GAIR9gD,GAAOqsD,aAAeJ,EAAgBjqD,IAAQqqD,aAChDvL,GAAU,E,IAILA,EACR,ECzBD,QACCpwC,QAAS,CACRiE,gBAAiB,CAACX,EAAOtD,KACxB,MAAM,MAAEkD,EAAK,aAAEikC,EAAY,cAAE+O,GAAkBl2C,EACzC04C,EAAiB,IAAIzC,GAC3B,OAAOyC,EAAez0C,gBAAgBf,EAAOikC,EAAc+O,EAAc,EAE1EuE,cAAe,CAACn3C,EAAOtD,IACf,CAACkD,EAAe+rC,EAAyBh/C,EAAU,CAAC,KAC1D,GAAiB,OAAbg/C,EACH,MAAO,GAGR,IAAKA,EAASzhD,MACb,MAAO,GAGR,MAAM8mC,EAAgBt0B,EAAQutD,iBAAiBrqD,GACzCsqD,EAAsB,KAAKl5B,EAAcwc,iBAAkB,IAAIxc,EAAckc,wBAAyBlc,EAAcmc,sBAE1H,OAAGnc,EAAckd,iBACTld,EAAcsd,mBAAmB3C,EAAUjvC,EAAQytD,eAAgBztD,EAAQsvC,SAAUtvC,EAAQoP,YAG9FpP,EAAQ0tD,+BAA+BF,EAAqBtqD,EAAO+rC,EAAUh/C,EAAQ,EAG9F09D,qBAAsB,CAACrqD,EAAOtD,IACtB,CAACkD,EAAe+rC,EAAyBh/C,EAAU,CAAC,KAC1D,MAAM,WAAEqgD,EAAU,qBAAEsd,GAAyB5tD,EACvCs0B,GAAgB,IAAK0hB,IAA6BntB,kBAAkB3lB,GACpE2qD,EAAoB,KAAKv5B,EAAcwc,iBAAkB,CAAC,YAEhE,GAAI,IAAQ+c,GACX,MAAO,GAGR,IAAIC,EAAY,GAgBhB,OAdAD,EAAkBva,QAAQjiD,SAAS0hD,IAClC+a,EAAYA,EAAUC,OAAOhb,EAAMI,YAAY7iD,KAAKyd,GAC5CuxC,GAAwBvM,EAAME,eAAgB,CACpDllC,YACAkhC,WACA70B,MAAO,GAAGnqB,EAAQ,WAAa,KAAKiT,KAAS6K,IAC7CohC,QAASmB,EAAWviC,GACpBuhC,SAAUse,EACV1e,eAAe,EAAAtqB,GAAAA,SAAQmuB,EAAM14B,aAAci2B,EAAWviC,GAAY,SAC/D9d,MACE,IACJ,IAGG69D,EAAUjjE,OAAO8M,QAAQ,EAGlCi2D,qBAAsB,CAACtqD,EAAOtD,IACtBA,EAAQsvC,SAEhB0e,uBAAwB,CAAC1qD,EAAOtD,KAC/B,MAAM,MAAEkD,EAAK,iBAAE+qD,GAAqBjuD,EAEpC,OAAOA,EAAQy6C,cAAcv3C,EAAO+qD,EAAiB,EAEtDC,8BAA+B,CAAC5qD,EAAOtD,KACtC,MAAM,MAAEkD,EAAK,iBAAE+qD,GAAqBjuD,EAEpC,OAAOA,EAAQ2tD,qBAAqBzqD,EAAO+qD,EAAiB,EAM7DP,+BAAgC,CAACpqD,EAAOtD,KACvC,MAAM,mBAAEmuD,EAAkB,gBAAEC,EAAe,WAAE9d,EAAU,qBAAEsd,GAAyB5tD,EAElF,MAAO,CAACwtD,EAAqDtqD,EAAe+rC,EAAyBh/C,EAAU,CAAC,KAC/G,GAAI,IAAQiT,KAAWirD,IAAuBC,GAAgC,OAAbnf,EAChE,MAAO,GAGR,IAAIof,EAAkB,GAEtB,IAAK,MAAOtgD,EAAWkM,KAAe/oB,OAAOohC,QAAQk7B,GAAsB,CAC1E,MAAMc,EAAqBr0C,EAAW3pB,KAAK6pB,IAE1C,MAAMo0C,EAAO,CAEXxgD,YACAkhC,WACA70B,MAAO,GAAGnqB,EAAQ,WAAa,KAAKiT,KAAS6K,IAC7CohC,QAASmB,EAAWviC,GACpBuhC,SAAUse,KAER39D,GAGJ,OAAOqvD,GAAwBnlC,EAAWo0C,KAAS,CAAK,IACtD1jE,OAAO8M,SAEV02D,EAAkB,IAAIA,KAAoBC,E,CAG3C,OAAOD,CAAe,CACtB,EAEFn0C,4BAA6B,SAAU5W,EAAOtD,GAC7C,OAAOw/C,GAAoBx/C,EAAQguD,uBACpC,EACAQ,mCAAoC,SAAUlrD,EAAOtD,GACpD,OAAOw/C,GAAoBx/C,EAAQkuD,8BAA+B,MAAM,EACzE,EACA3F,4BAA6B,CAACjlD,EAAOtD,IAAqBA,EAAQka,4BAA4BhvB,OAAS,EACvG2uB,mCAAoC,CAACvW,EAAOtD,IACpCA,EAAQwuD,mCAAmCtjE,OAAS,EAE5D4Y,mBAAoB,CAACR,EAAOtD,KAC3B,MAAMia,EAAa,CAClBja,EAAQuoD,4BACRvoD,EAAQo4B,4BACRp4B,EAAQwoD,yBACRxoD,EAAQ6Z,mCACR7Z,EAAQg7B,iCAGT,OAAO/gB,EAAWpvB,OAAO8M,SAASzM,OAAS,CAAC,EAE7C0lB,iBAAkB,CAACtN,EAAOtD,IACjBoa,KACHpa,EAAQoE,gBAIJw7C,GAAoB5/C,EAAQguD,uBAAwB5zC,GAG9DrI,aAAc,CAACzO,EAAOtD,IACboa,IACCwlC,GAAoB5/C,EAAQkuD,8BAA+B9zC,GAAO,GAG5EN,qCAAsC,CAACxW,EAAOtD,IACzCA,EAAQ6Z,mCACJ7Z,EAAQkuD,8BAA8B,GAAG7zC,aAG1C,GAERo0C,oBAAqB,CAACnrD,EAAOtD,KAC5B,MAAM,MAAEkD,EAAK,iBAAEm1C,EAAgB,OAAExqC,EAAM,cAAE4sC,EAAa,mBAAEt2C,GAAuBnE,EAE/E,GAAI,IAAQkD,IAAUI,EAAMg3B,aAAeD,GAAYI,MAAQ,IAAQ4d,IAAqB,IAAQxqC,GACnG,MAAO,GAGR,MAAQA,OAAQw/C,GAA4BphE,OAAOC,6BAA6BgU,KAAK+Z,WAE/Eqa,EAAgBt0B,EAAQutD,iBAAiB1/C,EAAOohC,SAAS/rC,OAC/D,IAAImrD,EAAkB,GAGrBA,EADE/5B,EAAckd,iBACEld,EAAcud,sBAAsBhkC,EAAOohC,SAAUjvC,EAAQo4C,kBAE7DqC,EAAc5sC,EAAOohC,SAAS/rC,MAAO2K,EAAOohC,SAAU,CACvEE,QAAS,EACT9iC,UAAU,EACVD,OAAQ,YAIV,MAAM84C,EAA0BllD,EAAQmlD,2BAClCjJ,EAAiB,IAAIkE,GAA2B,IAAImC,GAAqB2C,EAAyBllD,EAAQ86B,UAAUnM,WACpH6qB,EAAY0C,EAAcprD,OAAOC,WAAWD,OAAO0oD,UACnDxoD,EAAckrD,EAAcprD,OAAOE,YAAYF,OAAO0oD,UAU5D,OARA6U,EAAgBrgE,KACf,IAAIo/D,GACHlI,EAAwBv2B,WACxButB,IAKGlrD,GAMDrB,EAAoBqB,EAAawoD,IAAyC,SAA1B3rC,EAAOohC,SAAS/rC,OACnEmrD,EAAgBrgE,KAAM,IAAIq+D,GAAQ,CACjCjyC,MAAO,eACPrM,UAAW,eACX4+C,cAAe37D,EACf07D,oBAAqBlT,EACrBtK,eAAe,EAAAtqB,GAAAA,SAAQyoC,EAAwBl4B,mBAAoB,EAAG,MACtE9oB,UAAU,KAIZgiD,EAAgBrgE,KACf,IAAIkiD,GAAqB,CACxBniC,UAAW,mBACXqM,MAAO,mBACPpiB,MAAO6V,EAAOsuB,QAAQ,GAAGrwC,WAI3BuiE,EAAgBrgE,KACf,IAAIkiD,GAAqB,CACxBniC,UAAW,qBACXqM,MAAO,qBACPpiB,MAAO6V,EAAOsuB,QAAQ,GAAGrwC,WAIpBuiE,GAhCC,EAgCc,EAEvBK,2BAA4B,SAAUprD,EAAOtD,GAC5C,MAAM,MAAEkD,EAAK,iBAAEm1C,EAAgB,OAAExqC,EAAQ8gD,kBAAmBrf,GAAatvC,EAEzE,OAAI,IAAQkD,IAAUI,EAAMg3B,aAAeD,GAAYI,MAAQ,IAAQ4d,IAAqB,IAAQxqC,GAC5F,GAGD7N,EAAQ2tD,qBAAqB9/C,EAAO3K,MAAO2K,EAAOohC,SAAU,CAClEK,WACAH,QAAS,EACT9iC,UAAU,EACVD,OAAQ,WAEV,EACA8uB,yBAA0B,SAAU53B,EAAOtD,GAC1C,OAAOA,EAAQyuD,oBAAoB5jE,QAAQsvB,IAAmCA,EAAUi2B,WACzF,EACAoY,yBAA0B,SAAUllD,EAAOtD,GAC1C,OAAOA,EAAQk7B,yBAAyBhwC,OAAS,CAClD,EACA0jE,gCAAiC,SAAUtrD,EAAOtD,GACjD,OAAOw/C,GAAoBx/C,EAAQ0uD,2BAA4B,MAAM,EACtE,EACA1zB,gCAAiC,CAAC13B,EAAOtD,IACjCA,EAAQ4uD,gCAAgC1jE,OAAS,EAEzD,0BAAAuuC,CAA2Bn2B,EAAOtD,GACjC,OAAQoa,GACA0lC,GAA6B9/C,EAAQyuD,oBAAqBr0C,EAEnE,EACA6gB,kCAAmC,CAAC33B,EAAOtD,IACtCA,EAAQg7B,gCACJh7B,EAAQ4uD,gCAAgC,GAAGv0C,aAG5C,GAERmf,cAAe,CAACl2B,EAAOtD,IACdoa,IACCwlC,GAAoB5/C,EAAQyuD,oBAAqBr0C,GAG3DtI,mBAAoB,CAACxO,EAAOtD,IACnBoa,IACCwlC,GAAoB5/C,EAAQ4uD,gCAAiCx0C,GAAO,KCxRzE,MAAMy0C,WAAcnkB,GAC1B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,QAASxjB,GAEhB7jB,KAAKq/C,cAAgB,CACpBv3B,WAAY,cACZF,YAAa,aACbF,WAAY,cACZF,YAAa,aAEf,CAEA,SAAAy3B,GACC,OAAOj/C,KAAKujE,gBAAgBriE,IAAKlB,KAAKwjE,gBACvC,CAEA,QAAA5gB,GACC,OAAO5iD,KAAKyjE,eAAeriE,IAAKpB,KAAK0jE,eACtC,CAKA,YAAAD,GACC,OAAOzjE,KAAKo/C,kBAAkB13B,UAC/B,CAKA,aAAA67C,GACC,OAAOvjE,KAAKo/C,kBAAkB53B,WAC/B,CAKA,YAAAk8C,GACC,OAAO1jE,KAAKo/C,kBAAkBt3B,UAC/B,CAKA,aAAA07C,GACC,OAAOxjE,KAAKo/C,kBAAkBx3B,WAC/B,CAKA,kBAAA+7C,GACC,OAAO3jE,KAAK0jE,eAAeviE,SAAUnB,KAAKyjE,gBAAiB9hE,KAC5D,CAEA,sBAAA6+C,GACC,MAAO,CAAEC,QAAS,aAAcC,UAAW,cAAekjB,SAAU,cAAeC,WAAY,aAChG,CAKA,WAAAvjB,IACM,IAAApF,SAASl7C,KAAKo/C,qBAInB/X,MAAMiZ,cAEN,UAAcz4C,KAAM7H,KAAKiC,OACzB,UAAc6F,UAAW9H,KAAKiC,OAC/B,CAEA,iBAAA6gD,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAG/D,MAAMH,EAAU7gD,KAAK0jE,eAAejiE,OAAQ,GAAIN,SAAUnB,KAAKyjE,eAAehiE,OAAQ,IAEtF,OAAG4iC,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAGoC,EAAQ5/C,SAAU,CAAC,EAAG4/C,EAAQ3/C,IAAKlB,KAAKyjE,gBAAiBxiE,SAAUjB,KAAKkgD,qBAAsB,eAAiB,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,IAClO,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAACz+C,KAAKujE,gBAAgBtiE,QAAS,GAAIjB,KAAKkgD,qBAAsB,cAAgB,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,iCAAkC1c,EAAgB2c,IAGtM,IAAIvC,GACH,CAACz+C,KAAKi/C,YAAYh+C,QAAS,GAC3B,CAACjB,KAAKi/C,YAAYh+C,QAASjB,KAAK0jE,eAAeziE,SAC/CjB,KAAKkgD,qBAAsB,eAC3B,CAAC,GAAI,GACLtL,EACA50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,IAI5E,IAAIvC,GACH,CAACz+C,KAAKujE,gBAAgBtiE,QAAS,GAC/B,CAACjB,KAAKujE,gBAAgBriE,IAAKlB,KAAKwjE,iBAAkBviE,QAAS,GAC3DjB,KAAKkgD,qBAAsB,cAC3B,CAAC,GAAI,IACLtL,EACA50C,KAAK+gD,qBAAqB,iCAAkC1c,EAAgB2c,KAKxE,EACR,CAEA,oBAAAgC,GACC,MAAO,CACNt7B,WAAY,GACZF,YAAa,GACbI,YAAa,GACbE,WAAY,GAEd,CAEA,0BAAAm7B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCqkB,EAAc73B,EAAmB7hC,QACjC25D,EAAe93B,EAAmB5hC,SAElCD,EAAQ05D,EAAYriE,OAAO,GAAGlB,QAC9B8J,EAAS05D,EAAatiE,OAAO,GAAGlB,QAEtC,MAAO,CACNmnB,WAAYtd,EACZod,YAAand,EACbud,YAAavmB,KAAKO,MAAMwI,EAASA,EAAQ,GACzC0d,WAAYzmB,KAAKO,MAAMyI,EAAUD,EAAQ,GAE3C,ECvIM,MAAMi4B,WAAgB8c,GAC5B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,UAAWxjB,EACnB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,QACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,EAAEz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,SAAUjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAU,EAAEjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,8BAA+B1c,EAAgB2c,IAC1S,IAAIvC,GAAe,EAAEz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,SAAUjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAU,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,SAAUjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,6BAA8B1c,EAAgB2c,KAInS,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN34C,OAAQ,GACRD,MAAO,GAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACND,MAAOA,EAAM3I,OAAO,GAAGlB,QACvB8J,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,EChDM,MAAM,WAAmB4+C,GAC/B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,cAAexjB,EACvB,CAEA,WAAAmgD,GACC,OAAOhkE,KAAKo/C,kBAAkB94B,QAC/B,CAEA,SAAA24B,GACC,OAAOj/C,KAAKo/C,kBAAkB94B,QAC/B,CAEA,QAAAs8B,GACC,OAAO5iD,KAAKo/C,kBAAkB94B,SAAS7kB,OAAQ,EAChD,CAEA,SAAAkhD,GACC,OAAO3iD,KAAKo/C,kBAAkB94B,SAAS7kB,OAAQ,EAChD,CAEA,sBAAA++C,GACC,MAAO,CAAEC,QAAS,WACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAKgkE,cAAc/iE,QAAS,GAAKjB,KAAKkgD,qBAAsB,YAAc,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,oCAAqC1c,EAAgB2c,IACvM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAK2iD,YAAYpiD,SAAW,EAAE,GAAI,GAAIq0C,IAIlI,EACR,CAEA,oBAAAoO,GACC,MAAO,CAAE18B,SAAU,GACpB,CAEA,0BAAA28B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNkc,SAAUlc,EAAM3I,OAAO,GAAGlB,QAE5B,EC9CM,MAAM0/B,WAAekf,GAC3B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,SAAUxjB,EAClB,CAEA,SAAAo7B,GACC,OAAOj/C,KAAKo/C,kBAAkB94B,QAC/B,CAEA,QAAAs8B,GACC,OAAO5iD,KAAKo/C,kBAAkB94B,QAC/B,CAEA,WAAA09C,GACC,OAAOhkE,KAAKo/C,kBAAkB94B,QAC/B,CAEA,sBAAAk6B,GACC,MAAO,CAAEC,QAAS,WACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,MAAMhJ,EAAiB,GAevB,OAbG3T,EAAezkC,SAAS,uBAAyBohD,IACnDhJ,EAAev1C,KACd,IAAIg8C,GAAe,EAAEz+C,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAUjB,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAU,EAAGjB,KAAKgkE,cAAcviE,OAAO,GAAGR,QAASjB,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAK4iD,YAAc,EAAE,GAAI,GAAIhO,GACtP,IAAI6J,GAAe,EAAEz+C,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAUjB,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAU,CAAEjB,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAUjB,KAAKgkE,cAAcviE,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,QAASlgD,KAAK4iD,YAAc,CAAC,GAAI,IAAKhO,IAIpPvQ,EAAezkC,SAAS,iCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GAAe,EAAEz+C,KAAKgkE,cAAcviE,OAAO,GAAGR,QAAS,GAAI,CAAEjB,KAAKgkE,cAAcviE,OAAO,GAAGR,QAAS,GAAKjB,KAAKkgD,qBAAsB,YAAc,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,+BAAgC1c,EAAgB2c,KAIzOhJ,CACR,CAEA,oBAAAgL,GACC,MAAO,CAAE18B,SAAU,GACpB,CAEA,0BAAA28B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNkc,SAAUlc,EAAM3I,OAAO,GAAGlB,QAE5B,ECjDM,MAAM0jE,WAAc9kB,GAE1B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,QAASxjB,EACjB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,MAAM/kB,EAAI79B,KAAKi/C,YAAY1+C,SAC1B,EAAI,EAAIc,KAAKy8B,KAAM,GAAM,IAGpBomC,EAAarmC,GAClBx8B,KAAKy8B,KAAM,GAAM,EAAI,GAGtB,OAAOj+B,EAAOM,QAAS+jE,EACxB,CAEA,sBAAA1jB,GACC,MAAO,CAAEC,QAAS,SACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,4BAA6B1c,EAAgB2c,IAC3L,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,QAASlgD,KAAK4iD,WAAWriD,SAAW,CAAC,GAAI,IAAKq0C,IAI/H,EACR,CAKA,WAAA0L,IACM,IAAApF,SAASl7C,KAAKo/C,qBAInB/X,MAAMiZ,cAEN,UAAcz4C,KAAM7H,KAAKiC,OACzB,UAAc6F,UAAW9H,KAAKiC,OAC/B,CAEA,oBAAA+gD,GACC,MAAO,CAAE34C,OAAQ,GAClB,CAEA,0BAAA44C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCp1C,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNA,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,ECnEM,MAAM4jE,WAAgBhlB,GAC5B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,UAAWxjB,EACnB,CAEA,aAAAugD,GACC,OAAOpkE,KAAKo/C,kBAAkB93B,WAC/B,CAEA,SAAA23B,GACC,OAAOj/C,KAAKo/C,kBAAkB93B,WAC/B,CAEA,QAAAs7B,GACC,MAAMx4C,EAAQpK,KAAKokE,gBAAgB7iE,SAAS,GAAGN,QAE/C,OAAOpB,EAAOQ,QAAS+J,EACxB,CAEA,SAAAu4C,GACC,MAAMt4C,EAAShJ,KAAKy8B,KAAK,GAAK99B,KAAKokE,gBAAgBnjE,QAEnD,OAAOpB,EAAOQ,QAASgK,EACxB,CAEA,sBAAAm2C,GACC,MAAO,CAAEC,QAAS,cACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GASrB,IAPG3T,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAK2iD,YAAYpiD,SAAW,EAAE,GAAI,GAAIq0C,GACvI,IAAI6J,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,QAASlgD,KAAK4iD,WAAWriD,SAAW,CAAC,GAAI,IAAKq0C,KAInIvQ,EAAezkC,SAAS,oCAAqC,CAG/D,MAAMykE,EAAmBrkE,KAAKokE,gBAAgB3iE,OAAO,GAErDu2C,EAAev1C,KAAK,IAAIg8C,GAAe,CAAC4lB,EAAiBpjE,QAAS,GAAI,CAAEjB,KAAKokE,gBAAgBljE,IAAImjE,GAAkBpjE,QAAS,GAAKjB,KAAKkgD,qBAAsB,eAAiB,CAAC,EAAG,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,mCAAoC1c,EAAgB2c,I,CAG5Q,OAAOhJ,CACR,CAKA,WAAAsI,IACM,IAAApF,SAASl7C,KAAKo/C,qBAInB/X,MAAMiZ,cAEN,UAAcz4C,KAAM7H,KAAKiC,OACzB,UAAc6F,UAAW9H,KAAKiC,OAC/B,CAEA,oBAAA+gD,GACC,MAAO,CAAE17B,YAAa,GACvB,CAEA,0BAAA27B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNkd,YAAald,EAAM3I,OAAO,GAAGlB,QAE/B,EC7EM,MAAM,WAA0B4+C,GACtC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,qBAAsBxjB,GAE7B7jB,KAAKq/C,cAAgB,CACpBp4B,KAAM,QAER,CAEA,SAAA07B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,OAAAi6D,GACC,OAAOtkE,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,QAAA27B,GACC,OAAO5iD,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,aAAAm9C,GACC,MAAMG,EAAYvkE,KAAK4iD,WAAWnhD,OAAO,GAAGR,QACtCoJ,EAASrK,KAAK2iD,YAAY1hD,QAE1BujE,EAAcD,EAAYA,EAAYl6D,EAASA,EAC/Cgd,EAAahmB,KAAKy8B,KAAK0mC,GAE7B,OAAO3kE,EAAOQ,QAAQgnB,EACvB,CAEA,sBAAAm5B,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,OACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,yCAA0C1c,EAAgB2c,IACxM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,uCAAwC1c,EAAgB2c,IACpM,IAAIvC,GAAe,CAAEz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAK2iD,YAAY1hD,QAAU,IAAM,CAACjB,KAAK4iD,WAAW3hD,SAAU,IAAKjB,KAAKkgD,qBAAsB,cAAelgD,KAAKokE,gBAAgB7jE,SAAW,CAAC,GAAI,IAAKq0C,IAIxM,EACR,CAEA,oBAAAoO,GACC,MAAO,CACN34C,OAAQ,GACR4c,KAAM,GAER,CAEA,0BAAAg8B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNA,OAAQA,EAAO5I,OAAO,GAAGlB,QACzB0mB,KAAM7c,EAAM3I,OAAO,GAAGlB,QAExB,ECjEM,MAAM,WAAsB4+C,GAClC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,iBAAkBxjB,EAC1B,CAEA,SAAA4gD,GACC,OAAOzkE,KAAKo/C,kBAAkBv5B,MAC/B,CAEA,SAAAo5B,GACC,OAAOj/C,KAAKo/C,kBAAkBv5B,MAC/B,CAEA,QAAA+8B,GACC,OAAO5iD,KAAKo/C,kBAAkBv5B,MAC/B,CAEA,sBAAA26B,GACC,MAAO,CAAEC,QAAS,SACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAKi/C,YAAYh+C,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAUlgD,KAAKi/C,YAAY1+C,SAAW,CAAC,GAAI,IAAKq0C,EAAO50C,KAAK+gD,qBAAqB,qCAAsC1c,EAAgB2c,KAIzN,EACR,CAEA,oBAAAgC,GACC,MAAO,CAAEn9B,OAAQ,GAClB,CAEA,0BAAAo9B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNyb,OAAQzb,EAAM3I,OAAO,GAAGlB,QAE1B,EC5CM,MAAM2hC,WAAkBid,GAC9B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,YAAaxjB,GAEpB7jB,KAAKq/C,cAAgB,CACpB1/C,OAAQ,QACRyK,MAAO,SAET,CAEA,SAAA60C,GACC,OAAOj/C,KAAKo/C,kBAAkBz/C,MAC/B,CAEA,QAAAijD,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SACvC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK4iD,WAAW3hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,+BAAgC1c,EAAgB2c,IAC7L,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAKi/C,YAAYh+C,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,KAIzL,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN54C,MAAO,GACPzK,OAAQ,GAEV,CAEA,0BAAAsjD,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACND,MAAOC,EAAO5I,OAAO,GAAGlB,QACxBZ,OAAQyK,EAAM3I,OAAO,GAAGlB,QAE1B,EChDM,MAAM,WAA4B4+C,GACxC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,wBAAyBxjB,GAEhC7jB,KAAKq/C,cAAgB,CACpBp4B,KAAM,QAER,CAEA,SAAA07B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,OAAAi6D,GACC,OAAOtkE,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,SAAAg4B,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,aAAAy9C,GACC,MAAMC,EAAoB3kE,KAAK4iD,WAAW3hD,SAAS,EAAIjB,KAAK2iD,YAAY1hD,SAAS,EAGjF,OAAOpB,EAAOQ,QAAQgB,KAAKy8B,KAAK6mC,GACjC,CAEA,sBAAAnkB,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,OACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAAI,CAAEjB,KAAK4iD,WAAW3hD,QAASjB,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,CAAC,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,4CAA6C1c,EAAgB2c,IACtP,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,0CAA2C1c,EAAgB2c,IAEvM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAASjB,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,cAAelgD,KAAK0kE,gBAAgBnkE,SAAW,EAAE,GAAI,IAAKq0C,IAIlK,EACR,CAEA,oBAAAoO,GACC,MAAO,CACN34C,OAAQ,GACR4c,KAAM,GAER,CAEA,0BAAAg8B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNA,OAAQA,EAAO5I,OAAO,GAAGlB,QACzB0mB,KAAM7c,EAAM3I,OAAO,GAAGlB,QAExB,ECjEM,MAAM,WAAoC4+C,GAChD,WAAAr/C,CAAa+jB,GACZwjB,MAAO,iCAAkCxjB,GAEzC7jB,KAAKq/C,cAAgB,CACpBp4B,KAAM,QAER,CAEA,SAAA07B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,OAAAi6D,GACC,OAAOtkE,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,SAAAg4B,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBn4B,IAC/B,CAEA,aAAAy9C,GACC,MAAMC,EAAoB3kE,KAAK4iD,WAAW3hD,SAAS,EAAIjB,KAAK2iD,YAAY1hD,SAAS,EAGjF,OAAOpB,EAAOQ,QAAQgB,KAAKy8B,KAAK6mC,GACjC,CAEA,sBAAAnkB,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,OACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,qDAAsD1c,EAAgB2c,IACpN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,mDAAoD1c,EAAgB2c,IAEhN,IAAIvC,GAAe,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAW,CAACjB,KAAK4iD,WAAW3hD,QAAS,GAAIjB,KAAKkgD,qBAAsB,cAAelgD,KAAK0kE,gBAAgBnkE,SAAW,CAAC,GAAI,IAAKq0C,IAIjK,EACR,CAEA,oBAAAoO,GACC,MAAO,CACN34C,OAAQ,GACR4c,KAAM,GAER,CAEA,0BAAAg8B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNA,OAAQA,EAAO5I,OAAO,GAAGlB,QACzB0mB,KAAM7c,EAAM3I,OAAO,GAAGlB,QAExB,ECnEc,MAAMqkE,GACH1hC,WACAC,SAEjB,WAAArjC,CAAaojC,EAAoBC,GAChCnjC,KAAKkjC,WAAaA,EAClBljC,KAAKmjC,SAAWA,CACjB,CAEA,QAAAC,GACC,MAAMnhC,EAAQ,CAAC,EAGf,OAFA,KAAQA,MAAMqhC,QAAQrhC,EAAO,IAAI,KAAQC,MAAMg8B,MAAKl+B,KAAKkjC,WAAYljC,KAAKmjC,UAAW,aAE9ElhC,CACR,ECXM,MAAM,WAAyBk9C,GACrC,WAAAr/C,CAAa+jB,EAAqBkE,GACjCsf,MAAO,oBAAqBxjB,EAAYkE,GAExC/nB,KAAKq/C,cAAgB,CACpB1/C,OAAQ,QACRyK,MAAO,SAET,CAEA,SAAA60C,GACC,OAAOj/C,KAAKo/C,kBAAkBz/C,MAC/B,CAEA,QAAAijD,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,SAAAq6D,GACC,OAAOzkE,KAAKo/C,kBAAkBv5B,MAC/B,CAEA,iBAAAg/C,GACC,OAAO7kE,KAAKo/C,kBAAmB,mBAChC,CAEA,oBAAA0lB,GACC,OAAO9kE,KAAKo/C,kBAAmB,sBAChC,CAEA,mBAAA2lB,GACC,OAAO/kE,KAAKo/C,kBAAmB,qBAChC,CAEA,gBAAA4lB,GACC,OAAOhlE,KAAKo/C,kBAAmB,kBAChC,CAEA,sBAAAoB,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SAAUkjB,SAAU,SAAUC,WAAY,mBACjF,CAEA,iBAAA/gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GASrB,IAPG3T,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK4iD,WAAW3hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,uCAAwC1c,EAAgB2c,IACrM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAKi/C,YAAYh+C,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,wCAAyC1c,EAAgB2c,MAIpM3c,EAAezkC,SAAS,yCAA2C,CACtE,MAAMqlE,EAAMjlE,KAAK4iD,WAAW3hD,QAAUjB,KAAKykE,YAAYxjE,QACjDikE,EAAY,CAAC,EAAGD,GAChBE,EAAa,CAACnlE,KAAKykE,YAAYxjE,QAASgkE,GACxCG,EAAa,IAAI3mB,GAAcymB,EAAWC,EAAYnlE,KAAKkgD,qBAAqB,UAAW,CAAC,EAAG,GAAItL,GACzGoD,EAAev1C,KAAK2iE,E,CAIrB,GAAI/gC,EAAezkC,SAAS,kDAAoD,CAC/E,MAAMqlE,EAAMjlE,KAAK4iD,WAAW3hD,QAAUjB,KAAKglE,mBAAmB/jE,QACxDikE,EAAY,CAAC,EAAGD,GAChBE,EAAa,CAACnlE,KAAKglE,mBAAmB/jE,QAASgkE,GAC/CG,EAAa,IAAI3mB,GAAcymB,EAAWC,EAAYnlE,KAAKkgD,qBAAqB,mBAAoB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,iDAAkD1c,EAAgB2c,IACrNhJ,EAAev1C,KAAK2iE,E,CAIrB,GAAI/gC,EAAezkC,SAAS,mDAAqD,CAChF,MAAMqlE,EAAMjlE,KAAK4iD,WAAW3hD,QAAUjB,KAAK6kE,oBAAoB5jE,QACzDikE,EAAY,CAACllE,KAAKi/C,YAAYh+C,QAAUjB,KAAK6kE,oBAAoB5jE,QAASgkE,GAC1EE,EAAa,CAACnlE,KAAKi/C,YAAYh+C,QAASgkE,GACxCG,EAAa,IAAI3mB,GAAcymB,EAAWC,EAAYnlE,KAAKkgD,qBAAqB,oBAAqB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,kDAAmD1c,EAAgB2c,IACvNhJ,EAAev1C,KAAK2iE,E,CAIrB,GAAI/gC,EAAezkC,SAAS,qDAAuD,CAClF,MAAMqlE,EAAMjlE,KAAK+kE,sBAAsB9jE,QACjCikE,EAAY,CAAC,EAAGD,GAChBE,EAAa,CAACnlE,KAAK+kE,sBAAsB9jE,QAASgkE,GAClDG,EAAa,IAAI3mB,GAAcymB,EAAWC,EAAYnlE,KAAKkgD,qBAAqB,sBAAuB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,oDAAqD1c,EAAgB2c,IAC3NhJ,EAAev1C,KAAK2iE,E,CAIrB,GAAI/gC,EAAezkC,SAAS,sDAAwD,CACnF,MAAMqlE,EAAMjlE,KAAK8kE,uBAAuB7jE,QAClCikE,EAAY,CAACllE,KAAKi/C,YAAYh+C,QAAUjB,KAAK8kE,uBAAuB7jE,QAASgkE,GAC7EE,EAAa,CAACnlE,KAAKi/C,YAAYh+C,QAASgkE,GACxCG,EAAa,IAAI3mB,GAAcymB,EAAWC,EAAYnlE,KAAKkgD,qBAAqB,uBAAwB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,qDAAsD1c,EAAgB2c,IAC7NhJ,EAAev1C,KAAK2iE,E,CAGrB,OAAOptB,CACR,CAEA,aAAA8I,CAAczc,EAAiB,IAC9B,MAAMoS,EAAa,GACnB,GAAIpS,EAAezkC,SAAS,yCAA2C,CACtE,MAAM4D,EAAOxD,KAAKykE,YAAYxjE,QACxBokE,EAAW,CAAC7hE,EAAMxD,KAAK4iD,WAAW3hD,SAClCqkE,EAAc,CAAC9hE,EAAMxD,KAAK4iD,WAAW3hD,QAAUjB,KAAKykE,YAAYxjE,SAChEmkE,EAAa,IAAIR,GAAUS,EAAUC,GAC3C7uB,EAAWh0C,KAAK2iE,E,CAIjB,GAAI/gC,EAAezkC,SAAS,kDAAoD,CAC/E,MAAM4D,EAAOxD,KAAKglE,mBAAmB/jE,QAC/BokE,EAAW,CAAC7hE,EAAMxD,KAAK4iD,WAAW3hD,SAClCqkE,EAAc,CAAC9hE,EAAMxD,KAAK4iD,WAAW3hD,QAAUjB,KAAKglE,mBAAmB/jE,SACvEmkE,EAAa,IAAIR,GAAUS,EAAUC,GAC3C7uB,EAAWh0C,KAAK2iE,E,CAIjB,GAAI/gC,EAAezkC,SAAS,mDAAqD,CAChF,MAAM4D,EAAOxD,KAAKi/C,YAAYh+C,QAAUjB,KAAK6kE,oBAAoB5jE,QAC3DokE,EAAW,CAAC7hE,EAAMxD,KAAK4iD,WAAW3hD,SAClCqkE,EAAc,CAAC9hE,EAAMxD,KAAK4iD,WAAW3hD,QAAUjB,KAAK6kE,oBAAoB5jE,SACxEmkE,EAAa,IAAIR,GAAUS,EAAUC,GAC3C7uB,EAAWh0C,KAAK2iE,E,CAIjB,GAAI/gC,EAAezkC,SAAS,qDAAuD,CAClF,MAAM4D,EAAOxD,KAAK+kE,sBAAsB9jE,QAClCokE,EAAW,CAAC7hE,EAAM,GAClB8hE,EAAc,CAAC9hE,EAAMxD,KAAK+kE,sBAAsB9jE,SAChDmkE,EAAa,IAAIR,GAAUS,EAAUC,GAC3C7uB,EAAWh0C,KAAK2iE,E,CAIjB,GAAI/gC,EAAezkC,SAAS,sDAAwD,CACnF,MAAM4D,EAAOxD,KAAKi/C,YAAYh+C,QAAUjB,KAAK8kE,uBAAuB7jE,QAC9DokE,EAAW,CAAC7hE,EAAM,GAClB8hE,EAAc,CAAC9hE,EAAMxD,KAAK8kE,uBAAuB7jE,SACjDmkE,EAAa,IAAIR,GAAUS,EAAUC,GAC3C7uB,EAAWh0C,KAAK2iE,E,CAGjB,OAAO3uB,CACR,CAEA,oBAAAuM,GACC,MAAO,CACN54C,MAAO,GACPzK,OAAQ,GACRkmB,OAAQ,EACR,gBAAmB,EACnB,iBAAoB,EACpB,mBAAsB,EACtB,oBAAuB,EAEzB,CAEA,0BAAAo9B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCqkB,EAAc73B,EAAmB7hC,QACjC25D,EAAe93B,EAAmB5hC,SAElCD,EAAQ05D,EAAYriE,OAAO,GAAGlB,QACpC,MAAO,CACN6J,MAAO25D,EAAatiE,OAAO,GAAGlB,QAC9BZ,OAAQmkE,EAAYriE,OAAO,GAAGlB,QAC9BslB,OAAQzb,EAAQ,GAChB,gBAAmBA,EAAQ,GAC3B,iBAAoBA,EAAQ,GAC5B,mBAAsBA,EAAQ,GAC9B,oBAAuBA,EAAQ,GAEjC,EChLM,MAAM,WAAwB+0C,GACpC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,mBAAoBxjB,EAC5B,CAEA,SAAAo7B,GACC,OAAOj/C,KAAKo/C,kBAAkB14B,WAC/B,CAEA,aAAA6+C,GACC,OAAOvlE,KAAKi/C,WACb,CAEA,cAAAumB,GACC,OAAOxlE,KAAKo/C,kBAAkBx4B,YAC/B,CAEA,cAAA6+C,GACC,OAAOzlE,KAAKwlE,gBACb,CAEA,QAAA5iB,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,cAAeC,UAAW,QAASkjB,SAAU,eAChE,CAEA,iBAAA9gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAAI,CAACjB,KAAK4iD,WAAW3hD,QAASjB,KAAKwlE,iBAAiBvkE,SAAWjB,KAAKkgD,qBAAsB,gBAAkB,CAAC,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,6CAA8C1c,EAAgB2c,IACjQ,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAC,EAAGz+C,KAAKi/C,YAAYh+C,SAAUjB,KAAKkgD,qBAAsB,eAAiB,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,4CAA6C1c,EAAgB2c,IAC9M,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAAIjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,sCAAuC1c,EAAgB2c,KAI5L,EACR,CAEA,oBAAAgC,GACC,MAAO,CACNt8B,YAAa,GACbE,aAAc,GACdxc,MAAO,GAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNqc,YAAarc,EAAO5I,OAAO,GAAGlB,QAC9BqmB,aAAavc,EAAO5I,OAAO,GAAGlB,QAC9B6J,MAAOA,EAAM3I,OAAO,GAAGlB,QAEzB,ECzDM,MAAM,WAAwB4+C,GACpC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,mBAAoBxjB,EAC5B,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,SAAAu2C,GACC,MAAO,CACN,CACCyH,eAAgB,SAChBG,gBAAiB,QACjB3T,MAAO,IAGV,CAEA,sBAAA4L,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,QACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,MAAMxf,EAAYxhC,KAAK2iD,YAAY1hD,QAAUjB,KAAK4iD,WAAW3hD,QAAU,EAEvE,OAAGojC,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,uCAAwC1c,EAAgB2c,IACtM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,sCAAuC1c,EAAgB2c,IACnM,IAAIvC,GAAe,CAACz+C,KAAK4iD,WAAW3hD,QAAU,EAAG,GAAI,CAACjB,KAAK4iD,WAAW3hD,QAAU,EAAGugC,GAAYxhC,KAAKkgD,qBAAsB,SAAU,IAAIrgD,EAAO2hC,IAAc,CAAC,EAAG,GAAIoT,IAIhK,EACR,CAEA,aAAAkM,CAAczc,EAAiB,IAC9B,MAAM7C,EAAYxhC,KAAK2iD,YAAY1hD,QAAUjB,KAAK4iD,WAAW3hD,QAAU,EACvE,MAAO,CACN,IAAI2jE,GAAW,CAAC,EAAGpjC,GAAY,CAACxhC,KAAK4iD,WAAW3hD,QAASugC,IAE3D,CAKA,WAAA8e,GACQtgD,KAAKo/C,kBAAkB/0C,QAAYrK,KAAKo/C,kBAAkBh1C,OAIjEi9B,MAAMiZ,aACP,CAEA,oBAAA0C,GACC,MAAO,CACN54C,MAAO,GACPC,OAAQ,GAEV,CAEA,0BAAA44C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACND,MAAOA,EAAM3I,OAAO,GAAGlB,QACvB8J,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,EC5DM,MAAM,WAAkB4+C,GAC9B,WAAAr/C,CAAa+jB,EAAqBkE,GACjCsf,MAAO,YAAaxjB,EAAYkE,EACjC,CAEA,SAAA46B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAK0lE,iBAAiBtkE,IAAKpB,KAAK2lE,cACxC,CAEA,WAAAA,GACC,OAAO3lE,KAAKo/C,kBAAkBt4B,SAC/B,CAEA,cAAA4+C,GACC,OAAO1lE,KAAKo/C,kBAAkBp4B,YAC/B,CAEA,aAAA4+C,GACC,OAAO5lE,KAAKo/C,kBAAkBh4B,WAC/B,CAEA,sBAAAo5B,GACC,MAAO,CAAEC,QAAS,YAAaC,UAAW,SAAUkjB,SAAU,eAAgBC,WAAY,cAC3F,CAEA,iBAAA/gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,MAAM6kB,EAA6B7lE,KAAK0lE,iBAAiBtkE,IAAKpB,KAAK2lE,eAEnE,IAAIG,EAA0B9lE,KAAK4lE,gBAAgBjkE,MAC/CokE,EAA6B,IAAIlmE,EAAQ,GAGxCG,KAAK2lE,cAAc1kE,QAAUjB,KAAK0lE,iBAAiBzkE,UACvD6kE,EAA0B,IAAIjmE,EAAQ,GACtCkmE,EAA6B/lE,KAAK4lE,gBAAgBjkE,OAInD,MAAMqkE,EAAmBhmE,KAAK2lE,cAAczkE,IAAI4kE,GAC1CG,EAAsBjmE,KAAK0lE,iBAAiBxkE,IAAI6kE,GAEhDG,EAAY,CACjB,IAAIznB,GAAe,CAAConB,EAA2B5kE,QAAS,GAAI,CAAC4kE,EAA2B5kE,QAASjB,KAAKi/C,YAAYh+C,SAAUjB,KAAKkgD,qBAAsB,UAAY,CAAC,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,IAC9P,IAAIvC,GAAe,CAACqnB,EAAwB7kE,QAASjB,KAAKi/C,YAAYh+C,SAAU,CAAC+kE,EAAiB/kE,QAASjB,KAAKi/C,YAAYh+C,SAAUjB,KAAKkgD,qBAAsB,aAAe,CAAC,EAAG,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,mCAAoC1c,EAAgB2c,IAC9Q,IAAIvC,GAAe,CAACsnB,EAA2B9kE,QAAS,GAAI,CAACglE,EAAoBhlE,QAAS,GAAIjB,KAAKkgD,qBAAsB,gBAAkB,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,sCAAuC1c,EAAgB2c,KAGxOmlB,EAAenmE,KAAK0lE,iBAAiBtkE,IAAKpB,KAAK2lE,eAC/CS,EAAiBpmE,KAAK0lE,iBAAiBpkE,IAAKtB,KAAK2lE,eAEjDU,GAAgBF,EAAallE,QAAUmlE,EAAenlE,SAAY,EAExE,GAAmB,IAAhBolE,EACF,OAAOH,EAGR,MAAMI,EAAa,CAAC,EAAGtmE,KAAK2iD,YAAY1hD,QAAU,GAC5CslE,EAAc,CAACF,EAAarmE,KAAK2iD,YAAY1hD,QAAU,GAI7D,OAFAilE,EAASzjE,KAAK,IAAIg8C,GAAe6nB,EAAYC,EAAavmE,KAAKkgD,qBAAsB,eAAiB,CAAC,EAAG,GAAItL,IAE3GvQ,EAAezkC,SAAS,uBAAyBohD,EAC5CklB,EAGD,EACR,CAEA,oBAAAljB,GACC,MAAO,CACNl8B,UAAW,GACXzc,OAAQ,GACR2c,aAAc,GACdI,YAAa,GAEf,CAEA,aAAA05B,CAAczc,EAAiB,IAC9B,MAAM8hC,EAAenmE,KAAK0lE,iBAAiBtkE,IAAKpB,KAAK2lE,eAC/CS,EAAiBpmE,KAAK0lE,iBAAiBpkE,IAAKtB,KAAK2lE,eAEjDU,GAAgBF,EAAallE,QAAUmlE,EAAenlE,SAAY,EAExE,GAAoB,IAAhBolE,EACH,MAAO,GAGR,MAAMG,EAAe,CAACH,EAAa,GAC7BI,EAAY,CAACJ,EAAarmE,KAAK2iD,YAAY1hD,SACjD,MAAO,CACN,IAAI2jE,GAAW4B,EAAcC,GAE/B,CAEA,0BAAAxjB,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAE5Byc,EAAY1c,EAAM3I,OAAO,GAAGlB,QAC5BymB,EAAeF,EAAcA,EAAY,EAE/C,MAAO,CACNA,UAAWA,EACXzc,OAAQA,EAAO5I,OAAO,GAAGlB,QACzBymB,aAAcA,EACdI,aAAiBJ,EAAeF,GAAc,EAEhD,CAEA,mBAAAq6B,GACC,MAAO,CAAC,cACT,EC3IM,MAAM5e,WAAa4c,GACzB,WAAAr/C,CAAa+jB,EAAqBkE,GACjCsf,MAAO,OAAQxjB,EAAYkE,EAC5B,CAEA,cAAA2+C,GACC,OAAO1mE,KAAKo/C,kBAAkBh3B,YAC/B,CAEA,cAAAu+C,GACC,OAAO3mE,KAAKo/C,kBAAkBl3B,YAC/B,CAEA,SAAA+2B,GACC,OAAOj/C,KAAKo/C,kBAAkBl3B,YAC/B,CAEA,QAAA06B,GACC,OAAO5iD,KAAKo/C,kBAAkBh3B,YAC/B,CAKA,iBAAAw+C,GACC,OAAO5iD,SAAUhkB,KAAKo/C,kBAAkB92B,iBACzC,CAEA,sBAAAk4B,GACC,MAAO,CAAEC,QAAS,eAAgBC,UAAW,eAC9C,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAKhhD,KAAKiC,MACT,MAAO,GAGR,MAAM4kE,GAAY,IAAAjS,aAAY50D,KAAKiC,OACnC,KAAQA,MAAMggD,MAAM4kB,EAAW,IAE/B,MAAMnjE,EAAS,KAAQzB,MAAM0B,WAAWkjE,GACxC,IAAInjE,GAA4B,IAAlBA,EAAO/D,OACpB,MAAO,GAGR,MAAMkJ,EAAU,KAAQA,QAAQC,aAAa9I,KAAKiC,OAC5C6kE,EAAgB,KAAQ/iE,MAAMc,YAAYnB,EAAO,IACjDqjE,EAAmB,KAAQ/hE,MAAMgiE,QAAQ,CAAC,GAAI,GAAIF,GAClDz8D,EAASxK,EAAOM,QAAQ0I,EAAQ,WAChCuB,EAAQvK,EAAOM,QAAQ0I,EAAQ,UAErC,OAAGw7B,EAAezkC,SAAS,uBAAyBohD,EAC5C,CAEN,IAAIvC,GAAe,CAAC5+C,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,QAASpB,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,SAAU,CAAEpB,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,QAASpB,EAAOM,QAAQ0I,EAAQ,QAAQ,IAAI5H,SAAWjB,KAAKkgD,qBAAsB,SAAU71C,EAAO9J,SAAW,EAAE,GAAI,GAAIq0C,GAEvQ,IAAI6J,GAAe,CAAC5+C,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,QAASpB,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,SAAU,CAAEpB,EAAOM,QAAQ0I,EAAQ,QAAQ,IAAI5H,QAASpB,EAAOM,QAAQ0I,EAAQ,OAAO,IAAI5H,SAAWjB,KAAKkgD,qBAAsB,QAAS91C,EAAM7J,SAAW,CAAC,GAAI,IAAKq0C,GAErQ,IAAI6J,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,gBAAkB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,iCAAkC1c,EAAgB2c,IACnM,IAAIvC,GAAe,CAAC,EAAG,GAAIsoB,EAAkB/mE,KAAKkgD,qBAAsB,gBAAkB,CAAC,EAAG,GAAItL,EAAO50C,KAAK+gD,qBAAqB,iCAAkC1c,EAAgB2c,KAIhL,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN96B,aAAc,GACdE,aAAc,GAEhB,CAEA,0BAAA66B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAE3Bge,EAAehe,EAAM3I,OAAO,GAAGlB,QAErC,MAAO,CACN2nB,aAAcE,EAAiBA,EAAe,EAC9CA,aAAcA,EAEhB,CAEA,yBAAA84B,GACC,MAAO,CACN54B,iBAAkB,EAEpB,E,gDCzFM,MAAM2+C,WAAY9nB,GACxB,WAAAr/C,CAAamC,GACZolC,MAAO,OACPrnC,KAAKiC,MAAQA,CACd,CAEA,WAAAq+C,GAAqB,CAErB,iBAAAwC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAOhhD,KAAKiC,MACX,MAAO,GAGR,MAAM4G,EAAU,YAAgBC,aAAc9I,KAAKiC,OAC7CilE,EAAW,CAAC,CAACr+D,EAAQy1C,IAAI,GAAIz1C,EAAQy1C,IAAI,IAAK,CAACz1C,EAAQw1C,KAAK,GAAIx1C,EAAQw1C,KAAK,KAE7E8oB,EAAgB,GAChBC,EAAkB,GAClBC,EAAcH,EAAS,GAAG,GAC1BI,EAAYJ,EAAS,GAAG,GAExBxjE,EAAS,UAAcC,WAAY3D,KAAKiC,OAC9C,IAAM,MAAM8B,KAASL,EAAS,CAC7B,MAAM2B,EAAa,UAAcW,WAAYjC,GAAO,GAC9CwjE,EAAe,YAAgBz+D,aAAczD,GAC7CmiE,EAAe,CAAC,CAACD,EAAajpB,IAAI,GAAIipB,EAAajpB,IAAI,IAAK,CAACipB,EAAalpB,KAAK,GAAIkpB,EAAalpB,KAAK,KAC3G8oB,EAAc1kE,KAAK,IAAIg8C,GAAe,CAAC6oB,EAAWE,EAAa,GAAG,IAAK,CAAEF,EAAWE,EAAa,GAAG,IAAMxnE,KAAKkgD,qBAAsB,SAAU,IAAIrgD,EAAO2nE,EAAa,GAAG,GAAKA,EAAa,GAAG,KAAO,EAAE,GAAI,GAAI5yB,IAChNwyB,EAAgB3kE,KAAK,IAAIg8C,GAAe,CAAC+oB,EAAa,GAAG,GAAIH,GAAc,CAAEG,EAAa,GAAG,GAAIH,GAAernE,KAAKkgD,qBAAsB,QAAS,IAAIrgD,EAAO2nE,EAAa,GAAG,GAAKA,EAAa,GAAG,KAAO,CAAC,GAAI,IAAK5yB,G,CAGtN,MAAM6yB,EAAuB,KAAM,KAAQN,EAAe,SAAW,IACrEM,EAAqBC,MAAK,CAAC7pC,EAAGsE,IAAMA,EAAE8c,YAAcphB,EAAEohB,cACtDwoB,EAAqB3hE,SAAS,CAAE6hE,EAAM5hE,KACrC4hE,EAAKjpB,YAAa34C,EAAQ,EAAG,IAG9B,MAAM6hE,EAAyB,KAAM,KAAQR,EAAiB,SAAW,IAMzE,OALAQ,EAAuBF,MAAK,CAAC7pC,EAAGsE,IAAMA,EAAE8c,YAAcphB,EAAEohB,cACxD2oB,EAAuB9hE,SAAS,CAAE6hE,EAAM5hE,KACvC4hE,EAAKjpB,YAAa34C,EAAQ,EAAG,IAGvB,GAAGy8D,OAAQiF,EAAsBG,EACzC,CAEA,SAAA3oB,GACC,MAAMp2C,EAAU,YAAgBC,aAAc9I,KAAKiC,OACnD,OAAOpC,EAAOQ,QAASwI,EAAQwB,OAChC,CAEA,QAAAu4C,GACC,MAAM/5C,EAAU,YAAgBC,aAAc9I,KAAKiC,OACnD,OAAOpC,EAAOQ,QAASwI,EAAQuB,MAChC,CAOA,oBAAAy9D,CAAsBX,GACrB,MAAO5lE,EAAKF,GAAO8lE,GACZY,GAASxmE,GACTymE,GAAS3mE,EAEhB,OAAO,IAAIvB,EAAQkoE,EAAQD,EAC5B,CAOA,mBAAAE,CAAqBd,GACpB,MAAO5lE,EAAKF,GAAO8lE,GACZ,CAAEe,GAAS3mE,GACX,CAAE4mE,GAAS9mE,EAElB,OAAO,IAAIvB,EAAQqoE,EAAQD,EAC5B,CAEA,oBAAAjlB,GACC,MAAO,CAAC,CACT,CAEA,0BAAAC,GACC,MAAO,CAAC,CACT,ECzFM,MAAMklB,WAAiBhpB,GAC7B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,YAAaxjB,EACrB,CAEA,SAAA4gD,GACC,OAAOzkE,KAAKo/C,kBAAkBv5B,MAC/B,CAEA,SAAAo5B,GACC,OAAOj/C,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,SAAAu4C,GACC,OAAO3iD,KAAKo/C,kBAAkBv5B,OAAOtkB,SAAS,EAC/C,CAEA,QAAAqhD,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SACvC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GAGrB,MAAMowB,EAAYpoE,KAAK4iD,WAAWzhD,SAASnB,KAAKykE,YAAYljE,SAAS,IAgBrE,OAdG8iC,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAK2iD,YAAYpiD,SAAW,EAAE,GAAI,GAAIq0C,GACvI,IAAI6J,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,QAASlgD,KAAK4iD,WAAWriD,SAAW,CAAC,GAAI,IAAKq0C,EAAO50C,KAAK+gD,qBAAqB,+BAAgC1c,EAAgB2c,IACrN,IAAIvC,GAAe,CAAEz+C,KAAKykE,YAAYxjE,QAASjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAW,CAAEmnE,EAAUlnE,IAAIlB,KAAKykE,aAAaxjE,QAASjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,QAASkoB,EAAU7nE,SAAW,CAAC,EAAG,GAAIq0C,KAItOvQ,EAAezkC,SAAS,kCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GAAe,CAAE,EAAGz+C,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAW,CAAEjB,KAAKykE,YAAYxjE,QAASjB,KAAK2iD,YAAYlhD,OAAO,GAAGR,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAKykE,YAAYlkE,SAAW,CAAE,EAAG,GAAKq0C,EAAO50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,KAIxRhJ,CACR,CAEA,aAAA8I,CAAczc,EAAiB,IAC9B,MAAM+jC,EAAYpoE,KAAK4iD,WAAWzhD,SAASnB,KAAKykE,YAAYljE,SAAS,IAErE,MAAO,CACN,IAAIqjE,GAAW,CAAE5kE,KAAKykE,YAAYxjE,QAAS,GAAK,CAAEjB,KAAKykE,YAAYxjE,QAASjB,KAAK2iD,YAAY1hD,UAC7F,IAAI2jE,GAAW,CAAEwD,EAAUlnE,IAAIlB,KAAKykE,aAAaxjE,QAAS,GAAK,CAAEmnE,EAAUlnE,IAAIlB,KAAKykE,aAAaxjE,QAASjB,KAAK2iD,YAAY1hD,UAG7H,CAEA,oBAAA+hD,GACC,MAAO,CACNn9B,OAAQ,GACRzb,MAAO,IAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNA,MAAOA,EAAM3I,OAAO,GAAGlB,QACvBslB,OAAQzb,EAAM3I,OAAO,GAAGlB,QAE1B,EC1EM,MAAM,WAA6B4+C,GACzC,WAAAr/C,CAAa+jB,GACZwjB,MAAO,yBAA0BxjB,EAClC,CAEA,SAAAo7B,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBp4B,YAC/B,CAEA,SAAA27B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,WAAAs7D,GACC,OAAO3lE,KAAKo/C,kBAAkBt4B,SAC/B,CAEA,cAAA4+C,GACC,OAAO1lE,KAAKo/C,kBAAkBp4B,YAC/B,CAEA,sBAAAw5B,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,YAAakjB,SAAU,eAC/D,CAEA,iBAAA9gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,MAAMngC,EAASwjB,EAAezkC,SAAS,wBAA0BohD,EAAc,UAAY,GAE3F,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SAAUjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO,GAAG/zB,gDAAuDwjB,EAAiBoZ,GAAkBgD,QAAUhD,GAAkBr0C,SAC3O,IAAIq1C,GAAe,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SAAU,CAACjB,KAAK2lE,cAAc1kE,QAASjB,KAAK2iD,YAAY1hD,SAAUjB,KAAKkgD,qBAAsB,aAAe,CAAC,EAAG,IAAKtL,EAAO,GAAG/zB,mDAA0DwjB,EAAiBoZ,GAAkBgD,QAAUhD,GAAkBr0C,SAChS,IAAIq1C,GAAe,CAAC,EAAG,GAAI,CAACz+C,KAAK0lE,iBAAiBzkE,QAAS,GAAIjB,KAAKkgD,qBAAsB,gBAAkB,CAAC,GAAI,IAAKtL,EAAO,GAAG/zB,sDAA6DwjB,EAAiBoZ,GAAkBgD,QAAUhD,GAAkBr0C,UAIvP,EACR,CAEA,oBAAA45C,GACC,MAAO,CACN34C,OAAQ,GACRyc,UAAW,GACXE,aAAc,GAEhB,CAEA,0BAAAi8B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNyc,UAAW1c,EAAM3I,OAAO,GAAGlB,QAC3BymB,aAAa5c,EAAM3I,OAAO,GAAGlB,QAC7B8J,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,EC3DM,MAAM8nE,WAAgBlpB,GAC5B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,UAAWxjB,EACnB,CAEA,aAAAugD,GACC,OAAOpkE,KAAKo/C,kBAAkB93B,WAC/B,CAEA,SAAA23B,GACC,OAAOj/C,KAAKo/C,kBAAkB93B,WAC/B,CAEA,QAAAs7B,GACC,OAAO5iD,KAAKo/C,kBAAkB93B,WAC/B,CAEA,SAAAq7B,GACC,MAAMt4C,GAAU,EAAIhJ,KAAKy8B,KAAK,IAAM99B,KAAKokE,gBAAgBnjE,QAEzD,OAAOpB,EAAOQ,QAASgK,EACxB,CAEA,sBAAAm2C,GACC,MAAO,CAAEC,QAAS,cACnB,CAEA,SAAAgkB,GACC,MAAMnlC,EAAQ,EACRC,EAAiBl+B,KAAKm+B,GAAKF,EAC3BG,EAAWp+B,KAAKq+B,IAAKH,GACrB1Z,EAAS7lB,KAAKokE,gBAAgBnjE,SAAY,EAAIw+B,GACpD,OAAO5/B,EAAOQ,QAASwlB,EACxB,CAEA,iBAAAi9B,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GAGrB,MAAMzY,EAAiBl+B,KAAKm+B,GAAK,EAC3BC,EAAWp+B,KAAKq+B,IAAKH,GACrB1Z,EAAS7lB,KAAKokE,gBAAgBnjE,SAAY,EAAIw+B,GAC9Cx6B,EAASpF,EAAOQ,QAASwlB,GAa/B,OAXGwe,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,SAAUlgD,KAAK2iD,YAAYpiD,SAAW,EAAE,GAAI,GAAIq0C,GACvI,IAAI6J,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK2iD,YAAY1hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,QAASlgD,KAAK2iD,YAAYpiD,SAAW,CAAC,GAAI,IAAKq0C,KAIrIvQ,EAAezkC,SAAS,qCAC1Bo4C,EAAev1C,KAAK,IAAIg8C,GAAe,CAACx5C,EAAOhE,QAAS,GAAI,CAAEjB,KAAKokE,gBAAgBljE,IAAI+D,GAAQhE,QAAS,GAAKjB,KAAKkgD,qBAAsB,eAAiB,CAAC,EAAG,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,mCAAoC1c,EAAgB2c,KAGjPhJ,CACR,CAKA,WAAAsI,IACM,IAAApF,SAASl7C,KAAKo/C,qBAInB/X,MAAMiZ,cAEN,UAAcz4C,KAAM7H,KAAKiC,OACzB,UAAc6F,UAAW9H,KAAKiC,OAC/B,CAEA,oBAAA+gD,GACC,MAAO,CAAE17B,YAAa,GACvB,CAEA,0BAAA27B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNkd,YAAald,EAAM3I,OAAO,GAAGlB,QAE/B,ECrFM,MAAM+nE,WAAgBnpB,GAE5B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,UAAWxjB,EACnB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,QACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAc,CAAC,EAAG,GAAI,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SAAUjB,KAAKkgD,qBAAqB,UAAW,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,8BAA+B1c,EAAgB2c,IACxL,IAAIvC,GAAc,CAAC,EAAG,GAAI,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAAIjB,KAAKkgD,qBAAqB,SAAU,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,6BAA8B1c,EAAgB2c,KAIhL,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN34C,OAAQ,GACRD,MAAO,GAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCp1C,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACNA,OAAQA,EAAO5I,OAAO,GAAGlB,QACzB6J,MAAOC,EAAO5I,OAAO,GAAGlB,QAE1B,EChDM,MAAMo/B,WAAgBwf,GAC5B,WAAAr/C,CAAa+jB,EAAqBkE,GACjCsf,MAAO,UAAWxjB,EAAYkE,EAC/B,CAEA,SAAAk3B,GACC,OAAOj/C,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,QAAAw4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,SAAAu4C,GACC,OAAO3iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,aAAAm+D,GACC,OAAQvoE,KAAKo/C,kBAAkB9c,WAChC,CAEA,aAAA8hC,GACC,MAAM/8C,EAAa,EAAIrnB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAAUI,KAAKq+B,IAAIr+B,KAAKm+B,GAAKx/B,KAAKuoE,iBAEnF,OAAO1oE,EAAOQ,QAAQgnB,EACvB,CAEA,sBAAAm5B,GACC,MAAO,CAAEC,QAAS,QACnB,CAEA,iBAAAqC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAKhhD,KAAKiC,MACT,MAAO,GAGR,GAAGoiC,EAAezkC,SAAS,uBAAyBohD,EAAa,CAChE,MAAMn4C,EAAU,YAAgBC,aAAa9I,KAAKiC,OAG5C0lE,EAAO3nE,KAAKwoE,uBAAuBxoE,KAAKiC,MAAMC,OAE9CumE,EAAY,CAAC5oE,EAAOM,QAAQwnE,EAAKhlE,OAAO,IAAI1B,QAASpB,EAAOM,QAAQwnE,EAAKhlE,OAAO,IAAI1B,SACpFynE,EAAU,CAAC7oE,EAAOM,QAAQwnE,EAAKplE,IAAI,IAAItB,QAASpB,EAAOM,QAAQwnE,EAAKplE,IAAI,IAAItB,SAElF,MAAO,CACN,IAAIw9C,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,6BAA8B1c,EAAgB2c,IAC1L,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAG5+C,EAAOM,QAAQ0I,EAAQwB,QAAQpJ,SAAWjB,KAAKkgD,qBAAsB,SAAUrgD,EAAOM,QAAQ0I,EAAQwB,QAAQ9J,SAAW,EAAE,GAAI,GAAIq0C,GAEnK,IAAI6J,GAAegqB,EAAWC,EAAS1oE,KAAKkgD,qBAAsB,QAASlgD,KAAKokE,gBAAgB7jE,SAAW,CAAC,EAAG,GAAIq0C,G,CAIrH,MAAO,EACR,CAKA,WAAA0L,GACQtgD,KAAKo/C,kBAAkBh1C,OAAWpK,KAAKo/C,kBAAkB9c,cAIhE+E,MAAMiZ,cAECtgD,KAAKiC,QAIZ,UAAc4F,KAAM7H,KAAKiC,OACzB,UAAc6F,UAAW9H,KAAKiC,QAC/B,CAEA,oBAAA+gD,GACC,MAAO,CACN54C,MAAO,GAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNA,MAAOA,EAAM3I,OAAO,GAAGlB,QAEzB,CAEA,yBAAA2gD,GACC,MAAO,CACN5e,YAAa,EAEf,CAEA,sBAAAkmC,CAAuBG,GACtB,IAAIC,EAAc,GACd9V,EAAc+V,IAElB,IAAK,MAAO79D,EAAK28D,KAAShiE,OAAOohC,QAAQ4hC,GAAa,CACrD,MAAMG,EAAiBznE,KAAKy8B,KAAKz8B,KAAK0xD,IAAI4U,EAAKhlE,OAAO,GAAI,GAAKtB,KAAK0xD,IAAI4U,EAAKhlE,OAAO,GAAI,IAClFomE,EAAc1nE,KAAKy8B,KAAKz8B,KAAK0xD,IAAI4U,EAAKplE,IAAI,GAAI,GAAKlB,KAAK0xD,IAAI4U,EAAKplE,IAAI,GAAI,IAEzEywD,EAAW3xD,KAAKC,IAAIwnE,EAAgBC,GAEtC/V,EAAWF,IACdA,EAAcE,EACd4V,EAAc59D,E,CAIhB,OAAO29D,EAAWC,EACnB,EChHM,MAAMI,WAAY7pB,GACxB,WAAAr/C,CAAa+jB,GACZwjB,MAAO,MAAOxjB,EACf,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,QACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,GAAG3c,EAAezkC,SAAS,uBAAyBohD,EAAa,CAChE,MAAM/f,EAAUjhC,KAAK2iD,YAAYlhD,OAAO,GAClCy/B,EAAUlhC,KAAK4iD,WAAWnhD,OAAO,GAEvC,MAAO,CACN,IAAIg9C,GACH,EAAEvd,EAAQjgC,SAAUggC,EAAQhgC,SAC5B,EAAEigC,EAAQjgC,QAASjB,KAAK2iD,YAAY1hD,QAAQggC,EAAQhgC,SACpDjB,KAAKkgD,qBAAqB,UAC1B,EAAE,GAAI,GACNtL,EACA50C,KAAK+gD,qBAAqB,0BAA2B1c,EAAgB2c,IAEtE,IAAIvC,GACH,EAAEvd,EAAQjgC,SAAUggC,EAAQhgC,SAC5B,CAACjB,KAAK4iD,WAAW3hD,QAAQigC,EAAQjgC,SAAUggC,EAAQhgC,SACnDjB,KAAKkgD,qBAAqB,SAC1B,CAAC,GAAI,IACLtL,EACA50C,KAAK+gD,qBAAqB,yBAA0B1c,EAAgB2c,I,CAKvE,MAAO,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN34C,OAAQ,GACRD,MAAO,GAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACND,MAAOA,EAAM3I,OAAO,GAAGlB,QACvB8J,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,EC9DM,MAAM0oE,WAAa9pB,GAEzB,WAAAr/C,CAAa+jB,GACZwjB,MAAO,OAAQxjB,EAChB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKkpE,eAAehoE,IAAKlB,KAAKmpE,kBACtC,CAEA,SAAAlqB,GACC,OAAOj/C,KAAK4iD,UACb,CAEA,QAAAA,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,YAAA8+D,GACC,OAAOlpE,KAAKo/C,kBAAkBvzB,UAC/B,CAEA,eAAAs9C,GACC,OAAOnpE,KAAKo/C,kBAAkBrzB,aAC/B,CAEA,sBAAAy0B,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,aAAckjB,SAAU,gBAC/D,CAEA,iBAAA9gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GA2DrB,OA1DG3T,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GACH,CAAC,EAAG,GACJ,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SACrBjB,KAAKkgD,qBAAqB,SAAUlgD,KAAK2iD,YAAYpiD,SACrD,EAAE,GAAI,GACNq0C,GAED,IAAI6J,GACH,CAAC,EAAG,GACJ,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAC1BjB,KAAKkgD,qBAAqB,QAASlgD,KAAK4iD,WAAWriD,SACnD,CAAC,GAAI,IACLq0C,KAKAvQ,EAAezkC,SAAS,4BAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAAC,EAAGz+C,KAAKmpE,kBAAkBloE,SAC3B,CAACjB,KAAK4iD,WAAW3hD,QAASjB,KAAKmpE,kBAAkBloE,SACjDjB,KAAKkgD,qBAAqB,QAASlgD,KAAK4iD,WAAWriD,SACnD,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,0BAA2B1c,EAAgB2c,KAKrE3c,EAAezkC,SAAS,iCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAACz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAKmpE,kBAAkBloE,SAC3D,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAK2iD,YAAY1hD,SACrDjB,KAAKkgD,qBAAqB,aAAclgD,KAAKkpE,eAAe3oE,SAC5D,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,+BAAgC1c,EAAgB2c,KAK1E3c,EAAezkC,SAAS,oCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAACz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAAS,GACpC,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAKmpE,kBAAkBloE,SAC3DjB,KAAKkgD,qBAAqB,gBAAiBlgD,KAAKmpE,kBAAkB5oE,SAClE,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,kCAAmC1c,EAAgB2c,KAKzEhJ,CACR,CAEA,aAAA8I,CAAczc,EAAiB,IAC9B,OAAGA,EAAezkC,SAAS,oCAAsCykC,EAAezkC,SAAS,gCACjF,CACN,IAAIglE,GACH,CAAC,EAAG5kE,KAAKmpE,kBAAkBloE,SAC3B,CAACjB,KAAK4iD,WAAW3hD,QAASjB,KAAKmpE,kBAAkBloE,WAK7C,EACR,CAEA,WAAAq/C,IACI,IAAApF,SAAQl7C,KAAKo/C,qBAIhB/X,MAAMiZ,cACN,KAAQr+C,MAAM4F,KAAK7H,KAAKiC,OACxB,KAAQA,MAAM6F,UAAU9H,KAAKiC,OAC9B,CAEA,oBAAA+gD,GACC,MAAO,CACN54C,MAAO,GACPyhB,WAAY,GACZE,cAAe,GAEjB,CAEA,0BAAAk3B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCp1C,EAAS4hC,EAAmB5hC,SAC5BD,EAAQ6hC,EAAmB7hC,QAE3ByhB,EAAaxhB,EAAO5I,OAAO,GAAGlB,QAC9BwrB,EAAgBF,EAAeA,EAAa,EAElD,MAAO,CACNzhB,MAAOA,EAAM3I,OAAO,GAAGlB,QACvBsrB,WAAYA,EACZE,cAAeA,EAEjB,EC1IM,MAAMq9C,WAAejqB,GAE3B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,SAAUxjB,EAClB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAK4iD,UACb,CAEA,QAAAA,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,aAAAi/D,GACC,OAAOrpE,KAAKo/C,kBAAkBnzB,WAC/B,CAEA,gBAAAq9C,GACC,MAAMj/D,EAASrK,KAAK2iD,YACd32B,EAAahsB,KAAKqpE,gBACxB,OAAOh/D,EAAOpJ,QAAU+qB,EAAW/qB,QAAUoJ,EAAS2hB,CACvD,CAEA,sBAAAw0B,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SAAUkjB,SAAU,cAC3D,CAEA,iBAAA9gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GAmCrB,IAlCG3T,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GACH,CAAC,EAAG,GACJ,CAAC,EAAGz+C,KAAKspE,mBAAmBroE,SAC5BjB,KAAKkgD,qBAAqB,SAAUlgD,KAAKspE,mBAAmB/oE,SAC5D,EAAE,GAAI,GACNq0C,EACA50C,KAAK+gD,qBAAqB,6BAA8B1c,EAAgB2c,IAEzE,IAAIvC,GACH,CAAC,EAAG,GACJ,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAC1BjB,KAAKkgD,qBAAqB,SAC1B,CAAC,GAAI,IACLtL,EACA50C,KAAK+gD,qBAAqB,4BAA6B1c,EAAgB2c,MAKvE3c,EAAezkC,SAAS,+BAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAACz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAAS,GACpC,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAK2iD,YAAY1hD,SACrDjB,KAAKkgD,qBAAqB,UAC1B,CAAC,EAAG,GACJtL,EACA50C,KAAK+gD,qBAAqB,6BAA8B1c,EAAgB2c,KAKxE3c,EAAezkC,SAAS,mCAAoC,CAC9D,MAAMyvD,EAAUrvD,KAAKspE,mBAAmBnoE,SAASnB,KAAKqpE,iBAAiB5nE,OAAO,GAE9Eu2C,EAAev1C,KACd,IAAIg8C,GACH,CAAC,EAAG4Q,EAAQpuD,SACZ,CAAC,EAAGouD,EAAQnuD,IAAIlB,KAAKqpE,iBAAiBpoE,SACtCjB,KAAKkgD,qBAAqB,eAC1B,CAAC,GAAI,GACLtL,EACA50C,KAAK+gD,qBAAqB,kCAAmC1c,EAAgB2c,IAE9E,IAAIvC,GACH,CAACz+C,KAAK4iD,WAAW3hD,QAASouD,EAAQpuD,SAClC,CAACjB,KAAK4iD,WAAW3hD,QAASouD,EAAQnuD,IAAIlB,KAAKqpE,iBAAiBpoE,SAC5DjB,KAAKkgD,qBAAqB,eAC1B,EAAE,GAAI,GACNtL,EACA50C,KAAK+gD,qBAAqB,kCAAmC1c,EAAgB2c,I,CAKhF,OAAOhJ,CACR,CAEA,WAAAsI,IACI,IAAApF,SAAQl7C,KAAKo/C,qBAIhB/X,MAAMiZ,cACN,KAAQr+C,MAAM4F,KAAK7H,KAAKiC,OACxB,KAAQA,MAAM6F,UAAU9H,KAAKiC,OAC9B,CAEA,oBAAA+gD,GACC,MAAO,CACN54C,MAAO,GACPC,OAAQ,GACR4hB,YAAa,GAEf,CAEA,0BAAAg3B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCp1C,EAAS4hC,EAAmB5hC,SAC5BD,EAAQ6hC,EAAmB7hC,QAEjC,MAAO,CACNA,MAAOA,EAAM3I,OAAO,GAAGlB,QACvB8J,OAAQA,EAAO5I,OAAO,GAAGlB,QACzB0rB,YAAa5hB,EAAO5I,OAAO,GAAGlB,QAEhC,ECzHM,MAAMgpE,WAAcpqB,GAE1B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,QAASxjB,EACjB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKkpE,eAAehoE,IAAKlB,KAAKmpE,kBACtC,CAEA,SAAAlqB,GACC,OAAOj/C,KAAK4iD,UACb,CAEA,QAAAA,GACC,OAAO5iD,KAAKo/C,kBAAkBp4B,YAC/B,CAEA,YAAAkiD,GACC,OAAOlpE,KAAKo/C,kBAAkBvzB,UAC/B,CAEA,eAAAs9C,GACC,OAAOnpE,KAAKo/C,kBAAkBrzB,aAC/B,CAEA,WAAA45C,GACC,OAAO3lE,KAAKo/C,kBAAkBt4B,SAC/B,CAEA,cAAA4+C,GACC,OAAO1lE,KAAKo/C,kBAAkBp4B,YAC/B,CAEA,sBAAAw5B,GACC,MAAO,CAAEC,QAAS,YAAaC,UAAW,eAAgBkjB,SAAU,aAAcC,WAAY,gBAC/F,CAEA,iBAAA/gB,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,IAAIhJ,EAAiB,GAoBrB,IAnBG3T,EAAezkC,SAAS,uBAAyBohD,KACnDhJ,EAAiB,CAChB,IAAIyG,GACH,CAAC,EAAG,GACJ,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SACrBjB,KAAKkgD,qBAAqB,SAAUlgD,KAAK2iD,YAAYpiD,SACrD,EAAE,GAAI,GACNq0C,GAED,IAAI6J,GACH,CAAC,EAAG,GACJ,CAACz+C,KAAK4iD,WAAW3hD,QAAS,GAC1BjB,KAAKkgD,qBAAqB,QAASlgD,KAAK4iD,WAAWriD,SACnD,CAAC,GAAI,IACLq0C,KAKAvQ,EAAezkC,SAAS,gCAAiC,CAC3D,MAAMqF,EAASjF,KAAK4iD,WAAWzhD,SAASnB,KAAK2lE,eAAelkE,OAAO,GAAGR,QAEtE+2C,EAAev1C,KACd,IAAIg8C,GACH,CAACx5C,EAAQjF,KAAK2iD,YAAY1hD,SAC1B,CAACjB,KAAK2lE,cAAc1kE,QAAUgE,EAAQjF,KAAK2iD,YAAY1hD,SACvDjB,KAAKkgD,qBAAqB,YAAalgD,KAAK2lE,cAAcplE,SAC1D,CAAC,GAAI,IACLq0C,EACA50C,KAAK+gD,qBAAqB,+BAAgC1c,EAAgB2c,I,CA2C7E,OAvCG3c,EAAezkC,SAAS,oCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAAC,EAAGz+C,KAAKmpE,kBAAkBloE,SAC3B,CAACjB,KAAK4iD,WAAW3hD,QAASjB,KAAKmpE,kBAAkBloE,SACjDjB,KAAKkgD,qBAAqB,eAAgBlgD,KAAK2lE,cAAcplE,SAC7D,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,kCAAmC1c,EAAgB2c,KAK7E3c,EAAezkC,SAAS,kCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAACz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAKmpE,kBAAkBloE,SAC3D,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAK2iD,YAAY1hD,SACrDjB,KAAKkgD,qBAAqB,aAAclgD,KAAKkpE,eAAe3oE,SAC5D,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,gCAAiC1c,EAAgB2c,KAK3E3c,EAAezkC,SAAS,qCAC1Bo4C,EAAev1C,KACd,IAAIg8C,GACH,CAACz+C,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAAS,GACpC,CAACjB,KAAK4iD,WAAWnhD,OAAO,GAAGR,QAASjB,KAAKmpE,kBAAkBloE,SAC3DjB,KAAKkgD,qBAAqB,gBAAiBlgD,KAAKmpE,kBAAkB5oE,SAClE,CAAC,EAAG,GACJq0C,EACA50C,KAAK+gD,qBAAqB,mCAAoC1c,EAAgB2c,KAK1EhJ,CACR,CAEA,aAAA8I,CAAczc,EAAiB,IAC9B,OAAGA,EAAezkC,SAAS,qCAAuCykC,EAAezkC,SAAS,iCAClF,CACN,IAAIglE,GACH,CAAC,EAAG5kE,KAAKmpE,kBAAkBloE,SAC3B,CAACjB,KAAK4iD,WAAW3hD,QAASjB,KAAKmpE,kBAAkBloE,WAK7C,EACR,CAEA,WAAAq/C,IACI,IAAApF,SAAQl7C,KAAKo/C,qBAIhB/X,MAAMiZ,cACN,KAAQr+C,MAAM4F,KAAK7H,KAAKiC,OACxB,KAAQA,MAAM6F,UAAU9H,KAAKiC,OAC9B,CAEA,oBAAA+gD,GACC,MAAO,CACNl8B,UAAW,GACXE,aAAc,GACd6E,WAAY,GACZE,cAAe,GAEjB,CAEA,0BAAAk3B,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCp1C,EAAS4hC,EAAmB5hC,SAC5BD,EAAQ6hC,EAAmB7hC,QAE3ByhB,EAAaxhB,EAAO5I,OAAO,GAAGlB,QAC9BwrB,EAAgBF,EAAeA,EAAa,EAElD,MAAO,CACN/E,UAAW1c,EAAM3I,OAAO,GAAGlB,QAC3BymB,aAAc5c,EAAM3I,OAAO,GAAGlB,QAC9BsrB,WAAYA,EACZE,cAAeA,EAEjB,ECpKM,MAAMy9C,WAAsBrqB,GAClCvd,MAAQ,GAER,WAAA9hC,CAAa+jB,GACZwjB,MAAO,gBAAiBxjB,EACzB,CAEA,SAAA8+B,GACC,OAAO3iD,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,SAAA40C,GACC,OAAOj/C,KAAKo/C,kBAAkB/0C,MAC/B,CAEA,QAAAu4C,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,eAAAq/D,GACC,MAAMC,EAAe1pE,KAAK4hC,MAAQvgC,KAAKm+B,GAAK,IACtCmqC,EAAc3pE,KAAK2iD,YAAY1hD,QAAUI,KAAKq+B,IAAIgqC,GAClDt/D,EAAQu/D,EAActoE,KAAKuoE,IAAIF,GAErC,OAAO7pE,EAAOQ,QAAQ+J,EACvB,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,SAAUC,UAAW,QACxC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,OAAG3c,EAAezkC,SAAS,uBAAyBohD,EAC5C,CACN,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAE,EAAGz+C,KAAK2iD,YAAY1hD,SAAWjB,KAAKkgD,qBAAsB,UAAY,EAAE,GAAI,GAAItL,EAAO50C,KAAK+gD,qBAAqB,oCAAqC1c,EAAgB2c,IACnM,IAAIvC,GAAe,CAAC,EAAG,GAAI,CAAEz+C,KAAK4iD,WAAW3hD,QAAS,GAAKjB,KAAKkgD,qBAAsB,SAAW,CAAC,GAAI,IAAKtL,EAAO50C,KAAK+gD,qBAAqB,mCAAoC1c,EAAgB2c,IAChM,IAAIvC,GAAc,CAAC,EAAGz+C,KAAK2iD,YAAY1hD,SAAU,CAACjB,KAAKypE,kBAAkBvoE,IAAIlB,KAAK4iD,YAAY3hD,QAASjB,KAAK2iD,YAAY1hD,SAAUjB,KAAKkgD,qBAAqB,QAASlgD,KAAKypE,kBAAkBvoE,IAAIlB,KAAK4iD,YAAYriD,SAAU,CAAC,EAAG,IAAKq0C,IAI/N,EACR,CAEA,oBAAAoO,GACC,MAAO,CACN34C,OAAQ,GACRD,MAAO,IAET,CAEA,0BAAA64C,CAA2BC,GAC1B,MAAMjX,EAAqBiX,EAAYzD,wBACjCr1C,EAAQ6hC,EAAmB7hC,QAC3BC,EAAS4hC,EAAmB5hC,SAElC,MAAO,CACND,MAAOA,EAAM3I,OAAO,GAAGlB,QACvB8J,OAAQA,EAAO5I,OAAO,GAAGlB,QAE3B,ECxBM,MAAMspE,GACZ,GAAAtkD,EAAK,MAAE5N,EAAK,WAAEkM,EAAU,UAAEkE,EAAS,MAAEw5B,EAAK,MAAEt/C,EAAQ,OACnD,IAAIyhD,EAAW,KAEf,OAAQ/rC,GACP,IAAK,YACJ+rC,EAAW,IAAIxhB,GAAWre,GAC1B,MACD,IAAK,wBACJ6/B,EAAW,IAAI,GAAqB7/B,GACpC,MACD,IAAK,iCACJ6/B,EAAW,IAAI,GAA6B7/B,GAC5C,MACD,IAAK,oBACJ6/B,EAAW,IAAI,GAAkB7/B,EAAYkE,GAC7C,MACD,IAAK,MACJ27B,EAAW,IAAIslB,GAAKnlD,GACpB,MACD,IAAK,UACJ6/B,EAAW,IAAIrhB,GAASxe,GACxB,MACD,IAAK,YACJ6/B,EAAW,IAAIykB,GAAUtkD,GACzB,MACD,IAAK,qBACJ6/B,EAAW,IAAI,GAAmB7/B,GAClC,MACD,IAAK,iBACJ6/B,EAAW,IAAI,GAAe7/B,GAC9B,MACD,IAAK,cACJ6/B,EAAW,IAAI,GAAY7/B,GAC3B,MACD,IAAK,SACJ6/B,EAAW,IAAIzjB,GAAQpc,GACvB,MACD,IAAK,OACJ6/B,EAAW,IAAInhB,GAAM1e,EAAYkE,GACjC,MACD,IAAK,UACJ27B,EAAW,IAAIygB,GAAStgD,GACxB,MACD,IAAK,UACJ6/B,EAAW,IAAI2kB,GAASxkD,GACxB,MACD,IAAK,UACJ6/B,EAAW,IAAI/jB,GAAS9b,EAAYkE,GACpC,MACD,IAAK,QACJ27B,EAAW,IAAI4f,GAAOz/C,GACtB,MACD,IAAK,QACJ6/B,EAAW,IAAIugB,GAAOpgD,GACtB,MACD,IAAK,mBACJ6/B,EAAW,IAAI,GAAiB7/B,GAChC,MACD,IAAK,yBACJ6/B,EAAW,IAAI,GAAsB7/B,GACrC,MACD,IAAK,mBACJ6/B,EAAW,IAAI,GAAiB7/B,GAChC,MACD,IAAK,YACJ6/B,EAAW,IAAI,GAAW7/B,GAC1B,MACD,IAAK,OACJ6/B,EAAW,IAAIulB,GAAMplD,GACrB,MACD,IAAK,SACJ6/B,EAAW,IAAI0lB,GAAQvlD,GACvB,MACD,IAAK,QACJ6/B,EAAW,IAAI6lB,GAAO1lD,GACtB,MACD,IAAK,UACJ6/B,EAAW,IAAI4kB,GAASzkD,GACxB,MACD,IAAK,gBACJ6/B,EAAW,IAAI8lB,GAAe3lD,GAC9B,MACD,IAAK,OACJ6/B,EAAW,IAAIpC,GAAMz9B,EAAY09B,EAAOx5B,GACxC,MACD,IAAK,MACJ27B,EAAW,IAAIujB,GAAKhlE,GACpB,MAOF,OAJiB,OAAbyhD,GACHA,EAASpD,cAGHoD,CACR,EClID,QACComB,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,YACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,cAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,YAAarC,EAAmBznC,WAAY,cAE7DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,YAAasB,KChBhC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,oBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,sBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,oBAAqBrC,EAAmBznC,WAAY,sBAErEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,oBAAqBsB,GAEtCrpC,qBAAsB,CAAE7N,EAAOtD,EAASs4C,KACvC,MAAM,aAAE9c,GAAiBvvC,OAAOC,8BAC1B,UAAEonB,GAAcglC,EAAUnR,aAEhC,MAAK,2BAA4B7zB,GACY,IAArCA,EAAUs/B,uBAGT,sBAAuBpX,EAAaqX,gBAItCrX,EAAaqX,eAAgB,qBAAuB,yBAA0B,EAEtFiE,wBAAyB,CAAExzC,EAAOtD,EAASs4C,EAAWU,KACrD,MAAMwc,GAAS,IAAIJ,IAAsBtkD,IAAK,CAAE5N,MAAO81C,EAAY91C,QAAU6oC,0BACvE,QAAEC,EAAO,UAAEC,GAAcupB,EAEzBpmD,EAAa,CAClBzZ,MAAOqjD,EAAY5pC,WAAW48B,GAAW,EACzC9gD,OAAQ8tD,EAAY5pC,WAAW68B,GAAaD,GAAW,GAYxD,OATKhsC,EAAQmR,sBACZ/B,EAAW,mBAAqB4pC,EAAY5pC,WAAW48B,GAAW,GAClE58B,EAAW,oBAAsB4pC,EAAY5pC,WAAW48B,GAAW,GACnE58B,EAAW,sBAAwB4pC,EAAY5pC,WAAW48B,GAAW,GACrE58B,EAAW,uBAAyB4pC,EAAY5pC,WAAW48B,GAAW,IAEtE58B,EAAW,UAAY4pC,EAAY5pC,WAAW48B,GAAW,GAGnD58B,CAAU,EAElBk5C,iBAAkB,CAAEhlD,EAAOtD,EAASs4C,EAAWU,KAG9C,MAAM1kB,GAAgB,IAAM0hB,IAA8BntB,kBAAmB,qBACvEzZ,EAAa,KAAQ4pC,EAAYwB,kBAAkB,CAAEzsC,EAAoBxX,KAChB,IAAvD+9B,EAAckc,qBAAqBvlD,QAASsL,KAG9Ck/D,EAAmB,GACnBC,EAAmB,GAEzB,IAAM,MAAOn/D,EAAKyB,KAAU9G,OAAOohC,QAASljB,IACT,IAA7B7Y,EAAItL,QAAS,UAMlBwqE,EAAiBznE,KAAMgK,GALtB09D,EAAiB1nE,KAAMgK,GAQzB,MAAM,OAAEoZ,EAAM,MAAEukD,GAAU1pE,OAAOC,6BAA6BgU,KAAK+Z,WAAW7K,WAAW4gC,OAEnFn5C,EAAoC,IAA5B6+D,EAAiBxqE,OAAekmB,EAASukD,EACjDC,EAAkBH,EAAiBnlE,KAAK0H,GAASA,EAAQ,OAAO1F,KAAM,OACtEujE,EAAeH,EAAiBplE,KAAK0H,GAASA,EAAQ,OAAO1F,KAAM,KAEzE,MAAO,GAAGsjE,KAAmB/+D,MAAUg/D,GAAc,ICnFxD,IACCR,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,SACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,WAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,SAAUrC,EAAmBznC,WAAY,WAE1DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,SAAUsB,KClB7B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,cACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,gBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,cAAerC,EAAmBznC,WAAY,gBAE/DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,cAAesB,KClBlC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,iBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,mBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,iBAAkBrC,EAAmBznC,WAAY,mBAElEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,iBAAkBsB,KClBrC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,MACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,QAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,MAAOrC,EAAmBznC,WAAY,QAEvDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,MAAOsB,KClB1B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,UACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,YAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,UAAWrC,EAAmBznC,WAAY,YAE3DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,UAAWsB,KClB9B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,YACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,cAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,YAAarC,EAAmBznC,WAAY,cAE7DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,YAAasB,KClBhC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,mBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,qBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,mBAAoBrC,EAAmBznC,WAAY,qBAEpEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,mBAAoBsB,KClBvC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,yBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,2BAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,yBAA0BrC,EAAmBznC,WAAY,2BAE1EmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,yBAA0BsB,KClB7C,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,mBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,qBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,mBAAoBrC,EAAmBznC,WAAY,qBAEpEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,mBAAoBsB,KClBvC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,qBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,uBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,qBAAsBrC,EAAmBznC,WAAY,uBAEtEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,qBAAsBsB,KClBzC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,wBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,0BAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,wBAAyBrC,EAAmBznC,WAAY,0BAEzEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,wBAAyBsB,IAG3Cd,QAAS,CAAC,GCrBX,IACC2b,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,iCACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,mCAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,iCAAkCrC,EAAmBznC,WAAY,mCAElFmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,iCAAkCsB,KClBrD,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,YACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,cAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,YAAarC,EAAmBznC,WAAY,cAE7DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,YAAasB,KClBhC,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,UACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,YAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,UAAWrC,EAAmBznC,WAAY,YAE3DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,UAAWsB,KClB9B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,UACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,YAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,UAAWrC,EAAmBznC,WAAY,YAE3DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,UAAWsB,KClB9B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,UACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,yBACzC,IACH1nC,GAAc0nC,EAAmBznC,WAAY,YAChDye,YAAagpB,EAAmBvjC,UAAUua,cAG5C8N,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,UAAWrC,EAAmBznC,WAAY,YAE3DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,UAAWsB,KCrB9B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,QACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,UAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,QAASrC,EAAmBznC,WAAY,UAEzDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,QAASsB,KClB5B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,OACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,yBACzC,IACH1nC,GAAc0nC,EAAmBznC,WAAY,SAChDyE,iBAAkBgjC,EAAmBvjC,UAAUO,mBAGjD8nB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,OAAQrC,EAAmBznC,WAAY,SAExDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,OAAQsB,KCrB3B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,QACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,UAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,QAASrC,EAAmBznC,WAAY,UAEzDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,QAASsB,KClB5B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,OACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,SAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,OAAQrC,EAAmBznC,WAAY,SAExDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,OAAQsB,KClB3B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,SACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1BwiD,eAAgB,CAAExyD,EAAOtD,EAASs4C,GAAayd,gCACvC,IAAM/f,IAA8BntB,kBAAmB,UAAW6nB,uBAAwBqlB,GAElG1d,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,WAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,SAAUrC,EAAmBznC,WAAY,WAE1DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,SAAUsB,KCrB7B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,QACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1BwiD,eAAgB,CAAExyD,EAAOtD,EAASs4C,GAAayd,gCACvC,IAAM/f,IAA8BntB,kBAAmB,SAAU6nB,uBAAwBqlB,GAEjG1d,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,UAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,QAASrC,EAAmBznC,WAAY,UAEzDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,QAASsB,KClB5B,MAAMwb,GAAgB,IAAI,WAAevoC,WAAW,EAAG,GAEvD,QACC4nC,YAAY,EACZ/xD,MAAO,KAAc,CACpBiqC,UAAWyoB,GACXC,kBAAmB,KACnBC,YAAa,OAEdl2D,QAAS,CACRutC,UAAajqC,GAAmBA,EAAMiqC,UACtC4oB,qBAAwB7yD,GAA+BA,EAAM2yD,kBAC7DX,YAAa,CAAEhyD,EAAOtD,EAASs4C,EAAWU,KACzC,MAAM,cAAEP,EAAa,aAAEtR,GAAiB6R,EAExC,OAAOP,EAAe,OAAQtR,EAAc,EAE7CkR,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,SAErDmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,OAAQsB,IAG1Bd,QAAS,CACR,iBAAM0c,EAAa,MAAE9yD,EAAK,UAAEg1C,EAAS,QAAEt4C,EAAO,OAAEhJ,EAAM,YAAEgiD,GAAe3sC,GAAW,GAC1EA,IACNisC,EAAUzqC,OAAOysB,WAAaD,GAAYI,MAG3C,IAAIwU,EAAWjvC,EAAQs1D,YACnB5mB,EAAmBO,EAASzC,sBAC5B+a,EAAoBtY,EAASV,uBAE5BliC,IACJ4iC,EAAW+J,EAAYP,cAAc,OAAQz4C,EAAQ62C,oBACrDnI,EAAmBO,EAASxC,4BAC5B8a,EAAoBtY,EAAST,2BAA2BwK,EAAYpT,oBAGrE5uC,EAAQ,sBAAsB,EAAM,CAAEqe,MAAM,IAE5C,MAAM8xB,EAAe96B,EAAW2sC,EAAYnC,mBAAqByB,EAAUnR,aAE3E,IAAK,MAAOrzB,EAAU9b,KAAU9G,OAAOohC,QAASoc,GAC1C,IAASvH,EAAa7zB,UAAWQ,KACrC9c,EAAQqV,EAAW,uBAAyB,iBAAkB,CAAEyH,WAAU9b,SAAS,CAAEqd,MAAM,IAI7F,MAAM,eAAEgB,EAAiB/S,EAAM4yD,aAAgB3O,GAG1C,IAASlxC,IAAoBhK,IACjCrV,EAAQqV,EAAW,8BAAgC,wBAAyB,CAAEnJ,MAAO,OAAQkM,WAAY,CAAEiH,mBAAoB,CAAEhB,MAAM,IAGxIre,EAAQ,sBAAsB,EAAO,CAAEqe,MAAM,GAC9C,IC/DF,IACCggD,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,eAAc+O,oBAClD,IAAMkf,IAAwBtkD,IAAK,CACzC5N,MAAO,MACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,UACxB9lB,MAAO0oD,IAGTmC,iBAAkB,KACV,CAAC,GAET1c,cAAe,IACP,EAER45B,gBAAiB,KAAe,EAChCrc,QAAS,KACD,CAAC,GAEToP,iBAAkB,CAAEhlD,EAAOtD,EAASs4C,EAAWU,KAC9C,GAAkC,OAA9Bh5C,EAAQs1D,YAAY9nE,MACvB,MAAO,GAGR,MAAMmI,EAAQqK,EAAQs1D,YAAYnnB,WAAWriD,QACvC8J,EAASoK,EAAQs1D,YAAY9qB,YAAY1+C,QAE/C,MAAO,GAAG4iB,GAAqB9Y,UAAe8Y,GAAqB/Y,MAAU,IC5BhF,IACC0/D,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,UACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1BwiD,eAAgB,CAAExyD,EAAOtD,EAASs4C,GAAayd,gCACvC,IAAM/f,IAA8BntB,kBAAmB,WAAY6nB,uBAAwBqlB,GAEnG1d,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,YAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,UAAWrC,EAAmBznC,WAAY,YAE3DmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,UAAWsB,KCtB9B,IACC6a,YAAY,EACZr1D,QAAS,CACRs1D,YAAa,CAAEhyD,EAAOtD,EAASs4C,GAAanR,mBACpC,IAAMiuB,IAAwBtkD,IAAK,CACzC5N,MAAO,gBACPkM,WAAY+3B,EAAa/3B,WACzBkE,UAAW6zB,EAAa7zB,YAG1B+kC,iBAAkB,CAAE/0C,EAAOtD,EAASs4C,GAAazB,wBACzC1nC,GAAc0nC,EAAmBznC,WAAY,kBAErDusB,cAAe,CAAEr4B,EAAOtD,EAASs4C,GAAazB,qBAAoBqC,aAC1DA,EAAS,gBAAiBrC,EAAmBznC,WAAY,kBAEjEmmD,gBAAiB,KAAe,EAChCrc,QAAS,CAAE51C,EAAOtD,EAASs4C,GAAaY,UAASsB,sBACzCtB,EAAS,gBAAiBsB,KCnBrB,MAAM,GACpB6b,YAAc,YAEd,WAAAhrE,CAAaH,EAAQyK,GACpBpK,KAAKL,OAASA,EACdK,KAAKoK,MAAQA,CACd,CAEA,QAAA2gE,GACC,OAAO,GAAUC,IAClB,CAEA,qBAAAzzC,GACC,OAAOv3B,IACR,CAEA,uBAAAirE,GACC,OAAOjrE,IACR,CAEA,QAAAw3B,GACC,OAAO,IAAIkmB,GAAM19C,KAAKL,OAAOsB,QAAUjB,KAAKoK,MAAMnJ,QACnD,CAEA,iBAAA02B,GACC,OAAO33B,KAAKoK,MAAMlJ,IAAKlB,KAAKoK,OAAQlJ,IAAKlB,KAAKL,QAASuB,IAAKlB,KAAKL,OAClE,CAEA,eAAOurE,CAAUvrE,EAAQyK,GAGxB,OAFAzK,EAASE,EAAOM,QAASR,GACzByK,EAAQvK,EAAOM,QAASiK,GACjB,IAAI,GAAWzK,EAAQyK,EAC/B,CAEA,UAAA68C,GACC,OAAOjnD,KAAKL,MACb,CAEA,SAAAunD,GACC,OAAOlnD,KAAKoK,KACb,CAEA,iBAAAy7C,GACC,OAAK7lD,KAAKL,OAAOsB,QAAUjB,KAAKoK,MAAMnJ,QAC9BjB,KAAKL,OAGNK,KAAKoK,KACb,CAEA,gBAAA27C,GACC,OAAK/lD,KAAKL,OAAOsB,QAAUjB,KAAKoK,MAAMnJ,QAC9BjB,KAAKL,OAGNK,KAAKoK,KACb,CAEA,wBAAA+gE,GACC,OAAKnrE,KAAKoK,MAAQpK,KAAKL,OACf,IAAI,GAAWK,KAAKoK,MAAOpK,KAAKL,QAGjCK,IACR,CAEA,YAAAorE,CAAczrE,GACb,OAAO,IAAI,GAAWK,KAAKinD,aAAa9lD,SAAUxB,GAAUK,KAAKknD,YAAY/lD,SAAUxB,GACxF,CAEA,kBAAAslD,GACC,MAAO,CAAC,SAAU,QACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,sBAAAC,CAAwBS,GACvB,MAAO,CACNjmD,OAAQimD,EAAkBqB,aAC1B78C,MAAOw7C,EAAkBsB,YAE3B,CAEA,oBAAAmkB,GACC,MAAO,CACN1rE,OAAQK,KAAKL,OAAOsB,QACpBmJ,MAAOpK,KAAKoK,MAAMnJ,QAEpB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAW,IAAIxX,EAAQwX,EAAW1X,QAAU,IAAIE,EAAQwX,EAAWjN,OAC/E,ECzFM,MAAMmhE,WAAiBpsB,GAC7B,WAAAr/C,CAAa+jB,GACZwjB,MAAO,WAAY,CAAC,GAEpBrnC,KAAKq/C,cAAgB,CAAC,CACvB,CAEA,SAAAJ,GACC,OAAOj/C,KAAKo/C,kBAAkBz/C,MAC/B,CAEA,QAAAijD,GACC,OAAO5iD,KAAKo/C,kBAAkBh1C,KAC/B,CAEA,sBAAAo2C,GACC,MAAO,CAAEC,QAAS,QAASC,UAAW,SACvC,CAEA,iBAAAoC,CAAkBlO,EAAQ,EAAGvQ,EAAiB,GAAI2c,GAAc,GAC/D,MAAO,EACR,CAEA,oBAAAgC,GACC,MAAO,CACN54C,MAAO,EACPzK,OAAQ,EAEV,CAEA,0BAAAsjD,CAA2BC,GAC1B,MAAO,CACN94C,MAAO,EACPzK,OAAQ,EAEV,ECHD,QACC6rE,QAAS,CACR,UAAaz7D,GACb,oBAAqB,GACrB,OAAU9B,GACV,cAAe,GACf,iBAAkB,GAClB,IAAOG,GACP,QAAWE,GACX,YAAa,GACb,mBAAoB,GACpB,yBAA0B,GAC1B,mBAAoB,GACpB,qBAAsB,GACtB,wBAAyB,GACzB,iCAAkC,GAClC,UAAaW,GACb,QAAWE,GACX,QAAWE,GACX,QAAWE,GACX,MAASM,GACT,KAAQF,GACR,MAASF,GACT,KAAQS,GACR,OAAUE,GACV,MAASE,GACT,KAAQ,GACR,IAAOrJ,GACP,QAAWyK,GACX,cAAiB,IAElB+C,QAAS,CACR,kBAAAw3B,CAAoBl0B,EAAOtD,EAASs4C,EAAW0e,GAC9C,MAAsB,SAAlBh3D,EAAQkD,MACJ,YAAgB7O,aAAc2L,EAAQ,mBAGvC,YAAgB3L,aAAc2iE,EAAWxpE,MACjD,EACAigE,eAAgB,CAAEnqD,EAAOtD,EAASs4C,EAAWU,KAC5C,GAAI,IAASh5C,EAAQkD,UAAclD,EAAQkD,SAASI,GACnD,OAAO,EAGR,MAAM8rC,EAAWnjD,OAAOC,6BAA6BohD,cAAc,WAAW,oBAE9E,OAAO8B,EAAS4J,EAAYh4B,iBAAiB,EAE9C4kB,kBAAmB,CAAEtiC,EAAOtD,IACtBA,EAAQkD,OAAYlD,EAAQkD,SAASI,EAInCtD,EAAQ,GAAGA,EAAQkD,qBAHlB,KAKTu1C,cAAe,CAAEn1C,EAAOtD,IAChB,CAAEkD,EAAeikC,KACvB,MAAM8iB,EAAS,IAAK9iB,EAAcjkC,SAElC,GAAe,SAAVA,EAAmB,CACvB,MAAM,aAAE4jD,EAAY,oBAAEC,EAAmB,YAAEC,GAAgBhnD,EAG3D,IAAO8mD,EAAcC,GACpB,OAAO,IAAI+P,GAGZ7M,EAAO,SAAWjD,C,CAGnB,OAAO,IAAMoO,IAAwBtkD,IAAKm5C,EAAQ,EAGpD,YAAAruB,CAAct4B,EAAOtD,GACpB,OAAOA,EAAQkD,SAASI,EAIjBtD,EAAQ,GAAGA,EAAQkD,iBAHlB,CAIT,EACA,gBAAAqqD,GACC,OAASrqD,IACD,IAAM8yC,IAA8BntB,kBAAmB3lB,EAEhE,EACA,kBAAA+zD,CAAoB3zD,EAAOtD,EAASs4C,EAAWU,GAC9C,MAAO,CAAEnL,EAAuBqpB,EAAsBC,KACrD,MAAM,sBAAEC,EAAqB,qBAAEC,GAAyBprE,OAAOC,6BAA6BohD,cAGtFgqB,EAA8C,WAAjCte,EAAYh4B,iBAExBs2C,IACNzpB,EAAgBupB,EAAwBvpB,EAAgBA,EAAgB,GACxEqpB,EAAeG,EAAuBH,EAAeA,EAAe,IAGrE,IAAIK,EAAmB,IAAI,GAAW,IAAInsE,EAAQyiD,GAAiB,IAAIziD,EAAQ8rE,IAM/E,MAJI,cAAgBl3D,EAAQkD,QAC3Bq0D,EAAmBA,EAAiBZ,aAAc,IAAIvrE,EAAQ+rE,KAGxDn3D,EAAQutD,iBAAkBvtD,EAAQkD,OAAQwtC,uBAAwB6mB,EAAkBv3D,EAAQoP,WAAY,CAEjH,EACA,QAAAkgC,CAAUhsC,EAAOtD,GAChB,IAAI6tC,EAAgB5hD,OAAOC,6BAA6BohD,cAAcO,cAClEqpB,EAAejrE,OAAOC,6BAA6BohD,cAAc4pB,aAQrE,OALIl3D,EAAQ0mB,gBAAgB8wC,sBAAuBx3D,EAAQkD,SAC1D2qC,EAAgB5hD,OAAOC,6BAA6BohD,cAAc4pB,aAClEA,EAAejrE,OAAOC,6BAA6BohD,cAAcO,eAG3D7tC,EAAQi3D,mBACdppB,EACAqpB,EACAjrE,OAAOC,6BAA6BqzB,SAASk4C,qBAE/C,EACA,SAAAxhC,CAAU3yB,EAAOtD,EAASs4C,GAAW,iBAAE2V,IACtC,MAAO,CAAEyJ,GAAc,EAAM70D,EAAO,QACnC,MAAM4/C,EAAiB,IAAIxC,GAAoB,KAAMgO,GAC/CzgE,EAAQi1D,EAAe9zB,WACvBv6B,EAAU,YAAgBC,aAAa7G,GAC7C,IAAI2+C,EAAU,EACVC,EAAU,EAGW,IAAtBh4C,EAAQ,OAAO,IAAkC,IAAtBA,EAAQ,OAAO,IAC5C+3C,EAAU/3C,EAAQ,UAAU,GAC5Bg4C,EAAUh4C,EAAQ,UAAU,KAE5B+3C,GAA+B,EAArB/3C,EAAQ,OAAO,GACzBg4C,GAA+B,EAArBh4C,EAAQ,OAAO,IAG1B,IAAIumD,EAAU,IAAIvvD,EAAO+gD,GACrByO,EAAU,IAAIxvD,EAAOghD,GAOzB,OALKsrB,IACJ/c,EAAUA,EAAQxtD,MAAgB,OAAT0V,EAAgB,EAAI,GAC7C+3C,EAAUA,EAAQztD,MAAgB,OAAT0V,EAAgB,EAAI,IAGvC,CACNnV,EAAGitD,EAAQ,MAAM93C,OACjBlV,EAAGitD,EAAQ,MAAM/3C,OACjB,CAEH,EACA,eAAA2N,CAAiBlN,EAAOtD,EAASs4C,GAAW,WAAElpC,EAAU,iBAAEgpC,IACzD,MAAO,CAAEl1C,EAAemJ,GAAW,IAC3BA,EAAW+rC,EAAmBhpC,CAEvC,EACA,YAAAmE,CAAcjQ,EAAOtD,EAASs4C,GAAW,UAAEhlC,EAAS,gBAAE6kC,IACrD,MAAO,CAAE9rC,GAAU,IACXA,EAAW8rC,EAAkB7kC,CAEtC,EACA,YAAAzC,CAAcvN,EAAOtD,EAASs4C,GAAW,iBAAE1nC,EAAgB,cAAE4oB,IAC5D,MAAO,CAAEntB,GAAW,IACZA,EAAWmtB,EAAgB5oB,CAEpC,EACA,oBAAA3D,CAAqB3J,EAAOtD,GAC3B,OAAShE,IACR,MAAMgR,EAAa,CAAC,EAiBpB,OAfAhR,EAAO3K,SAAS6R,IACf,MAAMoxB,EAAgBt0B,EAAQutD,iBAAiBrqD,GACzCmK,EAAWinB,EAAcyc,eAEd,KAAb1jC,IAIEA,KAAYL,IACjBA,EAAWK,GAAY,IAGxBL,EAAWK,GAAUrf,KAAKkV,GAAM,IAG1B8J,CAAU,CAEnB,IClOa,MAAM,GACpBqpD,6BAA+B,GAK/B,QAAAC,GACC,MAAM,IAAIn5B,MAAO,0CAClB,CAKA,uBAAAq5B,GACC,MAAM,IAAIr5B,MAAO,yDAClB,CAEA,qBAAAra,GACC,MAAM60C,EAAiBpsE,KAAKirE,0BACtBtrE,EAAiBysE,EAAenlB,aAAa/lD,IAAK,IAAIrB,EAAQG,KAAKqsE,sBACnEjiE,EAAiBgiE,EAAellB,YAAYhmD,IAAK,IAAIrB,EAAQG,KAAKqsE,sBAExE,OAAO,IAAI,GAAW1sE,EAAQyK,EAC/B,CAKA,QAAAotB,GACC,MAAM,IAAIoa,MAAO,0CAClB,CAKA,iBAAAja,GACC,MAAM,IAAIia,MAAO,mDAClB,CAEA,iBAAAy6B,GACC,MAAMp8B,EAAevvC,OAAOC,6BAA6BsvC,aAAaC,eAEtE,MAAS,kBAAmBD,GAIe,KAApCA,EAAc,iBAA6D,EAAlCA,EAAc,iBAHtD,GAAcq8B,qBAIvB,CAKA,oBAAAjB,GACC,MAAM,IAAIz5B,MAAO,sDAClB,CAEA,6BAAO05B,GACN,MAAM,IAAI15B,MAAO,wDAClB,EC7Cc,MAAM26B,WAAuB,GAC3CzB,YAAc,iBAEd,WAAAhrE,CAAawmB,GACZ+gB,QAEArnC,KAAKsmB,SAAWA,CACjB,CAEA,QAAAkR,GACC,MAAM3R,EAAS7lB,KAAKsmB,SAASrlB,QAAU,EACjCiC,EAAO7B,KAAKm+B,GAAKn+B,KAAK0xD,IAAKltC,EAAQ,GACzC,OAAO,IAAI63B,GAAM19C,KAAKwsE,eAAiBtpE,EACxC,CAEA,iBAAAy0B,GACC,MAAM80C,EAAuB,IAAI5sE,EAAQwB,KAAKm+B,GAAKx/B,KAAKsmB,SAASrlB,SAEjE,OAA6B,IAAxBjB,KAAKwsE,eACFC,EAGD,IAAI5sE,EAAQG,KAAKwsE,eAAiBC,EAAqBxrE,QAAUjB,KAAKsmB,SAASrlB,QACvF,CAEA,YAAAyrE,GACC,OAAO1sE,KAAKsmB,QACb,CAEA,kBAAA2+B,GACC,MAAO,CAAC,WACT,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACN/kD,SAAUtmB,KAAKsmB,SAASrlB,QAE1B,CAEA,6BAAOqqE,CAAwBj0D,GAM9B,YAJQwS,IAAcxS,EAAWiP,eAAcuD,IAAcxS,EAAWwO,SACvExO,EAAWiP,SAA+B,EAApBjP,EAAWwO,QAG3B,IAAI7lB,KAAM,IAAIH,EAAQwX,EAAWiP,UACzC,EC9Dc,MAAM,WAAeimD,GACnCzB,YAAc,SAEd,QAAAC,GACC,OAAO,GAAOC,IACf,CAEA,uBAAAC,GACC,MAAMtrE,EAAS,IAAIE,EAAQG,KAAKsmB,SAASrlB,SACnCmJ,EAAQ,IAAIvK,EAAQG,KAAKsmB,SAASrlB,SACxC,OAAO,IAAI,GAAWtB,EAAQyK,EAC/B,CAEA,sBAAA+6C,CAAwBS,GACvB,MAAO,CACNt/B,SAAUs/B,EAAkBC,oBAE9B,CAEA,YAAA2mB,GACC,OAAO,CACR,ECpBc,MAAMG,WAAkB,GACtC,QAAA5B,GACC,MAAO,eACR,CAEA,qBAAAxzC,GACC,OAAO,IAAI,GAAW,IAAI13B,EAAQ,GAAK,IAAIA,EAAQ,GACpD,CAEA,uBAAAorE,GACC,OAAO,IAAI,GAAW,IAAIprE,EAAQ,GAAK,IAAIA,EAAQ,GACpD,CAEA,QAAA23B,GACC,OAAO,IAAIkmB,GAAM,EAClB,CAEA,iBAAA/lB,GACC,OAAO,IAAI93B,EAAQ,EACpB,CAEA,oBAAAwrE,GACC,MAAO,EACR,CAEA,6BAAOC,GACN,OAAO,IAAIqB,EACZ,EC1Bc,MAAMC,WAAoC,GACxD,WAAA9sE,CAAamnB,EAAM5c,GAClBg9B,QAEArnC,KAAKinB,KAAOA,EACZjnB,KAAKqK,OAASA,CACf,CAOA,uBAAA4gE,GACC,OAAO,IAAI,GAAWjrE,KAAKinB,KAAMjnB,KAAKqK,OACvC,CAOA,QAAAmtB,GACC,MAAMq1C,EAAc,GAAM7sE,KAAKinB,KAAKhmB,QAAUjB,KAAKqK,OAAOpJ,QAC1D,OAAOy8C,GAAKC,SAAUkvB,EACvB,CAOA,iBAAAl1C,GAEC,MAAMkG,EAAI79B,KAAKinB,KAAKhmB,QACdkhC,EAAIniC,KAAKqK,OAAOpJ,QAChBmhC,EAAI/gC,KAAKy8B,KAAMz8B,KAAK0xD,IAAKl1B,EAAG,GAAMx8B,KAAK0xD,IAAK5wB,EAAG,IACrD,OAAOtiC,EAAOQ,QAASw9B,EAAIsE,EAAIC,EAChC,CAOA,QAAA0qC,GACC,OAAO9sE,KAAKinB,IACb,CAOA,UAAA8lD,GACC,OAAO/sE,KAAKqK,MACb,CASA,sBAAA86C,CAAwBS,GAEvB,MAAO,CACN3+B,KAAM2+B,EAAkBqB,aACxB58C,OAAQu7C,EAAkBsB,YAE5B,CAOA,kBAAAjC,GACC,MAAO,CAAC,OAAQ,SACjB,CAOA,iBAAAC,GACC,MAAO,EACR,CAOA,oBAAAmmB,GACC,MAAO,CACNpkD,KAAMjnB,KAAKinB,KAAKhmB,QAChBoJ,OAAQrK,KAAKinB,KAAKhmB,QAEpB,CASA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAqB,IAAIxX,EAAQwX,EAAW4P,MAAQ,IAAIpnB,EAAQwX,EAAWhN,QACvF,ECpHc,MAAM,WAA4BuiE,GAChD9B,YAAc,wBAEd,QAAAC,GACC,OAAO,GAAoBC,IAC5B,ECLc,MAAM,WAAoC4B,GACxD9B,YAAc,iCAEd,QAAAC,GACC,OAAO,GAA4BC,IACpC,ECFc,MAAM,WAAgB,GACpCF,YAAc,UAEd,WAAAhrE,CAAasK,EAAOC,GACnBg9B,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAQC,IAChB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAKqK,OACxC,CAEA,QAAAmtB,GACC,MAAMqG,EAAI79B,KAAKoK,MAAMnJ,QAAU,EACzBkhC,EAAIniC,KAAKqK,OAAOpJ,QAAU,EAChC,OAAO,IAAIy8C,GAAMr8C,KAAKm+B,GAAK3B,EAAIsE,EAChC,CAEA,iBAAAxK,GAEC,MAAMkG,EAAY79B,KAAKoK,MAAMnJ,QAAU,EACjCkhC,EAAYniC,KAAKqK,OAAOpJ,QAAU,EAClC+rE,EAAY3rE,KAAK0xD,IAAKl1B,EAAIsE,EAAG,GAAM9gC,KAAK0xD,IAAKl1B,EAAIsE,EAAG,GACpD8qC,EAAY5rE,KAAKm+B,IACtB3B,EAAIsE,IAEJ,EAAI,EAAI6qC,GACP,GAAK3rE,KAAKy8B,KAAM,EAAI,EAAIkvC,KAG1B,OAAO,IAAIntE,EAAQotE,EACpB,CAEA,SAAA/lB,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GAEvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAS,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWhN,QAC5E,ECxEc,MAAM,WAAY,GAChCygE,YAAc,MAEd,WAAAhrE,CAAasK,EAAOC,GACnBg9B,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAIC,IACZ,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAKqK,OACxC,CAGA,iBAAAstB,GACC,MAAMkG,EAAI79B,KAAKoK,MAAMnJ,QAAU,EACzBisE,EAAOltE,KAAKqK,OAAOpJ,QAAU,EAAM,EACnCksE,EAAKntE,KAAKqK,OAAOpJ,QAAU,EAG3BmsE,GAAUvvC,EAAIqvC,IAASrvC,EAAIqvC,GAC3BG,GAAWxvC,EAAIsvC,IAAStvC,EAAIsvC,GAGlC,SAASG,EAAazvC,EAAGmvC,EAAGO,GAC3B,OAAS1vC,EAAImvC,IAAQ,EAAM,EAAI3rE,KAAK0xD,IAAKwa,EAAG,IAAU,GAAKlsE,KAAKy8B,KAAM,EAAI,EAAIz8B,KAAK0xD,IAAKwa,EAAG,KAC5F,CAEA,MAAMroE,EAAI7D,KAAKm+B,GAAK,GAAM8tC,EAAazvC,EAAGqvC,EAAIE,GAAUE,EAAazvC,EAAGsvC,EAAIE,IAC5E,OAAO,IAAIxtE,EAAQqF,EACpB,CAEA,SAAAgiD,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,QAAAu2B,GACC,MAAMqG,EAAI79B,KAAKoK,MAAMnJ,QAAU,EACzBkhC,EAAIniC,KAAKqK,OAAOpJ,QAAU,EAEhC,OAAO,IAAIy8C,GAAMr8C,KAAKm+B,GAAK3B,EAAIsE,EAChC,CAEA,6BAAOmpC,CAAwBj0D,GAC9B,OAAO,IAAI,GAAK,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWhN,QACxE,EC5Ec,MAAM,WAAyB,GAC7CygE,YAAc,oBAEd,WAAAhrE,CAAaH,EAAQyK,EAAOyb,EAAQQ,EAAiBN,EAAkBI,EAAoBF,GAC1FohB,QAEArnC,KAAKL,OAASA,EACdK,KAAKoK,MAAQA,EACbpK,KAAK6lB,OAASA,EACd7lB,KAAK+lB,iBAAmBA,EACxB/lB,KAAKimB,oBAAsBA,EAC3BjmB,KAAKmmB,mBAAqBA,EAC1BnmB,KAAKqmB,gBAAkBA,CACxB,CAEA,QAAA0kD,GACC,OAAO,GAAiBC,IACzB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKL,OAAQK,KAAKoK,MACzC,CAEA,QAAAotB,GAEC,GAAIx3B,KAAKwtE,uBAAyB,CACjC,MAAMpjE,EAAQpK,KAAKL,OAAOsB,QACpBoJ,EAASrK,KAAKoK,MAAMnJ,QACpBwsE,EAAqBrjE,EAAQC,EAE7BqjE,EAAqBrsE,KAAKm+B,GAAKn+B,KAAK0xD,IAAK/yD,KAAK+lB,iBAAiB9kB,QAAS,GACxE0sE,EAA0D,EAAhC3tE,KAAK+lB,iBAAiB9kB,SAAkD,EAAhCjB,KAAK+lB,iBAAiB9kB,SAExF2sE,EAAwBvsE,KAAKm+B,GAAKn+B,KAAK0xD,IAAK/yD,KAAKimB,oBAAoBhlB,QAAS,GAC9E4sE,EAAgE,EAAnC7tE,KAAKimB,oBAAoBhlB,SAAqD,EAAnCjB,KAAKimB,oBAAoBhlB,SAEjG6sE,EAAuBzsE,KAAKm+B,GAAKn+B,KAAK0xD,IAAK/yD,KAAKmmB,mBAAmBllB,QAAS,GAC5E8sE,EAA8D,EAAlC/tE,KAAKmmB,mBAAmBllB,SAAoD,EAAlCjB,KAAKmmB,mBAAmBllB,SAE9F+sE,EAAoB3sE,KAAKm+B,GAAKn+B,KAAK0xD,IAAK/yD,KAAKqmB,gBAAgBplB,QAAS,GACtEgtE,EAAwD,EAA/BjuE,KAAKqmB,gBAAgBplB,SAAiD,EAA/BjB,KAAKqmB,gBAAgBplB,SAErFitE,GAAuBR,EAAqBC,GAA0B,EACtEQ,GAA0BP,EAAwBC,GAA6B,EAC/EO,GAAyBN,EAAuBC,GAA4B,EAC5EM,GAAsBL,EAAoBC,GAAyB,EAEnE/qE,EAAOuqE,EAAqBS,EAAqBC,EAAwBC,EAAuBC,EAEtG,OAAO,IAAI3wB,GAAMx6C,EAClB,CAEA,MAAM26B,EAAI79B,KAAKL,OAAOsB,QAChBkhC,EAAIniC,KAAKoK,MAAMnJ,QACfmK,EAAIpL,KAAK6lB,OAAO5kB,QACtB,OAAO,IAAIy8C,GAAM,EAAItyC,GAAMyyB,EAAIsE,GAAMtE,EAAIsE,EAAI9gC,KAAKm+B,GAAKp0B,EAAIA,EAC5D,CAEA,iBAAAusB,GAGC,GAAI33B,KAAKwtE,uBAAyB,CACjC,MAAMpjE,EAAQpK,KAAKL,OAAOsB,QACpBoJ,EAASrK,KAAKoK,MAAMnJ,QAEpBqtE,EAAoBtuE,KAAKuuE,qBAAsBvuE,KAAK+lB,iBAAiB9kB,SACrEutE,EAAuBxuE,KAAKuuE,qBAAsBvuE,KAAKimB,oBAAoBhlB,SAC3EwtE,EAAsBzuE,KAAKuuE,qBAAsBvuE,KAAKmmB,mBAAmBllB,SACzEytE,EAAmB1uE,KAAKuuE,qBAAsBvuE,KAAKqmB,gBAAgBplB,SAEnE0tE,EAAkBL,EAAoBE,EAAuBC,EAAsBC,EACnFE,EAAqB,GAAMxkE,EAAQC,GAEnC4iE,EAAY2B,EAAqBD,EAEvC,OAAO,IAAI9uE,EAAQotE,EACpB,CAGA,MAAMpvC,EAAI79B,KAAKL,OAAOsB,QAChBkhC,EAAIniC,KAAKoK,MAAMnJ,QACfmK,EAAIpL,KAAK6lB,OAAO5kB,QACtB,OAAO,IAAIpB,EAAQ,GAAMg+B,EAAIsE,EAAI9gC,KAAKm+B,GAAKp0B,GAC5C,CAEA,oBAAAmjE,CAAsB1oD,GACrB,MAAMgpD,EAA8B,EAAThpD,EAAexkB,KAAKm+B,GAC/C,OAAOqvC,EAAmB,CAC3B,CAEA,UAAA5nB,GACC,OAAOjnD,KAAKL,MACb,CAEA,SAAAunD,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA0kE,GACC,OAAO9uE,KAAK6lB,MACb,CAEA,oBAAA2nD,GACC,OAAOxtE,KAAKqmB,iBAAmBrmB,KAAK+lB,kBAAoB/lB,KAAKmmB,oBAAsBnmB,KAAKimB,mBACzF,CAEA,sBAAAk/B,CAAwBS,GACvB,MAAMmpB,EAAkB1tE,KAAKC,IAAKskD,EAAkBqB,aAAahmD,QAAS2kD,EAAkBsB,YAAYjmD,SACxG,MAAO,CACNtB,OAAQimD,EAAkBqB,aAC1B78C,MAAOw7C,EAAkBsB,YACzBrhC,OAAQ,IAAIhmB,EAAQkvE,EAAkB,GAExC,CAEA,kBAAA9pB,GACC,MAAO,CAAC,SAAU,QAAS,SAC5B,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACN1rE,OAAQK,KAAKL,OAAOsB,QACpBmJ,MAAOpK,KAAKoK,MAAMnJ,QAClB4kB,OAAQ7lB,KAAK6lB,OAAO5kB,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GACV,IAAIxX,EAAQwX,EAAW1X,QACvB,IAAIE,EAAQwX,EAAWjN,OACvB,IAAIvK,EAAQwX,EAAWwO,QACvB,IAAIhmB,EAAQwX,EAAWgP,iBACvB,IAAIxmB,EAAQwX,EAAW0O,kBACvB,IAAIlmB,EAAQwX,EAAW8O,oBACvB,IAAItmB,EAAQwX,EAAW4O,qBAEzB,EC7Ic,MAAM,WAA0B,GAC9C6kD,YAAc,qBAEd,WAAAhrE,CAAamnB,EAAM5c,GAClBg9B,QAEArnC,KAAKinB,KAAOA,EACZjnB,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAkBC,IAC1B,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKinB,KAAMjnB,KAAKqK,OACvC,CAEA,QAAAmtB,GACC,OAAO,IAAIkmB,GAAM19C,KAAKinB,KAAKhmB,QAAUjB,KAAKqK,OAAOpJ,QAAU,EAC5D,CAEA,iBAAA02B,GAGC,MAAMkG,EAAI79B,KAAKinB,KAAKhmB,QAAU,EACxBkhC,EAAIniC,KAAKqK,OAAOpJ,QAChBmhC,EAAI/gC,KAAKy8B,KAAMz8B,KAAK0xD,IAAKl1B,EAAG,GAAMx8B,KAAK0xD,IAAK5wB,EAAG,IACrD,OAAO,IAAItiC,EAAQG,KAAKinB,KAAKhmB,QAAc,EAAJmhC,EACxC,CAEA,QAAA0qC,GACC,OAAO9sE,KAAKinB,IACb,CAEA,UAAA8lD,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GAEvB,MAAMO,EAAeP,EAAkBG,mBACvC,MAAO,CACN9+B,KAAMk/B,EACN97C,OAAQ87C,EAEV,CAEA,kBAAAlB,GACC,MAAO,CAAE,OAAQ,SAClB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNpkD,KAAMjnB,KAAKinB,KAAKhmB,QAChBoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAmB,IAAIxX,EAAQwX,EAAW4P,MAAQ,IAAIpnB,EAAQwX,EAAWhN,QACrF,EClEc,MAAM,WAAmBkiE,GACvCzB,YAAc,cAEd,QAAAC,GACC,OAAO,GAAWC,IACnB,CAEA,YAAAwB,GACC,MAAO,EACR,CAEA,uBAAAvB,GACC,OAAO,IAAI,GAAW,IAAIprE,EAAQG,KAAKsmB,SAASrlB,SAAW,IAAIpB,EAAQG,KAAKsmB,SAASrlB,QAAU,GAChG,CAEA,sBAAAkkD,CAAwBS,GACvB,MAAMM,EAAgBN,EAAkBC,oBACxC,MAAO,CACNv/B,SAAU4/B,EAEZ,ECnBc,MAAM,WAAsB,GAC1C4kB,YAAc,iBAEd,WAAAhrE,CAAa+lB,GACZwhB,QAEArnC,KAAK6lB,OAASA,CACf,CAEA,QAAAklD,GACC,OAAO,GAAcC,IACtB,CAEA,QAAAxzC,GACC,MAAMt0B,EAAO7B,KAAKm+B,GAAKn+B,KAAK0xD,IAAK/yD,KAAK6lB,OAAO5kB,QAAS,GACtD,OAAO,IAAIy8C,GAAM,IAAOx6C,EACzB,CAEA,iBAAAy0B,GACC,MAAMrR,EAAWtmB,KAAK6lB,OAAOtkB,SAAU,GAAIN,QACrCwrE,EAAuB,IAAI5sE,EAAQwB,KAAKm+B,GAAKlZ,GAEnD,OAAO,IAAIzmB,EAAQ,IAAO4sE,EAAqBxrE,QAAUqlB,EAC1D,CAEA,uBAAA2kD,GACC,OAAO,IAAI,GAAWjrE,KAAK6lB,OAAQ7lB,KAAK6lB,OACzC,CAEA,sBAAAs/B,CAAwBS,GAGvB,MAAMM,EAAgBN,EAAkBC,oBACxC,MAAO,CACNhgC,OAAQqgC,EAEV,CAEA,kBAAAjB,GACC,MAAO,CAAC,SACT,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNxlD,OAAQ7lB,KAAK6lB,OAAO5kB,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAIrX,KAAM,IAAIH,EAAQwX,EAAWwO,QACzC,ECtDc,MAAM,WAAgB,GACpCilD,YAAc,UAEd,WAAAhrE,CAAawnB,GACZ+f,QAEArnC,KAAKsnB,YAAcA,CACpB,CAEA,QAAAyjD,GACC,OAAO,GAAQC,IAChB,CAEA,uBAAAC,GACC,MAAM3jD,EAActnB,KAAKsnB,YAAYrmB,QAC/B+tE,EAA4B,EAAd1nD,EACd2nD,EAAyF,EAA3E5tE,KAAKy8B,KAAMz8B,KAAK0xD,IAAKzrC,EAAa,GAAMjmB,KAAK0xD,IAAKzrC,EAAc,EAAG,IACvF,OAAO,IAAI,GAAW,IAAIznB,EAAQmvE,GAAa,IAAInvE,EAAQovE,GAC5D,CAEA,QAAAz3C,GACC,MAAMt0B,EAAO,EAAI7B,KAAKy8B,KAAM,GAAM,EAAIz8B,KAAK0xD,IAAK/yD,KAAKsnB,YAAYrmB,QAAS,GAC1E,OAAO,IAAIy8C,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,OAAO,IAAI93B,EAAQ,EAAIG,KAAKsnB,YAAYrmB,QACzC,CAEA,eAAAiuE,GACC,OAAOlvE,KAAKsnB,WACb,CAEA,sBAAA69B,CAAwBS,GAOvB,IAAIM,EAAgBN,EAAkBC,oBAAoB5kD,QAC1DilD,GAAgC,EAChC,MAAMU,EAAsBV,GAC3B7kD,KAAKy8B,KAAM,GAAM,GAElB,MAAO,CACNxW,YAAa,IAAIznB,EAAQ+mD,GAE3B,CAEA,kBAAA3B,GACC,MAAO,CAAE,cACV,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACN/jD,YAAatnB,KAAKsnB,YAEpB,CAEA,6BAAOgkD,CAAwBj0D,GAC9B,OAAO,IAAI,GAAS,IAAIxX,EAAQwX,EAAWiQ,aAC5C,EClEc,MAAM,WAAgB,GACpCwjD,YAAc,UACdA,aAAe,EAEf,WAAAhrE,CAAawnB,GACZ+f,QAEArnC,KAAKsnB,YAAcA,CACpB,CAEA,QAAAyjD,GACC,OAAO,GAAQC,IAChB,CAEA,uBAAAC,GACC,MAAMkE,EAAQ9tE,KAAKy8B,KAAM,GACnBzW,EAAarnB,KAAKkvE,kBAAkBjuE,QACpCmJ,EAAQid,GAAe,EAAI8nD,GACjC,OAAO,IAAI,GAAW,IAAItvE,EAAQuK,GAAS,IAAIvK,EAAQuK,GACxD,CAEA,QAAAotB,GACC,MAAM23C,EAAQ9tE,KAAKy8B,KAAM,GACnB56B,EAAO,GAAM,EAAIisE,GAAU9tE,KAAK0xD,IAAK/yD,KAAKkvE,kBAAkBjuE,QAAS,GAC3E,OAAO,IAAIy8C,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,OAAO,IAAI93B,EAAQ,GAAQuvE,MAAQpvE,KAAKsnB,YAAYrmB,QACrD,CAEA,eAAAiuE,GACC,OAAOlvE,KAAKsnB,WACb,CAEA,kBAAA29B,GACC,MAAO,CAAE,cACV,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACN/jD,YAAatnB,KAAKsnB,YAEpB,CAEA,6BAAOgkD,CAAwBj0D,GAC9B,OAAO,IAAI,GAAS,IAAIxX,EAAQwX,EAAWiQ,aAC5C,ECnDc,MAAM,WAAgB,GACpCwjD,YAAc,UAEd,WAAAhrE,CAAasK,EAAOk4B,GACnB+E,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKsiC,YAAcA,CACpB,CAEA,QAAAyoC,GACC,OAAO,GAAQC,IAChB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAKoK,MACxC,CAEA,QAAAotB,GACC,MAAM3R,EAAS7lB,KAAKoK,MAAM3I,OAAQ,GAAIR,QAChCiC,EAAO,GAAMlD,KAAKsiC,YAAczc,EAASA,EAASxkB,KAAKq+B,IAAO,EAAIr+B,KAAKm+B,GAAOx/B,KAAKsiC,aACzF,OAAO,IAAIob,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,MAAM9R,EAAS7lB,KAAKoK,MAAM3I,OAAQ,GAAIR,QAChCqmB,EAAc,EAAIzB,EAASxkB,KAAKq+B,IAAKr+B,KAAKm+B,GAAKx/B,KAAKsiC,aAC1D,OAAO,IAAIziC,EAAQG,KAAKsiC,YAAchb,EACvC,CAEA,SAAA4/B,GACC,OAAOlnD,KAAKoK,KACb,CAEA,eAAAilE,GACC,OAAOrvE,KAAKsiC,WACb,CAEA,sBAAA6iB,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBC,oBAE3B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QACV,CAEA,iBAAAC,GACC,MAAO,CAAE,cACV,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBqhC,YAAatiC,KAAKsiC,YAEpB,CAEA,6BAAOgpC,CAAwBj0D,GAC9B,OAAO,IAAI,GACV,IAAIxX,EAAQwX,EAAWjN,OACvB4Z,SAAU3M,EAAWirB,YAAa,IAEpC,EChEc,MAAM,WAAc,GAClCwoC,YAAc,QAEd,WAAAhrE,CAAa0nB,EAAaE,EAAYE,EAAaE,GAClDuf,QAEArnC,KAAKwnB,YAAcA,EACnBxnB,KAAK0nB,WAAaA,EAClB1nB,KAAK4nB,YAAcA,EACnB5nB,KAAK8nB,WAAaA,CACnB,CAEA,QAAAijD,GACC,OAAO,GAAMC,IACd,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKwnB,YAAYtmB,IAAKlB,KAAK4nB,aAAe5nB,KAAK0nB,WAAWtmB,IAAKpB,KAAK8nB,YAC3F,CAEA,QAAA0P,GACC,MAAM83C,EAAY,IAAI,GAAWtvE,KAAKwnB,YAAaxnB,KAAK0nB,YAAa8P,WAC/D+3C,EAAY,IAAI,GAAmBvvE,KAAK8nB,WAAY9nB,KAAK4nB,aAAc4P,WAC7E,OAAO83C,EAAUpuE,IAAKquE,EACvB,CAEA,iBAAA53C,GAEC,MAAM63C,EAAuB,IAAI,GAAWxvE,KAAKwnB,YAAaxnB,KAAK0nB,YAAaiQ,oBAC1E83C,EAAuB,IAAI,GAAmBzvE,KAAK8nB,WAAY9nB,KAAK4nB,aAAc+P,oBAClF+3C,EAAuB1vE,KAAK0nB,WAAWpmB,IAAKtB,KAAK8nB,YACvD,OAAO0nD,EAAmBtuE,IAAKuuE,GAAqBtuE,SAAUuuE,GAAuBvuE,SAAUuuE,EAChG,CAEA,eAAAC,GACC,OAAO3vE,KAAKwnB,WACb,CAEA,cAAAooD,GACC,OAAO5vE,KAAK0nB,UACb,CAEA,eAAAmoD,GACC,OAAO7vE,KAAK4nB,WACb,CAEA,cAAAkoD,GACC,OAAO9vE,KAAK8nB,UACb,CAEA,sBAAAq9B,GACC,MAAO,CAAC,CACT,CAEA,kBAAAF,GACC,MAAO,CAAE,cAAe,aAAc,cAAe,aACtD,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACN7jD,YAAaxnB,KAAKwnB,YAAYvmB,QAC9BymB,WAAY1nB,KAAK0nB,WAAWzmB,QAC5B2mB,YAAa5nB,KAAK4nB,YAAY3mB,QAC9B6mB,WAAY9nB,KAAK8nB,WAAW7mB,QAE9B,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAO,IAAIxX,EAAQwX,EAAWmQ,aAAe,IAAI3nB,EAAQwX,EAAWqQ,YAAc,IAAI7nB,EAAQwX,EAAWuQ,aAAe,IAAI/nB,EAAQwX,EAAWyQ,YAC3J,ECzEc,MAAM,WAAa,GACjCgjD,YAAc,OACdA,gCAAkC,EAClCA,gCAAkC,GAElC,WAAAhrE,CAAawoB,EAAkBF,EAAcF,GAC5Cmf,QAEArnC,KAAKsoB,iBAAmBA,EACxBtoB,KAAKooB,aAAeA,EACpBpoB,KAAKkoB,aAAeA,CACrB,CAEA,QAAA6iD,GACC,OAAO/qE,KAAKF,YAAYkrE,IACzB,CAEA,uBAAAC,GAGC,IAAI8E,EAAgB/vE,KAAKooB,aAAahnB,IAAKpB,KAAKkoB,cAGhD,OAFA6nD,EAAgBA,EAAcxuE,SAAU,GAEjC,IAAI,GAAWwuE,EAAeA,EACtC,CAEA,QAAAv4C,GACC,MAAMw4C,EAAYhwE,KAAKooB,aAAannB,QAC9BgvE,EAAYjwE,KAAKkoB,aAAajnB,QAC9BivE,EAAY,EAAI7uE,KAAKm+B,IACF,EAAxBx/B,KAAKsoB,kBAEA6nD,EAAYF,EAAK5uE,KAAKq+B,IAAKwwC,GAC3BE,EAAYD,EAAKH,EACvB,OAAO,IAAItyB,GAAM19C,KAAKsoB,iBAAmB8nD,EAC1C,CAEA,iBAAAz4C,GACC,MAAMq4C,EAAYhwE,KAAKooB,aAAannB,QAC9BgvE,EAAYjwE,KAAKkoB,aAAajnB,QAC9BivE,EAAY,EAAI7uE,KAAKm+B,IACF,EAAxBx/B,KAAKsoB,kBAEA6nD,EAAYF,EAAK5uE,KAAKq+B,IAAKwwC,GAC3BG,EAAYhvE,KAAKy8B,KAAMz8B,KAAK0xD,IAAKkd,EAAI,GAAM5uE,KAAK0xD,IAAKod,EAAI,IACzDG,EAAYjvE,KAAKy8B,KAAMz8B,KAAK0xD,IAAKid,EAAKK,EAAI,GAAMhvE,KAAK0xD,IAAKod,EAAI,IACpE,OAAO,IAAItwE,EAAgC,EAAxBG,KAAKsoB,iBAAuBgoD,EAChD,CAEA,oBAAAC,GACC,OAAOvwE,KAAKsoB,gBACb,CAEA,gBAAAkoD,GACC,OAAOxwE,KAAKkoB,YACb,CAEA,gBAAAuoD,GACC,OAAOzwE,KAAKooB,YACb,CAEA,sBAAA+8B,CAAwBS,GAEvB,MAAMkD,EAAiBlD,EAAkBC,oBAAoB5kD,QAAU,EACvE,MAAO,CACNinB,aAAc,IAAIroB,EAAQipD,GAC1B1gC,aAAc,IAAIvoB,EAAQipD,GAC1BxgC,iBAAkBtoB,KAAK0wE,yBAEzB,CAEA,kBAAAzrB,GACC,MAAO,CAAE,eAAgB,eAC1B,CAEA,iBAAAC,GACC,MAAO,CAAE,mBACV,CAEA,oBAAAmmB,GACC,MAAO,CACNnjD,aAAcloB,KAAKkoB,aAAajnB,QAChCmnB,aAAcpoB,KAAKooB,aAAannB,QAChCqnB,iBAAkBtoB,KAAKsoB,iBAEzB,CAEA,6BAAOgjD,CAAwBj0D,GAC9B,OAAO,IAAI,GACV2M,SAAU3M,EAAWiR,iBAAkB,IACvC,IAAIzoB,EAAQwX,EAAW6Q,cACvB,IAAIroB,EAAQwX,EAAW+Q,cAEzB,EC7Fc,MAAM,WAAwB,GAC5C0iD,YAAc,mBAEd,WAAAhrE,CAAasK,EAAOsc,EAAaE,GAChCygB,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAK0mB,YAAcA,EACnB1mB,KAAK4mB,aAAeA,CACrB,CAEA,QAAAmkD,GACC,OAAO,GAAgBC,IACxB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAK2wE,qBACxC,CAEA,QAAAn5C,GACC,MAAMo5C,EAAiB5wE,KAAK2wE,qBACtBE,EAAkB7wE,KAAK8wE,sBACvBC,EAAiB,IAAI,GAAW/wE,KAAKoK,MAAOpK,KAAK8wE,uBACjDE,EAAe,IAAI,GAAqBhxE,KAAKoK,MAAOwmE,EAAezvE,SAAU0vE,IACnF,OAAOE,EAAev5C,WAAWt2B,IAAK8vE,EAAax5C,WACpD,CAEA,iBAAAG,GAEC,MAAMs5C,EAAkB5vE,KAAKy8B,KAAMz8B,KAAK0xD,IAAK/yD,KAAKoK,MAAMnJ,QAAS,GAAMI,KAAK0xD,IAAK/yD,KAAK2wE,qBAAqBxvE,SAAUnB,KAAK8wE,uBAAwB7vE,QAAS,IAC3J,OAAOjB,KAAKoK,MAAMlJ,IAAKlB,KAAK0mB,aAAcxlB,IAAKlB,KAAK4mB,cAAe1lB,IAAK,IAAIrB,EAAQoxE,GACrF,CAEA,kBAAAN,GACC,OAAO3wE,KAAK0mB,YAAYtlB,IAAKpB,KAAK4mB,aACnC,CAEA,mBAAAkqD,GACC,OAAO9wE,KAAK0mB,YAAYplB,IAAKtB,KAAK4mB,aACnC,CAEA,SAAAsgC,GACC,OAAOlnD,KAAKoK,KACb,CAEA,eAAA8mE,GACC,OAAOlxE,KAAK0mB,WACb,CAEA,gBAAAyqD,GACC,OAAOnxE,KAAK4mB,YACb,CAEA,sBAAAu+B,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBsB,YACzBxgC,YAAak/B,EAAkBG,mBAC/Bn/B,aAAcg/B,EAAkBG,mBAElC,CAEA,kBAAAd,GACC,MAAO,CAAC,cAAe,QAAS,eACjC,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBylB,YAAa1mB,KAAK0mB,YAAYzlB,QAC9B2lB,aAAc5mB,KAAK4mB,aAAa3lB,QAElC,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAiB,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWqP,aAAe,IAAI7mB,EAAQwX,EAAWuP,cAC1H,EC/Ec,MAAM,WAA6B,GACjDkkD,YAAc,yBAEd,WAAAhrE,CAAauK,EAAQyc,EAAWE,GAC/BqgB,QAEArnC,KAAKqK,OAASA,EACdrK,KAAK8mB,UAAYA,EACjB9mB,KAAKgnB,aAAeA,CACrB,CAEA,QAAA+jD,GACC,OAAO,GAAqBC,IAC7B,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKqK,OAAQrK,KAAKoxE,oBACzC,CAEA,QAAA55C,GACC,MAAMo5C,EAAiB5wE,KAAKoxE,oBACtBP,EAAkB7wE,KAAKqxE,qBACvBN,EAAiB,IAAI,GAAW/wE,KAAKqK,OAAQrK,KAAKqxE,sBAClDL,EAAe,IAAI,GAAqBhxE,KAAKqK,OAAQumE,EAAezvE,SAAU0vE,IACpF,OAAOE,EAAev5C,WAAWt2B,IAAK8vE,EAAax5C,WACpD,CAEA,iBAAAG,GAEC,MAAMs5C,EAAkB5vE,KAAKy8B,KAAMz8B,KAAK0xD,IAAK/yD,KAAKqK,OAAOpJ,QAAS,GAAMI,KAAK0xD,IAAK/yD,KAAKoxE,oBAAoBjwE,SAAUnB,KAAKqxE,sBAAuBpwE,QAAS,IAC1J,OAAOjB,KAAKqK,OAAOnJ,IAAKlB,KAAK8mB,WAAY5lB,IAAKlB,KAAKgnB,cAAe9lB,IAAK,IAAIrB,EAAQoxE,GACpF,CAEA,iBAAAG,GACC,OAAOpxE,KAAK8mB,UAAU1lB,IAAKpB,KAAKgnB,aACjC,CAEA,kBAAAqqD,GACC,OAAOrxE,KAAK8mB,UAAUxlB,IAAKtB,KAAKgnB,aACjC,CAEA,UAAA+lD,GACC,OAAO/sE,KAAKqK,MACb,CAEA,aAAAinE,GACC,OAAOtxE,KAAK8mB,SACb,CAEA,gBAAAyqD,GACC,OAAOvxE,KAAKgnB,YACb,CAEA,sBAAAm+B,CAAwBS,GACvB,MAAO,CACNv7C,OAAQu7C,EAAkBmnB,aAC1BjmD,UAAW8+B,EAAkBG,mBAC7B/+B,aAAc4+B,EAAkBG,mBAElC,CAEA,kBAAAd,GACC,MAAO,CAAC,YAAa,SAAU,eAChC,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNhhE,OAAQrK,KAAKqK,OAAOpJ,QACpB6lB,UAAW9mB,KAAK8mB,UAAU7lB,QAC1B+lB,aAAchnB,KAAKgnB,aAAa/lB,QAElC,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAsB,IAAIxX,EAAQwX,EAAWhN,QAAU,IAAIxK,EAAQwX,EAAWyP,WAAa,IAAIjnB,EAAQwX,EAAW2P,cAC9H,EC/Ec,MAAM,WAAwB,GAC5C8jD,YAAc,mBAEd,WAAAhrE,CAAasK,EAAOC,GACnBg9B,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAgBC,IACxB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAKqK,OACxC,CAEA,QAAAmtB,GACC,MAAM3R,EAAmB7lB,KAAKoK,MAAMnJ,QAAU,EACxCuwE,EAAmBnwE,KAAKm+B,GAAKn+B,KAAK0xD,IAAKltC,EAAQ,GAAM,GACrD4rD,EAAmBzxE,KAAKqK,OAAOpJ,QAAU4kB,EACzC3iB,EAAmBsuE,EAAgBxxE,KAAKoK,MAAMnJ,QAAUwwE,EAE9D,OAAO,IAAI/zB,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,MAAM+5C,EAA4B,IAAI7xE,EAAQwB,KAAKm+B,GAAKx/B,KAAKoK,MAAMnJ,QAAU,GACvEwwE,EAA4BzxE,KAAKqK,OAAOpJ,QAAUjB,KAAKoK,MAAMnJ,QAAU,EACvE0wE,EAA4B,IAAI9xE,EAAQG,KAAKoK,MAAMnJ,QAA+B,EAAnBwwE,GAErE,OAAO,IAAI5xE,EAAQ6xE,EAA0BzwE,QAAU0wE,EAAwB1wE,QAChF,CAEA,qBAAAs2B,GACC,MAAM60C,EAAiBpsE,KAAKirE,0BAEtB7gE,EAASgiE,EAAellB,YAAYhmD,IAAK,IAAIrB,EAAQG,KAAKqsE,sBAC1DhiE,EAAS+hE,EAAenlB,aAAa/lD,IAAK,IAAIrB,EAAQG,KAAKqsE,sBAEjE,OAAO,IAAI,GAAWjiE,EAAOC,EAC9B,CAEA,SAAA68C,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAiB,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWhN,QACpF,EC5Ec,MAAM,WAAc,GAClCygE,YAAc,QAEd,WAAAhrE,CAAauK,GACZg9B,QAEArnC,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAMC,IACd,CAEA,uBAAAC,GACC,MAAMptC,EAAI79B,KAAK4xE,qBAAqB3wE,QAC9BkhC,GAAM9gC,KAAKy8B,KAAM,GAAM,EAAI,GAAMD,EACvC,OAAO,IAAI,GAAW79B,KAAKqK,OAAQ,IAAIxK,EAAQsiC,GAChD,CAEA,kBAAAyvC,GAEC,MAAM5E,EAAchtE,KAAKqK,OAAOpJ,QAC1BqmB,EAAc0lD,GACnB,EAAI,EAAI3rE,KAAKy8B,KAAM,GAAM,IAE1B,OAAO,IAAIj+B,EAAQynB,EACpB,CAEA,QAAAkQ,GAEC,MAAMlQ,EAActnB,KAAK4xE,qBACnB7hE,EAAc,IAAI,GAAWuX,EAAaA,GAC1CrZ,EAAc,IAAI,GAAQqZ,GAChC,OAAOvX,EAAUynB,WAAWt2B,IAAK+M,EAAOupB,WACzC,CAEA,iBAAAG,GAGC,MAAMrQ,EAActnB,KAAK4xE,qBACnB7hE,EAAc,IAAI,GAAWuX,EAAaA,GAC1CrZ,EAAc,IAAI,GAAQqZ,GAChC,OAAOvX,EAAU4nB,oBAAoBl2B,OAAQ,GAAIP,IAAK+M,EAAO0pB,oBAC9D,CAEA,UAAAo1C,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GAEvB,MAAMM,EAAgBN,EAAkBC,oBAClC1jB,EAAgB+jB,EAAcjlD,QAC9B48B,EAAgBsE,GACrB9gC,KAAKy8B,KAAM,GAAM,EAAI,GAEhBkvC,EAAgBnvC,GACrB,EAAI,EAAIx8B,KAAKy8B,KAAM,GAAM,IAE1B,MAAO,CACNzzB,OAAQ,IAAIxK,EAAQmtE,GAEtB,CAEA,kBAAA/nB,GACC,MAAO,CAAE,SACV,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNhhE,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAO,IAAIxX,EAAQwX,EAAWhN,QAC1C,ECrFc,MAAM,GACpBygE,YAAc,OAEd,QAAAC,GACC,OAAO,GAAKC,IACb,CAEA,uBAAAC,GACA,CAEA,QAAAzzC,GACA,CAEA,iBAAAG,GACA,CAEA,sBAAAwtB,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBqB,aACzB58C,OAAQu7C,EAAkBsB,YAE5B,CAEA,kBAAAjC,GACC,MAAO,CAAC,iBACT,CAEA,iBAAAC,GACC,MAAO,CAAC,OAAQ,OAAQ,oBACzB,CAEA,oBAAAmmB,GACA,CAEA,6BAAOC,GACP,EC9Bc,MAAM,WAAkB,GACtCR,YAAc,YAEd,WAAAhrE,CAAaknB,EAAcI,EAAaN,EAAWzc,GAClDg9B,QAEArnC,KAAKgnB,aAAeA,EACpBhnB,KAAKonB,YAAcA,EACnBpnB,KAAK8mB,UAAYA,EACjB9mB,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAUC,IAClB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAK8mB,UAAU1lB,IAAKpB,KAAKgnB,cAAgBhnB,KAAKqK,OACrE,CAEA,QAAAmtB,GACC,OAAO,IAAIkmB,IAAQ19C,KAAKgnB,aAAa/lB,QAAUjB,KAAK8mB,UAAU7lB,SAAY,EAAIjB,KAAKqK,OAAOpJ,QAC3F,CAEA,iBAAA02B,GACC,MAAMk6C,EAAgBxwE,KAAKy8B,KAAMz8B,KAAK0xD,IAAK/yD,KAAKonB,YAAYnmB,QAAS,GAAMI,KAAK0xD,IAAK/yD,KAAKqK,OAAOpJ,QAAS,IACpG6wE,EAAe9xE,KAAKgnB,aAAa7lB,SAAUnB,KAAK8mB,UAAU5lB,IAAKlB,KAAKonB,cACpE2qD,EAAiB1wE,KAAKy8B,KAAMz8B,KAAK0xD,IAAK+e,EAAa7wE,QAAS,GAAMI,KAAK0xD,IAAK/yD,KAAKqK,OAAOpJ,QAAS,IACvG,OAAOjB,KAAKgnB,aAAa9lB,IAAKlB,KAAK8mB,WAAY5lB,IAAK,IAAIrB,EAAQgyE,IAAkB3wE,IAAK,IAAIrB,EAAQkyE,GACpG,CAEA,gBAAAR,GACC,OAAOvxE,KAAKgnB,YACb,CAEA,aAAAsqD,GACC,OAAOtxE,KAAK8mB,SACb,CAEA,eAAAkrD,GACC,OAAOhyE,KAAKonB,WACb,CAEA,UAAA2lD,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GACvB,MAAO,CACN5+B,aAAc4+B,EAAkBG,mBAChC3+B,YAAaw+B,EAAkBG,mBAC/Bj/B,UAAW8+B,EAAkBG,mBAC7B17C,OAAQu7C,EAAkBG,mBAE5B,CAEA,kBAAAd,GACC,MAAO,CAAC,YAAa,SAAU,eAAgB,cAChD,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNrkD,aAAchnB,KAAKgnB,aAAa/lB,QAChCmmB,YAAapnB,KAAKonB,YAAYnmB,QAC9B6lB,UAAW9mB,KAAK8mB,UAAU7lB,QAC1BoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAW,IAAIxX,EAAQwX,EAAW2P,cAAgB,IAAInnB,EAAQwX,EAAW+P,aAAe,IAAIvnB,EAAQwX,EAAWyP,WAAa,IAAIjnB,EAAQwX,EAAWhN,QAC/J,EC3Ec,MAAM,WAAiB,GACrCygE,YAAc,YAEd,WAAAhrE,CAAasK,EAAOyb,GACnBwhB,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAK6lB,OAASA,CACf,CAEA,QAAAklD,GACC,OAAO,GAASC,IACjB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKknD,YAAalnD,KAAK+sE,aAC9C,CAEA,QAAAv1C,GACC,MAAM3R,EAAS7lB,KAAK8uE,aAAa7tE,QAC3BgxE,EAAa5wE,KAAKm+B,GAAKn+B,KAAK0xD,IAAKltC,EAAQ,GACzCzb,EAAQpK,KAAKknD,YAAYjmD,QAAqB,EAAT4kB,EACrCqsD,EAAgB9nE,EAAQpK,KAAK+sE,aAAa9rE,QAC1CiC,EAAO+uE,EAAaC,EAE1B,OAAO,IAAIx0B,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,MAAM9R,EAAS7lB,KAAK8uE,aAAa7tE,QAC3BqlB,EAAoB,EAATT,EAEXzb,EAAQpK,KAAKknD,YAAYjmD,QAEzBkxE,EAAqB,GAAM/nE,EAAQkc,GACnC8rD,EAAkB/wE,KAAKm+B,GAAKlZ,EAC5B2mD,EAAYkF,EAAqBC,EAEvC,OAAO,IAAIvyE,EAAQotE,EACpB,CAEA,UAAA6B,GACC,OAAO9uE,KAAK6lB,MACb,CAEA,SAAAqhC,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAK6lB,OAAOtkB,SAAU,EAC9B,CAEA,sBAAA4jD,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzBlgC,OAAQ+/B,EAAkBC,oBAE5B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClB4kB,OAAQ7lB,KAAK6lB,OAAO5kB,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAU,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWwO,QAC7E,EC7Ec,MAAM,WAAa,GACjCilD,YAAc,OAEd,WAAAhrE,CAAasK,EAAOyhB,EAAYE,GAC/Bsb,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAK6rB,WAAaA,EAClB7rB,KAAK+rB,cAAgBA,CACtB,CAEA,QAAAg/C,GACC,OAAO,GAAKC,IACb,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKknD,YAAalnD,KAAK+sE,aAC9C,CAEA,QAAAv1C,GACC,MAAMt0B,EAASlD,KAAK+sE,aAAa9rE,QAAUjB,KAAKknD,YAAYjmD,QAAY,EAExE,OAAO,IAAIy8C,GAAMx6C,EAClB,CAEA,iBAAAy0B,GACC,MAAM4sC,EAAYvkE,KAAKknD,YAAYzlD,OAAQ,GAAIR,QACzCoxE,EAAahxE,KAAKy8B,KAAM99B,KAAKsyE,iBAAiBrxE,SAAW,EAAIsjE,GAAa,GAC1EgO,EAAalxE,KAAKy8B,KAAM99B,KAAKwyE,oBAAoBvxE,SAAW,EAAIsjE,GAAa,GAC7E0I,EAAY,GAAMoF,EAAaE,GAErC,OAAO,IAAI1yE,EAAQotE,EACpB,CAEA,SAAA/lB,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAK6rB,WAAW3qB,IAAKlB,KAAK+rB,cAClC,CAEA,cAAAumD,GACC,OAAOtyE,KAAK6rB,UACb,CACA,iBAAA2mD,GACC,OAAOxyE,KAAK+rB,aACb,CAEA,sBAAAo5B,CAAwBS,GACvB,MAAMO,EAAeP,EAAkBG,mBACjCl6B,EAAas6B,EAAa1kD,OAAQ,GAAIR,QACtC8qB,EAAgBF,EAAeA,EAAa,EAElD,MAAO,CACNzhB,MAAOw7C,EAAkBC,oBACzBh6B,WAAY,IAAIhsB,EAAQgsB,GACxBE,cAAe,IAAIlsB,EAAQksB,GAE7B,CAEA,kBAAAk5B,GACC,MAAO,CAAE,QAAS,aAAc,gBACjC,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClB4qB,WAAY7rB,KAAK6rB,WAAW5qB,QAC5B8qB,cAAe/rB,KAAK+rB,cAAc9qB,QAEpC,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAM,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWwU,YAAc,IAAIhsB,EAAQwX,EAAW0U,eAC9G,EC/Ec,MAAM,WAAe,GACnC++C,YAAc,SAEd,WAAAhrE,CAAasK,EAAOC,EAAQ4hB,GAC3Bob,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKqK,OAASA,EACdrK,KAAKisB,YAAcA,CACpB,CAEA,QAAA8+C,GACC,OAAO,GAAOC,IACf,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKknD,YAAalnD,KAAK+sE,aAC9C,CAEA,QAAAv1C,GACC,MAAMntB,EAASrK,KAAK+sE,aAAa9rE,QAC3BmJ,EAAQpK,KAAKknD,YAAYjmD,QACzB+qB,EAAahsB,KAAKyyE,kBAAkBxxE,QAEpCyxE,GAAwBroE,EAAS2hB,GAAe,EAEhD2mD,EAAcD,EAAsB,EAAQrxE,KAAK0xD,IAAK3oD,EAAO,IAAQ,EAAIsoE,GACzEE,EAAW,EAAIvxE,KAAKwxE,KAAMzoE,GAAU,EAAIuoE,IACxCG,EAAsBzxE,KAAK0xD,IAAK4f,EAAW,GAAM,GAAQC,EAAWvxE,KAAKq+B,IAAKkzC,IAE9EG,EAAe3oE,EAAQC,EAAa,EAAIyoE,EAC9C,OAAO,IAAIp1B,GAAMq1B,EAClB,CAEA,iBAAAp7C,GACC,MAAMvtB,EAAQpK,KAAKknD,YAAYjmD,QACzBoJ,EAASrK,KAAK+sE,aAAa9rE,QAC3B+qB,EAAahsB,KAAKyyE,kBAAkBxxE,QAEpCyxE,GAAwBroE,EAAS2hB,GAAe,EAEhD2mD,EAAcD,EAAsB,EAAQrxE,KAAK0xD,IAAK3oD,EAAO,IAAQ,EAAIsoE,GACzEE,EAAW,EAAIvxE,KAAKwxE,KAAMzoE,GAAU,EAAIuoE,IACxCK,EAAYL,EAAYC,EAExBK,EAAgC,EAAR7oE,EAAgB,EAAI4oE,EAElD,OAAO,IAAInzE,EAAQozE,EACpB,CAEA,SAAA/rB,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAKqK,MACb,CAEA,eAAAooE,GACC,OAAOzyE,KAAKisB,WACb,CAEA,sBAAAk5B,CAAwBS,GACvB,MAAMO,EAAeP,EAAkBG,mBAEvC,MAAO,CACN37C,MAAO+7C,EACP97C,OAAQ87C,EACRl6B,YAAa25B,EAAkBC,oBAEjC,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SAAU,cAC7B,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBoJ,OAAQrK,KAAKqK,OACb4hB,YAAajsB,KAAKisB,YAAYhrB,QAEhC,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GACV,IAAIxX,EAAQwX,EAAWjN,OACvB,IAAIvK,EAAQwX,EAAWhN,QACvB,IAAIxK,EAAQwX,EAAW4U,aAEzB,EC9Fc,MAAM,WAAc,GAClC6+C,YAAc,QAEd,WAAAhrE,CAAagnB,EAAWE,EAAc6E,EAAYE,GACjDsb,QAEArnC,KAAK8mB,UAAYA,EACjB9mB,KAAKgnB,aAAeA,EACpBhnB,KAAK6rB,WAAaA,EAClB7rB,KAAK+rB,cAAgBA,CACtB,CAEA,QAAAg/C,GACC,OAAO,GAAMC,IACd,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKknD,YAAalnD,KAAK+sE,aAC9C,CAMA,QAAAv1C,GACC,MAAM1Q,EAAY9mB,KAAKsxE,gBAAgBrwE,QACjC+lB,EAAehnB,KAAKuxE,mBAAmBtwE,QACvC4qB,EAAa7rB,KAAKsyE,iBAAiBrxE,QACnC8qB,EAAgB/rB,KAAKwyE,oBAAoBvxE,QAEzCiyE,EAAkBlsD,EAAe+E,EAAgB,EACjDonD,GAAkBrsD,EAAYE,GAAiB,EAAI6E,EAEzD,OAAO,IAAI6xB,GAAMw1B,EAAkBC,EACpC,CAMA,iBAAAx7C,GACC,MAAM7Q,EAAY9mB,KAAKsxE,gBAAgBrwE,QACjC+lB,EAAehnB,KAAKuxE,mBAAmBtwE,QACvC4qB,EAAa7rB,KAAKsyE,iBAAiBrxE,QACnC8qB,EAAgB/rB,KAAKwyE,oBAAoBvxE,QAEzCmyE,EAAuB/xE,KAAKy8B,KAAMz8B,KAAK0xD,IAAK/rC,EAAe,EAAG,GAAM3lB,KAAK0xD,IAAKhnC,EAAe,IAC7FsnD,EAAwBhyE,KAAKy8B,KAAMz8B,KAAK0xD,KAAO/rC,EAAeF,GAAc,EAAG,GAAMzlB,KAAK0xD,IAAKlnC,EAAY,IAEjH,OAAO,IAAIhsB,EAA+B,EAAvBuzE,EAAmD,EAAxBC,EAA4BvsD,EAC3E,CAEA,SAAAogC,GACC,OAAOlnD,KAAKgnB,YACb,CAEA,UAAA+lD,GACC,OAAO/sE,KAAK6rB,WAAW3qB,IAAKlB,KAAK+rB,cAClC,CAEA,aAAAulD,GACC,OAAOtxE,KAAK8mB,SACb,CAEA,gBAAAyqD,GACC,OAAOvxE,KAAKgnB,YACb,CAEA,cAAAsrD,GACC,OAAOtyE,KAAK6rB,UACb,CAEA,iBAAA2mD,GACC,OAAOxyE,KAAK+rB,aACb,CAEA,sBAAAo5B,CAAwBS,GACvB,MAAMO,EAAeP,EAAkBG,mBACjCl6B,EAAas6B,EAAa1kD,OAAQ,GAAIR,QACtC8qB,EAAgBF,EAAeA,EAAa,EAElD,MAAO,CACN/E,UAAW8+B,EAAkBC,oBAC7B7+B,aAAc4+B,EAAkBC,oBAChCh6B,WAAY,IAAIhsB,EAAQgsB,GACxBE,cAAe,IAAIlsB,EAAQksB,GAE7B,CAEA,kBAAAk5B,GACC,MAAO,CAAE,YAAa,eAAgB,aAAc,gBACrD,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNvkD,UAAW9mB,KAAK8mB,UAAU7lB,QAC1B+lB,aAAchnB,KAAKgnB,aAAa/lB,QAChC4qB,WAAY7rB,KAAK6rB,WAAW5qB,QAC5B8qB,cAAe/rB,KAAK+rB,cAAc9qB,QAEpC,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GACV,IAAIxX,EAAQwX,EAAWyP,WACvB,IAAIjnB,EAAQwX,EAAW2P,cACvB,IAAInnB,EAAQwX,EAAWwU,YACvB,IAAIhsB,EAAQwX,EAAW0U,eAEzB,ECjHc,MAAM,WAAgB,GACpC++C,YAAc,UACdwI,aAAe,CAAC,EAChBpwE,KAAO,KACPqwE,cAAgB,KAEhB,WAAAzzE,CAAauK,EAAQD,GACpBi9B,QAEArnC,KAAKqK,OAASA,EACdrK,KAAKoK,MAAQA,CACd,CAEA,QAAA2gE,GACC,OAAO,GAAQC,IAChB,CAEA,uBAAAC,GACC,MAAMptC,EAAI79B,KAAK4xE,qBAAqB3wE,QAC9BkhC,GAAM9gC,KAAKy8B,KAAM,GAAM,EAAI,GAAMD,EACvC,OAAO,IAAI,GAAW79B,KAAKqK,OAAQ,IAAIxK,EAAQsiC,GAChD,CAEA,kBAAAyvC,GACC,MAAM5E,EAAIhtE,KAAKqK,OAAOpJ,QAChBqmB,EAAc0lD,GACnB,EAAI,EAAI3rE,KAAKy8B,KAAM,GAAM,IAE1B,OAAO,IAAIj+B,EAAQynB,EACpB,CAEA,QAAAkQ,GAKC,OAJOx3B,KAAKkD,MACXlD,KAAKwzE,kBAGCxzE,KAAKkD,IACb,CAEA,iBAAAy0B,GAKC,OAJO33B,KAAKuzE,eACXvzE,KAAKwzE,kBAGCxzE,KAAKuzE,aACb,CAEA,eAAAC,GACC,MAAMppE,EAAQpK,KAAKoK,MAAMnJ,QACnBoJ,EAASrK,KAAKqK,OAAOpJ,QAErBwyE,EAAqBrpE,EAAQ,EAC7BspE,GAA4BrpE,EAASopE,GAAuB,EAE5DE,EAAwB3zE,KAAK4zE,0BAA2BH,EAAoBC,GAE5EG,EAAe,EAAIxyE,KAAKy8B,KAAM,EAAI21C,EAAqBE,EAAwBtyE,KAAK0xD,IAAK4gB,EAAuB,IAChHG,EAAkBzpE,EAASspE,EAC3BI,EAAgBF,EAAe,EAC/BT,EAAuB/xE,KAAKy8B,KAAMz8B,KAAK0xD,IAAKghB,EAAe,GAAM1yE,KAAK0xD,IAAK+gB,EAAiB,IAE5FE,EAAkC,EAArBP,EAAyBpyE,KAAK4yE,KAAM,EAAIN,EAAwBF,GAC7EF,EAAgB,EAAIH,EAAuBY,EAE3C9wE,GACHuwE,EAAqBO,EACrBH,GAAiBF,EAAwBF,GAC3CI,EAAexyE,KAAKy8B,MAAQ,EAAIz8B,KAAK0xD,IAAKqgB,EAAsB,GAAM/xE,KAAK0xD,IAAK8gB,EAAc,IAAQ,IACnG,EAEJ7zE,KAAKkD,KAAO,IAAIw6C,GAAMx6C,GACtBlD,KAAKuzE,cAAgB,IAAI1zE,EAAQ0zE,GAEjCvzE,KAAKszE,aAAe,CACnBG,qBACAC,0BACAC,wBACAE,eACAC,kBACAC,gBACAX,uBACAY,aACA/G,UAAWsG,EACXrwE,OAEF,CAOA,yBAAA0wE,CAA2BH,EAAoBC,GAC9C,MAAM1gB,EAAW0gB,EAGjB,GAAK1gB,EAAaygB,EAAqBC,GAA6B1gB,EAAW3xD,KAAKM,IAAK8xE,EAAqBC,GAC7G,OAAO,EAIR,MAAMQ,GAAc7yE,KAAK0xD,IAAK0gB,EAAoB,GAAMpyE,KAAK0xD,IAAK2gB,EAAyB,GAAMryE,KAAK0xD,IAAKC,EAAU,KAAU,EAAIA,GAGnI,OAAOkhB,EAAYT,CACpB,CAEA,UAAA1G,GACC,OAAO/sE,KAAKqK,MACb,CAEA,SAAA68C,GACC,OAAOlnD,KAAKoK,KACb,CAEA,sBAAA+6C,CAAwBS,GACvB,MAAMM,EAAgBN,EAAkBC,oBAClC1jB,EAAgB+jB,EAAcjlD,QAC9B48B,EAAgBsE,GACrB9gC,KAAKy8B,KAAM,GAAM,EAAI,GAEhBkvC,EAAgBnvC,GACrB,EAAI,EAAIx8B,KAAKy8B,KAAM,GAAM,IAE1B,MAAO,CACNzzB,OAAQ,IAAIxK,EAAQmtE,GAEtB,CAEA,kBAAA/nB,GACC,MAAO,CAAE,SAAU,QACpB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNhhE,OAAQrK,KAAKqK,OAAOpJ,QACpBmJ,MAAOpK,KAAKoK,MAAMnJ,QAEpB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAS,IAAIxX,EAAQwX,EAAWhN,QAAU,IAAIxK,EAAQwX,EAAWjN,OAC7E,EClJc,MAAM,WAAsB,GAC1C0gE,YAAc,gBAEd,WAAAhrE,CAAasK,EAAOC,GACnBg9B,QAEArnC,KAAKoK,MAAQA,EACbpK,KAAKqK,OAASA,CACf,CAEA,QAAA0gE,GACC,OAAO,GAAcC,IACtB,CAEA,uBAAAC,GACC,OAAO,IAAI,GAAWjrE,KAAKoK,MAAOpK,KAAKqK,OACxC,CAEA,QAAAmtB,GACC,MAAMptB,EAAQpK,KAAKoK,MAAMnJ,QACnBoJ,EAASrK,KAAKqK,OAAOpJ,QAE3B,OAAO,IAAIy8C,GAAMtzC,EAAQC,EAC1B,CAEA,iBAAAstB,GACC,MAAMvtB,EAAQpK,KAAKoK,MAAMnJ,QACnBoJ,EAASrK,KAAKqK,OAAOpJ,QACrBsyE,EAAoB,EAAInpE,EAAY,EAAIC,EAC9C,OAAO,IAAIxK,EAAQ0zE,EACpB,CAEA,SAAArsB,GACC,OAAOlnD,KAAKoK,KACb,CAEA,UAAA2iE,GACC,OAAO/sE,KAAKqK,MACb,CAEA,sBAAA86C,CAAwBS,GACvB,MAAO,CACNx7C,MAAOw7C,EAAkBG,mBACzB17C,OAAQu7C,EAAkBC,oBAE5B,CAEA,kBAAAZ,GACC,MAAO,CAAE,QAAS,SACnB,CAEA,iBAAAC,GACC,MAAO,EACR,CAEA,oBAAAmmB,GACC,MAAO,CACNjhE,MAAOpK,KAAKoK,MAAMnJ,QAClBoJ,OAAQrK,KAAKqK,OAAOpJ,QAEtB,CAEA,6BAAOqqE,CAAwBj0D,GAC9B,OAAO,IAAI,GAAe,IAAIxX,EAAQwX,EAAWjN,OAAS,IAAIvK,EAAQwX,EAAWhN,QAClF,ECxCc,MAAM8pE,GACpB,WAAAr0E,GACCE,KAAKyQ,OAAS,CACb,CAAE,GAAUu6D,MAAQ,GACpB,CAAE,GAAOA,MAAQ,GACjB,CAAE,GAAoBA,MAAQ,GAC9B,CAAE,GAA4BA,MAAQ,GACtC,CAAE,GAAiBA,MAAQ,GAC3B,CAAE,GAAIA,MAAQ,GACd,CAAE,GAAQA,MAAQ,GAClB,CAAE,GAASA,MAAQ,GACnB,CAAE,GAAkBA,MAAQ,GAC5B,CAAE,GAAWA,MAAQ,GACrB,CAAE,GAAcA,MAAQ,GACxB,CAAE,GAAQA,MAAQ,GAClB,CAAE,GAAQA,MAAQ,GAClB,CAAE,GAAQA,MAAQ,GAClB,CAAE,GAAMA,MAAQ,GAChB,CAAE,GAAKA,MAAQ,GACf,CAAE,GAAgBA,MAAQ,GAC1B,CAAE,GAAqBA,MAAQ,GAC/B,CAAE,GAAgBA,MAAQ,GAC1B,CAAE,GAAMA,MAAQ,GAChB,CAAE,GAAKA,MAAQ,GACf,CAAE,GAAUA,MAAQ,GACpB,CAAE,GAAKA,MAAQ,GACf,CAAE,GAAOA,MAAQ,GACjB,CAAE,GAAMA,MAAQ,GAChB,CAAE,GAAQA,MAAQ,GAClB,CAAE,GAAcA,MAAQ,GAE1B,CAQA,4BAAAoJ,CAA8BC,EAAYh9D,GACzC,OAAQg9D,KAAcr0E,KAAKyQ,OAIpBzQ,KAAKyQ,OAAQ4jE,GAAa/I,uBAAwBj0D,GAHjD,IAAIs1D,EAIb,CAMA,gBAAA2H,CAAkBD,GACjB,OAAOr0E,KAAKyQ,OAAQ4jE,IAAgB,IAAI1H,EACzC,EClFD,MAAM34C,GAAWtzB,OAAOC,6BAExB,QACCoX,MAAO,KAAoC,CAC1C0d,iBAAkB,WAEnB+1B,UAAW,CACV,sBAAA+oB,CAAwBx8D,EAAO0d,GAC9B1d,EAAM0d,iBAAmBA,CAC1B,GAEDhhB,QAAS,CACRsnC,oBAAqB,CAAChkC,EAAOtD,OACvBA,EAAQkD,QAASlD,EAAQ0mB,gBAAgBq5C,mBAAmB//D,EAAQglC,aAAag7B,mCAMvF/6B,qBAAsB,CAAE3hC,EAAOtD,EAASs4C,EAAWU,KAIlD,MAAM5wC,EAAUmX,GAASrf,KAAKmf,WAAWjX,QAGnC63D,EAAmB/uE,OAAOohC,QAAQlqB,GAASvd,QAAQmN,IACxD,MAAM6kB,EAAQm8B,EAAYtyB,gBAAgBI,+BAA+B9uB,EAAM,GAAIghD,EAAYhU,aAC/F,OAAOnoB,EAAQ,CAAC,IAGXqjD,EAAoBlgE,EAAQklC,qBAOlC,OAJIg7B,IAAsBD,EAAiBhzB,MAAMj1C,GAAUA,EAAM,KAAOkoE,KACvED,EAAiBjyE,KAAK,CAACkyE,EAAmB93D,EAAQ83D,KAG5CD,EAAiB3vE,KAAM0H,IAAU,CACvCA,MAAOA,EAAM,GACbnB,MAAOmB,EAAM,MACV,EAELktC,qBAAsB,CAAE5hC,EAAOtD,EAASs4C,EAAWU,KAClD,MAAM1L,EAAgB0L,EAAYtyB,gBAAgBq5C,mBAAmB/mB,EAAYhU,aACjF,OAAOsI,EAAc6yB,aAAa,EAEnC,gBAAAn/C,CAAkB1d,EAAOtD,GACxB,MAAMoI,EAAUpI,EAAQilC,qBACxB,OAAG78B,EAAQ6kC,MAAMlQ,GAAWA,EAAO/kC,QAAUsL,EAAM0d,mBAC3C1d,EAAM0d,iBAEPhhB,EAAQklC,oBAChB,IClCa,MAAMk7B,GACpB7mB,eACA1G,eACAwtB,uBACA5kC,eAEA,WAAApwC,CAAak0B,GAMZh0B,KAAKguD,eAAiBh6B,EAASg6B,gBAAkB,GACjDhuD,KAAKsnD,eAAiBtzB,EAASszB,gBAAkB,CAAC,EAClDtnD,KAAK80E,uBAAyB9gD,EAAS8gD,wBAA0B,CAAC,EAClE90E,KAAKkwC,eAAiB,CACrB6kC,mCACC/gD,EAASkc,gBAAgB6kC,oCAAsC,IAChEC,kCACChhD,EAASkc,gBAAgB8kC,mCAAqC,IAC/DC,cAAejhD,EAASkc,gBAAgB+kC,gBAAiB,EACzDC,kBAAmBlhD,EAASkc,gBAAgBglC,oBAAqB,EAEnE,CAEA,0BAAAC,CAA4BP,GAC3B,OAAO50E,KAAK80E,uBAAwBF,IAAmB,CAAC,CACzD,CAEA,+BAAAQ,CAAiCR,GAChC,MAAME,EAAyB90E,KAAKm1E,2BACnCP,GAED,OAAO/xD,WAAYiyD,EAAuBO,sBAAwB,IACnE,CAEA,8BAAA95C,CAAgCq5C,EAAuBj9D,GACtD,MAAMoqC,EAAgB/hD,KAAKw0E,mBAAoB78D,GAE/C,GAAa,cAAVA,GAAyBoqC,EAAc6yB,gBAAkBA,EAC3D,OAAO,EAGR,MAAME,EAAyB90E,KAAKm1E,2BACnCP,GAED,OAAO/xD,WAAYiyD,EAAuBQ,qBAAuB,IAClE,CAEA,kBAAAd,CAAoB78D,GACnB,OAAO3X,KAAKsnD,eAAgB3vC,IAAW,CACtCi9D,cAAe,SAEjB,CAEA,iBAAAW,CAAmB59D,GAClB,MAAM2vC,EAAiBtnD,KAAKw0E,mBAAoB78D,GAChD,OAAO2vC,EAAestB,eAAiB,QACxC,CAEA,2BAAAY,GACC,OAAO3yD,WAAY7iB,KAAKkwC,eAAe6kC,mCACxC,CAEA,0BAAA/4C,GACC,OAAOnZ,WAAY7iB,KAAKkwC,eAAe8kC,kCACxC,CAEA,0BAAAS,CAA4B99D,GAC3B,MAAM2vC,EAAiBtnD,KAAKw0E,mBAAoB78D,GAChD,OAAOkL,WAAYykC,EAAeouB,wBAA0B,IAC7D,CAEA,yBAAAt6C,CAA2BzjB,GAC1B,MAAM2vC,EAAiBtnD,KAAKw0E,mBAAoB78D,GAChD,OAAOkL,WAAYykC,EAAequB,uBAAyB,IAC5D,CAEA,kBAAAC,GACC,OAAO51E,KAAKguD,cACb,CAEA,gBAAA2R,GACC,OAAO3/D,KAAKkwC,eAAe+kC,aAC5B,CAEA,mBAAAnV,GACC,OAAO9/D,KAAKkwC,eAAeglC,iBAC5B,CAEA,qBAAAjJ,CAAuBt0D,GACtB,MAAM2vC,EAAiBtnD,KAAKw0E,mBAAoB78D,GAChD,OAAO2vC,EAAeuuB,0BAA2B,CAClD,CAEA,aAAAC,GAMC,MAAO,CACN9nB,eAAgBhuD,KAAKguD,eACrB1G,eAAgBtnD,KAAKsnD,eACrBwtB,uBAAwB90E,KAAK80E,uBAC7B5kC,eAAgBlwC,KAAKkwC,eAEvB,EC3HD,QACCn4B,MAAO,CACN46B,gBAAiB,GACjBksB,iBAAkB,GAClBC,iBAAkB,GAClBiX,WAAW,GAEZthE,QAAS,CACRk+B,gBAAkB56B,GAAiBA,EAAM46B,gBACzCgY,cAAe,CAAC5yC,EAAOtD,IACiB,IAAnCA,EAAQk+B,gBAAgBhzC,OACpB,KAIwB,kBAA3BoY,EAAM+mD,iBACH/2D,EAAW0M,EAAQk+B,iBAGpB3rC,EAAWyN,EAAQk+B,iBAE3BL,oBAAsBv6B,GAAiBA,EAAM8mD,iBAC7CE,oBAAsBhnD,GAAiBA,EAAM+mD,iBAC7CrsB,iBAAmB16B,GAAkBA,EAAMg+D,WAE5CvqB,UAAW,CACV,kBAAAwqB,CAAmBj+D,GAAO,OAACxT,EAAM,SAAEyb,EAAQ,SAAEhM,IAC5C+D,EAAM46B,gBAAkBpuC,EAAOgC,OAC/BwR,EAAM8mD,iBAAmB7+C,EACzBjI,EAAM+mD,iBAAmB9qD,CAC1B,EACA,eAAAiiE,CAAgBl+D,EAAOg+D,GACtBh+D,EAAMg+D,UAAYA,CACnB,GAED5nB,QAAS,CACR,qBAAA+nB,EAAsB,OAACzqE,GAAS0lC,GAG/B,GAAIA,EAAKihB,KAAO,IACf,OAGD3mD,EAAO,mBAAmB,GAC1B,MAAM0qE,EAAS,IAAIC,WACnBD,EAAOE,OAAS,SAASrqE,GACxBP,EAAO,qBAAsB,CAAClH,OAAQyH,EAAEgtB,OAAOz0B,OAAQyb,SAAUmxB,EAAKjkC,KAAM8G,SAAUm9B,EAAK3uC,OAC3FiJ,EAAO,mBAAmB,EAC3B,EACA0qE,EAAOG,WAAWnlC,EACnB,ICvBK,MAAeolC,GAIrB,UAAAC,GACC,OAAOx2E,KAAKy2E,YAAYlnC,QAAQ5vC,OAAS,CAC1C,CAEA,aAAA+2E,GACC,MAA4C,SAArC12E,KAAKy2E,YAAYxwC,WAAWzjC,IACpC,CAGA,SAAAm0E,GACC,MAAMlmE,EAAS,GAOf,OANAA,EAAOhO,KAAKzC,KAAKy2E,YAAYxvD,KAAKtP,OAE/B3X,KAAKw2E,cACPx2E,KAAKy2E,YAAYlnC,QAAQzpC,SAAQwc,GAAU7R,EAAOhO,KAAK6f,EAAO3K,SAGxDlH,CACR,EClDc,MAAMmmE,WAAyBL,GAC7C,OAAAp0D,GACC,MAAO,kBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,SACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,SAAY,KAGd,WAAc,CACb,KAAQ,QAET,QAAW,CACV,CACC,KAAQ,QACR,MAAS,SACT,WAAc,CACb,SAAY,IAEb,UAAa,GACb,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,ECjCc,MAAM00D,WAAmCN,GACvD,OAAAp0D,GACC,MAAO,4BACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,oBACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,GACV,OAAU,EACV,gBAAmB,EACnB,iBAAoB,EACpB,mBAAsB,EACtB,oBAAuB,IAGzB,WAAc,CACb,KAAQ,SACR,SAAY,CACX,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,OAIR,QAAW,GAEb,ECvCc,MAAM20D,WAAyBP,GAC7C,OAAAp0D,GACC,MAAO,kBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,SACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,SAAY,KAGd,WAAc,CACb,KAAQ,SACR,SAAY,CACX,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,OAIR,QAAW,GAEb,ECjCc,MAAM40D,WAA4BR,GAChD,OAAAp0D,GACC,MAAO,qBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,QAET,QAAW,CACV,CACC,KAAQ,QACR,MAAS,SACT,WAAc,CACb,SAAY,IAEb,UAAa,GACb,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,EClCc,MAAM60D,WAA4BT,GAChD,OAAAp0D,GACC,MAAO,qBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,SACR,SAAY,CACX,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,KAEN,CACC,EAAK,IACL,EAAK,OAIR,QAAW,GAEb,EClCc,MAAM80D,WAA2BV,GAC/C,OAAAp0D,GACC,MAAO,oBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,QACR,SAAY,UACZ,OAAU,IAEX,QAAW,GAEb,ECtBc,MAAM+0D,WAAgCX,GACpD,OAAAp0D,GACC,MAAO,yBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,QACR,SAAY,UACZ,OAAU,IAEX,QAAW,CACV,CACC,KAAQ,QACR,MAAS,YACT,WAAc,CACb,MAAS,GACT,OAAU,IAEX,UAAa,GACb,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,ECrCc,MAAMg1D,WAA+BZ,GACnD,OAAAp0D,GACC,MAAO,wBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,QAET,QAAW,CACV,CACC,KAAQ,QACR,MAAS,YACT,WAAc,CACb,MAAS,GACT,OAAU,IAEX,UAAa,GACb,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,ECnCc,MAAMi1D,WAAiCb,GACrD,OAAAp0D,GACC,MAAO,0BACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,SACR,SAAY,CACX,CACC,EAAK,IACL,EAAK,IACL,SAAY,IAEb,CACC,EAAK,IACL,EAAK,IACL,SAAY,IAEb,CACC,EAAK,IACL,EAAK,IACL,SAAY,MAIf,QAAW,CACV,CACC,KAAQ,QACR,MAAS,YACT,WAAc,CACb,MAAS,GACT,OAAU,IAEX,UAAa,GACb,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,ECpDc,MAAMk1D,WAAyBd,GAC7C,OAAAp0D,GACC,MAAO,kBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,SACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,SAAY,KAGd,WAAc,CACb,KAAQ,SACR,OAAU,GACV,SAAY,CACX,KAAQ,IACR,OAAU,KAEX,eAAkB,IAClB,SAAY,IAEb,QAAW,GAEb,EC1Bc,MAAMm1D,WAA0Bf,GAC9C,OAAAp0D,GACC,MAAO,mBACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,OACR,iBAAoB,EACpB,eAAkB,EAClB,OAAU,GACV,SAAY,IAEb,QAAW,GAEb,ECxBc,MAAMo1D,WAAkChB,GACtD,OAAAp0D,GACC,MAAO,2BACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,oBACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,GACV,OAAU,EACV,gBAAmB,EACnB,iBAAoB,EACpB,mBAAsB,EACtB,oBAAuB,IAGzB,WAAc,CACb,KAAQ,QACR,SAAY,UACZ,OAAU,GACV,SAAY,IAEb,QAAW,GAEb,EC5Bc,MAAMq1D,WAAsCjB,GAC1D,OAAAp0D,GACC,MAAO,+BACR,CAEA,SAAAs0D,GACC,MAAO,CACN,KAAQ,CACP,MAAS,YACT,YAAez2E,KAAKmiB,UACpB,WAAc,CACb,MAAS,GACT,OAAU,KAGZ,WAAc,CACb,KAAQ,QAET,QAAW,CACV,CACC,KAAQ,QACR,MAAS,oBACT,WAAc,CACb,MAAS,GACT,OAAU,GACV,OAAU,IACV,gBAAmB,IACnB,iBAAoB,IACpB,mBAAsB,IACtB,oBAAuB,KAExB,UAAa,CACZ,wBAA0B,GAE3B,SAAY,CACX,KAAQ,IACR,OAAU,IACV,SAAY,KAKjB,ECfc,MAAMs1D,GACpB,MAAAC,CAAOl2D,EAAyB+tB,EAAkB3E,GACjD,IAAIzpB,EAAU,CACb,IAAI81D,GACJ,IAAID,GACJ,IAAIG,GACJ,IAAIJ,GACJ,IAAID,GACJ,IAAIQ,GACJ,IAAIT,GACJ,IAAID,GACJ,IAAIQ,GACJ,IAAIC,GACJ,IAAIH,GACJ,IAAIK,GACJ,IAAIC,IAyBL,OArBAr2D,EAAUA,EAAQ7hB,QAASkS,GACnBA,EAAOmlE,YAAYttB,MAAK1xC,GAAS6J,EAAc5hB,SAAS+X,OAIhEwJ,EAAUA,EAAQ7hB,QAASkS,IACvBA,EAAOglE,gBACDjnC,IAOVpuB,EAAUA,EAAQ7hB,QAASkS,IACvBA,EAAOklE,mBACD9rC,IAKHzpB,CACR,EC3BD,MAAM,GAAWzgB,OAAOC,6BAClBg3E,GAAS,IAAI1mC,GAAQ,GAAShb,SAE9B2hD,GAAmB,CACxB,wBACA,iCACA,QACA,mBACA,YACA,OACA,OAGK,GAAgB,IAAI,WAAe11C,WAAW,EAAG,GACjD1gB,GAAgB,GAASA,cACzB7J,GAAQ,GAASA,MACjBkM,GAAa,CAAC,EAEpB,IAAIkE,GAAa,CAChB,kBAAqB,SACrB,uBAA0B,sBAAuB,GAASkoB,aAAaqX,gBAAkB,GAASrX,aAAaqX,eAAgB,qBAAuB,2BAGvJ9lC,GAAc1b,SAAWslD,IACxBvnC,GAAYunC,GAAiB,GAASrJ,cAAcia,kBAAmB5Q,GAGjD,cAAjBA,IACJvnC,GAAYunC,GAAezrD,OAAS,GAASoiD,cAAcia,kBAAkBjsD,UAAU,iBAChF8T,GAAYunC,GAAe/gD,O,IAK7B,KAAS,GAASwZ,cACxBA,GAAYlM,IAAU,GAASkM,YAEzB,KAAS,GAASkE,aACxBA,GAAY,GAASA,WAGtB,MAAM8vD,GAAmC,MAAU5uE,MAAQwR,IAC1DA,EAAS,wBAAwB,GAC/B,IAAM,CAAEq9D,SAAS,EAAMC,UAAU,IAEvBxsE,IAAQ,QAAY,CAChCigE,QAAS,CACRlpD,OAAQ01D,GACR7oB,UAAW8oB,GACXvZ,OAAQA,GACRnd,MAAOA,GACP22B,QAAS,GACTC,WAAYA,GACZnrB,WAAU,GACVl5B,WAAYskD,GACZC,gBAAe,IAEhBtgE,MAAO,KAAM,CACZyJ,cAAeA,GACfo6B,aAAc,CACbjkC,SACAkM,cACAkE,aACA+S,cAAe,CACd/a,QAAS,IAEVw0B,cAAe,UACf53B,kBAAkB,EAClBq9C,aAAc,GAEfse,GAAI,CACH78C,wBAAwB,EACxBC,yBAAyB,EACzBumB,MAAO,GAERs2B,uBAAwB,CACvBnuE,MAAO,EACPC,OAAQ,GAETpI,MAAO,GACP+e,YAAa,KAEdwqC,UAAW,CACV,YAAAwO,CAAcjiD,GACbA,EAAM6jC,aAAaoe,aAAe34D,KAAKm3E,QACxC,EACA,cAAAC,CAAgB1gE,GAAO,SAAEwQ,EAAQ,MAAE9b,IACnB,KAAVA,IACJA,EAAQ,GAGa,kBAAVA,IACXA,EAAQA,EAAM5L,QAAS,IAAK,MAG7BkX,EAAM6jC,aAAa7zB,UAAWQ,GAAa9b,CAC5C,EACA,iBAAAisE,CAAkB3gE,EAAOvG,GACxBuG,EAAMiJ,YAAcxP,CACrB,EACA,eAAAmnE,CAAiB5gE,GAAO,UAAEyK,EAAS,MAAE/V,IACpC,MAAM,MAAEkL,GAAUI,EAAM6jC,aAET,KAAVnvC,IACJA,EAAQ,GAGa,kBAAVA,IACXA,EAAQA,EAAM5L,QAAS,IAAK,MAG7BkX,EAAM6jC,aAAa/3B,WAAWlM,GAAO6K,GAAa/V,CACnD,EACA,qBAAAmsE,CAAuB7gE,GAAO,MAAEJ,EAAK,WAAEkM,IACtC9L,EAAM6jC,aAAa/3B,WAAWlM,GAASkM,CACxC,EACA,mBAAAg1D,CAAqB9gE,EAAO+iB,GAC3B/iB,EAAM6jC,aAAa9gB,cAAgBA,CACpC,EACA,4BAAAg+C,CAA8B/gE,EAAO0jB,GACpC1jB,EAAMugE,GAAG78C,uBAAyBA,CACnC,EACA,6BAAAvF,CAA+Bne,EAAO2jB,GACrC3jB,EAAMugE,GAAG58C,wBAA0BA,CACpC,EACA,mBAAA+Y,CAAqB18B,EAAOw8B,GAC3Bx8B,EAAM6jC,aAAaj/B,kBAAmB,EACtC5E,EAAM6jC,aAAarH,cAAgBA,CACpC,EACA,4BAAA96B,CAA8B1B,GAAO,MAAE3N,EAAK,OAAEC,IAC7C0N,EAAMwgE,uBAAuBnuE,MAAQA,EACrC2N,EAAMwgE,uBAAuBluE,OAASA,CACvC,GAEDoK,QAAS,CACR+M,cAAe,CAAEzJ,EAAOtD,IACpBA,EAAQ4qD,iBACH5qD,EAAQ4qD,iBAAiB5uD,OAE1BsH,EAAMyJ,cAEdJ,WAAY,CAAErJ,EAAOtD,KACpB,MAAMskE,EAAgB,IAAItB,GAC1B,OAAOsB,EAAcrB,OAAOjjE,EAAQ+M,cAAe/M,EAAQy5C,iBAAkBz5C,EAAQmrD,oBAAoB,EAE1G5+C,YAAejJ,GAAmBA,EAAMiJ,YACxCg4D,cAAiBjhE,GAAmBA,EAAMugE,GAAGU,cAC7CrhE,MAASI,GAAmBA,EAAM6jC,aAAajkC,MAC/CshE,qBAAwBlhE,GAAmBA,EAAMwgE,uBAAuBnuE,MACxE8uE,sBAAyBnhE,GAAmBA,EAAMwgE,uBAAuBluE,OACzEovC,YAAa,CAAE1hC,EAAOtD,KACrB,IAAIglC,EAAc1hC,EAAM6jC,aAAajkC,MAKrC,MAJ6B,SAAxBlD,EAAQm0B,aAA0Bn0B,EAAQs6B,aAAeD,GAAYI,MAA0B,QAAlBz6B,EAAQkD,QACzF8hC,EAAc,oBAGRA,CAAW,EAEnB51B,WAAY,CAAE9L,GAASJ,WAAqBI,EAAM6jC,aAAa/3B,WAAYlM,GAC3EoQ,UAAahQ,GAAmBA,EAAM6jC,aAAa7zB,UACnD6L,UAAW,CAAE7b,EAAOtD,KACnB,IAAKA,EAAQiE,gBACZ,OAED,MAAMpT,EAAgBmP,EAAQmE,mBAE9B,GAAK,IAAStT,IAAmB,IAASA,EAAcC,SAAYkP,EAAQ0kE,gBAC3E,OAGD,MAAMC,EAAc,gBAAqB9zE,GAEzC,OAAO,aAAiB+zE,MAAOD,EAAa,CAACE,MAAO,MAAO,EAE5D,kBAAA1gE,CAAoBb,EAAOtD,GAC1B,MAAM8kE,EAAa,CAACh0E,OAAQ,CAAC,GAC7B,IAAIkP,EAAQiE,gBACX,OAAO6gE,EAER,MAAMriB,EAAiBziD,EAAQ+kE,4BAC/B,OAAItiB,EAGGA,EAAe9zB,WAFdm2C,CAGT,EACA,eAAAJ,CAAiBphE,EAAOtD,GACvB,OAAO,KAASA,EAAQjP,aAAc,GACvC,EACAs1B,cAAiB/iB,GAAmBA,EAAM6jC,aAAa9gB,cACvDW,uBAA0B1jB,GAAoBA,EAAMugE,GAAG78C,uBACvDC,wBAA2B3jB,GAAoBA,EAAMugE,GAAG58C,wBACxD,gBAAAuzB,CAAkBl3C,GAAO,WAAE8L,IAC1B,OAAO,KAAWA,GAAgBrB,GAC1BK,WAAYL,IAErB,EACA,UAAAnL,CAAYU,GAAO,UAAEgQ,EAAS,iBAAEknC,IAC/B,MAAO,IACHlnC,KACAknC,EAEL,EACA,kBAAApzB,CAAoB9jB,GAAO,YAAE0hC,IAC5B,MAAuB,QAAhBA,GAAyC,SAAhBA,GAAyC,oBAAfA,CAC3D,EACA,kBAAAqC,CAAoB/jC,GAAO,YAAE0hC,IAC5B,MAAuB,SAAhBA,GAAyC,oBAAfA,GAAqD,QAAhBA,CACvE,EACAggC,kBAAmB,CAAE1hE,GAASJ,WACtBigE,GAAiBh4E,SAAU+X,GAEnC48B,cAAiBx8B,GAAmBA,EAAM6jC,aAAarH,cACvD53B,iBAAoB5E,GAAmBA,EAAM6jC,aAAaj/B,iBAC1D,iBAAAs/B,CAAmBlkC,EAAOtD,GACzB,QAAIA,EAAQkD,QAGJlD,EAAQglE,mBAAyD,gBAApC,GAASzlD,SAAS,eAAoC,GAAS0lD,sBAAsBz9B,kBAC3H,EACApF,eAAgB,CAAE9+B,EAAOtD,IACmB,gBAAtC,GAASuf,SAAU,cAChB,GAASrf,KAAK4/B,cAAcvgB,SAAUvf,EAAQ8/B,eAAgB0E,YAAc,QAE7E,GAASjlB,SAAU,mBAAsB,QAEjDmpC,UAAW,CAAEplD,EAAOtD,IACZ,GAASE,KAAK4/B,cAAcvgB,SAAUvf,EAAQ8/B,eAAgBjpC,MAEtEsrC,UAAW,CAAE7+B,EAAOtD,IACwB,gBAAtC,GAASuf,SAAU,cAChB,GAASrf,KAAK4/B,cAAcvgB,SAAUvf,EAAQ8/B,eAAgBqD,OAAS,QAGxE,GAAS5jB,SAAU,iBAAoB,QAE/CgmC,aAAgBjiD,GAAmBA,EAAM6jC,aAAaoe,aACtD+C,iBAAkB,CAAEhlD,EAAOtD,KAC1B,IAAO,IAAaA,EAAS,GAAGA,EAAQkD,2BACvC,OAAOlD,EAAS,GAAGA,EAAQkD,0BAG5B,MAAM+3C,EAAS/pD,OAAO+pD,OAAQj7C,EAAQw6C,kBAAmBlqD,KAAO0H,GACxD0W,GAAqB1W,GAAS,OAEtC,OAAOijD,EAAO3oD,KAAM,MAAO,EAE5Bg+C,WAAY,CAAEhtC,EAAOtD,IACX+N,GACW,qBAAdA,EACG,EAGW,gBAAdA,EACG,EAGD/N,EAAQytD,eAGjBQ,iBAAkB,CAAE3qD,EAAOtD,IACnBA,EAAQ4lC,kBAEhBuB,aAAgB7jC,GAAmBA,EAAM6jC,aACzC,gBAAA+9B,GACC,MAAO,IACC,EAET,EACA13E,MAAO,CAAE8V,EAAOtD,KACf,MAAMy4C,EAAgBz4C,EAAQ4lC,kBAE9B,OAAO6S,EAIAA,EAAcnjD,SAHb0K,EAAQklE,kBAGa,EAE9B,UAAAn0E,CAAYuS,EAAOtD,GAClB,MAAO,KACN,MAAM,MAAEkD,EAAK,iBAAEgiE,EAAgB,MAAE13E,GAAUwS,EAE3C,OAAOA,EAAQiE,iBAAqBzW,EAI7BA,EAHC03E,GAGI,CAEd,EACA,0BAAA/f,CAA4B7hD,EAAOtD,GAClC,OAAO,IAAIigD,GAAoB,KAAMjgD,EAAQ4lC,kBAC9C,EACA,2BAAAm/B,CAA4BzhE,EAAOtD,GAClC,IAAIyiD,EAAiBziD,EAAQmlD,2BAE7B,MAAM5D,EAAiBkB,EAAe9zB,WAGtC,IAAG,IAAQ4yB,EAAezwD,QAc1B,OAVA2xD,EAAiB,IAAIf,GAA4Be,EAAgBziD,EAAQwlD,+BACzE/C,EAAiB,IAAIb,GAAyBa,EAAgBziD,EAAQglD,qBAEtEvC,EAAiB,IAAIF,GAAqBE,EAAgBziD,EAAQ86B,SAElE2nB,EAAiB,IAAIrC,GAA2BqC,GAE7CziD,EAAQ44C,oBACV6J,EAAiB,IAAIjC,GAAqBiC,EAAgBziD,EAAQ+4C,aAE5D0J,CACR,EACA,eAAAz+C,CAAgBV,EAAOtD,GACtB,MAAM,kBAAE4lC,EAAiB,gBAAE/jC,EAAe,mBAAEiC,GAAuB9D,EACnE,IAAIyiD,EAAiBziD,EAAQ+kE,4BAG7B,GAAGjhE,EAAoB,MAAO,GAE9B,IAAI2+C,EACH,MAAO,GAGR,MAAMjJ,EAAYiJ,EAAe9zB,WAG3Bv6B,EAAU,YAAgBC,aAAamlD,GAC7C,IAAIplD,EACH,MAAO,GAGR,IAAI+rC,EAAQvzC,KAAKD,IAAIyH,EAAQuB,MAAQqK,EAAQwkE,qBAAsBpwE,EAAQwB,OAASoK,EAAQykE,uBAe5F,GAdAtkC,EAAQA,IAAUi0B,IAAW,GAAMj0B,EAEnCsiB,EAAiB,IAAI/B,GAAuB+B,EAAgB7c,EAAmBzF,EAAOngC,EAAQ4vB,gBAAgB,GAC9G6yB,EAAiB,IAAItB,GAAmBsB,EAAgB7c,EAAmB5lC,EAAQ4vB,gBAEhF/tB,IAAoBguB,GAAU2B,aAChCixB,EAAiB,IAAIT,GAA6BS,EAAgBziD,EAAQwlD,8BAA+BxlD,EAAQ4vB,gBACjH6yB,EAAiB,IAAIX,GAAmCW,EAAgBziD,EAAQwlD,8BAA+BxlD,EAAQ4vB,iBAGrH/tB,IAAoBguB,GAAU2B,YAAcxxB,EAAQglD,oBAAoB95D,OAAS,IACnFu3D,EAAiB,IAAIZ,GAAgCY,EAAgBziD,EAAQglD,oBAAoBhlD,EAAQ+iD,wBAAyB/iD,EAAQ4vB,iBAGxI/tB,IAAoBguB,GAAUiL,SAAW96B,EAAQ86B,QAAQ5vC,OAAS,EAAG,CACvE,MAAMg6D,EAA0BllD,EAAQmlD,2BAClC5D,EAAiB2D,EAAwBv2B,WAC/C8zB,EAAiB,IAAIC,GAA4BD,EAAgBziD,EAAQ86B,QAAQ96B,EAAQ+6B,oBAAqB/6B,EAAQ4vB,eAAgBuQ,EAAOngC,EAAQ44C,kBAAmB54C,EAAQ+4C,WAAYwI,E,CAG7L,MAAM1wD,EAAgB4xD,EAAe9zB,WAErC,UAAcv7B,KAAKvC,GACnB,UAAcwC,UAAUxC,GAIxB,MAAMs0E,EAAkB,YAAgB9wE,aAAaxD,GAC/Cu0E,EAAU,GACVC,EAAe,IAAI,WAAe53C,WACvC03C,EAAgBxvE,MAASyvE,EAAUjlC,EACnCglC,EAAgBvvE,OAAUwvE,EAAUjlC,GAGrC,UAAcjR,aAAam2C,EAAc,CACvCD,GAAW,EAAKjlC,EAChBilC,GAAW,EAAKjlC,IAIlBklC,EAAap2C,MAAQ,mBACrB,UAAcz/B,SAASqB,EAAew0E,EAAc,oBAEpD,IAAInlC,EAAY,aAAiByE,MAAM9zC,EAAe,CACrD+zC,gBAAgB,EAChBigC,MAAO,KACPxrE,OAAQ,YAWT,OARA6mC,EAAYD,GAAsBC,EAAWC,GAC1CngC,EAAQmiC,WAAaniC,EAAQoiC,iBAC/BlC,EAAYgC,GAAehC,EAAWlgC,EAAQmiC,UAAWniC,EAAQoiC,iBAGlElC,EAAY6B,GAAiB7B,GAC7BA,EAAYwD,GAAcxD,GAEnBoD,GAAWpD,EAEnB,EACA,kBAAAolC,CAAoBhiE,EAAOtD,GAC1B,OAAOA,EAAQ6B,kBAAoBguB,GAAU2B,UAC9C,EACA,cAAA/gB,GACC,OAAS1C,GACD9hB,OAAOC,6BAA6BgU,KAAK8N,eAAeD,EAEjE,EACA,QAAAw3D,CAAUjiE,EAAOtD,GAChB,OAASsvC,GACD,KAAWA,GAAU,CAAED,EAAiB94C,IACzC84C,aAAmBjkD,GAChB,EAAAw5B,GAAAA,SAAS,GAAS1kB,KAAKmvC,QAAShgB,GAAiBggB,EAAQvjD,SAAW,MAG/D,qBAARyK,GAAsC,gBAARA,GAC3B,EAAAquB,GAAAA,SAAS,GAAS1kB,KAAKmvC,QAASA,EAAS,IAG1C,GAAGA,KAGb,EAGA,2BAAAr4B,CAA6B1T,EAAOtD,GACnC,MAAO,CAAE+N,EAAmBy3D,EAA0Bn5D,GAAW,KAChE,IAAIrM,EAAQ4vB,eAAgB,MAAO,GACnC,IAAI5vB,EAAQ4vB,eAAezkC,SAAS,IAAI4iB,KAAc,MAAO,GAE7D,MAAM7N,EAAOjU,OAAOC,6BAA6BgU,KAAK+Z,WAAW7K,WAC3DqB,EAAiBzQ,EAAQyQ,eAAe1C,GAAWmmC,cACnDuxB,EAAwBzlE,EAAQyQ,eAAe+0D,GAAkBtxB,cAEvE,GAAG7nC,EAAU,CACZ,MAAMioB,EAAgBt0B,EAAQutD,iBAAiBvtD,EAAQ6N,OAAOohC,SAAS/rC,OACjEksC,EAAW9a,EAAcqd,uBAAuB,EAAG3xC,EAAQo4C,kBAC3D9I,EAAWhb,EAAcwgB,gCAAgC90C,EAAQo4C,kBACvE,OAAIhJ,EAASrhC,GAIVuhC,EAASvhC,IACJ,EAAA6W,GAAAA,SAAQ1kB,EAAKwlE,oBAAqBD,EAAuBzlE,EAAQo4C,iBAAiBotB,GAAmB/0D,EAAgB2+B,EAASrhC,IAAYjiB,QAASwjD,EAASvhC,IAAYjiB,QAAS,OAGlL,EAAA84B,GAAAA,SAAQ1kB,EAAKylE,oBAAqBF,EAAuBzlE,EAAQo4C,iBAAiBotB,GAAmB/0D,EAAgB2+B,EAASrhC,IAAYjiB,QAAS,MAPlJ,E,CAUT,MAAMwoC,EAAgBt0B,EAAQutD,iBAAkBvtD,EAAQkD,OAClDksC,EAAW9a,EAAcqd,uBAAuB3xC,EAAQytD,eAAgBztD,EAAQoP,YAChFkgC,EAAW,IACbtvC,EAAQsvC,YACRhb,EAAcwgB,gCAAgC90C,EAAQoP,aAI1D,OAAO,EAAAwV,GAAAA,SAAQ1kB,EAAKwlE,oBAAqBD,EAAuBzlE,EAAQoP,WAAWo2D,GAAmB/0D,EAAgB2+B,EAASrhC,IAAYjiB,QAASwjD,EAASvhC,IAAYjiB,QAAS,KAAK,CAEzL,EACA,uBAAA6kB,CAAyBrN,EAAOtD,GAC/B,OAAS+N,IACR,MAAM63D,EAAc5lE,EAAQiuD,iBAAiBviB,kBAAkB39B,GACzD83D,EAAW7lE,EAAQulE,SAASvlE,EAAQsvC,UAC1C,OAAOu2B,EAASD,IAAgB,EAAE,CAEpC,EACA,kBAAAzX,CAAoB7qD,EAAOtD,GAC1B,MAAM8lE,EAAsBxiE,EAAM6jC,aAAa/3B,WAAYpP,EAAQkD,OAGnE,GAAuB,QAAlBlD,EAAQkD,MACZ,OAAO,EAGR,GAAK,IAAS4iE,GACb,OAAO,EAGR,MAAMC,GAAuB,IAAM/vB,IAA8BntB,kBAAmB7oB,EAAQkD,OAAQstC,qBAEpG,OAAO,IAASu1B,EAAqBl7E,QAAUm7E,IAC9C,MAAMC,EAAUH,EAAqBE,GACrC,OAAS,KAAKF,EAAqBE,KAAqBC,GAAuB,IAAZA,GAA6B,MAAZA,CAAiB,IAEvG,EACA,eAAA7X,CAAiB9qD,EAAOtD,GACvB,MAAMkmE,EAAmB5iE,EAAM6jC,aAAa7zB,UACtCgjC,GAAoB,IAAMN,IAA8BntB,kBAAmB7oB,EAAQkD,OAAQutC,oBAEjG,QAAK,IAAS6F,IAIP,IAASA,EAAkBzrD,QAAUipB,IAC3C,MAAMmyD,EAAUC,EAAkBpyD,GAClC,OAAS,KAAKoyD,EAAkBpyD,KAAkBmyD,GAAuB,IAAZA,GAA6B,MAAZA,CAAiB,IAEjG,EACA,eAAA1Q,CAAiBjyD,EAAOtD,GACvB,MAAO,CACN,SACA,QACA,UACA,UACA,UACA,OACA,UACA,iBACA,QACC7U,SAAU6U,EAAQkD,MACrB,EACA,WAAAokB,CAAahkB,EAAOtD,GACnB,MAAM,MAAEkD,EAAK,UAAEoQ,GAAchQ,EAAM6jC,aAEnC,OAAOnnC,EAAQy2C,eAAgBvzC,EAAOlD,EAAQw6C,iBAAkBlnC,EACjE,EACA,cAAAmjC,GACC,MAAO,CAAEvzC,EAAekM,EAAoBkE,EAAY,CAAC,IACnD,IAASlE,GACN,IAAI8oD,IAGL,IAAMwH,IAAiBC,6BAC7Bz8D,EACA,IACIiM,GAAcC,MACdkE,GAIP,EACA,OAAA4lC,CAAS51C,EAAOtD,GACf,MAAO,CAAEkD,EAAekM,EAAoBkE,EAAY,CAAC,KACxD,MAAM27B,EAAWjvC,EAAQy2C,eAAgBvzC,EAAOkM,EAAYkE,GAE5D,OAAK27B,IAAaipB,GACV,EAGDjpB,EAASlsB,WAAWt0B,MAAQ,CAAC,CAEtC,EACA,iBAAAkqC,CAAmBr1B,EAAOtD,GACzB,MAAMzL,EAASyL,EAAQi2B,WAAW,EAAO,MAEzC,OAAO/nB,GAAe3Z,EAAO7G,IAAO,GAAKwgB,GAAe3Z,EAAO5G,IAAO,CACvE,EACA,qBAAAosB,CAAuBzW,EAAOtD,GAC7B,IAAIA,EAAQiE,gBACX,OAAO,EAER,MAAMzW,EAAQwS,EAAQmE,mBACtB,IAAIgiE,EAAgB,EAEpB,MAAMv3E,EAASoR,EAAQ+4C,WAGjB9pD,EAAS,UAAcC,WAAY1B,EAAiB,CAAE2B,QAAS,CAAEC,oBAAoB,GAAQC,sBAAuB2Q,EAAQ+4C,WAAWvsD,UAE7I,IAAI2E,MAAMC,QAAQnC,GACjB,OAAO,EAGR,IAAI,IAAIZ,EAAI,EAAGA,EAAIY,EAAO/D,OAAQmD,IAAK,CACtC,MAAMiB,EAAQL,EAAOZ,GACrB,GAAGiB,EAAMC,MAAMrE,OAAS,EAGvB,IAAI,IAAIoD,EAAI,EAAGA,EAAIgB,EAAMC,MAAMrE,OAAQoD,IAAK,CAG3C,MAAM83E,EAAO92E,EAAMC,MAAMjB,GACnB+3E,EAAW/3E,EAAI,EAAIgB,EAAMC,MAAMrE,OAASoE,EAAMC,MAAMjB,EAAI,GAAKgB,EAAMC,MAAM,GAGzE49B,EAAQ,UAAcm5C,iBAAiBF,EAAMC,GAE7CE,EAAWH,EAAKI,SAAWJ,EAAKK,UAAU,GAAKL,EAAKK,UAAU,GAC9DC,EAAaN,EAAKI,SAAWJ,EAAKK,UAAU,GAAKL,EAAKK,UAAU,GAElEt5C,GAAS,KACZg5C,IACGl6E,OAAO06E,WACT,UAAcn3E,SAAShC,EAAO,IAAI,WAAeo5E,OAAMh4E,EAAOpC,QAAS,CAAC+5E,IAAY,gBAAkBl4E,EAAI,IAAMC,EAAI,SAAW6+B,GAC/H,UAAc39B,SAAShC,EAAO,IAAI,WAAeo5E,OAAMh4E,EAAOpC,QAAQ,EAAG,CAACk6E,EAAYL,EAASI,UAAU,KAAM,gBAAkBp4E,EAAI,IAAMC,EAAI,SAAW6+B,I,CAO9J,GAA6B,qBAAnB79B,EAAMG,UAA4BH,EAAMG,SAASvE,OAAS,EACnE,IAAI,IAAIoD,EAAI,EAAGA,EAAIgB,EAAMG,SAASvE,OAAQoD,IAAK,CAC9C,MAAMoB,EAAaJ,EAAMG,SAASnB,GAClC,GAAGoB,EAAWH,MAAMrE,OAAS,EAG5B,IAAI,IAAIoD,EAAI,EAAGA,EAAIoB,EAAWH,MAAMrE,OAAQoD,IAAK,CAGhD,MAAM83E,EAAO12E,EAAWH,MAAMjB,GACxB+3E,EAAW/3E,EAAI,EAAIoB,EAAWH,MAAMrE,OAASwE,EAAWH,MAAMjB,EAAI,GAAKoB,EAAWH,MAAM,GAGxF49B,EAAQ,UAAcm5C,iBAAiBF,EAAMC,GAE7CE,EAAWH,EAAKI,SAAWJ,EAAKK,UAAU,GAAKL,EAAKK,UAAU,GAC9DC,EAAaN,EAAKI,SAAWJ,EAAKK,UAAU,GAAKL,EAAKK,UAAU,GAElEt5C,GAAS,KACZg5C,IACGl6E,OAAO06E,WACT,UAAcn3E,SAAShC,EAAO,IAAI,WAAeo5E,OAAMh4E,EAAOpC,QAAS,CAAC+5E,IAAY,gBAAkBl4E,EAAI,IAAMC,EAAI,SAAW6+B,GAC/H,UAAc39B,SAAShC,EAAO,IAAI,WAAeo5E,OAAMh4E,EAAOpC,QAAQ,EAAG,CAACk6E,EAAYL,EAASI,UAAU,KAAM,gBAAkBp4E,EAAI,IAAMC,EAAI,SAAW6+B,I,GASjK,OAAOg5C,EAAgB,CACxB,EACA,eAAAz/C,GAGC,OAAO,IAAI05C,GAAc,GAAS5kC,aACnC,GAEDke,QAAS,CACR,oCAAMmtB,EAAgC,SAAE7gE,IACvCo9D,GAAiCp9D,EAClC,EACA,2BAAM8gE,EAAuB,OAAE9vE,EAAM,YAAEgiD,EAAW,QAAEh5C,IACnD,IAAOg5C,EAAY/0C,gBAIlB,OAHAjN,EAAQ,sBAAuB,CAAEsU,QAAS,KAC1CtU,EAAQ,gCAAgC,QACxCA,EAAQ,gCAAgC,GAIzC,GAAKgiD,EAAY0rB,gBAIhB,OAHA1tE,EAAQ,sBAAuB,CAAEsU,QAAS,KAC1CtU,EAAQ,gCAAgC,QACxCA,EAAQ,gCAAgC,GAIzC,IAAMgiD,EAAY5xB,mBAIjB,OAHApwB,EAAQ,sBAAuB,CAAEsU,QAAS,KAC1CtU,EAAQ,gCAAgC,QACxCA,EAAQ,gCAAgC,GAGzCA,EAAQ,gCAAgC,GACxC,MAAM0lC,EAAO,IAAIG,KAAM,CAAE78B,EAAQmf,WAAa,CAAEpxB,KAAM,oBAEhD2F,QAAawvE,GAAOzmC,cAAe,GAASnb,WAAYob,EAAM18B,EAAQglC,YAAagU,EAAYh4B,kBAErGhqB,EAAQ,sBAAuBtD,GAC/BsD,EAAQ,gCAAgC,GACxCA,EAAQ,gCAAgC,EACzC,EACA,sBAAM+vE,EAAkB,SAAE/gE,GAAY9C,SAC/B8C,EAAU,cAAe9C,SAEzB8C,EAAU,sBACVA,EAAU,kBACjB,EACA,0BAAOghE,EAAsB,OAAEhwE,EAAM,QAAEgJ,EAAO,SAAEgG,IAAY,UAAE+H,EAAS,MAAE/V,IACxEhB,EAAQ,kBAAmB,CAAE+W,YAAW/V,UACxChB,EAAQ,gCAAgC,GAEnCgJ,EAAQ6N,SAAkD,IAAxC7N,EAAQ66B,mCACxB70B,EAAU,uBAElB,EACA,2BAAMihE,EAAuB,OAAEjwE,EAAM,MAAEsM,EAAK,QAAEtD,GAAWkD,GACxD,GAAe,QAAVA,GAA6B,cAAVA,EACvB,OAGD,MAAM+rC,EAAWjvC,EAAQ4lC,kBAEzB,KAAS,yBAA0BqJ,GAClC,OAID,IAAI7/B,EAAa,KAAW6/B,EAASV,wBAA0BzC,IAC9D,GAA0B,kBAAdA,EAIZ,OAAOA,EAAU52C,UAAU,IAM5B,OAFAka,EAAa,KAAQA,EAAY,KAExBlM,GACR,IAAK,OACEI,EAAM6jC,aAAa7zB,UAAUO,kBAClC7c,EAAQ,iBAAkB,CAAE8c,SAAU,mBAAoB9b,MAAO,IAG7D,IAASsL,EAAM6jC,aAAa/3B,WAAYlM,KAC5ClM,EAAQ,wBAAyB,CAAEkM,QAAOkM,eAE3C,MACD,IAAK,UACE9L,EAAM6jC,aAAa7zB,UAAUua,aAClC72B,EAAQ,iBAAkB,CAAE8c,SAAU,cAAe9b,MAAO,IAExD,IAASsL,EAAM6jC,aAAa/3B,WAAYlM,KAC5ClM,EAAQ,wBAAyB,CAAEkM,QAAOkM,eAE3C,MACD,QACM,IAAS9L,EAAM6jC,aAAa/3B,WAAYlM,KAC5ClM,EAAQ,wBAAyB,CAAEkM,QAAOkM,eAE3C,MAGFpY,EAAQ,gCAAgC,EACzC,EACA,iBAAM6T,EAAa,OAAE7T,EAAM,MAAEsM,EAAK,QAAEtD,EAAO,SAAEgG,GAAY9C,GACxDI,EAAM6jC,aAAajkC,MAAQA,EAEZ,SAAVA,UACE8C,EAAU,sBACVA,EAAU,yBAEVA,EAAU,oBAAoB,EAAO,CAAEqP,MAAM,KAGtC,QAAVnS,UACG8C,EAAU,sBACVA,EAAU,oBAGF,OAAV9C,GAAgD,OAA9BlD,EAAQ4lC,yBACxB5/B,EAAU,wBAAyB9C,GAGpClD,EAAQglE,mBACbhuE,EAAQ,sBAAuB,WAGhCA,EAAQ,aAAc,GACtBA,EAAQ,iBAAkB,GAC1BA,EAAQ,oBAAqB,CAAE,EAAG,IAE5BkM,GAAS,IAAMA,EAAMhY,QAI3Be,QAAQif,WAAWld,KAAM,CACxBoX,MAAO,wBACP+F,cAAe,mBAAqBvZ,SAASsH,MAC7CkS,YAAa,uBACbC,WAAYnI,GAEd,EACA,gBAAAgkE,EAAkB,OAAElwE,EAAM,SAAEgP,GAAYjJ,GACvC,MAAMktD,EAASltD,EAAOilE,YAEtBhrE,EAAQ,oBAAqB+F,EAAO2Q,WACpC1W,EAAQ,0BAA2BizD,GACnCjkD,EAAU,mBAAoBikD,EAC/B,KC3nBIkd,GAAkBv1E,SAAS4W,cAA2B,gCACxD2+D,KACHA,GAAgBp7D,QAAS,GAIO,qBAA9BjV,GAAMkJ,QAAQglC,aAChBluC,GAAMkP,SAAU,kCAIjBlP,GAAMkR,OAAO,CAAE1E,EAAOtD,IAAaA,EAAQmf,WAAanf,EAAQghB,mBAAkBxsB,gBAC3EsC,GAAMkP,SAAU,iCAAkC,IAGzD,MAAMohE,GAAW5yE,UAChB,MAAM6yE,GAAM,QAAU,CACrB5uE,KAAM,uBACN,MAAAnD,GACC,OAAO,IAAAijE,GAAE+O,GACV,IAGDD,EAAIE,UAAU,UAAW,KACzBF,EAAIE,UAAU,YAAa,KAC3BF,EAAIG,IAAI1wE,IACRuwE,EAAIG,IAAI,MACRH,EAAIG,IAAI,KAAc,CAAC,GAGvBH,EAAII,UAAU,QAAS,CAGtB,OAAAlgE,CAAQ7G,GAGPA,EAAG0lB,OACJ,IAIDihD,EAAIpd,OAAOyd,iBAAiBphE,MAAQra,OAAOC,6BAA6BgU,KACxEmnE,EAAIpd,OAAOyd,iBAAiBloD,aAAevzB,OAAOC,6BAClDm7E,EAAIpd,OAAOyd,iBAAiBC,aAAej9E,IAG3C28E,EAAIO,QAAQ,cAAel9E,KAE3B28E,EAAIQ,MAAM,6BAA6B,GAIxC,QAAgB,CACfC,mBAAmB,EACnBC,iBAAkB,mBAClBC,gBAAiB,qBAGlBZ,I,uBCxOe,SAASa,IACtB,OAAO,IAAIC,OAAO,IAA0B,yBAC9C,C,+CCDIC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBjzD,IAAjBkzD,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CACjD/lE,GAAI+lE,EACJI,QAAQ,EACRF,QAAS,CAAC,GAUX,OANAG,EAAoBL,GAAUrsB,KAAKwsB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG3EI,EAAOC,QAAS,EAGTD,EAAOD,OACf,CAGAH,EAAoBO,EAAID,E,WC5BxB,IAAIE,EAAW,GACfR,EAAoBS,EAAI,SAAS/4E,EAAQg5E,EAAUC,EAAIC,GACtD,IAAGF,EAAH,CAMA,IAAIG,EAAe7U,IACnB,IAAS/lE,EAAI,EAAGA,EAAIu6E,EAAS19E,OAAQmD,IAAK,CACrCy6E,EAAWF,EAASv6E,GAAG,GACvB06E,EAAKH,EAASv6E,GAAG,GACjB26E,EAAWJ,EAASv6E,GAAG,GAE3B,IAJA,IAGI66E,GAAY,EACP56E,EAAI,EAAGA,EAAIw6E,EAAS59E,OAAQoD,MACpB,EAAX06E,GAAsBC,GAAgBD,IAAa93E,OAAOD,KAAKm3E,EAAoBS,GAAGjvD,OAAM,SAASrjB,GAAO,OAAO6xE,EAAoBS,EAAEtyE,GAAKuyE,EAASx6E,GAAK,IAChKw6E,EAAShyC,OAAOxoC,IAAK,IAErB46E,GAAY,EACTF,EAAWC,IAAcA,EAAeD,IAG7C,GAAGE,EAAW,CACbN,EAAS9xC,OAAOzoC,IAAK,GACrB,IAAIsI,EAAIoyE,SACE3zD,IAANze,IAAiB7G,EAAS6G,EAC/B,CACD,CACA,OAAO7G,CArBP,CAJCk5E,EAAWA,GAAY,EACvB,IAAI,IAAI36E,EAAIu6E,EAAS19E,OAAQmD,EAAI,GAAKu6E,EAASv6E,EAAI,GAAG,GAAK26E,EAAU36E,IAAKu6E,EAASv6E,GAAKu6E,EAASv6E,EAAI,GACrGu6E,EAASv6E,GAAK,CAACy6E,EAAUC,EAAIC,EAwB/B,C,eC5BAZ,EAAoB/oE,EAAI,SAASmpE,GAChC,IAAIW,EAASX,GAAUA,EAAOY,WAC7B,WAAa,OAAOZ,EAAO,UAAY,EACvC,WAAa,OAAOA,CAAQ,EAE7B,OADAJ,EAAoB7yE,EAAE4zE,EAAQ,CAAE//C,EAAG+/C,IAC5BA,CACR,C,eCNAf,EAAoB7yE,EAAI,SAASgzE,EAASc,GACzC,IAAI,IAAI9yE,KAAO8yE,EACXjB,EAAoBkB,EAAED,EAAY9yE,KAAS6xE,EAAoBkB,EAAEf,EAAShyE,IAC5ErF,OAAOq4E,eAAehB,EAAShyE,EAAK,CAAEizE,YAAY,EAAM14D,IAAKu4D,EAAW9yE,IAG3E,C,eCPA6xE,EAAoBqB,EAAI,CAAC,EAGzBrB,EAAoB7wE,EAAI,SAASmyE,GAChC,OAAOhoD,QAAQwrC,IAAIh8D,OAAOD,KAAKm3E,EAAoBqB,GAAGt8D,QAAO,SAASw8D,EAAUpzE,GAE/E,OADA6xE,EAAoBqB,EAAElzE,GAAKmzE,EAASC,GAC7BA,CACR,GAAG,IACJ,C,eCPAvB,EAAoBwB,EAAI,SAASF,GAEhC,MAAO,gBACR,C,eCHAtB,EAAoByB,SAAW,SAASH,GAGxC,C,eCJAtB,EAAoB/kC,EAAI,WACvB,GAA0B,kBAAfymC,WAAyB,OAAOA,WAC3C,IACC,OAAOv+E,MAAQ,IAAImY,SAAS,cAAb,EAChB,CAAE,MAAOnM,GACR,GAAsB,kBAAXtL,OAAqB,OAAOA,MACxC,CACA,CAPuB,E,eCAxBm8E,EAAoBkB,EAAI,SAASpqD,EAAK6qD,GAAQ,OAAO74E,OAAO4qD,UAAUC,eAAeC,KAAK98B,EAAK6qD,EAAO,C,eCAtG,IAAIC,EAAa,CAAC,EACdC,EAAoB,6BAExB7B,EAAoB8B,EAAI,SAASx1E,EAAKqM,EAAMxK,EAAKmzE,GAChD,GAAGM,EAAWt1E,GAAQs1E,EAAWt1E,GAAK1G,KAAK+S,OAA3C,CACA,IAAI3L,EAAQ+0E,EACZ,QAAW/0D,IAAR7e,EAEF,IADA,IAAI6zE,EAAUx4E,SAASy4E,qBAAqB,UACpCh8E,EAAI,EAAGA,EAAI+7E,EAAQl/E,OAAQmD,IAAK,CACvC,IAAIi8E,EAAIF,EAAQ/7E,GAChB,GAAGi8E,EAAEx2E,aAAa,QAAUY,GAAO41E,EAAEx2E,aAAa,iBAAmBm2E,EAAoB1zE,EAAK,CAAEnB,EAASk1E,EAAG,KAAO,CACpH,CAEGl1E,IACH+0E,GAAa,EACb/0E,EAASxD,SAASC,cAAc,UAEhCuD,EAAOm1E,QAAU,QACjBn1E,EAAOo1E,QAAU,IACbpC,EAAoBqC,IACvBr1E,EAAO0rC,aAAa,QAASsnC,EAAoBqC,IAElDr1E,EAAO0rC,aAAa,eAAgBmpC,EAAoB1zE,GAExDnB,EAAO2D,IAAMrE,GAEds1E,EAAWt1E,GAAO,CAACqM,GACnB,IAAI2pE,EAAmB,SAASC,EAAMvlE,GAErChQ,EAAOw1E,QAAUx1E,EAAOwsE,OAAS,KACjCiJ,aAAaL,GACb,IAAIM,EAAUd,EAAWt1E,GAIzB,UAHOs1E,EAAWt1E,GAClBU,EAAOouC,YAAcpuC,EAAOouC,WAAWhC,YAAYpsC,GACnD01E,GAAWA,EAAQz5E,SAAQ,SAAS03E,GAAM,OAAOA,EAAG3jE,EAAQ,IACzDulE,EAAM,OAAOA,EAAKvlE,EACtB,EACIolE,EAAU11D,WAAW41D,EAAiBK,KAAK,UAAM31D,EAAW,CAAErnB,KAAM,UAAWw2B,OAAQnvB,IAAW,MACtGA,EAAOw1E,QAAUF,EAAiBK,KAAK,KAAM31E,EAAOw1E,SACpDx1E,EAAOwsE,OAAS8I,EAAiBK,KAAK,KAAM31E,EAAOwsE,QACnDuI,GAAcv4E,SAASo5E,KAAK1pC,YAAYlsC,EApCkB,CAqC3D,C,eCxCAgzE,EAAoBzxE,EAAI,SAAS4xE,GACX,qBAAX0C,QAA0BA,OAAOC,aAC1Ch6E,OAAOq4E,eAAehB,EAAS0C,OAAOC,YAAa,CAAElzE,MAAO,WAE7D9G,OAAOq4E,eAAehB,EAAS,aAAc,CAAEvwE,OAAO,GACvD,C,eCNAowE,EAAoB+C,IAAM,SAAS3C,GAGlC,OAFAA,EAAO/6E,MAAQ,GACV+6E,EAAO50E,WAAU40E,EAAO50E,SAAW,IACjC40E,CACR,C,eCJAJ,EAAoB33E,EAAI,wE,eCKxB,IAAI26E,EAAkB,CACrB,IAAK,GAGNhD,EAAoBqB,EAAEn7E,EAAI,SAASo7E,EAASC,GAE1C,IAAI0B,EAAqBjD,EAAoBkB,EAAE8B,EAAiB1B,GAAW0B,EAAgB1B,QAAWt0D,EACtG,GAA0B,IAAvBi2D,EAGF,GAAGA,EACF1B,EAAS37E,KAAKq9E,EAAmB,QAC3B,CAGL,IAAIC,EAAU,IAAI5pD,SAAQ,SAASC,EAAS4pD,GAAUF,EAAqBD,EAAgB1B,GAAW,CAAC/nD,EAAS4pD,EAAS,IACzH5B,EAAS37E,KAAKq9E,EAAmB,GAAKC,GAGtC,IAAI52E,EAAM0zE,EAAoB33E,EAAI23E,EAAoBwB,EAAEF,GAEpDrjB,EAAQ,IAAIlpB,MACZquC,EAAe,SAASpmE,GAC3B,GAAGgjE,EAAoBkB,EAAE8B,EAAiB1B,KACzC2B,EAAqBD,EAAgB1B,GACX,IAAvB2B,IAA0BD,EAAgB1B,QAAWt0D,GACrDi2D,GAAoB,CACtB,IAAII,EAAYrmE,IAAyB,SAAfA,EAAMrX,KAAkB,UAAYqX,EAAMrX,MAChE29E,EAAUtmE,GAASA,EAAMmf,QAAUnf,EAAMmf,OAAOxrB,IACpDstD,EAAMtvC,QAAU,iBAAmB2yD,EAAU,cAAgB+B,EAAY,KAAOC,EAAU,IAC1FrlB,EAAM5tD,KAAO,iBACb4tD,EAAMt4D,KAAO09E,EACbplB,EAAMiF,QAAUogB,EAChBL,EAAmB,GAAGhlB,EACvB,CAEF,EACA+hB,EAAoB8B,EAAEx1E,EAAK82E,EAAc,SAAW9B,EAASA,EAE/D,CAEH,EAUAtB,EAAoBS,EAAEv6E,EAAI,SAASo7E,GAAW,OAAoC,IAA7B0B,EAAgB1B,EAAgB,EAGrF,IAAIiC,EAAuB,SAASC,EAA4Bl4E,GAC/D,IAKI20E,EAAUqB,EALVZ,EAAWp1E,EAAK,GAChBm4E,EAAcn4E,EAAK,GACnBo4E,EAAUp4E,EAAK,GAGIrF,EAAI,EAC3B,GAAGy6E,EAASl0B,MAAK,SAAStyC,GAAM,OAA+B,IAAxB8oE,EAAgB9oE,EAAW,IAAI,CACrE,IAAI+lE,KAAYwD,EACZzD,EAAoBkB,EAAEuC,EAAaxD,KACrCD,EAAoBO,EAAEN,GAAYwD,EAAYxD,IAGhD,GAAGyD,EAAS,IAAIh8E,EAASg8E,EAAQ1D,EAClC,CAEA,IADGwD,GAA4BA,EAA2Bl4E,GACrDrF,EAAIy6E,EAAS59E,OAAQmD,IACzBq7E,EAAUZ,EAASz6E,GAChB+5E,EAAoBkB,EAAE8B,EAAiB1B,IAAY0B,EAAgB1B,IACrE0B,EAAgB1B,GAAS,KAE1B0B,EAAgB1B,GAAW,EAE5B,OAAOtB,EAAoBS,EAAE/4E,EAC9B,EAEIi8E,EAAqBzrD,KAAK,yCAA2CA,KAAK,0CAA4C,GAC1HyrD,EAAmB16E,QAAQs6E,EAAqBZ,KAAK,KAAM,IAC3DgB,EAAmB/9E,KAAO29E,EAAqBZ,KAAK,KAAMgB,EAAmB/9E,KAAK+8E,KAAKgB,G,ICpFvF,IAAIC,EAAsB5D,EAAoBS,OAAEzzD,EAAW,CAAC,MAAM,WAAa,OAAOgzD,EAAoB,IAAM,IAChH4D,EAAsB5D,EAAoBS,EAAEmD,E","sources":["webpack://app-measurements-selector/./src/functions/browser.ts","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Length.js","webpack://app-measurements-selector/./src/functions/makerjs.ts","webpack://app-measurements-selector/./src/components/accordion/AccordionContainer.vue","webpack://app-measurements-selector/./src/components/accordion/AccordionContainer.vue?599f","webpack://app-measurements-selector/./src/components/icons/CheckIcon.vue","webpack://app-measurements-selector/./src/components/icons/CheckIcon.vue?c602","webpack://app-measurements-selector/./src/components/icons/ErrorIcon.vue","webpack://app-measurements-selector/./src/components/icons/ErrorIcon.vue?e445","webpack://app-measurements-selector/./src/components/accordion/AccordionIndicator.vue?ab72","webpack://app-measurements-selector/./src/components/accordion/AccordionIndicator.vue","webpack://app-measurements-selector/./src/components/icons/InfoCircle.vue","webpack://app-measurements-selector/./src/components/icons/InfoCircle.vue?203b","webpack://app-measurements-selector/./src/components/UI/InfoModal/OpenButton.vue?78ae","webpack://app-measurements-selector/./src/components/UI/InfoModal/OpenButton.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/OpenButton.vue?caf9","webpack://app-measurements-selector/./src/utilities/UseEscapeEvent.ts","webpack://app-measurements-selector/./src/components/UI/InfoModal/ModalDialog.vue?44ca","webpack://app-measurements-selector/./src/components/UI/InfoModal/ModalDialog.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/ModalDialog.vue?a388","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentImage.vue?7aef","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentImage.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentImageText.vue?9001","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentImageText.vue","webpack://app-measurements-selector/./src/components/icons/ArrowIcon.vue","webpack://app-measurements-selector/./src/components/icons/ArrowIcon.vue?5c46","webpack://app-measurements-selector/./src/components/icons/CircleIcon.vue","webpack://app-measurements-selector/./src/components/icons/CircleIcon.vue?2ae7","webpack://app-measurements-selector/./src/components/icons/EllipseIcon.vue","webpack://app-measurements-selector/./src/components/icons/EllipseIcon.vue?9b12","webpack://app-measurements-selector/./src/components/icons/HalfCircle.vue","webpack://app-measurements-selector/./src/components/icons/HalfCircle.vue?3dac","webpack://app-measurements-selector/./src/components/icons/HeartIcon.vue","webpack://app-measurements-selector/./src/components/icons/HeartIcon.vue?3f81","webpack://app-measurements-selector/./src/components/icons/HexagonIcon.vue","webpack://app-measurements-selector/./src/components/icons/HexagonIcon.vue?8fa7","webpack://app-measurements-selector/./src/components/icons/OctagonIcon.vue","webpack://app-measurements-selector/./src/components/icons/OctagonIcon.vue?fb5a","webpack://app-measurements-selector/./src/components/icons/PolygonIcon.vue","webpack://app-measurements-selector/./src/components/icons/PolygonIcon.vue?9e2d","webpack://app-measurements-selector/./src/components/icons/IsoscelesTriangle.vue","webpack://app-measurements-selector/./src/components/icons/IsoscelesTriangle.vue?3608","webpack://app-measurements-selector/./src/components/icons/QuarterCircle.vue","webpack://app-measurements-selector/./src/components/icons/QuarterCircle.vue?e2b3","webpack://app-measurements-selector/./src/components/icons/RectangleCutout.vue","webpack://app-measurements-selector/./src/components/icons/RectangleCutout.vue?bc22","webpack://app-measurements-selector/./src/components/icons/RightAngledTriangle.vue","webpack://app-measurements-selector/./src/components/icons/RightAngledTriangle.vue?15cf","webpack://app-measurements-selector/./src/components/icons/RightAngledTriangleMirrored.vue","webpack://app-measurements-selector/./src/components/icons/RightAngledTriangleMirrored.vue?1469","webpack://app-measurements-selector/./src/components/icons/RoundedRectangle.vue","webpack://app-measurements-selector/./src/components/icons/RoundedRectangle.vue?6b7a","webpack://app-measurements-selector/./src/components/icons/SlopedRectangle.vue","webpack://app-measurements-selector/./src/components/icons/SlopedRectangle.vue?ff3d","webpack://app-measurements-selector/./src/components/icons/ArchedRectangle.vue","webpack://app-measurements-selector/./src/components/icons/ArchedRectangle.vue?df09","webpack://app-measurements-selector/./src/components/icons/StarIcon.vue","webpack://app-measurements-selector/./src/components/icons/StarIcon.vue?5a00","webpack://app-measurements-selector/./src/components/icons/TrapezoidIcon.vue","webpack://app-measurements-selector/./src/components/icons/TrapezoidIcon.vue?314b","webpack://app-measurements-selector/./src/components/icons/RectangleIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleIcon.vue?3e65","webpack://app-measurements-selector/./src/components/icons/ShapesIcon.vue","webpack://app-measurements-selector/./src/components/icons/ShapesIcon.vue?bfe2","webpack://app-measurements-selector/./src/components/icons/TextIcon.vue","webpack://app-measurements-selector/./src/components/icons/TextIcon.vue?929b","webpack://app-measurements-selector/./src/components/icons/UploadIcon.vue","webpack://app-measurements-selector/./src/components/icons/UploadIcon.vue?963f","webpack://app-measurements-selector/./src/components/icons/CrossIcon.vue","webpack://app-measurements-selector/./src/components/icons/CrossIcon.vue?acb9","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdges.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdges.vue?23b0","webpack://app-measurements-selector/./src/components/icons/DrillHoleRadial.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleRadial.vue?ab5d","webpack://app-measurements-selector/./src/components/icons/DrillHoleGrid.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleGrid.vue?49e8","webpack://app-measurements-selector/./src/components/icons/DrillHoleCustom.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleCustom.vue?ee33","webpack://app-measurements-selector/./src/components/icons/FlatOvalIcon.vue","webpack://app-measurements-selector/./src/components/icons/FlatOvalIcon.vue?344e","webpack://app-measurements-selector/./src/components/icons/DrillHolePresetIcon.vue","webpack://app-measurements-selector/./src/components/icons/DrillHolePresetIcon.vue?d54a","webpack://app-measurements-selector/./src/components/icons/SlopedRightRectangle.vue","webpack://app-measurements-selector/./src/components/icons/SlopedRightRectangle.vue?948e","webpack://app-measurements-selector/./src/components/icons/DropletIcon.vue","webpack://app-measurements-selector/./src/components/icons/DropletIcon.vue?8d02","webpack://app-measurements-selector/./src/components/icons/EggIcon.vue","webpack://app-measurements-selector/./src/components/icons/EggIcon.vue?f64c","webpack://app-measurements-selector/./src/components/icons/KiteIcon.vue","webpack://app-measurements-selector/./src/components/icons/KiteIcon.vue?2c0a","webpack://app-measurements-selector/./src/components/icons/BarrelIcon.vue","webpack://app-measurements-selector/./src/components/icons/BarrelIcon.vue?e204","webpack://app-measurements-selector/./src/components/icons/JewelIcon.vue","webpack://app-measurements-selector/./src/components/icons/JewelIcon.vue?a623","webpack://app-measurements-selector/./src/components/icons/DownloadIcon.vue","webpack://app-measurements-selector/./src/components/icons/DownloadIcon.vue?0b98","webpack://app-measurements-selector/./src/components/icons/SpecsIcon.vue","webpack://app-measurements-selector/./src/components/icons/SpecsIcon.vue?b563","webpack://app-measurements-selector/./src/components/icons/ParallelogramIcon.vue","webpack://app-measurements-selector/./src/components/icons/ParallelogramIcon.vue?6ad8","webpack://app-measurements-selector/./src/components/icons/RectangleNoneEdgesIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleNoneEdgesIcon.vue?abf5","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleEdgesIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleEdgesIcon.vue?0761","webpack://app-measurements-selector/./src/components/icons/CircleCircleNoneIcon.vue","webpack://app-measurements-selector/./src/components/icons/CircleCircleNoneIcon.vue?d93e","webpack://app-measurements-selector/./src/components/icons/RectangleNoneCustomIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleNoneCustomIcon.vue?e72f","webpack://app-measurements-selector/./src/components/icons/CircleNoneCustomIcon.vue","webpack://app-measurements-selector/./src/components/icons/CircleNoneCustomIcon.vue?15e2","webpack://app-measurements-selector/./src/components/icons/CircleNoneRadialIcon.vue","webpack://app-measurements-selector/./src/components/icons/CircleNoneRadialIcon.vue?4fd3","webpack://app-measurements-selector/./src/components/icons/RectangleCircleEdgesIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleCircleEdgesIcon.vue?c848","webpack://app-measurements-selector/./src/components/icons/RectangleCircleNoneIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleCircleNoneIcon.vue?7abc","webpack://app-measurements-selector/./src/components/icons/RectangleNoneGridIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleNoneGridIcon.vue?7198","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleCustomIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleCustomIcon.vue?aac6","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleNoneIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleRectangleNoneIcon.vue?5175","webpack://app-measurements-selector/./src/components/icons/RectangleRoundedrectangleNoneIcon.vue","webpack://app-measurements-selector/./src/components/icons/RectangleRoundedrectangleNoneIcon.vue?605e","webpack://app-measurements-selector/./src/components/icons/RoundedrectangleNoneCustomIcon.vue","webpack://app-measurements-selector/./src/components/icons/RoundedrectangleNoneCustomIcon.vue?281c","webpack://app-measurements-selector/./src/components/icons/RoundedrectangleNoneEdgesIcon.vue","webpack://app-measurements-selector/./src/components/icons/RoundedrectangleNoneEdgesIcon.vue?ecdb","webpack://app-measurements-selector/./src/components/icons/utils.ts","webpack://app-measurements-selector/./src/components/UI/DownloadLink.vue?ee41","webpack://app-measurements-selector/./src/components/UI/DownloadLink.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentDownloads.vue?bc2e","webpack://app-measurements-selector/./src/components/UI/InfoModal/ContentDownloads.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/HtmlContent.vue?bf09","webpack://app-measurements-selector/./src/components/UI/InfoModal/HtmlContent.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/InfoModal.vue?8497","webpack://app-measurements-selector/./src/components/UI/InfoModal/InfoModal.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/InfoModal.vue?6bfa","webpack://app-measurements-selector/./src/components/UI/MeasurementsHeightTransition.vue?7cf3","webpack://app-measurements-selector/./src/components/UI/MeasurementsHeightTransition.vue","webpack://app-measurements-selector/./src/components/UI/MeasurementsHeightTransition.vue?f679","webpack://app-measurements-selector/./src/components/accordion/AccordionItem.vue?09ac","webpack://app-measurements-selector/./src/components/accordion/AccordionItem.vue","webpack://app-measurements-selector/./src/components/accordion/AccordionItem.vue?d394","webpack://app-measurements-selector/./src/components/MountingShapePreview.vue","webpack://app-measurements-selector/./src/functions/dom.ts","webpack://app-measurements-selector/./src/components/ShapePreview.vue?5ffd","webpack://app-measurements-selector/./src/components/ShapePreview.vue","webpack://app-measurements-selector/./src/components/ShapePreview.vue?3878","webpack://app-measurements-selector/./src/components/icons/RotateClockwise.vue","webpack://app-measurements-selector/./src/components/icons/RotateClockwise.vue?1080","webpack://app-measurements-selector/./src/components/icons/RotateCounterClockwise.vue","webpack://app-measurements-selector/./src/components/icons/RotateCounterClockwise.vue?7008","webpack://app-measurements-selector/./src/components/icons/ZoomIn.vue","webpack://app-measurements-selector/./src/components/icons/ZoomIn.vue?1876","webpack://app-measurements-selector/./src/components/icons/ZoomOut.vue","webpack://app-measurements-selector/./src/components/icons/ZoomOut.vue?71c7","webpack://app-measurements-selector/./src/components/PreviewButtongroup.vue?8470","webpack://app-measurements-selector/./src/components/PreviewButtongroup.vue","webpack://app-measurements-selector/./src/components/PreviewButtongroup.vue?ffb2","webpack://app-measurements-selector/./src/components/MountingShapePreview.vue?e7c6","webpack://app-measurements-selector/./src/components/UI/ButtonGroup.vue?6f86","webpack://app-measurements-selector/./src/components/UI/ButtonGroup.vue","webpack://app-measurements-selector/./src/components/UI/ButtonGroup.vue?a954","webpack://app-measurements-selector/./src/components/UI/ButtonPrimitive.vue?e74f","webpack://app-measurements-selector/./src/components/UI/ButtonPrimitive.vue","webpack://app-measurements-selector/./src/components/UI/ButtonPrimitive.vue?251c","webpack://app-measurements-selector/./src/components/ShapeSelector.vue?eaa1","webpack://app-measurements-selector/./src/components/ShapeSelector.vue","webpack://app-measurements-selector/./src/components/ShapeSelector.vue?54cb","webpack://app-measurements-selector/./src/components/UI/TextLabel.vue?5687","webpack://app-measurements-selector/./src/components/UI/TextLabel.vue","webpack://app-measurements-selector/./src/components/EditableItem.vue?53d4","webpack://app-measurements-selector/./src/components/EditableItem.vue","webpack://app-measurements-selector/./src/components/EditableItem.vue?3b14","webpack://app-measurements-selector/./src/components/ShapeType.vue?90dc","webpack://app-measurements-selector/./src/components/ShapeType.vue","webpack://app-measurements-selector/./src/components/ShapeType.vue?5033","webpack://app-measurements-selector/./src/functions/analytics.ts","webpack://app-measurements-selector/./src/functions/numbers.ts","webpack://app-measurements-selector/./src/components/UI/InputLabel.vue?d88c","webpack://app-measurements-selector/./src/components/UI/InputLabel.vue","webpack://app-measurements-selector/./src/components/UI/InputGroup.vue?6f4b","webpack://app-measurements-selector/./src/components/UI/InputGroup.vue","webpack://app-measurements-selector/./src/components/UI/DimensionInput.vue?742d","webpack://app-measurements-selector/./src/components/UI/DimensionInput.vue","webpack://app-measurements-selector/./src/components/UI/DimensionInput.vue?700e","webpack://app-measurements-selector/./src/components/UI/ShapeInputFieldsWrapper.vue?d90c","webpack://app-measurements-selector/./src/components/UI/ShapeInputFieldsWrapper.vue","webpack://app-measurements-selector/./src/components/shapes/Rectangle/RectangleDimensionInputs.vue?d34f","webpack://app-measurements-selector/./src/components/shapes/Rectangle/RectangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Rectangle/RectangleDimensionInputs.vue?90be","webpack://app-measurements-selector/./src/components/shapes/RoundedRectangle/RoundedRectangleDimensionInputs.vue?b47a","webpack://app-measurements-selector/./src/components/shapes/RoundedRectangle/RoundedRectangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/RoundedRectangle/RoundedRectangleDimensionInputs.vue?cd8e","webpack://app-measurements-selector/./src/components/shapes/Circle/CircleDimensionInputs.vue?b58e","webpack://app-measurements-selector/./src/components/shapes/Circle/CircleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Circle/CircleDimensionInputs.vue?98f5","webpack://app-measurements-selector/./src/components/shapes/HalfCircle/HalfCircleDimensionInputs.vue?2b69","webpack://app-measurements-selector/./src/components/shapes/HalfCircle/HalfCircleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/HalfCircle/HalfCircleDimensionInputs.vue?d54b","webpack://app-measurements-selector/./src/components/shapes/QuarterCircle/QuarterCircleDimensionInputs.vue?4f48","webpack://app-measurements-selector/./src/components/shapes/QuarterCircle/QuarterCircleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/QuarterCircle/QuarterCircleDimensionInputs.vue?2937","webpack://app-measurements-selector/./src/components/shapes/Ellipse/EllipseDimensionInputs.vue?7806","webpack://app-measurements-selector/./src/components/shapes/Ellipse/EllipseDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Ellipse/EllipseDimensionInputs.vue?da2d","webpack://app-measurements-selector/./src/components/shapes/SlopedRectangle/SlopedRectangleDimensionInputs.vue?c3f1","webpack://app-measurements-selector/./src/components/shapes/SlopedRectangle/SlopedRectangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/SlopedRectangle/SlopedRectangleDimensionInputs.vue?8185","webpack://app-measurements-selector/./src/components/shapes/SlopedRightRectangle/SlopedRightRectangleDimensionInputs.vue?5eab","webpack://app-measurements-selector/./src/components/shapes/SlopedRightRectangle/SlopedRightRectangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/SlopedRightRectangle/SlopedRightRectangleDimensionInputs.vue?0bf9","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangle/RightAngledTriangleDimensionInputs.vue?c7b5","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangle/RightAngledTriangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangle/RightAngledTriangleDimensionInputs.vue?58ca","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangleMirrored/RightAngledTriangleMirroredDimensionInputs.vue?5a69","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangleMirrored/RightAngledTriangleMirroredDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/RightAngledTriangleMirrored/RightAngledTriangleMirroredDimensionInputs.vue?8392","webpack://app-measurements-selector/./src/components/shapes/IsoscelesTriangle/IsoscelesTriangleDimensionInputs.vue?becd","webpack://app-measurements-selector/./src/components/shapes/IsoscelesTriangle/IsoscelesTriangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/IsoscelesTriangle/IsoscelesTriangleDimensionInputs.vue?42f5","webpack://app-measurements-selector/./src/components/shapes/Trapezoid/TrapezoidDimensionInputs.vue?ef17","webpack://app-measurements-selector/./src/components/shapes/Trapezoid/TrapezoidDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Trapezoid/TrapezoidDimensionInputs.vue?2e92","webpack://app-measurements-selector/./src/components/shapes/Hexagon/HexagonDimensionInputs.vue?6820","webpack://app-measurements-selector/./src/components/shapes/Hexagon/HexagonDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Hexagon/HexagonDimensionInputs.vue?5449","webpack://app-measurements-selector/./src/components/shapes/Heart/HeartDimensionInputs.vue?992e","webpack://app-measurements-selector/./src/components/shapes/Heart/HeartDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Heart/HeartDimensionInputs.vue?6a0a","webpack://app-measurements-selector/./src/components/shapes/Arrow/ArrowDimensionInputs.vue?9e01","webpack://app-measurements-selector/./src/components/shapes/Arrow/ArrowDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Arrow/ArrowDimensionInputs.vue?ec86","webpack://app-measurements-selector/./src/components/shapes/Star/StarDimensionInputs.vue?4f8f","webpack://app-measurements-selector/./src/components/shapes/Star/StarDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Star/StarDimensionInputs.vue?11cc","webpack://app-measurements-selector/./src/components/shapes/Text/TextToggle.vue?fcc0","webpack://app-measurements-selector/./src/components/shapes/Text/TextToggle.vue","webpack://app-measurements-selector/./src/components/shapes/Text/TextToggle.vue?3154","webpack://app-measurements-selector/./src/components/shapes/Text/FontOptions.ts","webpack://app-measurements-selector/./src/components/shapes/Text/FontSelect.vue?9e92","webpack://app-measurements-selector/./src/components/shapes/Text/FontSelect.vue","webpack://app-measurements-selector/./src/components/shapes/Text/FontSelect.vue?ef12","webpack://app-measurements-selector/./src/components/UI/TextNotice.vue?57e8","webpack://app-measurements-selector/./src/components/UI/TextNotice.vue","webpack://app-measurements-selector/./src/components/UI/TextNotice.vue?1e0d","webpack://app-measurements-selector/./src/components/icons/InfoCircleDark.vue","webpack://app-measurements-selector/./src/components/icons/InfoCircleDark.vue?f797","webpack://app-measurements-selector/./src/components/shapes/Text/TextDimensionInputs.vue?edb6","webpack://app-measurements-selector/./src/components/shapes/Text/TextDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Text/TextDimensionInputs.vue?6cb6","webpack://app-measurements-selector/./src/components/shapes/ArchedRectangle/ArchedRectangleDimensionInputs.vue?fd8b","webpack://app-measurements-selector/./src/components/shapes/ArchedRectangle/ArchedRectangleDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/ArchedRectangle/ArchedRectangleDimensionInputs.vue?18cd","webpack://app-measurements-selector/./src/components/shapes/ShapeFieldsMissing.vue","webpack://app-measurements-selector/./src/components/shapes/ShapeFieldsMissing.vue?9d8b","webpack://app-measurements-selector/./src/components/icons/WarningIcon.vue","webpack://app-measurements-selector/./src/components/icons/WarningIcon.vue?3e8b","webpack://app-measurements-selector/./src/components/UI/ValidationMessage.vue?bd0d","webpack://app-measurements-selector/./src/components/UI/ValidationMessage.vue","webpack://app-measurements-selector/./src/components/shapes/FlatOval/FlatOvalDimensionInputs.vue?1528","webpack://app-measurements-selector/./src/components/shapes/FlatOval/FlatOvalDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/FlatOval/FlatOvalDimensionInputs.vue?d929","webpack://app-measurements-selector/./src/components/shapes/Octagon/OctagonDimensionInputs.vue?3598","webpack://app-measurements-selector/./src/components/shapes/Octagon/OctagonDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Octagon/OctagonDimensionInputs.vue?94b6","webpack://app-measurements-selector/./src/components/shapes/Droplet/DropletDimensionInputs.vue?cf49","webpack://app-measurements-selector/./src/components/shapes/Droplet/DropletDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Droplet/DropletDimensionInputs.vue?0038","webpack://app-measurements-selector/./src/components/shapes/Polygon/PolygonDimensionInputs.vue?098b","webpack://app-measurements-selector/./src/components/shapes/Polygon/PolygonDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Polygon/PolygonDimensionInputs.vue?0f04","webpack://app-measurements-selector/./src/components/shapes/Egg/EggDimensionInputs.vue?9e3d","webpack://app-measurements-selector/./src/components/shapes/Egg/EggDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Egg/EggDimensionInputs.vue?f8f1","webpack://app-measurements-selector/./src/components/shapes/Kite/KiteDimensionInputs.vue?1698","webpack://app-measurements-selector/./src/components/shapes/Kite/KiteDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Kite/KiteDimensionInputs.vue?a027","webpack://app-measurements-selector/./src/components/shapes/Barrel/BarrelDimensionInputs.vue?7545","webpack://app-measurements-selector/./src/components/shapes/Barrel/BarrelDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Barrel/BarrelDimensionInputs.vue?71c6","webpack://app-measurements-selector/./src/components/shapes/Jewel/JewelDimensionInputs.vue?308d","webpack://app-measurements-selector/./src/components/shapes/Jewel/JewelDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Jewel/JewelDimensionInputs.vue?1dfd","webpack://app-measurements-selector/./src/components/shapes/Parallelogram/ParallelogramDimensionInputs.vue?e33c","webpack://app-measurements-selector/./src/components/shapes/Parallelogram/ParallelogramDimensionInputs.vue","webpack://app-measurements-selector/./src/components/shapes/Parallelogram/ParallelogramDimensionInputs.vue?9f9f","webpack://app-measurements-selector/./src/components/shapes/ShapeHelper.ts","webpack://app-measurements-selector/./src/utilities/EmptySlotCheck.ts","webpack://app-measurements-selector/./src/components/UI/MessageContainer.vue?5d69","webpack://app-measurements-selector/./src/components/UI/MessageContainer.vue","webpack://app-measurements-selector/./src/components/ShapeInputs.vue?3d4d","webpack://app-measurements-selector/./src/components/ShapeInputs.vue","webpack://app-measurements-selector/./src/components/ShapeInputs.vue?6134","webpack://app-measurements-selector/./src/components/ShapeSettings.vue?080b","webpack://app-measurements-selector/./src/components/ShapeSettings.vue","webpack://app-measurements-selector/./src/components/ShapeSettings.vue?23a9","webpack://app-measurements-selector/./src/components/MetaInformation.vue?364c","webpack://app-measurements-selector/./src/components/MetaInformation.vue","webpack://app-measurements-selector/./src/functions/prices.ts","webpack://app-measurements-selector/./src/components/BulkPriceTable.vue","webpack://app-measurements-selector/./src/functions/cache.ts","webpack://app-measurements-selector/./src/components/FormattedPrice.vue","webpack://app-measurements-selector/./src/components/FormattedPrice.vue?db0e","webpack://app-measurements-selector/./src/components/BulkPriceTable.vue?e174","webpack://app-measurements-selector/./src/components/PriceStructureComponent.vue","webpack://app-measurements-selector/./src/components/PriceStructureComponent.vue?3179","webpack://app-measurements-selector/./src/Models/PriceCalculator.ts","webpack://app-measurements-selector/./src/components/ShareButton.vue","webpack://app-measurements-selector/./src/components/icons/ShareIcon.vue","webpack://app-measurements-selector/./src/components/icons/ShareIcon.vue?53cb","webpack://app-measurements-selector/./src/components/ShareButton.vue?a5b6","webpack://app-measurements-selector/./src/components/ShareModal.vue","webpack://app-measurements-selector/./src/components/icons/EmailIcon.vue","webpack://app-measurements-selector/./src/components/icons/EmailIcon.vue?5ee0","webpack://app-measurements-selector/./src/components/icons/WhatsApp.vue","webpack://app-measurements-selector/./src/components/icons/WhatsApp.vue?751b","webpack://app-measurements-selector/./src/components/ShareModal.vue?d0c3","webpack://app-measurements-selector/./src/components/StoreButton.vue","webpack://app-measurements-selector/./src/components/StoreButton.vue?51da","webpack://app-measurements-selector/./src/components/StoreModal.vue","webpack://app-measurements-selector/./src/components/StoreModal.vue?52c2","webpack://app-measurements-selector/./src/components/icons/ChevronRightIcon.vue","webpack://app-measurements-selector/./src/components/icons/ChevronRightIcon.vue?2544","webpack://app-measurements-selector/./src/components/MetaInformation.vue?24e1","webpack://app-measurements-selector/./src/components/UI/ButtonStrip.vue?66ae","webpack://app-measurements-selector/./src/components/UI/ButtonStrip.vue","webpack://app-measurements-selector/./src/components/UI/ButtonStrip.vue?00cc","webpack://app-measurements-selector/./src/Models/DrillHoleConfigurations/RadialDrillHoleConfiguration.ts","webpack://app-measurements-selector/./src/Models/DrillHoleConfigurations/GridDrillHoleConfiguration.ts","webpack://app-measurements-selector/./src/Models/DrillHoleConfigurations/EdgeDrillHoleConfiguration.ts","webpack://app-measurements-selector/./src/Models/DrillHoleConfigurations/NullDrillHoleConfiguration.ts","webpack://app-measurements-selector/./src/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory.ts","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeCorner.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeCorner.vue?3535","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeAround.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeAround.vue?e7db","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeTopBottom.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeTopBottom.vue?4688","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeLeftRight.vue","webpack://app-measurements-selector/./src/components/icons/DrillHoleEdgeTypeLeftRight.vue?1e41","webpack://app-measurements-selector/./src/Models/DrillHoleGenerators/Invalid.ts","webpack://app-measurements-selector/./src/Models/Lines/OffsetLine.ts","webpack://app-measurements-selector/../source/js/shared/rendering/makerjs.js","webpack://app-measurements-selector/./src/functions/lengths.ts","webpack://app-measurements-selector/./src/Models/DrillHole.ts","webpack://app-measurements-selector/./src/types/step.ts","webpack://app-measurements-selector/./src/Models/DrillHoleGenerators/Shape.ts","webpack://app-measurements-selector/./src/Models/DrillHoleGenerators/Trapezoid.ts","webpack://app-measurements-selector/./src/Models/DrillHoleGenerators/RoundedRectangle.ts","webpack://app-measurements-selector/./src/Models/ShapeDrillHoleGeneratorFactory.ts","webpack://app-measurements-selector/./src/components/DrillHoleEdgeCounts.vue?d604","webpack://app-measurements-selector/./src/components/DrillHoleEdgeCounts.vue","webpack://app-measurements-selector/./src/components/DrillHoleEdgeCounts.vue?17fe","webpack://app-measurements-selector/./src/components/DrillHoleEdgeTypes.vue?8059","webpack://app-measurements-selector/./src/components/DrillHoleEdgeTypes.vue","webpack://app-measurements-selector/./src/components/DrillHoleEdgeTypes.vue?4002","webpack://app-measurements-selector/./src/components/DrillHoleCustom.vue?95de","webpack://app-measurements-selector/./src/components/DrillHoleCustom.vue","webpack://app-measurements-selector/./src/components/DrillHoleCustom.vue?8d18","webpack://app-measurements-selector/./src/components/DrillHoleRadialSettings.vue?612e","webpack://app-measurements-selector/./src/components/DrillHoleRadialSettings.vue","webpack://app-measurements-selector/./src/components/DrillHoleRadialSettings.vue?97eb","webpack://app-measurements-selector/./src/components/DrillHoleGridSettings.vue?2ba0","webpack://app-measurements-selector/./src/components/DrillHoleGridSettings.vue","webpack://app-measurements-selector/./src/components/DrillHoleGridSettings.vue?790d","webpack://app-measurements-selector/./src/components/DrillHolePreset.vue?e54a","webpack://app-measurements-selector/./src/components/DrillHolePreset.vue","webpack://app-measurements-selector/./src/components/DrillHolePreset.vue?11c9","webpack://app-measurements-selector/./src/components/DrillHoles.vue?d67a","webpack://app-measurements-selector/./src/components/DrillHoles.vue","webpack://app-measurements-selector/./src/components/DrillHoles.vue?b5f5","webpack://app-measurements-selector/./src/components/CutoutPosition.vue?8f10","webpack://app-measurements-selector/./src/components/CutoutPosition.vue","webpack://app-measurements-selector/./src/components/CutoutPosition.vue?116f","webpack://app-measurements-selector/./src/Models/CutoutTypes.ts","webpack://app-measurements-selector/./src/components/CutoutType.vue?c00e","webpack://app-measurements-selector/./src/components/CutoutType.vue","webpack://app-measurements-selector/./src/components/CutoutType.vue?96c1","webpack://app-measurements-selector/./src/components/CutoutsConfiguration.vue?85b8","webpack://app-measurements-selector/./src/components/CutoutsConfiguration.vue","webpack://app-measurements-selector/./src/components/CutoutsConfiguration.vue?2c1b","webpack://app-measurements-selector/./src/utilities/Client.ts","webpack://app-measurements-selector/./src/components/ShapeUpload.vue?3e27","webpack://app-measurements-selector/./src/components/ShapeUpload.vue","webpack://app-measurements-selector/./src/components/ShapeUpload.vue?43f0","webpack://app-measurements-selector/./src/components/SideSelection.vue","webpack://app-measurements-selector/./src/utilities/SVGPreview.ts","webpack://app-measurements-selector/./src/components/UI/OptionSelector.vue?1a4a","webpack://app-measurements-selector/./src/components/UI/OptionSelector.vue","webpack://app-measurements-selector/./src/components/UI/OptionSelectorWrapper.vue","webpack://app-measurements-selector/./src/components/UI/OptionSelectorWrapper.vue?0f5e","webpack://app-measurements-selector/./src/components/SideToggle.vue?a63d","webpack://app-measurements-selector/./src/components/SideToggle.vue","webpack://app-measurements-selector/./src/components/SideToggle.vue?9128","webpack://app-measurements-selector/./src/components/SideSelection.vue?1449","webpack://app-measurements-selector/./src/components/EdgeFinish.vue?ce02","webpack://app-measurements-selector/./src/components/EdgeFinish.vue","webpack://app-measurements-selector/./src/components/EdgeFinish.vue?27e3","webpack://app-measurements-selector/./src/components/ThicknessSelector.vue?7858","webpack://app-measurements-selector/./src/components/ThicknessSelector.vue","webpack://app-measurements-selector/./src/components/ThicknessSelector.vue?f156","webpack://app-measurements-selector/./src/components/MaterialSelector.vue?3aa4","webpack://app-measurements-selector/./src/components/MaterialSelector.vue","webpack://app-measurements-selector/./src/components/MaterialSelector.vue?b2ad","webpack://app-measurements-selector/./src/components/HeaderPricingInformation.vue?946a","webpack://app-measurements-selector/./src/components/HeaderPricingInformation.vue","webpack://app-measurements-selector/./src/components/HeaderPricingInformation.vue?1d13","webpack://app-measurements-selector/./src/components/icons/RulerIcon.vue","webpack://app-measurements-selector/./src/components/icons/RulerIcon.vue?cb07","webpack://app-measurements-selector/./src/components/UI/InfoModal/InstructionsButton.vue?41d9","webpack://app-measurements-selector/./src/components/UI/InfoModal/InstructionsButton.vue","webpack://app-measurements-selector/./src/components/UI/InfoModal/InstructionsButton.vue?9b93","webpack://app-measurements-selector/./src/App.vue?2a5e","webpack://app-measurements-selector/./src/App.vue","webpack://app-measurements-selector/./src/App.vue?7ccd","webpack://app-measurements-selector/./src/Models/EnclosedShape.ts","webpack://app-measurements-selector/./src/Models/Lines/DimensionLine.ts","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Area.js","webpack://app-measurements-selector/./src/Models/Shapes/AbstractShape.ts","webpack://app-measurements-selector/./src/Models/Shapes/Text.ts","webpack://app-measurements-selector/./src/functions/strings.ts","webpack://app-measurements-selector/./src/Models/Validators/AbstractValidator.ts","webpack://app-measurements-selector/./src/Models/Validators/MaximumDecimalPoints.ts","webpack://app-measurements-selector/./src/Models/Validators/MinimumValue.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/ArrowConfiguration.ts","webpack://app-measurements-selector/./src/Models/Validators/MaximumValue.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/CircleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/EllipseConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/HalfCircleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/HeartConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/HexagonConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/IsoscelesTriangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/NullConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/QuarterCircleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/RectangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/RightAngledTriangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/RoundedRectangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/Validators/GroupedValidator.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/SlopedRectangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/Validators/MinimumRatio.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/ArchedRectangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/StarConfiguration.ts","webpack://app-measurements-selector/./src/Models/Validators/MaximumTextValue.ts","webpack://app-measurements-selector/./src/Models/Validators/MinimumTextValue.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/TextConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/TrapezoidConfiguration.ts","webpack://app-measurements-selector/./src/Models/Validators/OrValidator.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/FlatOvalConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/SlopedRightRectangleConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/OctagonConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/DropletConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/PolygonConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/EggConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/KiteConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/BarrelConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/JewelConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/ParallelogramConfiguration.ts","webpack://app-measurements-selector/./src/Models/ShapeConfigurations/ShapeConfigurationFactory.ts","webpack://app-measurements-selector/./src/utilities/ShapeValidator.ts","webpack://app-measurements-selector/./src/Models/Cutout.ts","webpack://app-measurements-selector/./src/store/modules/cutoutState.ts","webpack://app-measurements-selector/./src/Models/EdgeDrillHoles.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/AbstractValidatorSet.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/RadialDrillHoleValidatorSet.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/GridDrillHoleValidatorSet.ts","webpack://app-measurements-selector/./src/Models/Validators/IsUnique.ts","webpack://app-measurements-selector/./src/Models/Validators/CustomDrillHoleMissingValidator.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/CustomDrillHoleValidatorSet.ts","webpack://app-measurements-selector/./src/Models/Validators/ArrayContains.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/EdgeDrillHoleValidatorSet.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/NullValidatorSet.ts","webpack://app-measurements-selector/./src/Models/RadialDrillHoles.ts","webpack://app-measurements-selector/./src/Models/GridDrillHoles.ts","webpack://app-measurements-selector/./src/Models/PresetDrillHoles.ts","webpack://app-measurements-selector/./src/utilities/Validator.ts","webpack://app-measurements-selector/./src/Models/Validators/Sets/PresetDrillHoleValidatorSet.ts","webpack://app-measurements-selector/./src/utilities/decorators/ShapeModelDecorator.ts","webpack://app-measurements-selector/./src/utilities/decorators/DimensionLineDecorator.ts","webpack://app-measurements-selector/./src/utilities/decorators/CutoutMoveDecorator.ts","webpack://app-measurements-selector/./src/utilities/decorators/DrillHoleDecorator.ts","webpack://app-measurements-selector/./src/utilities/decorators/CutoutRotationDecorator.ts","webpack://app-measurements-selector/./src/utilities/decorators/CutoutModelDecorator.ts","webpack://app-measurements-selector/./src/store/modules/drillHoleState.ts","webpack://app-measurements-selector/./src/store/modules/fonts.ts","webpack://app-measurements-selector/./src/store/modules/uiState.ts","webpack://app-measurements-selector/./src/utilities/API.ts","webpack://app-measurements-selector/./src/store/modules/config.ts","webpack://app-measurements-selector/./src/Models/Validators/Offset.ts","webpack://app-measurements-selector/./src/Models/Validators/CutoutMissingValidator.ts","webpack://app-measurements-selector/./src/store/modules/validation.ts","webpack://app-measurements-selector/./src/Models/Shapes/Arrow.ts","webpack://app-measurements-selector/./src/Models/Shapes/Ellipse.ts","webpack://app-measurements-selector/./src/Models/Shapes/HalfCircle.ts","webpack://app-measurements-selector/./src/Models/Shapes/Circle.ts","webpack://app-measurements-selector/./src/Models/Shapes/Heart.ts","webpack://app-measurements-selector/./src/Models/Shapes/Hexagon.ts","webpack://app-measurements-selector/./src/Models/Shapes/IsoscelesTriangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/QuarterCircle.ts","webpack://app-measurements-selector/./src/Models/Shapes/Rectangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/RightAngledTriangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/RightAngledTriangleMirrored.ts","webpack://app-measurements-selector/./src/Models/Lines/GuideLine.ts","webpack://app-measurements-selector/./src/Models/Shapes/RoundedRectangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/SlopedRectangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/ArchedRectangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/Trapezoid.ts","webpack://app-measurements-selector/./src/Models/Shapes/Star.ts","webpack://app-measurements-selector/./src/Models/Shapes/DXF.ts","webpack://app-measurements-selector/./src/Models/Shapes/FlatOval.ts","webpack://app-measurements-selector/./src/Models/Shapes/SlopedRightRectangle.ts","webpack://app-measurements-selector/./src/Models/Shapes/Octagon.ts","webpack://app-measurements-selector/./src/Models/Shapes/Droplet.ts","webpack://app-measurements-selector/./src/Models/Shapes/Polygon.ts","webpack://app-measurements-selector/./src/Models/Shapes/Egg.ts","webpack://app-measurements-selector/./src/Models/Shapes/Kite.ts","webpack://app-measurements-selector/./src/Models/Shapes/Barrel.ts","webpack://app-measurements-selector/./src/Models/Shapes/Jewel.ts","webpack://app-measurements-selector/./src/Models/Shapes/Parallelogram.ts","webpack://app-measurements-selector/./src/Models/Shapes/PreviewShapeFactory.ts","webpack://app-measurements-selector/./src/store/modules/shapes/rectangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/rounded-rectangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/circle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/half-circle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/quarter-circle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/egg.ts","webpack://app-measurements-selector/./src/store/modules/shapes/ellipse.ts","webpack://app-measurements-selector/./src/store/modules/shapes/flat-oval.ts","webpack://app-measurements-selector/./src/store/modules/shapes/sloped-rectangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/sloped-right-rectangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/arched-rectangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/isosceles-triangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/right-angled-triangle.ts","webpack://app-measurements-selector/./src/store/modules/shapes/right-angled-triangle-mirrored.ts","webpack://app-measurements-selector/./src/store/modules/shapes/trapezoid.ts","webpack://app-measurements-selector/./src/store/modules/shapes/hexagon.ts","webpack://app-measurements-selector/./src/store/modules/shapes/octagon.ts","webpack://app-measurements-selector/./src/store/modules/shapes/polygon.ts","webpack://app-measurements-selector/./src/store/modules/shapes/heart.ts","webpack://app-measurements-selector/./src/store/modules/shapes/star.ts","webpack://app-measurements-selector/./src/store/modules/shapes/arrow.ts","webpack://app-measurements-selector/./src/store/modules/shapes/kite.ts","webpack://app-measurements-selector/./src/store/modules/shapes/barrel.ts","webpack://app-measurements-selector/./src/store/modules/shapes/jewel.ts","webpack://app-measurements-selector/./src/store/modules/shapes/text.ts","webpack://app-measurements-selector/./src/store/modules/shapes/dxf.ts","webpack://app-measurements-selector/./src/store/modules/shapes/droplet.ts","webpack://app-measurements-selector/./src/store/modules/shapes/parallelogram.ts","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Rectangle.js","webpack://app-measurements-selector/./src/Models/Shapes/Fallback.ts","webpack://app-measurements-selector/./src/store/modules/shapeState.ts","webpack://app-measurements-selector/../source/js/shared/models/Geometry/AbstractShape.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/CircleFraction.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Circle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/NullShape.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/AbstractRightAngledTriangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/RightAngledTriangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/RightAngledTriangleMirrored.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Ellipse.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Egg.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/RoundedRectangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/IsoscelesTriangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/HalfCircle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/QuarterCircle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Hexagon.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Octagon.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Polygon.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Arrow.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Star.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/SlopedRectangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/SlopedRightRectangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/ArchedRectangle.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Heart.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Text.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Trapezoid.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/FlatOval.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Kite.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Barrel.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Jewel.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Droplet.js","webpack://app-measurements-selector/../source/js/shared/models/Geometry/Parallelogram.js","webpack://app-measurements-selector/../source/js/shared/models/ShapeFactory.js","webpack://app-measurements-selector/./src/store/modules/edgeFinishStore.ts","webpack://app-measurements-selector/./src/Models/Pricing/PricingGroup.ts","webpack://app-measurements-selector/./src/store/modules/fileUploadState.ts","webpack://app-measurements-selector/./src/presets/AbstractPreset.ts","webpack://app-measurements-selector/./src/presets/CircleCircleNone.ts","webpack://app-measurements-selector/./src/presets/RoundedrectangleNoneCustom.ts","webpack://app-measurements-selector/./src/presets/CircleNoneCustom.ts","webpack://app-measurements-selector/./src/presets/RectangleCircleNone.ts","webpack://app-measurements-selector/./src/presets/RectangleNoneCustom.ts","webpack://app-measurements-selector/./src/presets/RectangleNoneEdges.ts","webpack://app-measurements-selector/./src/presets/RectangleRectangleEdges.ts","webpack://app-measurements-selector/./src/presets/RectangleRectangleNone.ts","webpack://app-measurements-selector/./src/presets/RectangleRectangleCustom.ts","webpack://app-measurements-selector/./src/presets/CircleNoneRadial.ts","webpack://app-measurements-selector/./src/presets/RectangleNoneGrid.ts","webpack://app-measurements-selector/./src/presets/RoundedrectangleNoneEdges.ts","webpack://app-measurements-selector/./src/presets/RectangleRoundedrectangleNone.ts","webpack://app-measurements-selector/./src/presets/PresetFactory.ts","webpack://app-measurements-selector/./src/store/index.ts","webpack://app-measurements-selector/./src/main.ts","webpack://app-measurements-selector/./src/webworker.ts","webpack://app-measurements-selector/webpack/bootstrap","webpack://app-measurements-selector/webpack/runtime/chunk loaded","webpack://app-measurements-selector/webpack/runtime/compat get default export","webpack://app-measurements-selector/webpack/runtime/define property getters","webpack://app-measurements-selector/webpack/runtime/ensure chunk","webpack://app-measurements-selector/webpack/runtime/get javascript chunk filename","webpack://app-measurements-selector/webpack/runtime/get mini-css chunk filename","webpack://app-measurements-selector/webpack/runtime/global","webpack://app-measurements-selector/webpack/runtime/hasOwnProperty shorthand","webpack://app-measurements-selector/webpack/runtime/load script","webpack://app-measurements-selector/webpack/runtime/make namespace object","webpack://app-measurements-selector/webpack/runtime/node module decorator","webpack://app-measurements-selector/webpack/runtime/publicPath","webpack://app-measurements-selector/webpack/runtime/jsonp chunk loading","webpack://app-measurements-selector/webpack/startup"],"sourcesContent":["export function detectBrowser(): string {\n\tconst browsers = [ \"Chrome\", \"MSIE\", \"Firefox\", \"Safari\", \"OP\" ];\n\n\tconst matches = browsers.filter( ( browser ): boolean => {\n\t\treturn navigator.userAgent.indexOf( browser ) > -1;\n\t} );\n\n\tif ( matches.length === 0 ) {\n\t\treturn \"Unknown\";\n\t}\n\n\t// Disregard Chrome and Safari since it also matches Opera.\n\tif ( matches.includes( \"OP\" ) ) {\n\t\treturn \"Opera\";\n\t}\n\n\t// Discard Safari since it also matches Chrome.\n\tif ( matches.includes( \"Chrome\" ) && matches.includes( \"Safari\" ) ) {\n\t\treturn \"Chrome\";\n\t}\n\n\treturn matches[0];\n}\n","export default class Length {\n\tconstructor( millimeters ) {\n\t\tthis.millimeters = millimeters;\n\t}\n\n\tstatic from_m( meters ) {\n\t\treturn new Length( meters * 1000 );\n\t}\n\n\tstatic from_cm( centimeters ) {\n\t\treturn new Length( centimeters * 10 );\n\t}\n\n\tstatic from_mm( millimeters ) {\n\t\treturn new Length( millimeters );\n\t}\n\n\tin_m() {\n\t\treturn this.millimeters / 1000;\n\t}\n\n\tin_cm() {\n\t\treturn this.millimeters / 10;\n\t}\n\n\tin_cm_i18n() {\n\t\tconst locale = window.measurementSelectorVariables?.shop?.locale.replace( '_', '-' ) || 'nl-NL';\n\t\treturn this.in_cm().toLocaleString( locale, { minimumFractionDigits: 0, maximumFractionDigits: 1 } );\n\t}\n\n\tin_mm() {\n\t\treturn this.millimeters;\n\t}\n\n\tadd( length ) {\n\t\treturn new Length( this.in_mm() + length.in_mm() );\n\t}\n\n\tsubtract( length ) {\n\t\treturn new Length( this.in_mm() - length.in_mm() );\n\t}\n\n\tmax( length ) {\n\t\treturn new Length( Math.max( this.in_mm(), length.in_mm() ) );\n\t}\n\n\tmin( length ) {\n\t\treturn new Length( Math.min( this.in_mm(), length.in_mm() ) );\n\t}\n\n\tmultiply( int ) {\n\t\treturn new Length( this.millimeters * int );\n\t}\n\n\tdivide( by ) {\n\t\treturn new Length( this.millimeters / by );\n\t}\n\n\tabs() {\n\t\treturn new Length( Math.abs( this.millimeters ) );\n\t}\n\n\tround( decimals = 2 ) {\n\t\treturn new Length( Number( Math.round( this.millimeters + 'e' + decimals ) + 'e-' + decimals ) );\n\t}\n\n\tis_lesser_than( length ) {\n\t\treturn this.millimeters < length.in_mm();\n\t}\n}\n","import PromiseWorker from \"promise-worker\";\nimport makerjs, {ICombineOptions, IModel, IPoint} from \"makerjs\";\nimport { optimize } from 'svgo/dist/svgo.browser';\nimport parse from 'parse-svg-path';\n\nimport map from \"lodash/map\";\nimport isEmpty from \"lodash/isEmpty\";\nimport every from \"lodash/every\";\nimport some from \"lodash/some\";\n\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport isUndefined from \"lodash/isUndefined\";\nimport {Helper} from \"dxf-mod\";\n\n/*\n * Loads a web worker with the help of the Webpack worker-loader.\n *\n * With Webpack5+ this can be converted to `new Worker(new URL(\"@/webworker\", import.meta.url))`\n *\n * @see https://github.com/webpack/webpack/issues/6472\n */\nasync function loadWorker() { // eslint-disable-line @typescript-eslint/explicit-function-return-type\n\tlet Worker;\n\n\t// We only want to use the 'dirty' inline version when using the dev server\n\tif ( process.env.NODE_ENV === 'production' ) { // eslint-disable-line no-undef\n\t\tWorker = await require( 'worker-loader!@/webworker' ); // eslint-disable-line no-undef\n\t} else {\n\t\tWorker = await require( 'worker-loader?inline=fallback!@/webworker' ); // eslint-disable-line no-undef\n\t}\n\n\treturn Worker.default;\n}\n\nlet worker = null;\n\n/**\n * Returns a cached worker instance.\n */\nasync function getWorker(): Promise<PromiseWorker> {\n\tif ( worker === null ) {\n\t\tconst Worker = await loadWorker();\n\n\t\tworker = new PromiseWorker( new Worker() );\n\t}\n\n\treturn worker;\n}\n\nexport async function combineUnionCharacters( model ) { // eslint-disable-line @typescript-eslint/explicit-function-return-type\n\tconst worker = await getWorker();\n\n\treturn await worker.postMessage( {\n\t\ttype: 'combine-union-characters',\n\t\tmodel,\n\t} );\n}\n\nexport function getContainingModelExceedances( model: IModel, containingModel: IModel ): IModel[] {\n\n\t// We need to create this object to ensure we get references to the deleted paths.\n\tconst combineOptions: ICombineOptions = {};\n\n\tmakerjs.model.combine( containingModel, model, true, true, true, false, combineOptions );\n\n\tif ( combineOptions.out_deleted && ! isEmpty( combineOptions.out_deleted[ 1 ].paths ) ) {\n\t\treturn combineOptions.out_deleted;\n\t}\n\n\treturn [];\n}\n\n/**\n * Extracts the polygons from the model.\n *\n * @returns {object[]} The extracted polygons.\n */\nfunction extractPolygons( model: IModel ): object[] {\n\tif ( ! model.paths ) {\n\t\treturn [ { x: 0, y: 0 } ];\n\t}\n\n\tconst mapped = map( model.paths, ( path ) => {\n\t\tif ( ! path.end ) {\n\t\t\treturn { x: 0, y: 0 };\n\t\t}\n\n\t\treturn { x: path.end[ 0 ], y: path.end[ 1 ] };\n\t} );\n\n\t// Manually add a point that is halfway the arc. Only applies to half-circles.\n\tif ( model.type && model.type === 'half-circle' ) {\n\t\tmapped.push( { x: model.paths.arc.origin[ 0 ], y: model.paths.arc[ 'radius' ] } );\n\t}\n\n\treturn mapped;\n}\n\n/**\n * Calculates the area based on the extracted polygons.\n *\n * @returns {number} The area.\n */\nfunction calculateArea( polygons: object[] ): number {\n\tlet area = 0, i, j, point1, point2;\n\n\tfor( i = 0, j = polygons.length - 1; i < polygons.length; j = i, i+= 1 ) {\n\t\tpoint1 = polygons[ i ];\n\t\tpoint2 = polygons[ j ];\n\n\t\tarea += point1.x * point2.y;\n\t\tarea -= point1.y * point2.x;\n\t}\n\n\tarea /= 2;\n\n\treturn area;\n}\n\n/**\n * Calculates the centroid point.\n *\n * @returns {Length[]} The X and Y-coordinates of the centroid.\n */\nexport function centroid( model: IModel ): Length[] {\n\tconst polygons = extractPolygons( model );\n\n\tlet x = 0, y = 0, i, j, area, point1, point2;\n\n\tfor ( i = 0, j = polygons.length - 1; i < polygons.length; j = i, i += 1 ) {\n\t\tpoint1 = polygons[ i ];\n\t\tpoint2 = polygons[ j ];\n\n\t\tarea = point1.x * point2.y - point2.x * point1.y;\n\t\tx += ( point1.x + point2.x ) * area;\n\t\ty += ( point1.y + point2.y ) * area;\n\t}\n\n\tarea = calculateArea( polygons ) * 6;\n\n\treturn [ Length.from_cm( x / area ), Length.from_cm( y / area ) ];\n}\n\n/**\n * Fillets the passed model.\n *\n * @param {IModel} model The model whose submodels will be filleted.\n * @param {Length} fillet The fillet to be added.\n *\n * @returns {IModel} The resulting model.\n */\nexport function filletModel( model: IModel, fillet: Length, reverse = false ): IModel {\n\n\tconst filletToUse = reverse ? { left: 0, right: ( fillet.in_mm() ) } : { left: ( fillet.in_mm() ), right: 0 };\n\n\tconst chains = makerjs.model.findChains( model as IModel, { contain: { alternateDirection: true }, pointMatchingDistance: fillet.in_cm() } );\n\tif(!chains || chains.length === 0) {\n\t\treturn model;\n\t}\n\n\tfor(let i = 0; i < chains.length; i++) {\n\t\tconst chain = chains[i];\n\t\tif(chain.links.length > 1) {\n\t\t\tconst filletModel = makerjs.chain.fillet(chain, filletToUse );\n\n\t\t\tif(!isEmpty(filletModel)) {\n\t\t\t\tmakerjs.model.addModel(model, filletModel, 'fillets'+i);\n\t\t\t}\n\t\t}\n\n\t\tif(typeof chain.contains !== 'undefined' && chain.contains.length > 0) {\n\t\t\tfor(let j = 0; j < chain.contains.length; j++) {\n\t\t\t\tconst childChain = chain.contains[j];\n\t\t\t\tif(childChain.links.length > 1) {\n\t\t\t\t\tconst filletModel = makerjs.chain.fillet(childChain, filletToUse );\n\n\t\t\t\t\tif(!isEmpty(filletModel)) {\n\t\t\t\t\t\tmakerjs.model.addModel(model, filletModel, 'fillets' + i + '.' + j);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn model;\n}\n\nexport function generateArrow( length: number, scale: number ): IModel {\n\tconst hs = 4 * scale;\n\tconst paths = {};\n\n\tpaths[ 'right-up' ] = new makerjs.paths.Line( [ length, 0 ], [ length-hs, hs ] );\n\tpaths[ 'right-down' ] = new makerjs.paths.Line( [ length, 0 ], [ length-hs, -hs ] );\n\n\tpaths[ 'main' ] = new makerjs.paths.Line( [ 0, 0 ], [ length, 0 ] );\n\n\tpaths[ 'left-up' ] = new makerjs.paths.Line( [ 0, 0 ], [ hs, -hs] );\n\tpaths[ 'left-down' ] = new makerjs.paths.Line( [ 0, 0 ], [ hs, hs ] );\n\n\treturn { models: { arrow: { paths } } };\n}\n\nexport function generateExtensionLine( length: number ): IModel {\n\tconst ms = length / 2;\n\tconst paths = {};\n\n\tpaths[ 'left' ] = new makerjs.paths.Line( [ 0, -ms ], [ 0, 2 * ms ] );\n\tpaths[ 'right' ] = new makerjs.paths.Line( [ length, -ms ], [ length, 2 * ms ] );\n\n\tpaths[ 'main' ] = new makerjs.paths.Line( [ 0, -ms ], [ length, -ms ] );\n\n\treturn { models: { extension_line: { paths } } };\n}\n\n/**\n * Checks whether the passed model completely falls inside the parent model by checking the first model's points.\n *\n * @param {IModel} model The model to check.\n * @param {IModel} parentModel The parent model to check against.\n * @param {boolean} allowPartial Whether to count partial overlapping to be considered valid.\n *\n * @returns {boolean} Whether the first model completely falls inside the second model.\n */\nexport function isModelInsideParent( model: IModel, parentModel: IModel, allowPartial = false ): boolean {\n\tconst route = [ \"models\", \"modelMidPoint\" ];\n\tlet result = true;\n\n\tconst results = [];\n\n\tconst callback = allowPartial ? some : every;\n\n\tconst options = {\n\t\tonPath: ( path ): void => {\n\t\t\tlet points = makerjs.path.toKeyPoints( path.pathContext );\n\n\t\t\tpoints = points.map( ( point ) => {\n\t\t\t\treturn makerjs.point.add( point, path.offset );\n\t\t\t} );\n\n\t\t\tresult = callback( points, ( p ) => makerjs.measure.isPointInsideModel( p, parentModel ) );\n\t\t\tresults.push( result );\n\t\t}\n\t};\n\n\tmakerjs.model.walk( model, options );\n\n\treturn callback( results );\n}\n\n// Chain a model to create one path\nexport function chainModel(model: IModel): IModel {\n\tlet completeModel = {\n\t\tmodels: {\n\t\t\tshapeModel: {\n\t\t\t\tmodels: {},\n\t\t\t},\n\t\t\tcutoutModel: {\n\t\t\t\tmodels: {},\n\t\t\t},\n\t\t}\n\t} as IModel;\n\tconst cutoutModel = {} as IModel;\n\n\t// Get model keys\n\tconst keys = Object.keys(model.models);\n\n\tconst chains = makerjs.model.findChains(model, {contain: true});\n\tif(Array.isArray(chains) && chains.length > 0) {\n\t\tchains.forEach((chain, index) => {\n\t\t\tconst chainModel = makerjs.chain.toNewModel(chain, true);\n\t\t\tchainModel[ 'originalKey' ] = keys[index] ?? null;\n\t\t\tmakerjs.model.addModel(completeModel.models.shapeModel, chainModel, `baseModel`);\n\n\t\t\tif(Array.isArray(chain.contains) && chain.contains.length > 0) {\n\t\t\t\tchain.contains.forEach((childChain, childIndex) => {\n\t\t\t\t\tconst chainModel = makerjs.chain.toNewModel(childChain, true);\n\t\t\t\t\tmakerjs.model.addModel(cutoutModel, chainModel, `cutoutModel-${index}-${childIndex}`);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tmakerjs.model.addModel(completeModel.models.cutoutModel, cutoutModel, `baseModel`);\n\t} else {\n\n\t\t// Fallback to the original model because the chain failed\n\t\tcompleteModel = model;\n\t}\n\n\treturn completeModel;\n}\n\n/**\n * Converts a html string to an HTML Element.\n * @param {string} html\n */\nexport default function htmlToElement (html: string): ChildNode {\n\tconst template = document.createElement('template');\n\n\thtml = html.trim();\n\ttemplate.innerHTML = html;\n\n\treturn template.content.firstChild;\n}\n\nfunction maybeFixCirclePath (path: string): string {\n\tconst commands = parse(path);\n\tconst newPath = commands.flat().join(' ');\n\n\treturn newPath;\n}\n\nexport function DXFToModel(dxf: string): IModel {\n\tlet model: IModel = {\n\t\tmodels: {}\n\t};\n\n\tconst helper = new Helper(dxf);\n\tconst polylinesObject = helper.toPolylines();\n\n\t// @ts-expect-error - library has incorrect typing, return object instead of array of polylines\n\tpolylinesObject.polylines.forEach((polyline, index) => {\n\t\tconst polylinesText = polyline.vertices.map((vertex) => vertex.join(' ')).join(', ');\n\t\tconst childModel = makerjs.model.mirror(new makerjs.models.ConnectTheDots(false, polylinesText), false, true);\n\t\tmakerjs.model.addModel(model, childModel, `polyline-${index}`);\n\t});\n\n\tmodel = makerjs.model.mirror(model, false, true);\n\n\tmakerjs.model.zero(model);\n\tmakerjs.model.originate(model);\n\n\treturn model;\n}\n\nexport function SVGToModel(svg: string): IModel {\n\tconst svg_optimized = optimize(svg, {});\n\tconst svg_element = htmlToElement(svg_optimized.data) as SVGSVGElement;\n\n\tconst model: IModel = {\n\t\tpaths: {}\n\t};\n\n\tfor (const element of svg_element.children) {\n\t\tconst paths = [];\n\t\tif (element.tagName === 'path') {\n\t\t\tpaths.push(element.getAttribute('d'));\n\t\t} else if (element.tagName === 'g') {\n\t\t\tfor (const subPath of element.children) {\n\t\t\t\tif (subPath.tagName === 'path') {\n\t\t\t\t\tpaths.push(subPath.getAttribute('d'));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (paths.length === 0) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (const path of paths) {\n\t\t\tconst fixedPath = maybeFixCirclePath(path);\n\n\t\t\tconst svgPathData = makerjs.importer.fromSVGPathData(fixedPath);\n\n\t\t\tmakerjs.model.addModel(model, svgPathData, 'line');\n\t\t}\n\t}\n\n\tmakerjs.model.zero(model);\n\tmakerjs.model.originate(model);\n\n\treturn model;\n}\n\nexport function getShapeModelCenter(model: IModel): IPoint {\n\tconst measure = makerjs.measure.modelExtents(model);\n\n\tif ( isUndefined( measure ) ) {\n\t\treturn [0, 0];\n\t}\n\n\tconst irregularShapes = [\n\t\t'arrow',\n\t\t'half-circle',\n\t\t'isosceles-triangle',\n\t\t'quarter-circle',\n\t\t'right-angled-triangle',\n\t\t'right-angled-triangle-mirrored',\n\t\t'sloped-rectangle',\n\t\t'sloped-right-rectangle',\n\t];\n\n\tif(!irregularShapes.includes(model.type)) {\n\t\treturn [measure.center[0], measure.center[1]];\n\t}\n\n\tconst center = centroid(model);\n\n\treturn [center[0].in_cm(), center[1].in_cm()];\n}\n\nexport async function loadFont(url: string): Promise<object> {\n\tconst { default: openType } = await import( /* webpackChunkName: \"OpenType\" */ 'opentype.js' );\n\n\tlet font = {};\n\n\ttry {\n\n\t\t// Docs claim this approach should work (and it seems to be the case). However, TS suggests this isn't possible.\n\t\tfont = await openType.load( url );\n\t} catch( err ) {\n\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.log(err.toString());\n\t}\n\n\treturn font;\n}\n","<script setup lang=\"ts\">\n</script>\n\n<template>\n\t<div class=\"accordion-container\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.accordion-container {\n\tborder: 1px solid $border-color;\n\tborder-radius: 8px;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n</style>\n","import { render } from \"./AccordionContainer.vue?vue&type=template&id=767770e1&scoped=true\"\nconst script = {}\n\nimport \"./AccordionContainer.vue?vue&type=style&index=0&id=767770e1&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-767770e1\"]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\twidth=\"14\" height=\"10\" viewBox=\"0 0 14 10\"\n\t>\n\t\t<path d=\"M13.055 2.422a.723.723 0 0 1-.22.531L6.118 9.672a.723.723 0 0 1-.531.219.723.723 0 0 1-.531-.22l-3.89-3.89a.723.723 0 0 1-.22-.531.72.72 0 0 1 .22-.531l1.062-1.063a.723.723 0 0 1 .53-.219.72.72 0 0 1 .532.22L5.586 5.96 10.71.828a.723.723 0 0 1 .531-.219c.209 0 .386.073.531.22l1.063 1.062a.723.723 0 0 1 .219.53z\" fill=\"#ffffff\" fill-rule=\"evenodd\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./CheckIcon.vue?vue&type=template&id=4f1b8e10\"\nimport script from \"./CheckIcon.vue?vue&type=script&lang=js\"\nexport * from \"./CheckIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"11\" height=\"10\" viewBox=\"0 0 11 10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M0.779977 8.078C0.778396 7.97915 0.797104 7.88103 0.834943 7.78969C0.872783 7.69836 0.928952 7.61576 0.999978 7.54699L3.29598 5.25031L0.995491 2.95051C0.924646 2.88166 0.868662 2.79902 0.830996 2.70769C0.79333 2.61636 0.77478 2.51829 0.776491 2.41951C0.774909 2.32066 0.793617 2.22254 0.831457 2.13121C0.869297 2.03988 0.925466 1.95728 0.996491 1.88851L2.16749 0.83251C2.23626 0.761484 2.31886 0.705316 2.41019 0.667476C2.50152 0.629637 2.59965 0.610929 2.69849 0.61251C2.79737 0.61075 2.89554 0.629376 2.9869 0.667227C3.07826 0.705077 3.16084 0.76134 3.22949 0.83251L5.45449 3.09116L7.71698 0.827995C7.78583 0.75715 7.86847 0.701167 7.9598 0.6635C8.05113 0.625834 8.14921 0.607285 8.24798 0.608995C8.34683 0.607414 8.44495 0.626121 8.53628 0.663961C8.62762 0.701801 8.71022 0.75797 8.77898 0.828995L9.83498 2C9.90601 2.06876 9.96218 2.15136 10 2.2427C10.0379 2.33403 10.0566 2.43215 10.055 2.531C10.0567 2.62987 10.0381 2.72805 10.0003 2.8194C9.96242 2.91076 9.90615 2.99334 9.83498 3.062L7.59727 5.26636L9.83949 7.54251C9.91034 7.61136 9.96632 7.694 10.004 7.78533C10.0417 7.87666 10.0602 7.97474 10.0585 8.07351C10.0585 8.28251 9.98549 8.45952 9.83849 8.60452L8.77649 9.66751C8.70776 9.73824 8.62528 9.79415 8.53413 9.83181C8.44299 9.86947 8.3451 9.88809 8.24649 9.88651L8.24549 9.88752C8.14664 9.8891 8.04852 9.87039 7.95719 9.83255C7.86586 9.79471 7.78326 9.73854 7.71449 9.66751L5.43888 7.39258L3.12498 9.672C3.05613 9.74284 2.97349 9.79882 2.88216 9.83649C2.79084 9.87416 2.69276 9.89271 2.59398 9.891C2.38498 9.891 2.20798 9.818 2.06298 9.67099L0.999978 8.609C0.929257 8.54026 0.873346 8.45778 0.835684 8.36664C0.798021 8.27549 0.779404 8.1776 0.780978 8.07899L0.779977 8.078Z\" fill=\"#ffffff\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n\n","import { render } from \"./ErrorIcon.vue?vue&type=template&id=7861c5c7\"\nimport script from \"./ErrorIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ErrorIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementBlock as _createElementBlock } from \"vue\"\n\nimport CheckIcon from \"../icons/CheckIcon.vue\";\nimport ErrorIcon from \"../icons/ErrorIcon.vue\";\n\ninterface Props {\n\tvariant: 'valid' | 'empty' | 'error';\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'AccordionIndicator',\n  props: {\n    variant: {}\n  },\n  setup(__props: any) {\n\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"span\", {\n    class: _normalizeClass(['accordion-indicator', `accordion-indicator--${_ctx.variant}`])\n  }, [\n    (_ctx.variant === 'valid')\n      ? (_openBlock(), _createBlock(CheckIcon, {\n          key: 0,\n          \"aria-hidden\": \"true\"\n        }))\n      : _createCommentVNode(\"\", true),\n    (_ctx.variant === 'error')\n      ? (_openBlock(), _createBlock(ErrorIcon, {\n          key: 1,\n          \"aria-hidden\": \"true\"\n        }))\n      : _createCommentVNode(\"\", true)\n  ], 2))\n}\n}\n\n})","import script from \"./AccordionIndicator.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AccordionIndicator.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AccordionIndicator.vue?vue&type=style&index=0&id=afad8954&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-afad8954\"]])\n\nexport default __exports__","<template>\n\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><circle fill=\"#CCEEFB\" cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M8.986 8c.24 0 .481.025.719.073.66.135 1.173.513 1.44 1.062.327.672.261 1.531-.184 2.42l-.75 1.495c-.4.798-.166.962-.04 1.05.025.018.105.06.304.06.36 0 .775-.139.78-.14a.376.376 0 0 1 .368.637 3.818 3.818 0 0 1-2.361.844c-.239 0-.48-.026-.716-.073-.662-.135-1.174-.512-1.44-1.062-.328-.671-.263-1.53.183-2.419l.75-1.496c.4-.797.165-.963.038-1.052-.024-.017-.104-.058-.301-.058-.36 0-.776.139-.78.14a.375.375 0 0 1-.37-.636 3.814 3.814 0 0 1 2.36-.844Zm1.64-4.499a1.875 1.875 0 1 1 0 3.75 1.875 1.875 0 0 1 0-3.75Z\" fill=\"#00ADEF\" fill-rule=\"nonzero\"/></g></svg>\n\n</template>\n","import { render } from \"./InfoCircle.vue?vue&type=template&id=717a36a4\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-87edfd7e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"info-button__text\" }\n\nimport { useStore } from 'vuex';\nimport InfoCircleIcon from \"../../icons/InfoCircle.vue\";\n\ninterface Props {\n\tmodalName: string;\n\tlabel: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'OpenButton',\n  props: {\n    modalName: {},\n    label: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\nconst store = useStore();\n\nfunction showInfoModal() {\n\tstore.commit('updateCurrentModalName', props.modalName);\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"button\", {\n    class: \"info-button\",\n    type: \"button\",\n    onClick: showInfoModal\n  }, [\n    _createVNode(InfoCircleIcon),\n    _createElementVNode(\"span\", _hoisted_1, _toDisplayString(_ctx.label), 1)\n  ]))\n}\n}\n\n})","<!-- A button that opens an Info Modal -->\n<script setup lang=\"ts\">\nimport { useStore } from 'vuex';\nimport InfoCircleIcon from \"../../icons/InfoCircle.vue\";\n\ninterface Props {\n\tmodalName: string;\n\tlabel: string;\n}\nconst props = defineProps<Props>();\n\nconst store = useStore();\n\nfunction showInfoModal() {\n\tstore.commit('updateCurrentModalName', props.modalName);\n}\n</script>\n\n<template>\n\t<button class=\"info-button\" type=\"button\" v-on:click=\"showInfoModal\">\n\t\t<info-circle-icon />\n\t\t<span class=\"info-button__text\">{{label}}</span>\n\t</button>\n</template>\n\n<style scoped lang=\"scss\">\n.info-button {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-weight: 400;\n\tdisplay: flex;\n\tgap:5px;\n\talign-items: center;\n\twhite-space: normal;\n\ttext-align: left;\n}\n.info-button > svg {\n\tflex-shrink: 0;\n\twidth: 100%;\n\theight: 100%;\n\tmax-width: 12px;\n\tmax-height: 12px;\n}\n.info-button__text {\n\tfont-size: 15px;\n}\n</style>\n","import script from \"./OpenButton.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./OpenButton.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./OpenButton.vue?vue&type=style&index=0&id=87edfd7e&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-87edfd7e\"]])\n\nexport default __exports__","import { onMounted, onUnmounted } from \"vue\";\n\nexport function useEscapeEvent(methodToTrigger): void {\n\tconst handleEscKey = (e: KeyboardEvent): void => {\n\t\tif (e.key === \"Escape\") {\n\t\t\tmethodToTrigger();\n\t\t}\n\t};\n\n\tonMounted(() => window.addEventListener(\"keydown\", handleEscKey));\n\tonUnmounted(() => window.removeEventListener(\"keydown\", handleEscKey));\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, resolveDirective as _resolveDirective, openBlock as _openBlock, createElementBlock as _createElementBlock, withDirectives as _withDirectives, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, createCommentVNode as _createCommentVNode, Transition as _Transition, withModifiers as _withModifiers, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-3ba9513e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = { class: \"dialog__content\" }\n\nimport { useEscapeEvent } from '@/utilities/UseEscapeEvent';\nimport { ref, computed, watch } from 'vue';\nimport { useStore } from 'vuex';\n\ninterface Props {\n\tmodalName: string;\n\tisOpen: boolean;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ModalDialog',\n  props: {\n    modalName: {},\n    isOpen: { type: Boolean }\n  },\n  setup(__props: any) {\n\nconst props = __props;\nconst dialog = ref<HTMLDialogElement>();\nconst store = useStore();\n\nconst isDialogOpen = computed(() => props.isOpen);\n\nconst close = () => {\n\tstore.commit('updateCurrentModalName', null);\n};\nconst show = () => {\n\tdialog.value?.showModal();\n};\n\n// fire dialog close after transition has finished\nfunction onAfterLeave() {\n\tdialog.value?.close();\n}\n\nwatch(\n\tisDialogOpen,\n\t(open) => {\n\t\tif (open) {\n\t\t\tshow();\n\t\t} else {\n\t\t\tclose();\n\t\t}\n\t},\n\t{ immediate: true }\n);\n\nuseEscapeEvent(close);\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_focus_trap = _resolveComponent(\"focus-trap\")!\n  const _directive_scroll_lock = _resolveDirective(\"scroll-lock\")!\n\n  return (_openBlock(), _createElementBlock(\"dialog\", {\n    ref_key: \"dialog\",\n    ref: dialog,\n    class: \"dialog\",\n    onClick: _withModifiers(close, [\"self\"])\n  }, [\n    _createVNode(_Transition, {\n      name: \"slide\",\n      onAfterLeave: onAfterLeave\n    }, {\n      default: _withCtx(() => [\n        (isDialogOpen.value)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n              _createVNode(_component_focus_trap, {\n                active: isDialogOpen.value,\n                \"onUpdate:active\": _cache[0] || (_cache[0] = ($event: any) => ((isDialogOpen).value = $event))\n              }, {\n                default: _withCtx(() => [\n                  _withDirectives((_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n                    _renderSlot(_ctx.$slots, \"default\")\n                  ])), [\n                    [_directive_scroll_lock, true]\n                  ])\n                ]),\n                _: 3\n              }, 8, [\"active\"])\n            ]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 3\n    })\n  ], 512))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useEscapeEvent } from '@/utilities/UseEscapeEvent';\nimport { ref, computed, watch } from 'vue';\nimport { useStore } from 'vuex';\n\ninterface Props {\n\tmodalName: string;\n\tisOpen: boolean;\n}\n\nconst props = defineProps<Props>();\nconst dialog = ref<HTMLDialogElement>();\nconst store = useStore();\n\nconst isDialogOpen = computed(() => props.isOpen);\n\nconst close = () => {\n\tstore.commit('updateCurrentModalName', null);\n};\nconst show = () => {\n\tdialog.value?.showModal();\n};\n\n// fire dialog close after transition has finished\nfunction onAfterLeave() {\n\tdialog.value?.close();\n}\n\nwatch(\n\tisDialogOpen,\n\t(open) => {\n\t\tif (open) {\n\t\t\tshow();\n\t\t} else {\n\t\t\tclose();\n\t\t}\n\t},\n\t{ immediate: true }\n);\n\nuseEscapeEvent(close);\n</script>\n\n<template>\n\t<dialog\n\t\tref=\"dialog\"\n\t\tclass=\"dialog\"\n\t\t@click.self=\"close\"\n\t>\n\t\t<Transition name=\"slide\" @after-leave=\"onAfterLeave\">\n\t\t\t<div v-if=\"isDialogOpen\">\n\t\t\t\t<focus-trap\tv-model:active=\"isDialogOpen\">\n\t\t\t\t\t<div class=\"dialog__content\" v-scroll-lock=\"true\">\n\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t</div>\n\t\t\t\t</focus-trap>\n\t\t\t</div>\n\t\t</Transition>\n\t</dialog>\n</template>\n\n<style scoped lang=\"scss\">\n.dialog {\n\tbackground-color: #00000070;\n\tbackdrop-filter: blur(2px);\n\tmargin: 0;\n\tpadding: 0;\n\tborder: none;\n\tmin-width: 100vw;\n\tmin-height: 100vh;\n\tinset: 0;\n\toverflow: hidden;\n}\n\n.dialog::backdrop {\n\tdisplay: none;\n}\n\n.dialog__content {\n\tborder-top-left-radius: 10px;\n\tborder-top-right-radius: 10px;\n\tbackground-color: $white;\n\twidth: 100vw;\n\theight: calc(90vh - var(--admin-bar));\n\tposition: fixed;\n\ttop: calc(100vh - calc(90vh - var(--admin-bar)));\n\tright: 0;\n\ttransform: translateY(0);\n\twill-change: transform;\n\toverflow: scroll;\n}\n\n.slide-enter-active,\n.slide-leave-active {\n\ttransition: transform 300ms ease;\n}\n\n.slide-enter-from,\n.slide-leave-to{\n\ttransform: translateY(100vh);\n}\n\n@media screen and (min-width: 400px) {\n\t.dialog__content {\n\t\tposition: fixed;\n\t\tborder-radius: 0;\n\t\twidth: 95vw;\n\t\tmax-width: 500px;\n\t\theight: calc(100vh - var(--admin-bar));\n\t\ttop: var(--admin-bar);\n\t\tright: 0;\n\t}\n\t.slide-enter-from,\n\t.slide-leave-to{\n\t\ttransform: initial;\n\t\ttransform: translateX(100%);\n\t}\n}\n</style>\n","import script from \"./ModalDialog.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ModalDialog.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ModalDialog.vue?vue&type=style&index=0&id=3ba9513e&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-3ba9513e\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-01a2a57a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"src\", \"alt\", \"width\", \"height\"]\n\nimport { Image } from '@/types/image';\n\ninterface Props {\n\timage: Image;\n\timageSize: 'thumbnail' | 'medium_large';\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ContentImage',\n  props: {\n    image: {},\n    imageSize: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_ctx.image)\n    ? (_openBlock(), _createElementBlock(\"img\", {\n        key: 0,\n        src: _ctx.image.sizes[_ctx.imageSize],\n        alt: _ctx.image.alt ||'',\n        width: _ctx.image.sizes[`${_ctx.imageSize}-width`],\n        height: _ctx.image.sizes[`${_ctx.imageSize}-height`]\n      }, null, 8, _hoisted_1))\n    : _createCommentVNode(\"\", true)\n}\n}\n\n})","import script from \"./ContentImage.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ContentImage.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ContentImage.vue?vue&type=style&index=0&id=01a2a57a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-01a2a57a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-f4a06546\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"layout-image-text\" }\nconst _hoisted_2 = { class: \"layout-image-text__content\" }\nconst _hoisted_3 = [\"innerHTML\"]\nconst _hoisted_4 = [\"innerHTML\"]\n\nimport { Image } from '@/types/image';\nimport ContentImage from \"./ContentImage.vue\";\n\ninterface Props {\n\timage: Image;\n\ttitle: string;\n\ttext: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ContentImageText',\n  props: {\n    image: {},\n    title: {},\n    text: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_ctx.image)\n      ? (_openBlock(), _createBlock(ContentImage, {\n          key: 0,\n          image: _ctx.image,\n          \"image-size\": \"thumbnail\"\n        }, null, 8, [\"image\"]))\n      : _createCommentVNode(\"\", true),\n    _createElementVNode(\"div\", _hoisted_2, [\n      (_ctx.title)\n        ? (_openBlock(), _createElementBlock(\"h2\", {\n            key: 0,\n            innerHTML: _ctx.title,\n            class: \"layout-image-text__title\"\n          }, null, 8, _hoisted_3))\n        : _createCommentVNode(\"\", true),\n      (_ctx.text)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 1,\n            innerHTML: _ctx.text,\n            class: \"layout-image-text__text\"\n          }, null, 8, _hoisted_4))\n        : _createCommentVNode(\"\", true)\n    ])\n  ]))\n}\n}\n\n})","import script from \"./ContentImageText.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ContentImageText.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ContentImageText.vue?vue&type=style&index=0&id=f4a06546&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-f4a06546\"]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M19 7.93932L34.8839 22.3516L19 36.7638V31V30.25H18.25H6.75V14.75H18.25H19V14V7.93932Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./ArrowIcon.vue?vue&type=template&id=1662949e\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"7.75\" width=\"28.5\" height=\"28.5\" rx=\"14.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./CircleIcon.vue?vue&type=template&id=6893d932\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\twidth=\"44\"\n\t\theight=\"44\"\n\t\tviewBox=\"0 0 44 44\"\n\t\taria-hidden=\"true\">\n\t\t<path d=\"M33.5227 22C33.5227 24.4651 32.1618 26.7601 29.8352 28.4663C27.5091 30.1721 24.2592 31.25 20.6364 31.25C17.0135 31.25 13.7637 30.1721 11.4375 28.4663C9.11095 26.7601 7.75 24.4651 7.75 22C7.75 19.5349 9.11095 17.2399 11.4375 15.5337C13.7637 13.8279 17.0135 12.75 20.6364 12.75C24.2592 12.75 27.5091 13.8279 29.8352 15.5337C32.1618 17.2399 33.5227 19.5349 33.5227 22Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\" />\n\t</svg>\n</template>\n","import { render } from \"./EllipseIcon.vue?vue&type=template&id=98cb0496\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M8.77011 28.75C9.15956 21.5049 15.1577 15.75 22.5 15.75C29.8423 15.75 35.8404 21.5049 36.2299 28.75H8.77011Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./HalfCircle.vue?vue&type=template&id=18f89827\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M33.9947 11.7275C36.6223 14.3685 37.296 18.9797 34.1546 22.0908L21.9805 33.3625L9.80896 22.0932C6.71051 18.9655 7.38709 14.3429 10.003 11.7026C11.2946 10.399 13.0247 9.62437 14.9532 9.76683C16.8828 9.90938 19.1282 10.9798 21.4157 13.5977L21.9797 14.2431L22.5445 13.5985C24.831 10.9895 27.0818 9.92395 29.0197 9.78481C30.9572 9.64568 32.6972 10.4233 33.9947 11.7275Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./HeartIcon.vue?vue&type=template&id=4d857eae\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M28.567 10.6256L35.134 22L28.567 33.3744L15.433 33.3744L8.86603 22L15.433 10.6256L28.567 10.6256Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./HexagonIcon.vue?vue&type=template&id=bf34ed06\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\twidth=\"32\"\n\t\theight=\"32\"\n\t\tviewBox=\"0 0 32 32\"\n\t\taria-hidden=\"true\">\n\t\t<path d=\"M29 11.4497L21.7677 4.09006L11.4497 4L4.09006 11.2323L4 21.5503L11.2323 28.9099L21.5503 29L28.9099 21.7677L29 11.4497Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./OctagonIcon.vue?vue&type=template&id=c710f948\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M12.6745 12.6745L22 8.81179L31.3255 12.6745L35.1882 22L31.3255 31.3255L22 35.1882L12.6745 31.3255L8.81179 22L12.6745 12.6745Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./PolygonIcon.vue?vue&type=template&id=1ba60778\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M8.80524 33.25L22.0009 11.4484L35.1966 33.25H8.80524Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./IsoscelesTriangle.vue?vue&type=template&id=77e9afe6\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M12.75 12.7643C22.7851 13.1488 30.8512 21.2149 31.2357 31.25H12.75V12.7643Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./QuarterCircle.vue?vue&type=template&id=255ed1c0\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"-1 -1 32 32\">\n\t\t<path fill=\"none\" stroke=\"#0074B5\" d=\"M30,0 L30,30 L0,30 L0,0 L30,0 Z\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./RectangleCutout.vue?vue&type=template&id=3fc48dd3\"\nimport script from \"./RectangleCutout.vue?vue&type=script&lang=js\"\nexport * from \"./RectangleCutout.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M33.25 33.25V11.8107L11.8107 33.25H33.25Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RightAngledTriangle.vue?vue&type=template&id=7cb44f50\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M10.75 33.77V11.3431L32.2425 33.77H10.75Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RightAngledTriangleMirrored.vue?vue&type=template&id=79c056e9\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"7.75\" width=\"28.5\" height=\"28.5\" rx=\"6.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RoundedRectangle.vue?vue&type=template&id=30712298\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M32.25 20.4917V33.25H10.75V11.1439L32.25 20.4917Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./SlopedRectangle.vue?vue&type=template&id=351448f0\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M32.25 18.0001V18.0499V18.0998V18.1497V18.1997V18.2497V18.2997V18.3498V18.3999V18.4501V18.5003V18.5506V18.6009V18.6512V18.7016V18.752V18.8024V18.8529V18.9034V18.954V19.0046V19.0552V19.1058V19.1565V19.2073V19.258V19.3088V19.3596V19.4105V19.4614V19.5123V19.5632V19.6142V19.6652V19.7162V19.7672V19.8183V19.8694V19.9205V19.9717V20.0229V20.0741V20.1253V20.1765V20.2278V20.2791V20.3304V20.3817V20.4331V20.4844V20.5358V20.5872V20.6386V20.6901V20.7415V20.793V20.8445V20.896V20.9475V20.999V21.0506V21.1021V21.1537V21.2052V21.2568V21.3084V21.36V21.4116V21.4633V21.5149V21.5665V21.6182V21.6698V21.7215V21.7731V21.8248V21.8765V21.9281V21.9798V22.0315V22.0832V22.1348V22.1865V22.2382V22.2899V22.3415V22.3932V22.4449V22.4966V22.5482V22.5999V22.6516V22.7032V22.7549V22.8065V22.8581V22.9098V22.9614V23.013V23.0646V23.1162V23.1678V23.2193V23.2709V23.3224V23.374V23.4255V23.477V23.5285V23.58V23.6315V23.6829V23.7343V23.7858V23.8372V23.8885V23.9399V23.9913V24.0426V24.0939V24.1452V24.1964V24.2477V24.2989V24.3501V24.4013V24.4524V24.5035V24.5546V24.6057V24.6568V24.7078V24.7588V24.8097V24.8607V24.9116V24.9625V25.0133V25.0641V25.1149V25.1657V25.2164V25.2671V25.3177V25.3683V25.4189V25.4695V25.52V25.5705V25.6209V25.6713V25.7217V25.772V25.8223V25.8725V25.9227V25.9729V26.023V26.0731V26.1232V26.1732V26.2231V26.273V26.3229V26.3727V26.4225V26.4722V26.5219V26.5715V26.6211V26.6706V26.7201V26.7696V26.819V26.8683V26.9176V26.9668V27.016V27.0651V27.1142V27.1632V27.2122V27.2611V27.3099V27.3587V27.4075V27.4562V27.5048V27.5534V27.6019V27.6503V27.6987V27.747V27.7953V27.8435V27.8916V27.9397V27.9877V28.0357V28.0835V28.1314V28.1791V28.2268V28.2744V28.322V28.3694V28.4169V28.4642V28.5115V28.5587V28.6058V28.6529V28.6999V28.7468V28.7936V28.8404V28.8871V28.9337V28.9802V29.0267V29.0731V29.1194V29.1656V29.2118V29.2579V29.3039V29.3498V29.3956V29.4414V29.4871V29.5327V29.5782V29.6236V29.669V29.7142V29.7594V29.8045V29.8495V29.8944V29.9392V29.984V30.0286V30.0732V30.1177V30.1621V30.2064V30.2506V30.2947V30.3387V30.3826V30.4265V30.4702V30.5138V30.5574V30.6008V30.6442V30.6875V30.7306V30.7737V30.8167V30.8595V30.9023V30.945V30.9875V31.03V31.0724V31.1146V31.1568V31.1989V31.2408V31.2827V31.3244V31.366V31.4076V31.449V31.4903V31.5315V31.5726V31.6136V31.6545V31.6953V31.7359V31.7765V31.8169V31.8573V31.8975V31.9376V31.9776V32.0174V32.0572V32.0968V32.1364V32.1758V32.2151V32.2542V32.2933V32.3322V32.371V32.4097V32.4483V32.4868V32.5251V32.5633V32.6014V32.6394V32.6772V32.7149V32.7525V32.79V32.8273V32.8645V32.9016V32.9385V32.9754V33.0121V33.0486V33.0851V33.1214V33.1575V33.1936V33.2295V33.2653V33.3009V33.3364V33.3718V33.407V33.4421V33.4771V33.5119V33.5466V33.5812V33.6156V33.6499V33.684V33.718V33.7519V33.7856V33.8192V33.8526V33.8859V33.919V33.952V33.9849V34.0176V34.0501V34.0826V34.1148V34.1469V34.1789V34.2107V34.2424V34.2739V34.3053V34.3365V34.3676V34.3985V34.4293V34.4599V34.4904V34.5207V34.5508V34.5808V34.6107V34.6404V34.6699V34.6993V34.7285V34.7575V34.7864V34.8152V34.8437V34.8721V34.9004V34.9285V34.9564V34.9842V35.0118V35.0392V35.0665V35.0936V35.1205V35.1473V35.1739V35.2003V35.2266V35.2527V35.2786V35.3044V35.33V35.3554V35.3807V35.4057V35.4306V35.4554V35.4799V35.5043V35.5285V35.5525V35.5764V35.6001V35.6236V35.6469V35.67V35.693V35.7158V35.7384V35.7608V35.7831V35.8051V35.827V35.8487V35.8702V35.8916V35.9127V35.9337V35.9545V35.975V35.9954V36.0157V36.0357V36.0555V36.0752V36.0946V36.1139V36.133V36.1519V36.1706V36.1891V36.2074V36.2255V36.2434V36.2501H10.75L10.75 35.2266L10.75 30.6875L10.75 18.0001C10.75 12.3391 15.3391 7.7498 21 7.75009C27.1671 7.75041 32.25 12.134 32.25 18.0001Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./ArchedRectangle.vue?vue&type=template&id=629613ce\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M22 7.78062L25.8528 16.0768L26.0285 16.4552L26.4428 16.5054L35.5234 17.606L28.8239 23.8338L28.5183 24.1179L28.5986 24.5274L30.3579 33.5037L22.3646 29.0566L22 28.8537L21.6354 29.0566L13.6421 33.5037L15.4014 24.5274L15.4817 24.1179L15.1761 23.8338L8.47657 17.606L17.5572 16.5054L17.9715 16.4552L18.1472 16.0768L22 7.78062Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n\n</template>\n","import { render } from \"./StarIcon.vue?vue&type=template&id=42191a36\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M10.9306 33.25L15.8219 10.75H29.1953L33.1083 33.25H10.9306Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./TrapezoidIcon.vue?vue&type=template&id=054ae9d8\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M7.75 10.75H36.25V33.25H7.75V10.75Z\" fill=\"white\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./RectangleIcon.vue?vue&type=template&id=43686ddf\"\nimport script from \"./RectangleIcon.vue?vue&type=script&lang=js\"\nexport * from \"./RectangleIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M21.578 2.418L23.683 8.87L23.852 9.387H31.199L25.698 13.367L25.255 13.688L25.425 14.208L27.527 20.654L22.017 16.667L21.578 16.349L21.138 16.667L15.629 20.654L17.732 14.208L17.902 13.688L17.458 13.368L11.958 9.388H19.304L19.474 8.87L21.578 2.418ZM17.315 36C17.315 40.001 14.057 43.25 10.032 43.25C6.008 43.25 2.75 40.001 2.75 36C2.75 31.999 6.008 28.75 10.033 28.75C14.057 28.75 17.315 31.999 17.315 36ZM40.404 36.25H24.462L40.404 19.848V36.25Z\" fill=\"white\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String,\n\t}\n};\n</script>\n","import { render } from \"./ShapesIcon.vue?vue&type=template&id=9031849c\"\nimport script from \"./ShapesIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ShapesIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M16.624 14.277H10.75V6.75H33.25V14.277H27.01V37.25H17.374V14.277H16.624Z\" fill=\"white\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./TextIcon.vue?vue&type=template&id=41457278\"\nimport script from \"./TextIcon.vue?vue&type=script&lang=js\"\nexport * from \"./TextIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M8.75 13.59C8.75 13.35 8.82 13.114 8.95 12.912L10.625 10.322C10.7383 10.1465 10.8938 10.0022 11.0772 9.90231C11.2606 9.80239 11.4661 9.75003 11.675 9.75H19.182C19.681 9.75 20.132 10.047 20.33 10.505L21.272 12.693C21.4074 13.0069 21.6317 13.2742 21.9173 13.4621C22.2028 13.6499 22.5372 13.75 22.879 13.75H33.443C34.0397 13.75 34.612 13.9871 35.034 14.409C35.4559 14.831 35.693 15.4033 35.693 16V32C35.693 32.5967 35.4559 33.169 35.034 33.591C34.612 34.0129 34.0397 34.25 33.443 34.25H11C10.4033 34.25 9.83097 34.0129 9.40901 33.591C8.98705 33.169 8.75 32.5967 8.75 32V13.59Z\" fill=\"white\"/>\n\t\t<path d=\"M20.33 10.505C20.132 10.047 19.681 9.75 19.182 9.75H11.675C11.4661 9.75003 11.2606 9.80239 11.0772 9.90231C10.8938 10.0022 10.7383 10.1465 10.625 10.322L8.95 12.912C8.82 13.114 8.75 13.35 8.75 13.59V32C8.75 32.5967 8.98705 33.169 9.40901 33.591C9.83097 34.0129 10.4033 34.25 11 34.25H33.443C34.0397 34.25 34.612 34.0129 35.034 33.591C35.4559 33.169 35.693 32.5967 35.693 32V16C35.693 15.4033 35.4559 14.831 35.034 14.409C34.612 13.9871 34.0397 13.75 33.443 13.75H22.879C22.5372 13.75 22.2028 13.6499 21.9173 13.4621C21.6317 13.2742 21.4074 13.0069 21.272 12.693L20.33 10.505ZM20.33 10.505L21.018 10.209\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./UploadIcon.vue?vue&type=template&id=6bf81ac6\"\nimport script from \"./UploadIcon.vue?vue&type=script&lang=js\"\nexport * from \"./UploadIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 46 46\"\n\t\twidth= \"46\" height=\"46\"\n\t>\n\t\t<g stroke=\"#0074B5\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"square\">\n\t\t\t<path d=\"M30.483 16 16 30.5M16 16l14.483 14.5\" stroke-width=\"1.5\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./CrossIcon.vue?vue&type=template&id=46feef7a\"\nimport script from \"./CrossIcon.vue?vue&type=script&lang=js\"\nexport * from \"./CrossIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M5.636 41.249C7.22989 41.249 8.522 39.9569 8.522 38.363C8.522 36.7691 7.22989 35.477 5.636 35.477C4.04211 35.477 2.75 36.7691 2.75 38.363C2.75 39.9569 4.04211 41.249 5.636 41.249Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 8.522C7.22989 8.522 8.522 7.22989 8.522 5.636C8.522 4.04211 7.22989 2.75 5.636 2.75C4.04211 2.75 2.75 4.04211 2.75 5.636C2.75 7.22989 4.04211 8.522 5.636 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M22 41.249C23.5939 41.249 24.886 39.9569 24.886 38.363C24.886 36.7691 23.5939 35.477 22 35.477C20.4061 35.477 19.114 36.7691 19.114 38.363C19.114 39.9569 20.4061 41.249 22 41.249Z\" fill=\"white\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 41.249C39.9569 41.249 41.249 39.9569 41.249 38.363C41.249 36.7691 39.9569 35.477 38.363 35.477C36.7691 35.477 35.477 36.7691 35.477 38.363C35.477 39.9569 36.7691 41.249 38.363 41.249Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 8.522C39.9569 8.522 41.249 7.22989 41.249 5.636C41.249 4.04211 39.9569 2.75 38.363 2.75C36.7691 2.75 35.477 4.04211 35.477 5.636C35.477 7.22989 36.7691 8.522 38.363 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 41.249C7.22989 41.249 8.522 39.9569 8.522 38.363C8.522 36.7691 7.22989 35.477 5.636 35.477C4.04211 35.477 2.75 36.7691 2.75 38.363C2.75 39.9569 4.04211 41.249 5.636 41.249Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M5.636 8.522C7.22989 8.522 8.522 7.22989 8.522 5.636C8.522 4.04211 7.22989 2.75 5.636 2.75C4.04211 2.75 2.75 4.04211 2.75 5.636C2.75 7.22989 4.04211 8.522 5.636 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 41.249C23.5939 41.249 24.886 39.9569 24.886 38.363C24.886 36.7691 23.5939 35.477 22 35.477C20.4061 35.477 19.114 36.7691 19.114 38.363C19.114 39.9569 20.4061 41.249 22 41.249Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 41.249C39.9569 41.249 41.249 39.9569 41.249 38.363C41.249 36.7691 39.9569 35.477 38.363 35.477C36.7691 35.477 35.477 36.7691 35.477 38.363C35.477 39.9569 36.7691 41.249 38.363 41.249Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 8.522C39.9569 8.522 41.249 7.22989 41.249 5.636C41.249 4.04211 39.9569 2.75 38.363 2.75C36.7691 2.75 35.477 4.04211 35.477 5.636C35.477 7.22989 36.7691 8.522 38.363 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleEdges.vue?vue&type=template&id=662def84\"\nimport script from \"./DrillHoleEdges.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleEdges.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M10.183 36.704C11.7769 36.704 13.069 35.4119 13.069 33.818C13.069 32.2241 11.7769 30.932 10.183 30.932C8.5891 30.932 7.297 32.2241 7.297 33.818C7.297 35.4119 8.5891 36.704 10.183 36.704Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M10.183 13.068C11.7769 13.068 13.069 11.7759 13.069 10.182C13.069 8.58811 11.7769 7.29601 10.183 7.29601C8.5891 7.29601 7.297 8.58811 7.297 10.182C7.297 11.7759 8.5891 13.068 10.183 13.068Z\" fill=\"white\"/>\n\t\t<path d=\"M22 41.249C23.5939 41.249 24.886 39.9569 24.886 38.363C24.886 36.7691 23.5939 35.477 22 35.477C20.4061 35.477 19.114 36.7691 19.114 38.363C19.114 39.9569 20.4061 41.249 22 41.249Z\" fill=\"white\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M33.82 36.704C35.4139 36.704 36.706 35.4119 36.706 33.818C36.706 32.2241 35.4139 30.932 33.82 30.932C32.2261 30.932 30.934 32.2241 30.934 33.818C30.934 35.4119 32.2261 36.704 33.82 36.704Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M33.82 13.068C35.4139 13.068 36.706 11.7759 36.706 10.182C36.706 8.58811 35.4139 7.29601 33.82 7.29601C32.2261 7.29601 30.934 8.58811 30.934 10.182C30.934 11.7759 32.2261 13.068 33.82 13.068Z\" fill=\"white\"/>\n\t\t<path d=\"M10.183 36.704C11.7769 36.704 13.069 35.4119 13.069 33.818C13.069 32.2241 11.7769 30.932 10.183 30.932C8.5891 30.932 7.297 32.2241 7.297 33.818C7.297 35.4119 8.5891 36.704 10.183 36.704Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M10.183 13.068C11.7769 13.068 13.069 11.7759 13.069 10.182C13.069 8.58811 11.7769 7.29601 10.183 7.29601C8.5891 7.29601 7.297 8.58811 7.297 10.182C7.297 11.7759 8.5891 13.068 10.183 13.068Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 41.249C23.5939 41.249 24.886 39.9569 24.886 38.363C24.886 36.7691 23.5939 35.477 22 35.477C20.4061 35.477 19.114 36.7691 19.114 38.363C19.114 39.9569 20.4061 41.249 22 41.249Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M33.82 36.704C35.4139 36.704 36.706 35.4119 36.706 33.818C36.706 32.2241 35.4139 30.932 33.82 30.932C32.2261 30.932 30.934 32.2241 30.934 33.818C30.934 35.4119 32.2261 36.704 33.82 36.704Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M33.82 13.068C35.4139 13.068 36.706 11.7759 36.706 10.182C36.706 8.58811 35.4139 7.29601 33.82 7.29601C32.2261 7.29601 30.934 8.58811 30.934 10.182C30.934 11.7759 32.2261 13.068 33.82 13.068Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleRadial.vue?vue&type=template&id=2131fccb\"\nimport script from \"./DrillHoleRadial.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleRadial.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M5.636 41.25C7.22989 41.25 8.522 39.9579 8.522 38.364C8.522 36.7701 7.22989 35.478 5.636 35.478C4.04211 35.478 2.75 36.7701 2.75 38.364C2.75 39.9579 4.04211 41.25 5.636 41.25Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 8.522C7.22989 8.522 8.522 7.22989 8.522 5.636C8.522 4.04211 7.22989 2.75 5.636 2.75C4.04211 2.75 2.75 4.04211 2.75 5.636C2.75 7.22989 4.04211 8.522 5.636 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M22 41.25C23.5939 41.25 24.886 39.9579 24.886 38.364C24.886 36.7701 23.5939 35.478 22 35.478C20.4061 35.478 19.114 36.7701 19.114 38.364C19.114 39.9579 20.4061 41.25 22 41.25Z\" fill=\"white\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 41.25C39.9569 41.25 41.249 39.9579 41.249 38.364C41.249 36.7701 39.9569 35.478 38.363 35.478C36.7691 35.478 35.477 36.7701 35.477 38.364C35.477 39.9579 36.7691 41.25 38.363 41.25Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M22 24.886C23.5939 24.886 24.886 23.5939 24.886 22C24.886 20.4061 23.5939 19.114 22 19.114C20.4061 19.114 19.114 20.4061 19.114 22C19.114 23.5939 20.4061 24.886 22 24.886Z\" fill=\"white\"/>\n\t\t<path d=\"M38.363 8.522C39.9569 8.522 41.249 7.22989 41.249 5.636C41.249 4.04211 39.9569 2.75 38.363 2.75C36.7691 2.75 35.477 4.04211 35.477 5.636C35.477 7.22989 36.7691 8.522 38.363 8.522Z\" fill=\"white\"/>\n\t\t<path d=\"M5.636 41.25C7.22989 41.25 8.522 39.9579 8.522 38.364C8.522 36.7701 7.22989 35.478 5.636 35.478C4.04211 35.478 2.75 36.7701 2.75 38.364C2.75 39.9579 4.04211 41.25 5.636 41.25Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M5.636 24.886C7.22989 24.886 8.522 23.5939 8.522 22C8.522 20.4061 7.22989 19.114 5.636 19.114C4.04211 19.114 2.75 20.4061 2.75 22C2.75 23.5939 4.04211 24.886 5.636 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M5.636 8.522C7.22989 8.522 8.522 7.22989 8.522 5.636C8.522 4.04211 7.22989 2.75 5.636 2.75C4.04211 2.75 2.75 4.04211 2.75 5.636C2.75 7.22989 4.04211 8.522 5.636 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 41.25C23.5939 41.25 24.886 39.9579 24.886 38.364C24.886 36.7701 23.5939 35.478 22 35.478C20.4061 35.478 19.114 36.7701 19.114 38.364C19.114 39.9579 20.4061 41.25 22 41.25Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 8.522C23.5939 8.522 24.886 7.22989 24.886 5.636C24.886 4.04211 23.5939 2.75 22 2.75C20.4061 2.75 19.114 4.04211 19.114 5.636C19.114 7.22989 20.4061 8.522 22 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 41.25C39.9569 41.25 41.249 39.9579 41.249 38.364C41.249 36.7701 39.9569 35.478 38.363 35.478C36.7691 35.478 35.477 36.7701 35.477 38.364C35.477 39.9579 36.7691 41.25 38.363 41.25Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 24.886C39.9569 24.886 41.249 23.5939 41.249 22C41.249 20.4061 39.9569 19.114 38.363 19.114C36.7691 19.114 35.477 20.4061 35.477 22C35.477 23.5939 36.7691 24.886 38.363 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M22 24.886C23.5939 24.886 24.886 23.5939 24.886 22C24.886 20.4061 23.5939 19.114 22 19.114C20.4061 19.114 19.114 20.4061 19.114 22C19.114 23.5939 20.4061 24.886 22 24.886Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M38.363 8.522C39.9569 8.522 41.249 7.22989 41.249 5.636C41.249 4.04211 39.9569 2.75 38.363 2.75C36.7691 2.75 35.477 4.04211 35.477 5.636C35.477 7.22989 36.7691 8.522 38.363 8.522Z\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleGrid.vue?vue&type=template&id=516968f3\"\nimport script from \"./DrillHoleGrid.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleGrid.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg :alt=\"alt\" width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path d=\"M7.636 41.319C9.268 41.319 10.591 39.996 10.591 38.364C10.591 36.732 9.268 35.409 7.636 35.409C6.004 35.409 4.681 36.732 4.681 38.364C4.681 39.996 6.004 41.319 7.636 41.319Z\" fill=\"white\"/>\n\t\t<path d=\"M11.273 19.501C12.905 19.501 14.228 18.178 14.228 16.546C14.228 14.914 12.905 13.591 11.273 13.591C9.641 13.591 8.318 14.914 8.318 16.546C8.318 18.178 9.641 19.501 11.273 19.501Z\" fill=\"white\"/>\n\t\t<path d=\"M31.273 37.682C32.905 37.682 34.228 36.359 34.228 34.727C34.228 33.095 32.905 31.772 31.273 31.772C29.641 31.772 28.318 33.095 28.318 34.727C28.318 36.359 29.641 37.682 31.273 37.682Z\" fill=\"white\"/>\n\t\t<path d=\"M24 8.591C25.632 8.591 26.955 7.268 26.955 5.636C26.955 4.004 25.632 2.681 24 2.681C22.368 2.681 21.045 4.004 21.045 5.636C21.045 7.268 22.368 8.591 24 8.591Z\" fill=\"white\"/>\n\t\t<path d=\"M35.82 23.137C37.452 23.137 38.775 21.814 38.775 20.182C38.775 18.55 37.452 17.227 35.82 17.227C34.188 17.227 32.865 18.55 32.865 20.182C32.865 21.814 34.188 23.137 35.82 23.137Z\" fill=\"white\"/>\n\t\t<path d=\"M24 24.955C25.632 24.955 26.955 23.632 26.955 22C26.955 20.368 25.632 19.045 24 19.045C22.368 19.045 21.045 20.368 21.045 22C21.045 23.632 22.368 24.955 24 24.955Z\" fill=\"white\"/>\n\t\t<path d=\"M7.636 41.319C9.268 41.319 10.591 39.996 10.591 38.364C10.591 36.732 9.268 35.409 7.636 35.409C6.004 35.409 4.681 36.732 4.681 38.364C4.681 39.996 6.004 41.319 7.636 41.319Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t\t<path d=\"M11.273 19.501C12.905 19.501 14.228 18.178 14.228 16.546C14.228 14.914 12.905 13.591 11.273 13.591C9.641 13.591 8.318 14.914 8.318 16.546C8.318 18.178 9.641 19.501 11.273 19.501Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t\t<path d=\"M31.273 37.682C32.905 37.682 34.228 36.359 34.228 34.727C34.228 33.095 32.905 31.772 31.273 31.772C29.641 31.772 28.318 33.095 28.318 34.727C28.318 36.359 29.641 37.682 31.273 37.682Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t\t<path d=\"M24 8.591C25.632 8.591 26.955 7.268 26.955 5.636C26.955 4.004 25.632 2.681 24 2.681C22.368 2.681 21.045 4.004 21.045 5.636C21.045 7.268 22.368 8.591 24 8.591Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t\t<path d=\"M35.82 23.137C37.452 23.137 38.775 21.814 38.775 20.182C38.775 18.55 37.452 17.227 35.82 17.227C34.188 17.227 32.865 18.55 32.865 20.182C32.865 21.814 34.188 23.137 35.82 23.137Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t\t<path d=\"M24 24.955C25.632 24.955 26.955 23.632 26.955 22C26.955 20.368 25.632 19.045 24 19.045C22.368 19.045 21.045 20.368 21.045 22C21.045 23.632 22.368 24.955 24 24.955Z\" stroke=\"#0074B5\" stroke-width=\"1.364\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleCustom.vue?vue&type=template&id=2e61dfb6\"\nimport script from \"./DrillHoleCustom.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleCustom.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"12.75\" width=\"28.5\" height=\"18.5\" rx=\"9.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./FlatOvalIcon.vue?vue&type=template&id=652f6c10\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\"\n\t\twidth=\"32\"\n\t\theight=\"32\"\n\t>\n\t\t<g transform=\"translate(1 1)\" fill=\"#FFF\" fill-rule=\"nonzero\" stroke=\"#0074B5\">\n\t\t\t<circle cx=\"7\" cy=\"7\" r=\"4\"/>\n\t\t\t<circle cx=\"23\" cy=\"7\" r=\"4\"/>\n\t\t\t<circle cx=\"7\" cy=\"23\" r=\"4\"/>\n\t\t\t<circle cx=\"23\" cy=\"23\" r=\"4\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHolePresetIcon.vue?vue&type=template&id=0c4d4169\"\nimport script from \"./DrillHolePresetIcon.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHolePresetIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M23.5083 33.25L10.75 33.25L10.75 11.75L32.8561 11.75L23.5083 33.25Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./SlopedRightRectangle.vue?vue&type=template&id=900b8faa\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M31.5227 24.7352C31.5227 29.858 27.7393 34.7756 20.6364 34.7756C13.5334 34.7756 9.75 29.858 9.75 24.7352C9.75 20.7887 12.2242 16.6232 14.9627 13.3715C16.3179 11.7622 17.7067 10.4138 18.8196 9.47271C19.3771 9.00137 19.856 8.64018 20.2194 8.40152C20.3972 8.28478 20.5357 8.20513 20.6345 8.15679C20.7332 8.20589 20.8714 8.28671 21.0489 8.40505C21.4126 8.6475 21.8918 9.01411 22.4496 9.4917C23.5631 10.4452 24.9526 11.8087 26.3086 13.4284C29.0503 16.7033 31.5227 20.8681 31.5227 24.7352Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./DropletIcon.vue?vue&type=template&id=35517dbe\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M31.5227 24.7352C31.5227 29.858 27.7393 34.7756 20.6364 34.7756C13.5334 34.7756 9.75 29.858 9.75 24.7352C9.75 20.6199 10.7529 16.4194 12.6374 13.2738C14.5167 10.1368 17.2148 8.125 20.6364 8.125C24.0527 8.125 26.7519 10.1699 28.6343 13.3308C30.5206 16.498 31.5227 20.6999 31.5227 24.7352Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./EggIcon.vue?vue&type=template&id=965b7f6e\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M22.5891 7.56941L35.4746 15.1953L22.5783 35.91L8.56836 15.2043L22.5891 7.56941Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./KiteIcon.vue?vue&type=template&id=241c6626\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M36.25 18.8129V25.1867C36.241 25.1951 36.2318 25.2037 36.2223 25.2125C36.0565 25.3667 35.8061 25.5906 35.4758 25.8611C34.8147 26.4024 33.8361 27.1279 32.5775 27.8543C30.0585 29.308 26.4374 30.7539 22 30.7539C17.5626 30.7539 13.9415 29.308 11.4225 27.8543C10.1639 27.1279 9.18531 26.4024 8.52425 25.8611C8.19393 25.5906 7.94352 25.3667 7.7777 25.2125C7.76819 25.2037 7.75895 25.1951 7.75 25.1867V18.813C7.75884 18.8044 7.76797 18.7956 7.77738 18.7865C7.93676 18.6332 8.17838 18.4101 8.49892 18.1405C9.14039 17.601 10.0955 16.8771 11.3378 16.152C13.8226 14.7019 17.443 13.2544 22.0001 13.2539C26.557 13.2534 30.1774 14.7009 32.6621 16.1513C33.9044 16.8764 34.8595 17.6005 35.501 18.1402C35.8215 18.4098 36.0632 18.633 36.2225 18.7864C36.232 18.7955 36.2411 18.8043 36.25 18.8129Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./BarrelIcon.vue?vue&type=template&id=a25ffb6c\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M27.7912 9.96094L35.5157 18.2634L22.5761 33.6565L8.51349 18.5384L16.6547 9.96094H27.7912Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./JewelIcon.vue?vue&type=template&id=46e4c364\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\tviewBox=\"0 0 32 32\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t>\n\t\t<g fill=\"none\" fill-rule=\"evenodd\">\n\t\t\t<path d=\"M23 18v1.99a1 1 0 0 1-1 1h-.01l-11-.116a1 1 0 0 1-.99-1V18h0\" stroke=\"#00ADEF\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n\t\t\t<g transform=\"translate(13 8)\" fill=\"#00ABEF\" fill-rule=\"nonzero\">\n\t\t\t\t<path d=\"M3.5 10a.666.666 0 0 1-.492-.212L.208 6.93A.693.693 0 0 1 0 6.429c0-.194.07-.361.208-.503A.666.666 0 0 1 .7 5.714h5.6c.19 0 .354.071.492.212A.693.693 0 0 1 7 6.43c0 .193-.07.36-.208.502l-2.8 2.857A.666.666 0 0 1 3.5 10Z\"/>\n\t\t\t\t<rect transform=\"rotate(90 3.5 4)\" x=\"-.5\" y=\"2.5\" width=\"8\" height=\"3\" rx=\"1\"/>\n\t\t\t</g>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DownloadIcon.vue?vue&type=template&id=d1394b7e\"\nimport script from \"./DownloadIcon.vue?vue&type=script&lang=js\"\nexport * from \"./DownloadIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\tviewBox=\"0 0 32 32\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t>\n\t\t<g fill=\"none\" fill-rule=\"evenodd\">\n\t\t\t<path fill=\"#EEEBE9\" d=\"M-511-634H929v3584H-511z\"/>\n\t\t\t<path fill=\"#FFF\" d=\"M-511-484H929V9803H-511z\"/>\n\t\t\t<rect x=\"1\" y=\"1\" width=\"18\" height=\"14\" rx=\"2\" transform=\"rotate(-90 17 9)\" fill=\"#FFF\" stroke=\"#00ABEF\" stroke-width=\"2\"/>\n\t\t\t<path fill=\"#00ABEF\" d=\"M12 11h8v2h-8zm0 4h8v2h-8zm0 4h4v2h-4z\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./SpecsIcon.vue?vue&type=template&id=54432b97\"\nimport script from \"./SpecsIcon.vue?vue&type=script&lang=js\"\nexport * from \"./SpecsIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<path d=\"M6.23317 30.9023L15.4561 13.098L37.7668 13.098L28.5439 30.9023L6.23317 30.9023Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./ParallelogramIcon.vue?vue&type=template&id=71942e42\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleNoneEdgesIcon.vue?vue&type=template&id=f7c32698\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M19.7539 17.5547H24.2441V26.5352H19.7539V17.5547Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleRectangleEdgesIcon.vue?vue&type=template&id=195eb920\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"7.75\" width=\"28.5\" height=\"28.5\" rx=\"14.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<rect x=\"16.75\" y=\"16.75\" width=\"10.5\" height=\"10.5\" rx=\"5.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./CircleCircleNoneIcon.vue?vue&type=template&id=f4f7939a\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"15.7891\" cy=\"19.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"21.7012\" cy=\"26.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"29.8945\" cy=\"17.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleNoneCustomIcon.vue?vue&type=template&id=451a6ca1\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"7.75\" width=\"28.5\" height=\"28.5\" rx=\"14.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"14.666\" cy=\"20.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"20.5781\" cy=\"27.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"28.7715\" cy=\"18.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./CircleNoneCustomIcon.vue?vue&type=template&id=e2b4eb7c\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"7.75\" width=\"28.5\" height=\"28.5\" rx=\"14.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"15.8359\" cy=\"15.5625\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"15.8359\" cy=\"28.4375\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"28.1641\" cy=\"15.5625\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"28.1641\" cy=\"28.4375\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"22\" cy=\"13.5625\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.9922\" cy=\"22\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.459\" cy=\"22\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"22\" cy=\"30.7695\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./CircleNoneRadialIcon.vue?vue&type=template&id=9ef3d0d4\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<rect x=\"17.7383\" y=\"17.5078\" width=\"8.52539\" height=\"8.98047\" rx=\"2.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleCircleEdgesIcon.vue?vue&type=template&id=5b5125ca\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<rect x=\"14.623\" y=\"18.75\" width=\"6.5\" height=\"6.5\" rx=\"3.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleCircleNoneIcon.vue?vue&type=template&id=3ac1768e\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"22\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"12.8887\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"22\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"22\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"22\" cy=\"22.0781\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"15.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"22\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.2188\" cy=\"28.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleNoneGridIcon.vue?vue&type=template&id=23979565\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M14.623 17.5078H19.1133V26.4883H14.623V17.5078Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"26.6211\" cy=\"20.4531\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"29.6211\" cy=\"26.8438\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"31.6211\" cy=\"17.4531\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleRectangleCustomIcon.vue?vue&type=template&id=3f4372e2\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<path d=\"M14.623 17.5078H19.1133V26.4883H14.623V17.5078Z\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleRectangleNoneIcon.vue?vue&type=template&id=6bb54669\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<rect x=\"17.7383\" y=\"17.5078\" width=\"8.52539\" height=\"8.98047\" rx=\"2.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RectangleRoundedrectangleNoneIcon.vue?vue&type=template&id=3e7b7dfa\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" rx=\"3.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"15.7891\" cy=\"19.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"21.7012\" cy=\"26.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"29.8945\" cy=\"17.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RoundedrectangleNoneCustomIcon.vue?vue&type=template&id=430de48d\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"44\" height=\"44\" viewBox=\"0 0 44 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n\t\t<rect x=\"7.75\" y=\"10.75\" width=\"28.5\" height=\"22.5\" rx=\"4.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"13.8887\" cy=\"16.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"13.8887\" cy=\"27.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"30.2188\" cy=\"16.6445\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t\t<circle cx=\"30.2188\" cy=\"27.5156\" r=\"1.25\" fill=\"#E5F6FD\" stroke=\"#0074B5\" stroke-width=\"1.5\"/>\n\t</svg>\n</template>\n","import { render } from \"./RoundedrectangleNoneEdgesIcon.vue?vue&type=template&id=1bdcaddb\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { Component } from \"vue\";\nimport ArrowIcon from \"./ArrowIcon.vue\";\nimport CircleIcon from \"./CircleIcon.vue\";\nimport EllipseIcon from \"./EllipseIcon.vue\";\nimport HalfCircle from \"./HalfCircle.vue\";\nimport HeartIcon from \"./HeartIcon.vue\";\nimport HexagonIcon from \"./HexagonIcon.vue\";\nimport OctagonIcon from \"./OctagonIcon.vue\";\nimport PolygonIcon from \"./PolygonIcon.vue\";\nimport IsoscelesTriangle from \"./IsoscelesTriangle.vue\";\nimport QuarterCircle from \"./QuarterCircle.vue\";\nimport RectangleCutout from \"./RectangleCutout.vue\";\nimport RightAngledTriangle from \"./RightAngledTriangle.vue\";\nimport RightAngledTriangleMirrored from \"./RightAngledTriangleMirrored.vue\";\nimport RoundedRectangle from \"./RoundedRectangle.vue\";\nimport SlopedRectangle from \"./SlopedRectangle.vue\";\nimport ArchedRectangle from \"./ArchedRectangle.vue\";\nimport StarIcon from \"./StarIcon.vue\";\nimport TrapezoidIcon from \"./TrapezoidIcon.vue\";\nimport RectangleIcon from \"@/components/icons/RectangleIcon.vue\";\nimport ShapesIcon from \"@/components/icons/ShapesIcon.vue\";\nimport TextIcon from \"@/components/icons/TextIcon.vue\";\nimport UploadIcon from \"@/components/icons/UploadIcon.vue\";\nimport CrossIcon from \"@/components/icons/CrossIcon.vue\";\nimport DrillHoleEdges from \"@/components/icons/DrillHoleEdges.vue\";\nimport DrillHoleRadial from \"@/components/icons/DrillHoleRadial.vue\";\nimport DrillHoleGrid from \"@/components/icons/DrillHoleGrid.vue\";\nimport DrillHoleCustom from \"@/components/icons/DrillHoleCustom.vue\";\nimport FlatOvalIcon from \"./FlatOvalIcon.vue\";\nimport DrillHolePresetIcon from \"@/components/icons/DrillHolePresetIcon.vue\";\nimport SlopedRightRectangle from \"./SlopedRightRectangle.vue\";\nimport DropletIcon from \"./DropletIcon.vue\";\nimport EggIcon from \"./EggIcon.vue\";\nimport KiteIcon from \"./KiteIcon.vue\";\nimport BarrelIcon from \"./BarrelIcon.vue\";\nimport JewelIcon from \"./JewelIcon.vue\";\nimport DownloadIcon from \"./DownloadIcon.vue\";\nimport SpecsIcon from \"./SpecsIcon.vue\";\nimport ParallogramIcon from \"./ParallelogramIcon.vue\";\nimport RectangleNoneEdgesIcon from \"./RectangleNoneEdgesIcon.vue\";\nimport RectangleRectangleEdgesIcon from \"./RectangleRectangleEdgesIcon.vue\";\nimport CircleCircleNoneIcon from \"./CircleCircleNoneIcon.vue\";\nimport RectangleNoneCustomIcon from \"./RectangleNoneCustomIcon.vue\";\nimport CircleNoneCustomIcon from \"./CircleNoneCustomIcon.vue\";\nimport CircleNoneRadialIcon from \"./CircleNoneRadialIcon.vue\";\nimport RectangleCircleEdgesIcon from \"./RectangleCircleEdgesIcon.vue\";\nimport RectangleCircleNoneIcon from \"./RectangleCircleNoneIcon.vue\";\nimport RectangleNoneGridIcon from \"./RectangleNoneGridIcon.vue\";\nimport RectangleRectangleCustomIcon from \"./RectangleRectangleCustomIcon.vue\";\nimport RectangleRectangleNoneIcon from \"./RectangleRectangleNoneIcon.vue\";\nimport RectangleRoundedrectangleNoneIcon from \"./RectangleRoundedrectangleNoneIcon.vue\";\nimport RoundedrectangleNoneCustomIcon from \"./RoundedrectangleNoneCustomIcon.vue\";\nimport RoundedrectangleNoneEdgesIcon from \"./RoundedrectangleNoneEdgesIcon.vue\";\n\nconst iconComponents = {\n\tcircle: CircleIcon,\n\t\"rounded-rectangle\": RoundedRectangle,\n\tegg: EggIcon,\n\tellipse: EllipseIcon,\n\t\"flat-oval\": FlatOvalIcon,\n\t\"right-angled-triangle\": RightAngledTriangle,\n\t\"right-angled-triangle-mirrored\": RightAngledTriangleMirrored,\n\t\"isosceles-triangle\": IsoscelesTriangle,\n\t\"half-circle\": HalfCircle,\n\t\"quarter-circle\": QuarterCircle,\n\t\"sloped-rectangle\": SlopedRectangle,\n\t\"sloped-right-rectangle\": SlopedRightRectangle,\n\t\"arched-rectangle\": ArchedRectangle,\n\ttrapezoid: TrapezoidIcon,\n\thexagon: HexagonIcon,\n\toctagon: OctagonIcon,\n\tpolygon: PolygonIcon,\n\tarrow: ArrowIcon,\n\tstar: StarIcon,\n\theart: HeartIcon,\n\trectangle: RectangleIcon,\n\t\"rectangle-icon\": RectangleCutout,\n\tkite: KiteIcon,\n\tbarrel: BarrelIcon,\n\tjewel: JewelIcon,\n\tparallelogram: ParallogramIcon,\n\tshapes: ShapesIcon,\n\ttext: TextIcon,\n\tupload: UploadIcon,\n\tdxf: UploadIcon,\n\tcross: CrossIcon,\n\tedges: DrillHoleEdges,\n\tradial: DrillHoleRadial,\n\tgrid: DrillHoleGrid,\n\tcustom: DrillHoleCustom,\n\tpreset: DrillHolePresetIcon,\n\tdroplet: DropletIcon,\n\tdownload: DownloadIcon,\n\tspecs: SpecsIcon,\n\tcircleCircleNone: CircleCircleNoneIcon,\n\tcircleNoneCustom: CircleNoneCustomIcon,\n\tcircleNoneRadial: CircleNoneRadialIcon,\n\trectangleCircleEdges: RectangleCircleEdgesIcon,\n\trectangleCircleNone: RectangleCircleNoneIcon,\n\trectangleNoneCustom: RectangleNoneCustomIcon,\n\trectangleNoneEdges: RectangleNoneEdgesIcon,\n\trectangleNoneGrid: RectangleNoneGridIcon,\n\trectangleRectangleCustom: RectangleRectangleCustomIcon,\n\trectangleRectangleEdges: RectangleRectangleEdgesIcon,\n\trectangleRectangleNone: RectangleRectangleNoneIcon,\n\trectangleRoundedrectangleNone: RectangleRoundedrectangleNoneIcon,\n\troundedrectangleNoneCustom: RoundedrectangleNoneCustomIcon,\n\troundedrectangleNoneEdges: RoundedrectangleNoneEdgesIcon,\n};\n\nexport const getIconComponent = (icon: string): Component => {\n\treturn iconComponents[icon];\n};\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-4d2bc3f1\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"download-link\" }\nconst _hoisted_2 = {\n  class: \"download-link__icon download-link__icon--left\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_3 = [\"href\"]\nconst _hoisted_4 = {\n  key: 0,\n  class: \"download-link__title\"\n}\nconst _hoisted_5 = {\n  key: 1,\n  class: \"download-link__meta\"\n}\nconst _hoisted_6 = { class: \"download-link__filetype\" }\nconst _hoisted_7 = {\n  class: \"download-link__icon download-link__icon--right\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_8 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", { class: \"download-link__spinner download-link__spinner--right\" }, [\n  /*#__PURE__*/_createElementVNode(\"svg\", {\n    class: \"spinner\",\n    viewBox: \"0 0 50 50\"\n  }, [\n    /*#__PURE__*/_createElementVNode(\"circle\", {\n      class: \"spinner__path\",\n      cx: \"25\",\n      cy: \"25\",\n      r: \"20\",\n      fill: \"none\",\n      \"stroke-width\": \"4\"\n    })\n  ])\n], -1))\n\nimport { getIconComponent } from '../icons/utils';\nimport { Download } from '@/types/download';\n\ninterface Props {\n\tdownload: Download;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DownloadLink',\n  props: {\n    download: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"span\", _hoisted_2, [\n      (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getIconComponent)('specs'))))\n    ]),\n    (_ctx.download.url)\n      ? (_openBlock(), _createElementBlock(\"a\", {\n          key: 0,\n          class: \"download-link__link\",\n          href: _ctx.download.url\n        }, [\n          (_ctx.download.title)\n            ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, _toDisplayString(_ctx.download.title), 1))\n            : _createCommentVNode(\"\", true),\n          (_ctx.download.filetype || _ctx.download.filesize)\n            ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n                _createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.download.filetype) + \" \" + _toDisplayString(_ctx.download.filesize), 1)\n              ]))\n            : _createCommentVNode(\"\", true)\n        ], 8, _hoisted_3))\n      : _createCommentVNode(\"\", true),\n    _createElementVNode(\"span\", _hoisted_7, [\n      (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getIconComponent)('download'))))\n    ]),\n    _hoisted_8\n  ]))\n}\n}\n\n})","import script from \"./DownloadLink.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DownloadLink.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DownloadLink.vue?vue&type=style&index=0&id=4d2bc3f1&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-4d2bc3f1\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, createBlock as _createBlock, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-354655ce\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"layout-downloads\" }\nconst _hoisted_2 = { class: \"layout-downloads__content\" }\nconst _hoisted_3 = [\"innerHTML\"]\n\nimport DownloadLink from \"@/components/UI/DownloadLink.vue\";\n\ninterface Props {\n\ttitle: string;\n\tdownloads: {\n\t\turl: string;\n\t\ttitle: string;\n\t\tfiletype: string;\n\t\tfilesize: string;\n\t}[];\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ContentDownloads',\n  props: {\n    title: {},\n    downloads: {}\n  },\n  setup(__props: any) {\n\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      (_ctx.title)\n        ? (_openBlock(), _createElementBlock(\"h2\", {\n            key: 0,\n            innerHTML: _ctx.title,\n            class: \"layout-downloads__title\"\n          }, null, 8, _hoisted_3))\n        : _createCommentVNode(\"\", true),\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.downloads, (item, key) => {\n        return (_openBlock(), _createBlock(DownloadLink, {\n          key: key,\n          download: item\n        }, null, 8, [\"download\"]))\n      }), 128))\n    ])\n  ]))\n}\n}\n\n})","import script from \"./ContentDownloads.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ContentDownloads.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ContentDownloads.vue?vue&type=style&index=0&id=354655ce&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-354655ce\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1dc526b4\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"html-content\" }\nconst _hoisted_2 = [\"innerHTML\"]\nconst _hoisted_3 = [\"innerHTML\"]\n\nimport { ExtendedProductInformationLayouts } from '@/types/extendedProductInformation';\nimport ContentImage from \"./ContentImage.vue\";\nimport ContentImageText from \"./ContentImageText.vue\";\nimport ContentDownloads from \"./ContentDownloads.vue\";\n\ninterface Props {\n\tcontent: ExtendedProductInformationLayouts;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'HtmlContent',\n  props: {\n    content: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.content, (item, index) => {\n      return (_openBlock(), _createElementBlock(_Fragment, null, [\n        (item.acf_fc_layout === 'title')\n          ? (_openBlock(), _createElementBlock(\"h2\", {\n              key: index + 'title',\n              innerHTML: item.title,\n              class: \"html-content__title\"\n            }, null, 8, _hoisted_2))\n          : (item.acf_fc_layout === 'text')\n            ? (_openBlock(), _createElementBlock(\"div\", {\n                key: index + 'text',\n                innerHTML: item.text,\n                class: \"html-content__text\"\n              }, null, 8, _hoisted_3))\n            : (item.acf_fc_layout === 'image')\n              ? (_openBlock(), _createBlock(ContentImage, {\n                  key: index + 'image',\n                  image: item.image,\n                  \"image-size\": \"medium_large\"\n                }, null, 8, [\"image\"]))\n              : (item.acf_fc_layout === 'image-text')\n                ? (_openBlock(), _createBlock(ContentImageText, {\n                    key: index + 'image-text',\n                    image: item.image,\n                    title: item.title,\n                    text: item.text\n                  }, null, 8, [\"image\", \"title\", \"text\"]))\n                : (item.acf_fc_layout === 'downloads')\n                  ? (_openBlock(), _createBlock(ContentDownloads, {\n                      key: index + 'downloads',\n                      title: item.title,\n                      downloads: item.downloads\n                    }, null, 8, [\"title\", \"downloads\"]))\n                  : _createCommentVNode(\"\", true)\n      ], 64))\n    }), 256))\n  ]))\n}\n}\n\n})","import script from \"./HtmlContent.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HtmlContent.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./HtmlContent.vue?vue&type=style&index=0&id=1dc526b4&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-1dc526b4\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, withCtx as _withCtx, Teleport as _Teleport, openBlock as _openBlock, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-769ca148\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"aria-label\"]\n\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport ModalDialog from \"./ModalDialog.vue\";\nimport HtmlContent from \"./HtmlContent.vue\";\nimport CrossIcon from \"../../icons/CrossIcon.vue\";\nimport { ExtendedProductInformationLayouts } from '@/types/extendedProductInformation';\n\ninterface Props {\n\tmodalName: string;\n\tcontent: ExtendedProductInformationLayouts;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'InfoModal',\n  props: {\n    modalName: {},\n    content: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\nconst currentModalName = computed(() => store.getters.currentModalName);\nconst isCurrent = computed(() => currentModalName.value === props.modalName);\n\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst store = useStore();\n\nfunction closeModal() {\n\tstore.commit('updateCurrentModalName', null);\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(_Teleport, { to: \"body\" }, [\n    _createVNode(ModalDialog, {\n      \"modal-name\": _ctx.modalName,\n      isOpen: isCurrent.value\n    }, {\n      default: _withCtx(() => [\n        _createElementVNode(\"button\", {\n          class: \"info-modal-close\",\n          type: \"button\",\n          onClick: closeModal,\n          ref: \"closeButton\",\n          \"aria-label\": _unref(i18n).closeModal\n        }, [\n          _createVNode(CrossIcon)\n        ], 8, _hoisted_1),\n        _createVNode(HtmlContent, { content: _ctx.content }, null, 8, [\"content\"])\n      ]),\n      _: 1\n    }, 8, [\"modal-name\", \"isOpen\"])\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport ModalDialog from \"./ModalDialog.vue\";\nimport HtmlContent from \"./HtmlContent.vue\";\nimport CrossIcon from \"../../icons/CrossIcon.vue\";\nimport { ExtendedProductInformationLayouts } from '@/types/extendedProductInformation';\n\ninterface Props {\n\tmodalName: string;\n\tcontent: ExtendedProductInformationLayouts;\n}\nconst props = defineProps<Props>();\nconst currentModalName = computed(() => store.getters.currentModalName);\nconst isCurrent = computed(() => currentModalName.value === props.modalName);\n\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst store = useStore();\n\nfunction closeModal() {\n\tstore.commit('updateCurrentModalName', null);\n}\n</script>\n\n<template>\n\t<Teleport to=\"body\">\n\t\t<modal-dialog :modal-name=\"modalName\" :isOpen=\"isCurrent\">\n\t\t\t<button\n\t\t\t\tclass=\"info-modal-close\"\n\t\t\t\ttype=\"button\"\n\t\t\t\t@click=\"closeModal\"\n\t\t\t\tref=\"closeButton\"\n\t\t\t\t:aria-label=\"i18n.closeModal\"\n\t\t\t>\n\t\t\t\t<cross-icon />\n\t\t\t</button>\n\t\t\t<html-content\n\t\t\t\t:content=\"content\"\n\t\t\t></html-content>\n\t\t</modal-dialog>\n\t</Teleport>\n</template>\n\n<style scoped lang=\"scss\">\n.info-modal-close {\n\theight: 40px;\n\twidth: 40px;\n\tpadding: 4px;\n\tposition: fixed;\n\ttop: 10px;\n\tright: 0;\n\tz-index: 2;\n}\n\n.info-modal-close > svg,\n.info-modal-close > svg > * {\n\twidth: 2rem;\n\theight: 2rem;\n\tstroke-width: 5px;\n}\n\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 0.2s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to{\n\topacity: 0;\n}\n</style>\n","import script from \"./InfoModal.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./InfoModal.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./InfoModal.vue?vue&type=style&index=0&id=769ca148&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-769ca148\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, Transition as _Transition, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport gsap from 'gsap';\n\ninterface Props {\n\tappear?: boolean\n\tmode?: \"in-out\" | \"out-in\" | \"default\"\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'MeasurementsHeightTransition',\n  props: {\n    appear: { type: Boolean },\n    mode: {}\n  },\n  setup(__props: any) {\n\n\n\nfunction onBeforeEnter(el) {\n\tgsap.set(el, {\n\t\theight: 0,\n\t\toverflow: 'hidden',\n\t});\n}\n\nfunction onEnter(el, done) {\n\tconst sectionHeight = el.scrollHeight;\n\tgsap.fromTo(\n\t\tel,\n\t\t{ height: 0 },\n\t\t{\n\t\t\theight: sectionHeight,\n\t\t\tduration: 0.3,\n\t\t\tease: 'power2.in',\n\t\t\tonComplete: done\n\t\t}\n\t);\n}\n\nfunction onAfterEnter(el) {\n\tgsap.set(el, {\n\t\theight: \"auto\",\n\t\toverflow: null,\n\t});\n}\n\nfunction onBeforeLeave(el) {\n\tgsap.set(el, {\n\t\toverflow: 'hidden',\n\t});\n}\n\nfunction onLeave(el, done) {\n\tconst sectionHeight = el.scrollHeight;\n\tgsap.fromTo(\n\t\tel,\n\t\t{ height: sectionHeight },\n\t\t{\n\t\t\theight: 0,\n\t\t\tduration: 0.3,\n\t\t\tease: 'power2.in',\n\t\t\tonComplete: done\n\t\t}\n\t);\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(_Transition, {\n    name: \"measurements-height\",\n    appear: \"\",\n    mode: _ctx.mode,\n    onBeforeEnter: onBeforeEnter,\n    onEnter: onEnter,\n    onAfterEnter: onAfterEnter,\n    onBeforeLeave: onBeforeLeave,\n    onLeave: onLeave,\n    css: false\n  }, {\n    default: _withCtx(() => [\n      _renderSlot(_ctx.$slots, \"default\")\n    ]),\n    _: 3\n  }, 8, [\"mode\"]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport gsap from 'gsap';\n\ninterface Props {\n\tappear?: boolean\n\tmode?: \"in-out\" | \"out-in\" | \"default\"\n}\ndefineProps<Props>();\n\nfunction onBeforeEnter(el) {\n\tgsap.set(el, {\n\t\theight: 0,\n\t\toverflow: 'hidden',\n\t});\n}\n\nfunction onEnter(el, done) {\n\tconst sectionHeight = el.scrollHeight;\n\tgsap.fromTo(\n\t\tel,\n\t\t{ height: 0 },\n\t\t{\n\t\t\theight: sectionHeight,\n\t\t\tduration: 0.3,\n\t\t\tease: 'power2.in',\n\t\t\tonComplete: done\n\t\t}\n\t);\n}\n\nfunction onAfterEnter(el) {\n\tgsap.set(el, {\n\t\theight: \"auto\",\n\t\toverflow: null,\n\t});\n}\n\nfunction onBeforeLeave(el) {\n\tgsap.set(el, {\n\t\toverflow: 'hidden',\n\t});\n}\n\nfunction onLeave(el, done) {\n\tconst sectionHeight = el.scrollHeight;\n\tgsap.fromTo(\n\t\tel,\n\t\t{ height: sectionHeight },\n\t\t{\n\t\t\theight: 0,\n\t\t\tduration: 0.3,\n\t\t\tease: 'power2.in',\n\t\t\tonComplete: done\n\t\t}\n\t);\n}\n\n</script>\n<template>\n\t<Transition name=\"measurements-height\" appear :mode=\"mode\" @before-enter=\"onBeforeEnter\" @enter=\"onEnter\" @after-enter=\"onAfterEnter\" @before-leave=\"onBeforeLeave\" @leave=\"onLeave\" :css=\"false\">\n\t\t<slot></slot>\n\t</Transition>\n</template>\n","import script from \"./MeasurementsHeightTransition.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./MeasurementsHeightTransition.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, createElementVNode as _createElementVNode, unref as _unref, toDisplayString as _toDisplayString, vShow as _vShow, withDirectives as _withDirectives, Transition as _Transition, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, normalizeClass as _normalizeClass, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-a38d12fc\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = { class: \"accordion-item__header\" }\nconst _hoisted_3 = { class: \"accordion-item__indicator\" }\nconst _hoisted_4 = [\"aria-expanded\", \"aria-describedby\", \"disabled\"]\nconst _hoisted_5 = { class: \"accordion-item__title\" }\nconst _hoisted_6 = [\"id\"]\nconst _hoisted_7 = {\n  key: 0,\n  class: \"accordion-item__info-button\"\n}\nconst _hoisted_8 = [\"aria-hidden\"]\n\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport { uniqueId } from 'lodash';\nimport AccordionIndicator from './AccordionIndicator.vue';\nimport InfoButton from '../UI/InfoModal/OpenButton.vue';\nimport InfoModal from '../UI/InfoModal/InfoModal.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport { StepTypes } from '@/types/step';\n\ninterface Props {\n\tstepName: StepTypes;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'AccordionItem',\n  props: {\n    stepName: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst step = computed(() => store.getters.getStepById(props.stepName));\nconst currentStepName = computed(() => store.getters.currentStepName);\nconst isCurrent = computed(() => currentStepName.value === props.stepName);\n\nconst htmlId = uniqueId('accordion-item-');\nconst variant = computed((): 'valid' | 'empty' | 'error' => {\n\tif (step.value.status === 'completed') {\n\t\treturn 'valid';\n\t}\n\tif (step.value.status === 'invalid') {\n\t\treturn 'error';\n\t}\n\treturn 'empty';\n});\n\nif (!currentStepName.value) { // if no current step, set first one\n\tstore.commit('updateCurrentStepName', props.stepName);\n}\n\nfunction updateCurrentStep() {\n\tstore.commit('updateCurrentStepName', props.stepName);\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"section\", {\n    class: _normalizeClass(['accordion-item', `accordion-item--${variant.value}`]),\n    \"aria-label\": step.value.shortTitle\n  }, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createElementVNode(\"div\", _hoisted_3, [\n        _createVNode(AccordionIndicator, { variant: variant.value }, null, 8, [\"variant\"])\n      ]),\n      _createElementVNode(\"div\", null, [\n        _createElementVNode(\"button\", {\n          class: \"accordion-item__button\",\n          onClick: updateCurrentStep,\n          type: \"button\",\n          \"aria-expanded\": isCurrent.value,\n          \"aria-describedby\": step.value.text && !isCurrent.value ? _unref(htmlId) : null,\n          disabled: isCurrent.value\n        }, [\n          _createElementVNode(\"span\", _hoisted_5, _toDisplayString(step.value.title), 1)\n        ], 8, _hoisted_4),\n        _createVNode(MeasurementsHeightTransition, {\n          appear: false,\n          mode: \"out-in\"\n        }, {\n          default: _withCtx(() => [\n            (step.value.text || isCurrent.value)\n              ? (_openBlock(), _createElementBlock(\"p\", {\n                  key: 0,\n                  class: \"accordion-item__selection-info\",\n                  id: _unref(htmlId)\n                }, [\n                  _createVNode(_Transition, { name: \"accordion-fade\" }, {\n                    default: _withCtx(() => [\n                      _withDirectives(_createElementVNode(\"span\", null, _toDisplayString(step.value.status === 'invalid' ? _unref(i18n).stepError : step.value.text), 513), [\n                        [_vShow, step.value.text && !isCurrent.value]\n                      ])\n                    ]),\n                    _: 1\n                  })\n                ], 8, _hoisted_6))\n              : _createCommentVNode(\"\", true)\n          ]),\n          _: 1\n        })\n      ]),\n      (step.value.information)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n            _createVNode(InfoButton, {\n              \"modal-name\": _ctx.stepName,\n              label: _unref(i18n).modalTriggerLabel\n            }, null, 8, [\"modal-name\", \"label\"]),\n            _createVNode(InfoModal, {\n              \"modal-name\": _ctx.stepName,\n              content: step.value.information\n            }, null, 8, [\"modal-name\", \"content\"])\n          ]))\n        : _createCommentVNode(\"\", true)\n    ]),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: false,\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        _withDirectives(_createElementVNode(\"div\", {\n          class: \"accordion-item__content\",\n          \"aria-hidden\": !isCurrent.value\n        }, [\n          _renderSlot(_ctx.$slots, \"default\", { stepName: _ctx.stepName })\n        ], 8, _hoisted_8), [\n          [_vShow, isCurrent.value]\n        ])\n      ]),\n      _: 3\n    })\n  ], 10, _hoisted_1))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport { uniqueId } from 'lodash';\nimport AccordionIndicator from './AccordionIndicator.vue';\nimport InfoButton from '../UI/InfoModal/OpenButton.vue';\nimport InfoModal from '../UI/InfoModal/InfoModal.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport { StepTypes } from '@/types/step';\n\ninterface Props {\n\tstepName: StepTypes;\n}\n\nconst props = defineProps<Props>();\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst step = computed(() => store.getters.getStepById(props.stepName));\nconst currentStepName = computed(() => store.getters.currentStepName);\nconst isCurrent = computed(() => currentStepName.value === props.stepName);\n\nconst htmlId = uniqueId('accordion-item-');\nconst variant = computed((): 'valid' | 'empty' | 'error' => {\n\tif (step.value.status === 'completed') {\n\t\treturn 'valid';\n\t}\n\tif (step.value.status === 'invalid') {\n\t\treturn 'error';\n\t}\n\treturn 'empty';\n});\n\nif (!currentStepName.value) { // if no current step, set first one\n\tstore.commit('updateCurrentStepName', props.stepName);\n}\n\nfunction updateCurrentStep() {\n\tstore.commit('updateCurrentStepName', props.stepName);\n}\n\n</script>\n\n<template>\n\t<section :class=\"['accordion-item', `accordion-item--${variant}`]\" :aria-label=\"step.shortTitle\">\n\t\t<div class=\"accordion-item__header\">\n\t\t\t<div class=\"accordion-item__indicator\">\n\t\t\t\t<accordion-indicator :variant=\"variant\" />\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<button class=\"accordion-item__button\" @click=\"updateCurrentStep\" type=\"button\" :aria-expanded=\"isCurrent\" :aria-describedby=\"step.text && !isCurrent ? htmlId : null\" :disabled=\"isCurrent\">\n\t\t\t\t\t<span class=\"accordion-item__title\">{{ step.title }}</span>\n\t\t\t\t</button>\n\t\t\t\t<measurements-height-transition :appear=\"false\" mode=\"out-in\">\n\t\t\t\t\t<p class=\"accordion-item__selection-info\" :id=\"htmlId\" v-if=\"step.text || isCurrent\">\n\t\t\t\t\t\t<transition name=\"accordion-fade\">\n\t\t\t\t\t\t\t<span v-show=\"step.text && !isCurrent\">\n\t\t\t\t\t\t\t\t{{ step.status === 'invalid' ? i18n.stepError : step.text }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</transition>\n\t\t\t\t\t</p>\n\t\t\t\t</measurements-height-transition>\n\t\t\t</div>\n\t\t\t<div v-if=\"step.information\" class=\"accordion-item__info-button\">\n\t\t\t\t<info-button :modal-name=\"stepName\" :label=\"i18n.modalTriggerLabel\"></info-button>\n\t\t\t\t<info-modal :modal-name=\"stepName\" :content=\"step.information\"></info-modal>\n\t\t\t</div>\n\t\t</div>\n\t\t<measurements-height-transition :appear=\"false\" mode=\"out-in\">\n\t\t\t<div class=\"accordion-item__content\" :aria-hidden=\"!isCurrent\" v-show=\"isCurrent\">\n\t\t\t\t<slot :stepName=\"stepName\"></slot>\n\t\t\t</div>\n\t\t</measurements-height-transition>\n\t</section>\n</template>\n\n<style scoped lang=\"scss\">\n.accordion-item {\n\t--accordion-item-px: 20px;\n\t--text-color: #{$brand-blue-dark};\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tpadding: 16px var(--accordion-item-px);\n\tposition: relative;\n\n\t+ * {\n\t\tborder-top: 1px solid $border-color;\n\t}\n\n\t&.accordion-item--error {\n\t\t--text-color: #{$brand-pink};\n\t}\n}\n\n.accordion-item__header {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: flex-start;\n\tjustify-content: flex-start;\n\tgap: 20px;\n}\n\n.accordion-item__indicator {\n\tposition: relative;\n\ttop: 3px;\n}\n\n.accordion-item__button {\n\tcolor: var(--text-color);\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: flex-start;\n\tgap: 10px;\n\tpadding: 0;\n\twidth: 100%;\n\tposition: static;\n\twhite-space: normal;\n\ttext-align: left;\n\n\t&:focus {\n\t\toutline: auto;\n\t\toutline-offset: 3px;\n\t}\n\n\t&[aria-expanded=\"true\"] {\n\t\tcursor: default;\n\t\ttext-decoration: none;\n\n\t\t&:focus {\n\t\t\toutline: none;\n\t\t}\n\t}\n\n\t&[disabled] {\n\t\tbackground-color: transparent;\n\t}\n\n\t&:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\tinset: 0;\n\t}\n}\n\n.accordion-item__title {\n\tcolor: var(--text-color);\n\tfont-weight: 600;\n}\n\n.accordion-item__info-button {\n\tmargin-left: auto;\n\tposition: relative;\n\tz-index: 2;\n\tflex-shrink: 0;\n}\n\n.accordion-item__content {\n\tdisplay: grid;\n\tgrid-template-rows: 1fr;\n\tgrid-template-columns: minmax(0, 1fr);\n\tgap: $default-padding * 0.5;\n}\n\n.accordion-item__content-inner {\n\toverflow: hidden;\n}\n\n.accordion-item__selection-info {\n\tcolor: var(--text-color);\n\tmargin: 0;\n\tfont-size: 14px;\n\tline-height: 1.4;\n\tmin-height: calc(14px * 1.4);\n\n\tspan {\n\t\tdisplay: inline-block;\n\t}\n}\n\n.accordion-fade-enter-active {\n\ttransition: opacity 0.2s ease;\n\ttransition-delay: 0.2s;\n}\n\n.accordion-fade-leave-active {\n\ttransition: opacity 0.2s ease;\n\ttransition-delay: 0;\n}\n\n.accordion-fade-enter-from,\n.accordion-fade-leave-to {\n\topacity: 0;\n}\n</style>\n","import script from \"./AccordionItem.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AccordionItem.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AccordionItem.vue?vue&type=style&index=0&id=a38d12fc&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-a38d12fc\"]])\n\nexport default __exports__","<template>\n\t<Teleport v-if=\"showDesktopPreview\" to=\"#measurements-selector-desktop-preview\">\n\t\t<ShapePreview\n\t\t\tv-if=\"showDesktopPreview\"\n\t\t\tv-bind:primitives=\"primitives\"\n\t\t\tv-bind:unit=\"unit\"\n\t\t\t:onResize=\"resizeProductGallery\"\n\t\t></ShapePreview>\n\t</Teleport>\n\t<Teleport v-if=\"initialized && showDesktopPreview\" to=\"#measurements-selector-desktop-controls\">\n\t\t<PreviewButtongroup v-if=\"previewIsShown\" />\n\t</Teleport>\n\t<portal\n\t\tv-else-if=\"!showDesktopPreview && shape === 'dxf'\"\n\t\tto=\"shape-preview\"\n\t\ttag=\"div\"\n\t>\n\t\t<ShapePreview\n\t\t\tv-bind:primitives=\"primitives\"\n\t\t\tv-bind:unit=\"unit\"\n\t\t\t:canPreview=\"canPreview\"\n\t\t></ShapePreview>\n\t</portal>\n\t<template v-else-if=\"!showDesktopPreview && shape !== ''\">\n\t\t<ShapePreview\n\t\t\tv-bind:primitives=\"primitives\"\n\t\t\tv-bind:unit=\"unit\"\n\t\t\t:canPreview=\"canPreview\"\n\t\t></ShapePreview>\n\t</template>\n</template>\n\n<script>\nimport ShapePreview from \"./ShapePreview\";\nimport debounce from \"lodash/debounce\";\nimport { mapGetters, mapMutations } from \"vuex\";\nimport PreviewButtongroup from \"@/components/PreviewButtongroup\";\n\nexport default {\n\tprops: {\n\t\tprimitives: Object,\n\t\tunit: String,\n\t},\n\tmounted: function() {\n\t\tthis.setProductGallery();\n\t\tthis.addFullScreenListener();\n\t},\n\tcreated: function() {\n\t\twindow.addEventListener( 'resize', this.onResize );\n\t},\n\tbeforeUnmount: function() {\n\t\twindow.removeEventListener( 'resize', this.onResize );\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tinitialized: false,\n\t\t\tgalleryItemId: \"#measurements-selector-desktop-preview\",\n\t\t\tcontrolsItemId: \"measurements-selector-desktop-controls\",\n\t\t\tproductGallery: null,\n\t\t\tshowDesktopPreview: this.isMediaDesktopSize(),\n\t\t\tpreviewIsShown: false,\n\t\t};\n\t},\n\twatch: {\n\n\t\t// If the user interacts with the measurements configurator\n\t\t// we need to show the preview.\n\t\tusesDefaultDimensions: function( newValue, oldValue ) {\n\t\t\tif( newValue !== oldValue ) {\n\t\t\t\tthis.resizeProductGallery({ canPreview: this.canPreview });\n\t\t\t}\n\t\t},\n\t\tisShapeComplete: function( newValue, oldValue ) {\n\t\t\tif( newValue !== oldValue ) {\n\t\t\t\tthis.resizeProductGallery({ canPreview: this.canPreview });\n\t\t\t}\n\t\t},\n\t\tsideUserSelected: function( newValue, oldValue ) {\n\t\t\tif( newValue !== oldValue ) {\n\t\t\t\tthis.resizeProductGallery({ canPreview: this.canPreview });\n\t\t\t}\n\t\t},\n\t},\n\tcomputed: {\n\t\ti18n: function() { return this.$i18n; },\n\t\t...mapGetters( [\n\t\t\t'rotation',\n\t\t\t'usesDefaultDimensions',\n\t\t\t'shape',\n\t\t\t'isShapeComplete',\n\t\t\t'sideUserSelected'\n\t\t] )\n\t},\n\tmethods: {\n\t\tsetProductGallery: function() {\n\n\t\t\t// Only set the reference if we haven't before.\n\t\t\tif ( this.productGallery !== null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst $ = jQuery;\n\n\t\t\t// This finds the gallery in which our measurements preview is contained.\n\t\t\tconst $wrap      = $( document.querySelector( '.kps-gallery' ) );\n\t\t\tconst $gallery   = $( document.getElementById( 'js-kps-gallery' ) );\n\t\t\tconst $preview   = $( document.querySelector('[data-product-slider-preview-container]') );\n\t\t\tconst keenSlider = $gallery[ 0 ]?.keenSlider;\n\n\t\t\t// This means flexslider hasn't been initialized yet.\n\t\t\tif ( ! keenSlider ) {\n\n\t\t\t\t// WooCommerce triggers this event when it is done initializing the gallery.\n\t\t\t\t$gallery.on( 'wc-product-gallery-after-init', this.setProductGallery );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.init( {\n\t\t\t\t$wrap,\n\t\t\t\t$gallery,\n\t\t\t\t$preview,\n\t\t\t\tkeenSlider,\n\t\t\t} );\n\t\t},\n\t\tresizeProductGallery: function( ) {\n\t\t\tif ( ! this.initialized ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst $ = jQuery;\n\t\t\tconst { keenSlider, $preview, $previewButton } = this.productGallery;\n\t\t\tif (\n\t\t\t\tthis.isShapeComplete\n\t\t\t\t&& this.showDesktopPreview\n\t\t\t\t&& ! this.usesDefaultDimensions\n\t\t\t\t&& this.shape.length > 0\n\t\t\t\t|| this.isShapeComplete\n\t\t\t\t&& this.showDesktopPreview\n\t\t\t\t&& this.usesDefaultDimensions\n\t\t\t\t&& this.shape.length > 0\n\t\t\t\t&& this.sideUserSelected\n\t\t\t) {\n\t\t\t\tthis.showPreview();\n\t\t\t} else {\n\t\t\t\tif ( this.previewIsShown ) {\n\t\t\t\t\tthis.hidePreview();\n\t\t\t\t\tkeenSlider.moveToSlide( 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinit: function( productGallery ) {\n\t\t\tconst $ = jQuery;\n\n\t\t\t// Our WordPress filter is very late so our preview item should always be the last one.\n\t\t\tconst $previewButton = $( document.querySelector( '[data-gallery-navigation-preview-trigger]' ) );\n\n\t\t\t// Save relevant elements for later reference\n\t\t\tproductGallery.$previewButton = $previewButton;\n\n\t\t\tthis.productGallery = productGallery;\n\t\t\tthis.addPreviewButtongroup();\n\t\t\tthis.initialized = true;\n\t\t},\n\t\tshowPreview() {\n\t\t\tthis.productGallery.$wrap.addClass('js-show-preview');\n\t\t\tthis.previewIsShown = true;\n\t\t},\n\t\thidePreview() {\n\t\t\tthis.productGallery.$wrap.removeClass('js-show-preview');\n\t\t\tthis.previewIsShown = false;\n\t\t},\n\t\taddPreviewButtongroup() {\n\t\t\tconst { $gallery } = this.productGallery;\n\n\t\t\t$gallery.prepend( '<div class=\"measurements-selector__preview-controls\" id=\"' + this.controlsItemId + '\"></div>' );\n\t\t},\n\t\tisMediaDesktopSize: function() {\n\t\t\tconst media = window.matchMedia( \"(min-width: 992px)\" );\n\n\t\t\treturn media.matches;\n\t\t},\n\t\tonResize: debounce( function() {\n\t\t\tconst previousShowDesktopPreview = this.showDesktopPreview;\n\n\t\t\tthis.showDesktopPreview = this.isMediaDesktopSize();\n\n\t\t\tif ( previousShowDesktopPreview !== this.showDesktopPreview ) {\n\t\t\t\tthis.resizeProductGallery();\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Because resizing a window doesn't happen all the time, use a relatively long debounce. Having no slowdown\n\t\t\t * is more important than a constant up-to-date view.\n\t\t\t */\n\t\t}, 200 ),\n\t\taddFullScreenListener: function() {\n\t\t\tdocument.querySelector( '.js-product-zoom' )?.addEventListener('click', () =>{\n\t\t\t\tthis.updateZoom(1);\n\t\t\t\tthis.updateRotation(0);\n\t\t\t});\n\t\t},\n\t\t...mapMutations( [\n\t\t\t'updateZoom',\n\t\t\t'updateRotation',\n\t\t\t'updateTranslation'\n\t\t] )\n\t},\n\tcomponents: {\n\t\tPreviewButtongroup,\n\t\tShapePreview\n\t}\n};\n</script>\n","export function toggleAddToCartButtonState( state: boolean ): void {\n\tconst submit = document.getElementsByClassName( 'single_add_to_cart_button' );\n\n\tif ( ! submit.length ) {\n\t\treturn;\n\t}\n\n\tfor ( const element of submit ) {\n\t\telement[ 'disabled' ] = state;\n\t}\n}\n\n","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, normalizeStyle as _normalizeStyle } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"measurements-selector__message\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"measurements-selector__message\"\n}\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"icon-spinner2\" }, null, -1)\nconst _hoisted_4 = {\n  key: 2,\n  class: \"measurements-selector__message\"\n}\nconst _hoisted_5 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"icon-spinner2\" }, null, -1)\nconst _hoisted_6 = [\"innerHTML\"]\nconst _hoisted_7 = {\n  key: 4,\n  class: \"measurements-selector__message\"\n}\n\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { useStore } from \"vuex\";\nimport isEmpty from \"lodash/isEmpty\";\nimport { onBeforeUnmount } from \"vue\";\nimport { toggleAddToCartButtonState } from \"@/functions/dom\";\n\ninterface Props {\n\tprimitives: {\n\t\tfont: string|boolean;\n\t};\n\thasFailedLoadingFont?: boolean;\n\n\tunit: string;\n\tonResize: ({ canPreview }) => void;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapePreview',\n  props: {\n    primitives: {},\n    hasFailedLoadingFont: { type: Boolean },\n    unit: {},\n    onResize: { type: Function }\n  },\n  setup(__props: any) {\n\nconst props = __props;\nconst store = useStore();\n\nconst previewContainer = ref<HTMLElement | null>(null);\nconst isDragging = ref(false);\nconst dragStart = ref({ x: null, y: null });\n\nconst hasValidatorErrors = computed(() => store.getters.hasValidatorErrors);\nconst previewModel = computed(() => store.getters.getPreviewModel);\nconst canPreview = computed(() => store.getters.isShapeComplete);\nconst shape = computed(() => store.getters.shape);\nconst isLoading = computed(() => {\n\tif(!store.getters.isShapeComplete) {\n\t\treturn false;\n\t}\n\tconst completeModel = store.getters.getExportableModel;\n\n\treturn isEmpty(completeModel) || isEmpty(completeModel.models);\n});\nconst fontIsLoading = computed(() => store.getters.fontIsLoading);\nconst translation = computed(() => store.getters.translation);\nconst isShapeComplete = computed(() => store.getters.isShapeComplete);\nconst transformContainerStyle = computed(() => {\n\treturn {\n\t\ttransform: `translate(${translation.value[ 0 ]}px, ${translation.value[ 1 ]}px)`,\n\t};\n});\nconst zoom = computed(() => store.getters.zoom);\nconst rotation = computed(() => store.getters.rotation);\nconst previewTransformStyle = computed(() => {\n\treturn {\n\t\tdisplay: 'flex',\n\t\ttransform: `rotate(${rotation.value}deg) scale(${zoom.value})`,\n\t\ttransition: \"transform 0.5s ease 0s\",\n\t\ttransformOrigin: \"center\",\n\t};\n});\n\nconst resizeObserver = new ResizeObserver(() => {\n\tupdatePreviewShapeDimensions();\n});\n\nwatch(hasValidatorErrors, (hasErrors: boolean) => {\n\ttoggleAddToCartButtonState(hasErrors);\n});\n\nwatch(shape, async (newValue, oldValue) => {\n\tif (newValue !== oldValue) {\n\t\tupdatePreviewShapeDimensions();\n\t}\n}, { deep: true });\n\nonMounted(() => {\n\tif (previewContainer.value) {\n\t\tresizeObserver.observe(previewContainer.value);\n\t\tupdatePreviewShapeDimensions();\n\t}\n\tstore.dispatch('loadConfiguration');\n});\n\nonBeforeUnmount(() => {\n\tresizeObserver.disconnect();\n});\n\nfunction updatePreviewShapeDimensions(): void {\n\tif (!previewContainer.value) return;\n\n\tstore.commit(\"updatePreviewShapeDimensions\", {\n\t\twidth: previewContainer.value.offsetWidth,\n\t\theight: previewContainer.value.offsetHeight,\n\t});\n\n\tif (props.onResize) {\n\t\tprops.onResize({ canPreview: canPreview.value });\n\t}\n}\n\nfunction mousedown( event: MouseEvent ):void {\n\tif (!canPreview.value) return;\n\n\tdragStart.value.x = event.screenX;\n\tdragStart.value.y = event.screenY;\n\tisDragging.value = true;\n}\n\nfunction mouseup(): void {\n\tisDragging.value = false;\n}\n\nfunction mousemove( event: MouseEvent ): void {\n\tif (!isDragging.value) return;\n\n\tconst diffX = event.screenX - dragStart.value.x;\n\tconst diffY = event.screenY - dragStart.value.y;\n\n\tstore.commit('updateTranslation', [\n\t\ttranslation.value[0] + diffX,\n\t\ttranslation.value[1] + diffY,\n\t] );\n\n\tdragStart.value.x = event.screenX;\n\tdragStart.value.y = event.screenY;\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    ref_key: \"previewContainer\",\n    ref: previewContainer,\n    class: \"measurements-selector__sub-section measurements-selector__preview\",\n    style: _normalizeStyle({'cursor': isDragging.value ? 'grabbing' : 'grab'}),\n    onMousedown: mousedown,\n    onMouseup: mouseup,\n    onMousemove: mousemove\n  }, [\n    (props.hasFailedLoadingFont === props.primitives.font)\n      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, _toDisplayString(_ctx.$i18n.messages.failedLoadingFont), 1))\n      : (fontIsLoading.value)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, [\n            _hoisted_3,\n            _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.messages.isLoadingFont), 1)\n          ]))\n        : (isLoading.value)\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_4, [\n              _hoisted_5,\n              _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.messages.isLoadingCalculations), 1)\n            ]))\n          : (isShapeComplete.value)\n            ? (_openBlock(), _createElementBlock(\"div\", {\n                key: 3,\n                class: \"measurements-selector__preview-inner-container\",\n                style: _normalizeStyle(transformContainerStyle.value)\n              }, [\n                _createElementVNode(\"div\", {\n                  style: _normalizeStyle(previewTransformStyle.value),\n                  innerHTML: previewModel.value\n                }, null, 12, _hoisted_6)\n              ], 4))\n            : (_openBlock(), _createElementBlock(\"span\", _hoisted_7, _toDisplayString(_ctx.$i18n.messages.noPreview), 1))\n  ], 36))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { useStore } from \"vuex\";\nimport isEmpty from \"lodash/isEmpty\";\nimport { onBeforeUnmount } from \"vue\";\nimport { toggleAddToCartButtonState } from \"@/functions/dom\";\n\ninterface Props {\n\tprimitives: {\n\t\tfont: string|boolean;\n\t};\n\thasFailedLoadingFont?: boolean;\n\n\tunit: string;\n\tonResize: ({ canPreview }) => void;\n}\n\nconst props = defineProps<Props>();\nconst store = useStore();\n\nconst previewContainer = ref<HTMLElement | null>(null);\nconst isDragging = ref(false);\nconst dragStart = ref({ x: null, y: null });\n\nconst hasValidatorErrors = computed(() => store.getters.hasValidatorErrors);\nconst previewModel = computed(() => store.getters.getPreviewModel);\nconst canPreview = computed(() => store.getters.isShapeComplete);\nconst shape = computed(() => store.getters.shape);\nconst isLoading = computed(() => {\n\tif(!store.getters.isShapeComplete) {\n\t\treturn false;\n\t}\n\tconst completeModel = store.getters.getExportableModel;\n\n\treturn isEmpty(completeModel) || isEmpty(completeModel.models);\n});\nconst fontIsLoading = computed(() => store.getters.fontIsLoading);\nconst translation = computed(() => store.getters.translation);\nconst isShapeComplete = computed(() => store.getters.isShapeComplete);\nconst transformContainerStyle = computed(() => {\n\treturn {\n\t\ttransform: `translate(${translation.value[ 0 ]}px, ${translation.value[ 1 ]}px)`,\n\t};\n});\nconst zoom = computed(() => store.getters.zoom);\nconst rotation = computed(() => store.getters.rotation);\nconst previewTransformStyle = computed(() => {\n\treturn {\n\t\tdisplay: 'flex',\n\t\ttransform: `rotate(${rotation.value}deg) scale(${zoom.value})`,\n\t\ttransition: \"transform 0.5s ease 0s\",\n\t\ttransformOrigin: \"center\",\n\t};\n});\n\nconst resizeObserver = new ResizeObserver(() => {\n\tupdatePreviewShapeDimensions();\n});\n\nwatch(hasValidatorErrors, (hasErrors: boolean) => {\n\ttoggleAddToCartButtonState(hasErrors);\n});\n\nwatch(shape, async (newValue, oldValue) => {\n\tif (newValue !== oldValue) {\n\t\tupdatePreviewShapeDimensions();\n\t}\n}, { deep: true });\n\nonMounted(() => {\n\tif (previewContainer.value) {\n\t\tresizeObserver.observe(previewContainer.value);\n\t\tupdatePreviewShapeDimensions();\n\t}\n\tstore.dispatch('loadConfiguration');\n});\n\nonBeforeUnmount(() => {\n\tresizeObserver.disconnect();\n});\n\nfunction updatePreviewShapeDimensions(): void {\n\tif (!previewContainer.value) return;\n\n\tstore.commit(\"updatePreviewShapeDimensions\", {\n\t\twidth: previewContainer.value.offsetWidth,\n\t\theight: previewContainer.value.offsetHeight,\n\t});\n\n\tif (props.onResize) {\n\t\tprops.onResize({ canPreview: canPreview.value });\n\t}\n}\n\nfunction mousedown( event: MouseEvent ):void {\n\tif (!canPreview.value) return;\n\n\tdragStart.value.x = event.screenX;\n\tdragStart.value.y = event.screenY;\n\tisDragging.value = true;\n}\n\nfunction mouseup(): void {\n\tisDragging.value = false;\n}\n\nfunction mousemove( event: MouseEvent ): void {\n\tif (!isDragging.value) return;\n\n\tconst diffX = event.screenX - dragStart.value.x;\n\tconst diffY = event.screenY - dragStart.value.y;\n\n\tstore.commit('updateTranslation', [\n\t\ttranslation.value[0] + diffX,\n\t\ttranslation.value[1] + diffY,\n\t] );\n\n\tdragStart.value.x = event.screenX;\n\tdragStart.value.y = event.screenY;\n}\n\n</script>\n\n<template>\n\t<div\n\t\tref=\"previewContainer\"\n\t\tclass=\"measurements-selector__sub-section measurements-selector__preview\"\n\t\t:style=\"{'cursor': isDragging ? 'grabbing' : 'grab'}\"\n\t\t@mousedown=\"mousedown\"\n\t\t@mouseup=\"mouseup\"\n\t\t@mousemove=\"mousemove\"\n\t>\n\t\t<span\n\t\t\tv-if=\"props.hasFailedLoadingFont === props.primitives.font\"\n\t\t\tclass=\"measurements-selector__message\"\n\t\t>\n\t\t\t{{ $i18n.messages.failedLoadingFont }}\n\t\t</span>\n\t\t<span v-else-if=\"fontIsLoading\" class=\"measurements-selector__message\">\n\t\t\t<i class=\"icon-spinner2\"></i> {{ $i18n.messages.isLoadingFont }}\n\t\t</span>\n\t\t<span v-else-if=\"isLoading\" class=\"measurements-selector__message\">\n\t\t\t<i class=\"icon-spinner2\"></i> {{ $i18n.messages.isLoadingCalculations }}\n\t\t</span>\n\t\t<div\n\t\t\tv-else-if=\"isShapeComplete\"\n\t\t\tclass=\"measurements-selector__preview-inner-container\"\n\t\t\t:style=\"transformContainerStyle\"\n\t\t>\n\t\t\t<div :style=\"previewTransformStyle\" v-html=\"previewModel\"></div>\n\t\t</div>\n\t\t<span v-else class=\"measurements-selector__message\">\n\t\t\t{{ $i18n.messages.noPreview }}\n\t\t</span>\n\t</div>\n</template>\n","import script from \"./ShapePreview.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapePreview.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"18\" viewBox=\"0 0 16 18\">\n\t\t<path fill=\"#0D74B5\" d=\"M890.833333,164 C891.059028,164 891.25434,164.079167 891.419271,164.2375 L894.752604,167.4375 C894.917535,167.595833 895,167.783333 895,168 C895,168.216667 894.917535,168.404167 894.752604,168.5625 L891.419271,171.7625 C891.25434,171.920833 891.059028,172 890.833333,172 C890.607639,172 890.412326,171.920833 890.247396,171.7625 C890.082465,171.604167 890,171.416667 890,171.2 L890,169 L890,169 C886.962434,169 884.5,171.462434 884.5,174.5 C884.5,177.537566 886.962434,180 890,180 C893.037566,180 895.5,177.537566 895.5,174.5 C895.5,173.947715 895.947715,173.5 896.5,173.5 C897.052285,173.5 897.5,173.947715 897.5,174.5 C897.5,178.642136 894.142136,182 890,182 C885.857864,182 882.5,178.642136 882.5,174.5 C882.5,170.357864 885.857864,167 890,167 L890,164.8 C890,164.583333 890.082465,164.395833 890.247396,164.2375 C890.412326,164.079167 890.607639,164 890.833333,164 Z\" transform=\"translate(-882 -164)\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./RotateClockwise.vue?vue&type=template&id=dbeea6ca\"\nimport script from \"./RotateClockwise.vue?vue&type=script&lang=js\"\nexport * from \"./RotateClockwise.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"18\" viewBox=\"0 0 16 18\">\n\t\t<path fill=\"#0D74B5\" d=\"M850.833333,164 C851.059028,164 851.25434,164.079167 851.419271,164.2375 L854.752604,167.4375 C854.917535,167.595833 855,167.783333 855,168 C855,168.216667 854.917535,168.404167 854.752604,168.5625 L851.419271,171.7625 C851.25434,171.920833 851.059028,172 850.833333,172 C850.607639,172 850.412326,171.920833 850.247396,171.7625 C850.082465,171.604167 850,171.416667 850,171.2 L850,169 L850,169 C846.962434,169 844.5,171.462434 844.5,174.5 C844.5,177.537566 846.962434,180 850,180 C853.037566,180 855.5,177.537566 855.5,174.5 C855.5,173.947715 855.947715,173.5 856.5,173.5 C857.052285,173.5 857.5,173.947715 857.5,174.5 C857.5,178.642136 854.142136,182 850,182 C845.857864,182 842.5,178.642136 842.5,174.5 C842.5,170.357864 845.857864,167 850,167 L850,164.8 C850,164.583333 850.082465,164.395833 850.247396,164.2375 C850.412326,164.079167 850.607639,164 850.833333,164 Z\" transform=\"matrix(-1 0 0 1 858 -164)\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./RotateCounterClockwise.vue?vue&type=template&id=a8305da2\"\nimport script from \"./RotateCounterClockwise.vue?vue&type=script&lang=js\"\nexport * from \"./RotateCounterClockwise.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\">\n\t\t<path fill=\"#0D74B5\" d=\"M930.772727,166 C931.615881,166 932.424494,166.165337 933.194474,166.495328 C933.959628,166.823251 934.621964,167.26571 935.178127,167.821873 C935.73429,168.378036 936.176749,169.040372 936.504672,169.805526 C936.834663,170.575506 937,171.384119 937,172.227273 C937,173.070426 936.834663,173.879039 936.504672,174.649019 C936.176749,175.414174 935.73429,176.07651 935.178127,176.632673 C934.621964,177.188836 933.959628,177.631294 933.194474,177.959217 C932.424494,178.289209 931.615881,178.454545 930.772727,178.454545 C930.049809,178.454545 929.355061,178.336348 928.690983,178.099951 L928.41064,177.992683 C928.04174,177.84144 927.692435,177.65733 927.363131,177.440541 L927.248,177.36 L923.942575,180.669361 C923.725089,180.886848 923.446795,181 923.136364,181 C922.823748,181 922.544375,180.888556 922.32791,180.67209 C922.111444,180.455625 922,180.176252 922,179.863636 L922.006901,179.732646 C922.034454,179.474938 922.144187,179.243877 922.330395,179.057668 L925.64,175.752 L925.559459,175.636869 C925.288472,175.225239 925.068548,174.782358 924.900049,174.309017 C924.663652,173.644939 924.545455,172.950191 924.545455,172.227273 C924.545455,171.384119 924.710791,170.575506 925.040783,169.805526 C925.368706,169.040372 925.811164,168.378036 926.367327,167.821873 C926.92349,167.26571 927.585826,166.823251 928.350981,166.495328 C929.120961,166.165337 929.929574,166 930.772727,166 Z M930.772727,167.772727 C930.169508,167.772727 929.592803,167.890388 929.042614,168.12571 C928.492424,168.361032 928.018466,168.677557 927.620739,169.075284 C927.223011,169.473011 926.906487,169.94697 926.671165,170.497159 C926.435843,171.047348 926.318182,171.624053 926.318182,172.227273 C926.318182,172.830492 926.435843,173.407197 926.671165,173.957386 C926.906487,174.507576 927.223011,174.981534 927.620739,175.379261 C928.018466,175.776989 928.492424,176.093513 929.042614,176.328835 C929.592803,176.564157 930.169508,176.681818 930.772727,176.681818 C931.375947,176.681818 931.952652,176.564157 932.502841,176.328835 C933.05303,176.093513 933.526989,175.776989 933.924716,175.379261 C934.322443,174.981534 934.638968,174.507576 934.87429,173.957386 C935.109612,173.407197 935.227273,172.830492 935.227273,172.227273 C935.227273,171.624053 935.109612,171.047348 934.87429,170.497159 C934.638968,169.94697 934.322443,169.473011 933.924716,169.075284 C933.526989,168.677557 933.05303,168.361032 932.502841,168.12571 C931.952652,167.890388 931.375947,167.772727 930.772727,167.772727 Z M930.85,169.2 C931.264214,169.2 931.6,169.535786 931.6,169.95 L931.6,171.45 L933.1,171.45 C933.514214,171.45 933.85,171.785786 933.85,172.2 C933.85,172.614214 933.514214,172.95 933.1,172.95 L931.6,172.95 L931.6,174.45 C931.6,174.864214 931.264214,175.2 930.85,175.2 C930.435786,175.2 930.1,174.864214 930.1,174.45 L930.1,172.949 L928.6,172.95 C928.185786,172.95 927.85,172.614214 927.85,172.2 C927.85,171.785786 928.185786,171.45 928.6,171.45 L930.1,171.449 L930.1,169.95 C930.1,169.535786 930.435786,169.2 930.85,169.2 Z\" transform=\"translate(-922 -166)\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./ZoomIn.vue?vue&type=template&id=7d5eeaad\"\nimport script from \"./ZoomIn.vue?vue&type=script&lang=js\"\nexport * from \"./ZoomIn.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\">\n\t\t<path fill=\"#0D74B5\" d=\"M970.772727,166 C971.615881,166 972.424494,166.165337 973.194474,166.495328 C973.959628,166.823251 974.621964,167.26571 975.178127,167.821873 C975.73429,168.378036 976.176749,169.040372 976.504672,169.805526 C976.834663,170.575506 977,171.384119 977,172.227273 C977,173.070426 976.834663,173.879039 976.504672,174.649019 C976.176749,175.414174 975.73429,176.07651 975.178127,176.632673 C974.621964,177.188836 973.959628,177.631294 973.194474,177.959217 C972.424494,178.289209 971.615881,178.454545 970.772727,178.454545 C970.049809,178.454545 969.355061,178.336348 968.690983,178.099951 L968.41064,177.992683 C968.04174,177.84144 967.692435,177.65733 967.363131,177.440541 L967.248,177.36 L963.942575,180.669361 C963.725089,180.886848 963.446795,181 963.136364,181 C962.823748,181 962.544375,180.888556 962.32791,180.67209 C962.111444,180.455625 962,180.176252 962,179.863636 L962.006901,179.732646 C962.034454,179.474938 962.144187,179.243877 962.330395,179.057668 L965.64,175.752 L965.559459,175.636869 C965.288472,175.225239 965.068548,174.782358 964.900049,174.309017 C964.663652,173.644939 964.545455,172.950191 964.545455,172.227273 C964.545455,171.384119 964.710791,170.575506 965.040783,169.805526 C965.368706,169.040372 965.811164,168.378036 966.367327,167.821873 C966.92349,167.26571 967.585826,166.823251 968.350981,166.495328 C969.120961,166.165337 969.929574,166 970.772727,166 Z M970.772727,167.772727 C970.169508,167.772727 969.592803,167.890388 969.042614,168.12571 C968.492424,168.361032 968.018466,168.677557 967.620739,169.075284 C967.223011,169.473011 966.906487,169.94697 966.671165,170.497159 C966.435843,171.047348 966.318182,171.624053 966.318182,172.227273 C966.318182,172.830492 966.435843,173.407197 966.671165,173.957386 C966.906487,174.507576 967.223011,174.981534 967.620739,175.379261 C968.018466,175.776989 968.492424,176.093513 969.042614,176.328835 C969.592803,176.564157 970.169508,176.681818 970.772727,176.681818 C971.375947,176.681818 971.952652,176.564157 972.502841,176.328835 C973.05303,176.093513 973.526989,175.776989 973.924716,175.379261 C974.322443,174.981534 974.638968,174.507576 974.87429,173.957386 C975.109612,173.407197 975.227273,172.830492 975.227273,172.227273 C975.227273,171.624053 975.109612,171.047348 974.87429,170.497159 C974.638968,169.94697 974.322443,169.473011 973.924716,169.075284 C973.526989,168.677557 973.05303,168.361032 972.502841,168.12571 C971.952652,167.890388 971.375947,167.772727 970.772727,167.772727 Z M973.1,171.45 C973.514214,171.45 973.85,171.785786 973.85,172.2 C973.85,172.614214 973.514214,172.95 973.1,172.95 L968.6,172.95 C968.185786,172.95 967.85,172.614214 967.85,172.2 C967.85,171.785786 968.185786,171.45 968.6,171.45 L973.1,171.45 Z\" transform=\"translate(-962 -166)\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./ZoomOut.vue?vue&type=template&id=14ece668\"\nimport script from \"./ZoomOut.vue?vue&type=script&lang=js\"\nexport * from \"./ZoomOut.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-03fc2ac5\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"preview-buttongroup\" }\nconst _hoisted_2 = [\"aria-label\"]\nconst _hoisted_3 = [\"aria-label\"]\nconst _hoisted_4 = [\"aria-label\"]\nconst _hoisted_5 = [\"aria-label\"]\n\nimport { useStore } from \"vuex\";\nimport RotateClockwise from \"@/components/icons/RotateClockwise.vue\";\nimport RotateCounterClockwise from \"@/components/icons/RotateCounterClockwise.vue\";\nimport ZoomIn from \"@/components/icons/ZoomIn.vue\";\nimport ZoomOut from \"@/components/icons/ZoomOut.vue\";\nimport { computed } from \"vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'PreviewButtongroup',\n  setup(__props) {\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst rotation = computed(() => store.getters.rotation);\nconst zoom = computed(() => store.getters.zoom);\nconst updateZoom = (data: number) => store.commit('updateZoom', data);\nconst updateRotation = (data: number) => store.commit('updateRotation', data);\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"button\", {\n      onClick: _cache[0] || (_cache[0] = ($event: any) => (updateRotation( rotation.value - 90 ))),\n      type: \"button\",\n      class: \"preview-buttongroup__button\",\n      \"aria-label\": _unref(i18n).previewControls.rotateCounterClockwise\n    }, [\n      _createVNode(RotateCounterClockwise, { \"aria-hidden\": \"true\" })\n    ], 8, _hoisted_2),\n    _createElementVNode(\"button\", {\n      onClick: _cache[1] || (_cache[1] = ($event: any) => (updateRotation( rotation.value + 90 ))),\n      type: \"button\",\n      class: \"preview-buttongroup__button\",\n      \"aria-label\": _unref(i18n).previewControls.rotateClockwise\n    }, [\n      _createVNode(RotateClockwise, { \"aria-hidden\": \"true\" })\n    ], 8, _hoisted_3),\n    _createElementVNode(\"button\", {\n      onClick: _cache[2] || (_cache[2] = ($event: any) => (updateZoom( Math.max( 1, zoom.value - 1 ) ))),\n      type: \"button\",\n      class: \"preview-buttongroup__button\",\n      \"aria-label\": _unref(i18n).previewControls.zoomOut\n    }, [\n      _createVNode(ZoomOut, { \"aria-hidden\": \"true\" })\n    ], 8, _hoisted_4),\n    _createElementVNode(\"button\", {\n      onClick: _cache[3] || (_cache[3] = ($event: any) => (updateZoom( zoom.value + 1 ))),\n      type: \"button\",\n      class: \"preview-buttongroup__button\",\n      \"aria-label\": _unref(i18n).previewControls.zoomIn\n    }, [\n      _createVNode(ZoomIn, { \"aria-hidden\": \"true\" })\n    ], 8, _hoisted_5)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport RotateClockwise from \"@/components/icons/RotateClockwise.vue\";\nimport RotateCounterClockwise from \"@/components/icons/RotateCounterClockwise.vue\";\nimport ZoomIn from \"@/components/icons/ZoomIn.vue\";\nimport ZoomOut from \"@/components/icons/ZoomOut.vue\";\nimport { computed } from \"vue\";\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst rotation = computed(() => store.getters.rotation);\nconst zoom = computed(() => store.getters.zoom);\nconst updateZoom = (data: number) => store.commit('updateZoom', data);\nconst updateRotation = (data: number) => store.commit('updateRotation', data);\n</script>\n\n<template>\n\t<div class=\"preview-buttongroup\">\n\t\t<button\n\t\t\t@click=\"updateRotation( rotation - 90 )\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"preview-buttongroup__button\"\n\t\t\t:aria-label=\"i18n.previewControls.rotateCounterClockwise\"\n\t\t>\n\t\t\t<RotateCounterClockwise aria-hidden=\"true\" />\n\t\t</button>\n\t\t<button\n\t\t\t@click=\"updateRotation( rotation + 90 )\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"preview-buttongroup__button\"\n\t\t\t:aria-label=\"i18n.previewControls.rotateClockwise\"\n\t\t>\n\t\t\t<RotateClockwise aria-hidden=\"true\" />\n\t\t</button>\n\t\t<button\n\t\t\t@click=\"updateZoom( Math.max( 1, zoom - 1 ) )\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"preview-buttongroup__button\"\n\t\t\t:aria-label=\"i18n.previewControls.zoomOut\"\n\t\t>\n\t\t\t<ZoomOut aria-hidden=\"true\" />\n\t\t</button>\n\t\t<button\n\t\t\t@click=\"updateZoom( zoom + 1 )\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"preview-buttongroup__button\"\n\t\t\t:aria-label=\"i18n.previewControls.zoomIn\"\n\t\t>\n\t\t\t<ZoomIn aria-hidden=\"true\" />\n\t\t</button>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n\t.preview-buttongroup {\n\t\tdisplay: none;\n\t\t.kps-gallery.is-open & { // only show when slider is full-screen\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: space-between;\n\t\t\twidth: 150px;\n\t\t\tfloat: right;\n\t\t}\n\t}\n\n\t.preview-buttongroup__button {\n\t\tbackground: $white;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tborder-radius: 100%;\n\t\tpadding: 2px 0 0 1px;\n\t\tline-height: 0;\n\t}\n</style>\n","import script from \"./PreviewButtongroup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PreviewButtongroup.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./PreviewButtongroup.vue?vue&type=style&index=0&id=03fc2ac5&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-03fc2ac5\"]])\n\nexport default __exports__","import { render } from \"./MountingShapePreview.vue?vue&type=template&id=24e1bf26\"\nimport script from \"./MountingShapePreview.vue?vue&type=script&lang=js\"\nexport * from \"./MountingShapePreview.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { useCssVars as _useCssVars, unref as _unref, defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-76ec3e91\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"button-group\" }\n\nimport {computed, ref, watch} from 'vue';\n\ninterface Props {\n\tbuttonsPerRow: number;\n\ttotalButtons: number;\n\tselectedItem?: number;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ButtonGroup',\n  props: {\n    buttonsPerRow: {},\n    totalButtons: {},\n    selectedItem: {}\n  },\n  setup(__props: any) {\n\n_useCssVars(_ctx => ({\n  \"49a80d21\": (_ctx.buttonsPerRow),\n  \"498b0356\": (activeItem.value),\n  \"f666b894\": (rows.value),\n  \"397f9ffa\": (col.value),\n  \"397f2f46\": (row.value)\n}))\n\nconst props = __props;\nconst activeItem = ref(0);\n\nconst row = computed(() => Math.floor(props.selectedItem / props.buttonsPerRow));\nconst col = computed(() => props.selectedItem % props.buttonsPerRow);\nconst rows = ref(Math.ceil(props.totalButtons / props.buttonsPerRow));\n\nwatch( props, ({ selectedItem } ) => {\n\tactiveItem.value = selectedItem;\n} );\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _renderSlot(_ctx.$slots, \"default\")\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {computed, ref, watch} from 'vue';\n\ninterface Props {\n\tbuttonsPerRow: number;\n\ttotalButtons: number;\n\tselectedItem?: number;\n}\n\nconst props = defineProps<Props>();\nconst activeItem = ref(0);\n\nconst row = computed(() => Math.floor(props.selectedItem / props.buttonsPerRow));\nconst col = computed(() => props.selectedItem % props.buttonsPerRow);\nconst rows = ref(Math.ceil(props.totalButtons / props.buttonsPerRow));\n\nwatch( props, ({ selectedItem } ) => {\n\tactiveItem.value = selectedItem;\n} );\n\n</script>\n\n<template>\n\t<div class=\"button-group\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.button-group {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(v-bind('buttonsPerRow'), 1fr);\n\tposition: relative;\n\tz-index: 1;\n\t--i: v-bind('activeItem');\n\t--row-height: calc(100% / v-bind('rows'));\n\n\t&:before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index:-1;\n\t\twidth: calc(calc(100% / v-bind('buttonsPerRow')) - 2px);\n\t\theight: calc(var(--row-height) - 2px);\n\t\tborder: 1px solid $brand-blue-dark;\n\t\tbackground-color: $brand-blue-background;\n\t\tborder-radius: 4px;\n\t\ttransform: translateX(calc(v-bind('col') * 100%)) translateY(calc(v-bind('row') * 100%));\n\t\twill-change: transform;\n\t\ttransition: transform .2s ease-in-out;\n\t}\n\n\t:deep(.button) {\n\t\tposition: relative;\n\t\tz-index: 2;\n\t}\n}\n</style>\n","import script from \"./ButtonGroup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ButtonGroup.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ButtonGroup.vue?vue&type=style&index=0&id=76ec3e91&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-76ec3e91\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-c384d632\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"type\"]\nconst _hoisted_2 = {\n  class: \"button__icon\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_3 = {\n  key: 0,\n  class: \"button__text\"\n}\n\nimport { getIconComponent } from '../icons/utils';\n\ntype ButtonType = \"button\" | \"submit\" | \"reset\";\n\ninterface Props {\n\ticon: string;\n\tonClick: Function;\n\ttext?: string;\n\ttype?: ButtonType;\n\tindex?: number;\n\tisActive?: boolean;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ButtonPrimitive',\n  props: {\n    icon: {},\n    onClick: {},\n    text: { default: \"\" },\n    type: { default: \"button\" },\n    index: {},\n    isActive: { type: Boolean, default: false }\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"button\", {\n    type: props.type,\n    class: _normalizeClass(['button', props.isActive ? 'button--active' : '']),\n    onClick: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (props.onClick && props.onClick(...args)))\n  }, [\n    _createElementVNode(\"span\", _hoisted_2, [\n      (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getIconComponent)(props.icon))))\n    ]),\n    (props.text)\n      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, _toDisplayString(props.text), 1))\n      : _createCommentVNode(\"\", true)\n  ], 10, _hoisted_1))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { getIconComponent } from '../icons/utils';\n\ntype ButtonType = \"button\" | \"submit\" | \"reset\";\n\ninterface Props {\n\ticon: string;\n\tonClick: Function;\n\ttext?: string;\n\ttype?: ButtonType;\n\tindex?: number;\n\tisActive?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\ttext: \"\",\n\ttype: \"button\",\n\tisActive: false,\n} );\n\n</script>\n\n<template>\n\t<button :type=\"props.type\" :class=\"['button', props.isActive ? 'button--active' : '']\" @click=\"props.onClick\">\n\t\t<span class=\"button__icon\" aria-hidden=\"true\">\n\t\t\t<component :is=\"getIconComponent(props.icon)\" />\n\t\t</span>\n\t\t<span class=\"button__text\" v-if=\"props.text\">\n\t\t\t{{ props.text }}\n\t\t</span>\n\t</button>\n</template>\n\n<style scoped lang=\"scss\">\n.button {\n\t@include font-size(14px, 18px);\n\tborder-color: transparent;\n\tbackground-color: transparent;\n\tborder-radius: 4px;\n\twidth: 100%;\n\tpadding: 0;\n\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-weight: normal;\n\twhite-space: inherit;\n\n\t@include hover-focus-style {\n\t\tborder-color: transparent;\n\t}\n\n\t&:focus {\n\t\toutline: none;\n\t}\n\n\t&:focus-visible {\n\t\toutline-offset: -2px;\n\t\toutline-style: auto;\n\t\toutline-width: 5px;\n\t}\n\n\t&--active {\n\t\tfont-weight: bold;\n\t}\n\n\t.button__icon {\n\t\tposition: relative;\n\t}\n\n\t:deep(svg) {\n\t\tpointer-events: none;\n\t}\n}\n</style>\n","import script from \"./ButtonPrimitive.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ButtonPrimitive.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ButtonPrimitive.vue?vue&type=style&index=0&id=c384d632&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-c384d632\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, withCtx as _withCtx } from \"vue\"\n\nimport { useStore } from \"vuex\";\nimport {computed} from \"vue\";\nimport ButtonGroup from \"@/components/UI/ButtonGroup.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeSelector',\n  setup(__props) {\n\nconst store = useStore();\nconst selectedMenuItem = computed(() => store.getters.selectedMenuItem);\nconst shapeSelectorButtons = computed(() => store.getters.shapeSelectorButtons);\nconst activeItemIndex = computed(() => {\n\tconst index = shapeSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} )=> item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\n\nfunction onClick(type: string, reset = false): void {\n\tupdateShape(type === \"shapes\" ? \"\" : type);\n\tupdateCurrentMenuItem(type);\n\n\tif (reset) {\n\t\tresetUpload();\n\t}\n}\n\nfunction updateShape(shape: string) {\n\tstore.dispatch(\"updateShape\", shape);\n\tstore.dispatch(\"resetDrillHoles\");\n\tstore.commit(\"updatePresetShape\", \"\");\n}\n\nfunction updateCurrentMenuItem(selectedMenuItem: string) {\n\tstore.commit(\"updateMenuItem\", selectedMenuItem);\n\taddMenuItemToDataLayer(selectedMenuItem);\n}\n\nfunction addMenuItemToDataLayer(menuItem: string) {\n\tif (!menuItem || 0 === menuItem.length) return;\n\n\twindow?.dataLayer?.push({\n\t\tevent: \"measurements_selector\",\n\t\teventCategory: \"Shapes & Sizes:\" + document.title,\n\t\teventAction: \"Step 1. Shape Type\",\n\t\teventLabel: menuItem,\n\t});\n}\n\nfunction resetUpload() {\n\tstore.commit(\"updateDxfDefinition\", {\n\t\tsvgPath: \"\",\n\t});\n\n\t// Reset the dxf export state, becasuse of switching between dxf and text\n\tstore.commit('setUploadedContent', {result: '', filename: ''} );\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ButtonGroup, {\n    \"buttons-per-row\": 4,\n    \"total-buttons\": shapeSelectorButtons.value.length,\n    \"selected-item\": activeItemIndex.value\n  }, {\n    default: _withCtx(() => [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(shapeSelectorButtons.value, (item, index) => {\n        return (_openBlock(), _createBlock(ButtonPrimitive, {\n          key: index,\n          \"on-click\": () => onClick(item.handler, item.reset),\n          icon: item.icon,\n          text: item.text,\n          index: index,\n          \"is-active\": item.selection === selectedMenuItem.value\n        }, null, 8, [\"on-click\", \"icon\", \"text\", \"index\", \"is-active\"]))\n      }), 128))\n    ]),\n    _: 1\n  }, 8, [\"total-buttons\", \"selected-item\"]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport {computed} from \"vue\";\nimport ButtonGroup from \"@/components/UI/ButtonGroup.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\n\nconst store = useStore();\nconst selectedMenuItem = computed(() => store.getters.selectedMenuItem);\nconst shapeSelectorButtons = computed(() => store.getters.shapeSelectorButtons);\nconst activeItemIndex = computed(() => {\n\tconst index = shapeSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} )=> item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\n\nfunction onClick(type: string, reset = false): void {\n\tupdateShape(type === \"shapes\" ? \"\" : type);\n\tupdateCurrentMenuItem(type);\n\n\tif (reset) {\n\t\tresetUpload();\n\t}\n}\n\nfunction updateShape(shape: string) {\n\tstore.dispatch(\"updateShape\", shape);\n\tstore.dispatch(\"resetDrillHoles\");\n\tstore.commit(\"updatePresetShape\", \"\");\n}\n\nfunction updateCurrentMenuItem(selectedMenuItem: string) {\n\tstore.commit(\"updateMenuItem\", selectedMenuItem);\n\taddMenuItemToDataLayer(selectedMenuItem);\n}\n\nfunction addMenuItemToDataLayer(menuItem: string) {\n\tif (!menuItem || 0 === menuItem.length) return;\n\n\twindow?.dataLayer?.push({\n\t\tevent: \"measurements_selector\",\n\t\teventCategory: \"Shapes & Sizes:\" + document.title,\n\t\teventAction: \"Step 1. Shape Type\",\n\t\teventLabel: menuItem,\n\t});\n}\n\nfunction resetUpload() {\n\tstore.commit(\"updateDxfDefinition\", {\n\t\tsvgPath: \"\",\n\t});\n\n\t// Reset the dxf export state, becasuse of switching between dxf and text\n\tstore.commit('setUploadedContent', {result: '', filename: ''} );\n}\n\n</script>\n\n<template>\n\t<button-group :buttons-per-row=\"4\" :total-buttons=\"shapeSelectorButtons.length\" :selected-item=\"activeItemIndex\">\n\t\t<button-primitive\n\t\t\tv-for=\"(item, index) in shapeSelectorButtons\"\n\t\t\t:key=\"index\"\n\t\t\t:on-click=\"() => onClick(item.handler, item.reset)\"\n\t\t\t:icon=\"item.icon\"\n\t\t\t:text=\"item.text\"\n\t\t\t:index=\"index\"\n\t\t\t:is-active=\"item.selection === selectedMenuItem\"\n\t\t/>\n\t</button-group>\n</template>\n\n<style scoped lang=\"scss\">\n.button {\n\tcolor: $brand-blue-dark;\n\tpadding-block: 7px;\n\n\t@include hover-focus-style {\n\t\tborder-color: transparent;\n\t}\n\n\t&:focus-visible {\n\t\toutline-color: $outline-color;\n\t}\n\n\t.button__icon {\n\t\twidth: 44px;\n\t\theight: 44px;\n\t}\n}\n</style>\n","import script from \"./ShapeSelector.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeSelector.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ShapeSelector.vue?vue&type=style&index=0&id=6f48dd34&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6f48dd34\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-75182bbe\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"text-label\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"text-label__instructions\"\n}\n\ninterface Props {\n\tinstructions?: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'TextLabel',\n  props: {\n    instructions: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n    _renderSlot(_ctx.$slots, \"default\"),\n    (_ctx.instructions)\n      ? (_openBlock(), _createElementBlock(\"span\", _hoisted_2, _toDisplayString(_ctx.instructions), 1))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","import script from \"./TextLabel.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TextLabel.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./TextLabel.vue?vue&type=style&index=0&id=75182bbe&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-75182bbe\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = {\n  key: 0,\n  class: \"editable-list__icon\",\n  \"aria-hidden\": \"true\"\n}\nconst _hoisted_2 = { class: \"editable-list__actions\" }\nconst _hoisted_3 = [\"disabled\", \"aria-label\"]\nconst _hoisted_4 = /*#__PURE__*/_createElementVNode(\"span\", {\n  class: \"icon icon-edit\",\n  \"aria-hidden\": \"true\"\n}, null, -1)\nconst _hoisted_5 = [\n  _hoisted_4\n]\nconst _hoisted_6 = [\"disabled\", \"aria-label\"]\nconst _hoisted_7 = /*#__PURE__*/_createElementVNode(\"span\", { class: \"icon icon-delete\" }, null, -1)\nconst _hoisted_8 = [\n  _hoisted_7\n]\n\nimport { getIconComponent } from './icons/utils';\n\ninterface ActionButton {\n\tindex: number|string;\n\ttitle: string;\n\tdisabled: boolean;\n\thidden: boolean;\n\tonClick: (index: number|string) => void;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'EditableItem',\n  props: {\n    edit: {},\n    remove: {},\n    icon: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    _createElementVNode(\"span\", {\n      class: _normalizeClass([\n\t\t\t'editable-list__text',\n\t\t\tprops.icon ? 'editable-list__text--icon': '',\n\t\t])\n    }, [\n      (props.icon)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_1, [\n            (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getIconComponent)(props.icon))))\n          ]))\n        : _createCommentVNode(\"\", true),\n      _renderSlot(_ctx.$slots, \"default\")\n    ], 2),\n    _createElementVNode(\"span\", _hoisted_2, [\n      (!props.edit.hidden)\n        ? (_openBlock(), _createElementBlock(\"button\", {\n            key: 0,\n            class: \"button--list-action\",\n            type: \"button\",\n            onClick: _cache[0] || (_cache[0] = ($event: any) => (props.edit.onClick(props.edit.index))),\n            disabled: props.edit.disabled,\n            \"aria-label\": props.edit.title\n          }, _hoisted_5, 8, _hoisted_3))\n        : _createCommentVNode(\"\", true),\n      (!props.remove.hidden)\n        ? (_openBlock(), _createElementBlock(\"button\", {\n            key: 1,\n            class: \"button--list-action\",\n            type: \"button\",\n            onClick: _cache[1] || (_cache[1] = ($event: any) => (props.remove.onClick(props.remove.index))),\n            disabled: props.remove.disabled,\n            \"aria-label\": props.remove.title\n          }, _hoisted_8, 8, _hoisted_6))\n        : _createCommentVNode(\"\", true)\n    ])\n  ], 64))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { getIconComponent } from './icons/utils';\n\ninterface ActionButton {\n\tindex: number|string;\n\ttitle: string;\n\tdisabled: boolean;\n\thidden: boolean;\n\tonClick: (index: number|string) => void;\n}\n\nconst props = defineProps<{\n\tedit: ActionButton,\n\tremove: ActionButton,\n\ticon?: string,\n}>();\n\n</script>\n\n<template>\n\t<span\n\t\t:class=\"[\n\t\t\t'editable-list__text',\n\t\t\tprops.icon ? 'editable-list__text--icon': '',\n\t\t]\"\n\t>\n\t\t<span class=\"editable-list__icon\" aria-hidden=\"true\" v-if=\"props.icon\">\n\t\t\t<component :is=\"getIconComponent(props.icon)\" />\n\t\t</span>\n\t\t<slot></slot>\n\t</span>\n\t<span class=\"editable-list__actions\">\n\t\t<button v-if=\"!props.edit.hidden\"\n\t\t\tclass=\"button--list-action\"\n\t\t\ttype=\"button\"\n\t\t\tv-on:click=\"props.edit.onClick(props.edit.index)\"\n\t\t\t:disabled=\"props.edit.disabled\"\n\t\t\t:aria-label=\"props.edit.title\"\n\t\t>\n\t\t\t<span class=\"icon icon-edit\" aria-hidden=\"true\"></span>\n\t\t</button>\n\t\t<button v-if=\"!props.remove.hidden\"\n\t\t\tclass=\"button--list-action\"\n\t\t\ttype=\"button\"\n\t\t\tv-on:click=\"props.remove.onClick(props.remove.index)\"\n\t\t\t:disabled=\"props.remove.disabled\"\n\t\t\t:aria-label=\"props.remove.title\"\n\t\t>\n\t\t\t<span class=\"icon icon-delete\"></span>\n\t\t</button>\n\t</span>\n</template>\n","import script from \"./EditableItem.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./EditableItem.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, unref as _unref, toDisplayString as _toDisplayString, withModifiers as _withModifiers, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, createCommentVNode as _createCommentVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-69a29fcc\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { key: 0 }\nconst _hoisted_2 = { class: \"currentShape-type__buttons\" }\nconst _hoisted_3 = [\"onClick\"]\nconst _hoisted_4 = { key: 0 }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"currentShape-type__list\"\n}\nconst _hoisted_6 = {\n  key: 1,\n  class: \"currentShape-type__list\"\n}\nconst _hoisted_7 = {\n  key: 0,\n  class: \"editable-list\"\n}\nconst _hoisted_8 = { class: \"editable-list__item editable-list__item--active\" }\n\nimport { useStore } from \"vuex\";\nimport { computed, ref } from \"vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\nimport EditableItem from './EditableItem.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport { AbstractPreset } from \"@/presets/AbstractPreset\";\n\nexport interface Props {\n\tdisabledShapes?: string[];\n\tstoreShapeGetter?: string;\n\tstoreShapeUpdater?: string;\n\taction?: string;\n\tprefix?: string;\n\tisCutout?: boolean;\n\tmodifierAction?: string;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeType',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst store = useStore();\nconst props = __props;\nconst type = ref('straight');\n\nconst presetShape = computed(() => store.getters.presetShape);\nconst currentShape = computed(() => {\n\tif (!props.storeShapeGetter) return;\n\n\t// We don't have presets for cutouts so we don't need to check for them\n\tif (props.isCutout) return store.getters[props.storeShapeGetter];\n\n\tif (presetShape.value) {\n\t\tsetCategory('preset');\n\t\treturn presetShape.value;\n\t}\n\n\treturn store.getters[props.storeShapeGetter];\n});\nconst presets = computed(() => store.getters.getPresets );\nconst shapeName = computed(() => store.getters.getShapeName );\n\nconst categorizedShapes = computed(() => {\n\tconst enabledShapes = store.getters.enabledShapes.filter((currentShape: string) => {\n\t\treturn ( !props.disabledShapes.includes(currentShape) && currentShape !== \"customized-currentShape\" );\n\t});\n\n\tconst categories = store.getters.getCategorizedShapes( enabledShapes );\n\n\t// Set order based on the order of the currentShape categories in php (ShapePresenter.php)\n\treturn Object.keys(i18n.shapeCategories).reduce((acc, key) => {\n\t\tif (categories[key]) {\n\t\t\tacc[key] = categories[key];\n\t\t}\n\t\treturn acc;\n\t}, {});\n} );\n\nfunction updateShape(currentShape: string) {\n\tstore.commit( 'updatePresetShape', '' );\n\n\tif (props.storeShapeUpdater) {\n\t\tstore.dispatch(props.storeShapeUpdater, currentShape);\n\t}\n}\n\nfunction setCategory(category: string) {\n\ttype.value = category;\n}\n\nfunction editShape(): void {\n\tupdateShape('');\n}\n\nfunction updatePreset(preset: AbstractPreset): void {\n\tstore.dispatch('loadPresetConfig', preset);\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", null, [\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (!currentShape.value)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n              _createElementVNode(\"ul\", _hoisted_2, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categorizedShapes.value, (shapes, category) => {\n                  return (_openBlock(), _createElementBlock(\"li\", { key: category }, [\n                    _createElementVNode(\"button\", {\n                      class: _normalizeClass(['currentShape-type__button', type.value === category ? 'currentShape-type__button--active' : '']),\n                      onClick: _withModifiers(($event: any) => (setCategory(category)), [\"prevent\"])\n                    }, _toDisplayString(_unref(i18n).shapeCategories[category] ?? \"Other\"), 11, _hoisted_3)\n                  ]))\n                }), 128)),\n                (!props.isCutout)\n                  ? (_openBlock(), _createElementBlock(\"li\", _hoisted_4, [\n                      _createElementVNode(\"button\", {\n                        class: _normalizeClass(['currentShape-type__button', type.value === 'preset' ? 'currentShape-type__button--active' : '']),\n                        onClick: _cache[0] || (_cache[0] = _withModifiers(($event: any) => (setCategory('preset')), [\"prevent\"]))\n                      }, _toDisplayString(_unref(i18n).shapeCategories['preset']), 3)\n                    ]))\n                  : _createCommentVNode(\"\", true)\n              ]),\n              _createVNode(TextLabel, { class: \"screen-reader-text\" }, {\n                default: _withCtx(() => [\n                  _createTextVNode(_toDisplayString(_unref(i18n).shapeCategories[type.value] ?? \"Other\"), 1)\n                ]),\n                _: 1\n              }),\n              (categorizedShapes.value[type.value])\n                ? (_openBlock(), _createElementBlock(\"ul\", _hoisted_5, [\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(categorizedShapes.value[type.value], (item) => {\n                      return (_openBlock(), _createElementBlock(\"li\", { key: item }, [\n                        _createVNode(ButtonPrimitive, {\n                          \"on-click\": () => updateShape(item),\n                          icon: item,\n                          class: _normalizeClass({\n\t\t\t\t\t\t\t\t'button--inactive': item !== '' && item !== currentShape.value,\n\t\t\t\t\t\t\t}),\n                          \"aria-label\": _unref(i18n).shapeNames[item]\n                        }, null, 8, [\"on-click\", \"icon\", \"class\", \"aria-label\"])\n                      ]))\n                    }), 128))\n                  ]))\n                : _createCommentVNode(\"\", true),\n              (type.value === 'preset' && !_ctx.isCutout)\n                ? (_openBlock(), _createElementBlock(\"ul\", _hoisted_6, [\n                    (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(presets.value, (preset) => {\n                      return (_openBlock(), _createElementBlock(\"li\", {\n                        key: preset.getName()\n                      }, [\n                        _createVNode(ButtonPrimitive, {\n                          \"on-click\": () => updatePreset(preset),\n                          icon: preset.getName(),\n                          class: _normalizeClass({\n\t\t\t\t\t\t\t\t'button--inactive': preset.getName() !== '' && preset.getName() !== currentShape.value,\n\t\t\t\t\t\t\t}),\n                          \"aria-label\": _unref(i18n).shapePresets[preset.getName()]\n                        }, null, 8, [\"on-click\", \"icon\", \"class\", \"aria-label\"])\n                      ]))\n                    }), 128))\n                  ]))\n                : _createCommentVNode(\"\", true)\n            ]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (currentShape.value !== '')\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n              _createElementVNode(\"div\", _hoisted_8, [\n                _createVNode(EditableItem, {\n                  icon: currentShape.value,\n                  edit: { index: currentShape.value, title: _ctx.$i18n.cutout.edit, disabled: false, onClick: editShape, hidden: false },\n                  remove: { index: currentShape.value, title: _ctx.$i18n.cutout.remove, disabled: false, onClick: editShape, hidden: false }\n                }, {\n                  default: _withCtx(() => [\n                    _createTextVNode(_toDisplayString(shapeName.value), 1)\n                  ]),\n                  _: 1\n                }, 8, [\"icon\", \"edit\", \"remove\"])\n              ])\n            ]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    })\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport { computed, ref } from \"vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\nimport EditableItem from './EditableItem.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport { AbstractPreset } from \"@/presets/AbstractPreset\";\n\nexport interface Props {\n\tdisabledShapes?: string[];\n\tstoreShapeGetter?: string;\n\tstoreShapeUpdater?: string;\n\taction?: string;\n\tprefix?: string;\n\tisCutout?: boolean;\n\tmodifierAction?: string;\n}\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst store = useStore();\nconst props = defineProps<Props>();\nconst type = ref('straight');\n\nconst presetShape = computed(() => store.getters.presetShape);\nconst currentShape = computed(() => {\n\tif (!props.storeShapeGetter) return;\n\n\t// We don't have presets for cutouts so we don't need to check for them\n\tif (props.isCutout) return store.getters[props.storeShapeGetter];\n\n\tif (presetShape.value) {\n\t\tsetCategory('preset');\n\t\treturn presetShape.value;\n\t}\n\n\treturn store.getters[props.storeShapeGetter];\n});\nconst presets = computed(() => store.getters.getPresets );\nconst shapeName = computed(() => store.getters.getShapeName );\n\nconst categorizedShapes = computed(() => {\n\tconst enabledShapes = store.getters.enabledShapes.filter((currentShape: string) => {\n\t\treturn ( !props.disabledShapes.includes(currentShape) && currentShape !== \"customized-currentShape\" );\n\t});\n\n\tconst categories = store.getters.getCategorizedShapes( enabledShapes );\n\n\t// Set order based on the order of the currentShape categories in php (ShapePresenter.php)\n\treturn Object.keys(i18n.shapeCategories).reduce((acc, key) => {\n\t\tif (categories[key]) {\n\t\t\tacc[key] = categories[key];\n\t\t}\n\t\treturn acc;\n\t}, {});\n} );\n\nfunction updateShape(currentShape: string) {\n\tstore.commit( 'updatePresetShape', '' );\n\n\tif (props.storeShapeUpdater) {\n\t\tstore.dispatch(props.storeShapeUpdater, currentShape);\n\t}\n}\n\nfunction setCategory(category: string) {\n\ttype.value = category;\n}\n\nfunction editShape(): void {\n\tupdateShape('');\n}\n\nfunction updatePreset(preset: AbstractPreset): void {\n\tstore.dispatch('loadPresetConfig', preset);\n}\n\n</script>\n\n<template>\n\t<div>\n\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t<div v-if=\"!currentShape\" >\n\t\t\t\t<ul class=\"currentShape-type__buttons\">\n\t\t\t\t\t<li v-for=\"(shapes, category) in categorizedShapes\"\n\t\t\t\t\t\t:key=\"category\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t:class=\"['currentShape-type__button', type === category ? 'currentShape-type__button--active' : '']\"\n\t\t\t\t\t\t\t@click.prevent=\"setCategory(category)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.shapeCategories[category] ?? \"Other\" }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li v-if=\"!props.isCutout\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t:class=\"['currentShape-type__button', type === 'preset' ? 'currentShape-type__button--active' : '']\"\n\t\t\t\t\t\t\t@click.prevent=\"setCategory('preset')\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ i18n.shapeCategories['preset'] }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<text-label class=\"screen-reader-text\">{{ i18n.shapeCategories[type] ?? \"Other\"}}</text-label>\n\t\t\t\t<ul class=\"currentShape-type__list\" v-if=\"categorizedShapes[type]\">\n\t\t\t\t\t<li v-for=\"item in categorizedShapes[type]\"\n\t\t\t\t\t\t:key=\"item\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button-primitive\n\t\t\t\t\t\t\t:on-click=\"() => updateShape(item)\"\n\t\t\t\t\t\t\t:icon=\"item\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t'button--inactive': item !== '' && item !== currentShape,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t:aria-label=\"i18n.shapeNames[item]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<ul class=\"currentShape-type__list\" v-if=\"type === 'preset' && !isCutout\">\n\t\t\t\t\t<li v-for=\"preset in presets\"\n\t\t\t\t\t\t:key=\"preset.getName()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button-primitive\n\t\t\t\t\t\t\t:on-click=\"() => updatePreset(preset)\"\n\t\t\t\t\t\t\t:icon=\"preset.getName()\"\n\t\t\t\t\t\t\t:class=\"{\n\t\t\t\t\t\t\t\t'button--inactive': preset.getName() !== '' && preset.getName() !== currentShape,\n\t\t\t\t\t\t\t}\"\n\t\t\t\t\t\t\t:aria-label=\"i18n.shapePresets[preset.getName()]\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</measurements-height-transition>\n\n\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t<div v-if=\"currentShape !== ''\" class=\"editable-list\">\n\t\t\t\t<div class=\"editable-list__item editable-list__item--active\">\n\t\t\t\t\t<EditableItem\n\t\t\t\t\t\t:icon=\"currentShape\"\n\t\t\t\t\t\t:edit=\"{ index: currentShape, title: $i18n.cutout.edit, disabled: false, onClick: editShape, hidden: false }\"\n\t\t\t\t\t\t:remove=\"{ index: currentShape, title: $i18n.cutout.remove, disabled: false, onClick: editShape, hidden: false }\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t{{ shapeName }}\n\t\t\t\t\t</EditableItem>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</measurements-height-transition>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n\t.currentShape-type__list {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 16px;\n\t\tmargin-top: 16px;\n\t}\n\n\t.currentShape-type__buttons {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tcolumn-gap: 10px;\n\t\tbackground-color: $brand-blue-background;\n\t}\n\n\t.currentShape-type__button {\n\t\tcolor: $measurements-preview-blue;\n\t\tbackground-color: transparent;\n\t\tfont-size: 14px;\n\t\tpadding: 6px 10px;\n\t\tborder-radius: 3px;\n\t\tfont-weight: 700;\n\n\t\t&--active,\n\t\t&:focus,\n\t\t&:hover {\n\t\t\tbackground-color: $measurements-preview-blue;\n\t\t\tcolor: white;\n\t\t}\n\t}\n\n\t.button {\n\t\theight: 44px;\n\t\twidth: 44px;\n\t\tborder-radius: 4px;\n\t\tline-height: 0;\n\n\t\t:deep(circle),\n\t\t:deep(path),\n\t\t:deep(rect),\n\t\t:deep(ellipse) {\n\t\t\tfill: $brand-blue-light;\n\t\t\tstroke: $brand-blue-dark;\n\t\t\tstroke-width: 2px;\n\t\t}\n\n\t\t&:focus,\n\t\t&:hover {\n\t\t\tbackground-color: $brand-blue-light;\n\n\t\t\t:deep(circle),\n\t\t\t:deep(path),\n\t\t\t:deep(rect),\n\t\t\t:deep(ellipse) {\n\t\t\t\tfill: $white;\n\t\t\t\tstroke: $brand-blue-dark;\n\t\t\t}\n\t\t}\n\n\t\t&--active {\n\t\t\t:deep(circle),\n\t\t\t:deep(path),\n\t\t\t:deep(rect),\n\t\t\t:deep(ellipse) {\n\t\t\t\tfill: $white;\n\t\t\t}\n\t\t}\n\n\t\t&--inactive {\n\t\t\t:deep(circle),\n\t\t\t:deep(path),\n\t\t\t:deep(rect),\n\t\t\t:deep(ellipse) {\n\t\t\t\tfill: $measurements-light-blue;\n\t\t\t\tstroke: $measurements-dark-blue;\n\t\t\t}\n\t\t}\n\t}\n</style>\n","import script from \"./ShapeType.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeType.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ShapeType.vue?vue&type=style&index=0&id=69a29fcc&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-69a29fcc\"]])\n\nexport default __exports__","export function addSizeToDataLayer( dimension: string, value: number|string, shape: string ): void {\n\tif ( ! dimension || ! value ) {\n\t\treturn;\n\t}\n\n\twindow?.dataLayer?.push( {\n\t\tevent: 'measurements_selector',\n\t\teventCategory: 'Shapes & Sizes: ' + document.title,\n\t\teventAction: 'Step 3: Set size',\n\t\teventLabel: window.measurementSelectorVariables.i18n.dimensionNames[dimension],\n\t\teventValue: shape,\n\t} );\n}\n","import isUndefined from \"lodash/isUndefined\";\nimport mapValues from \"lodash/mapValues\";\nimport isEmpty from \"lodash/isEmpty\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport { detectBrowser } from \"@/functions/browser\";\n\n/**\n * Counts the amount of decimal points.\n *\n * @param {number} x The number to check.\n *\n * @return {number} The decimal count.\n */\nexport function countDecimals( x: number ): number {\n\tif ( x && x % 1 ) {\n\t\treturn x.toString().length - x.toString().indexOf( \".\" ) - 1 || 0;\n\t}\n\treturn 0;\n}\n\n/**\n * Converts a string to a number, before make sure the comma is a period\n * then strip all non-numeric characters and parse to a float\n *\n * @param {string|number} value The string to strip.\n *\n * @return {number} The stripped string.\n */\nexport function stripNonNumeric( value: string|number ): number {\n\treturn parseFloat(value.toString().replace(\",\", \".\").replace(/[^0-9.]/g, \"\"));\n}\n\n/**\n * Checks whether the passed value ends with a period or comma.\n *\n * @param {string|number} value The string to check.\n *\n * @return {boolean} Whether it ends with a period or a comma.\n */\nexport function endsWithSeparator( value: string|number ): boolean {\n\tif ( typeof value === 'number' ) {\n\t\tvalue = value.toString();\n\t}\n\n\treturn value.endsWith('.') || value.endsWith(',');\n}\n\n/**\n * Formats the passed value and limits it to the amount of decimals.\n *\n * @param {string|number} value The\n * @param {number} decimals The amount of decimals to return. Defaults to 2.\n */\nexport function limitDecimals( value: string|number, decimals = 2 ): number {\n\treturn parseFloat( parseFloat( toDecimalPoint( value ) ).toFixed( decimals ) );\n}\n\n/**\n * Formats a number according to locale, with support for partial inputs such as `10,` or `10.`\n *\n * @param {string|number} value The value to format.\n *\n * @return {string} The formatted value.\n */\nexport function formatToLocaleString( value: string|number ): string {\n\tif ( isUndefined( value ) ) {\n\t\treturn;\n\t}\n\n\tvalue = value.toString();\n\n\tconst locale = navigator.language || 'nl-NL';\n\tconst parsedValue = parseFloat( value.replace( ',', '.' ) );\n\tconst separator = ( 0.1 ).toLocaleString( locale ).substring( 1, 2 );\n\n\tif ( isNaN( parsedValue ) ) {\n\t\treturn value.replace( /[.,]/, separator );\n\t}\n\n\tconst formatted = parsedValue.toLocaleString( locale, { maximumFractionDigits: 1, useGrouping: false } );\n\n\treturn endsWithSeparator( value ) ? `${formatted}${separator}` : formatted;\n}\n\n/**\n * Formats a number for use in an input field.\n *\n * @param {string|number} value The value to format.\n * @return {string|number} The formatted value.\n */\nexport function formatForInputField( value: string|number ): string|number {\n\tif ( detectBrowser() !== 'Safari' ) {\n\t\treturn value;\n\t}\n\n\tif ( isUndefined( value ) ) {\n\t\treturn '';\n\t}\n\n\t// Special case: if x is 0, return an empty string for easier inputting for the user\n\tif ( value === 0 ) {\n\t\treturn '';\n\t}\n\n\tvalue = stripNonNumeric( value.toString() );\n\n\tconst formatted = formatToLocaleString( value );\n\n\tif ( formatted === 'NaN' ) {\n\t\treturn '';\n\t}\n\n\treturn formatted;\n}\n\n/**\n * Converts the units from CM to MM (or vice versa).\n *\n * @param {object} dimensions The dimensions to convert.\n * @param {boolean} fromCM Whether to convert from CMs. Defaults to true.\n *\n * @return {object} The converted units.\n */\nexport function convertUnits( dimensions: object, fromCM = true ): object {\n\treturn mapValues( dimensions, ( ( dimension: number ) => {\n\t\treturn fromCM ? Length.from_cm( dimension ).in_mm() : new Length( dimension ).in_cm();\n\t} ) );\n}\n\n/**\n * Converts the passed value to a number.\n *\n * @param {any} value The value to convert.\n *\n * @returns {number} A numeric value of the passed value.\n */\nexport function toNumber( value: any ): number {\n\tif ( typeof value == 'number' ) {\n\t\treturn value;\n\t}\n\n\tif ( isEmpty( value ) ) {\n\t\treturn 0;\n\t}\n\n\treturn parseInt( value, 10 );\n}\n\n/**\n * Converts the passed value to a store-compliant decimal string.\n *\n * @param {string|number} value The value to convert.\n *\n * @returns {string} The compliant value.\n */\nexport function toDecimalPoint( value: string|number ): string {\n\tvalue = stripNonNumeric( value );\n\n\tif ( typeof value !== 'string' ) {\n\t\tvalue = value.toString();\n\t}\n\n\treturn value.replace( ',', '.' );\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-b43af9e6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"input-label\" }\n\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\ninterface Props {\n\tinstructions?: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'InputLabel',\n  props: {\n    instructions: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"label\", _hoisted_1, [\n    _createVNode(TextLabel, { instructions: _ctx.instructions }, {\n      default: _withCtx(() => [\n        _renderSlot(_ctx.$slots, \"default\")\n      ]),\n      _: 3\n    }, 8, [\"instructions\"])\n  ]))\n}\n}\n\n})","import script from \"./InputLabel.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./InputLabel.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./InputLabel.vue?vue&type=style&index=0&id=b43af9e6&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-b43af9e6\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\ninterface Props {\n\tflexJustify?: 'default'|'bottom';\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'InputGroup',\n  props: {\n    flexJustify: { default: \"default\" }\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass(`input-group input-group--justify-${_ctx.flexJustify}`)\n  }, [\n    _renderSlot(_ctx.$slots, \"default\")\n  ], 2))\n}\n}\n\n})","import script from \"./InputGroup.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./InputGroup.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./InputGroup.vue?vue&type=style&index=0&id=4629af12&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, vModelText as _vModelText, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, withDirectives as _withDirectives, createElementBlock as _createElementBlock, vShow as _vShow, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-6f986130\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"dimension-input__wrap\" }\nconst _hoisted_2 = [\"aria-describedby\", \"disabled\", \"id\", \"inputmode\", \"name\", \"readonly\", \"min\", \"max\"]\nconst _hoisted_3 = {\n  key: 1,\n  class: \"dimension-input__spinner\"\n}\nconst _hoisted_4 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"i\", { class: \"icon icon-spinner2\" }, null, -1))\nconst _hoisted_5 = [\n  _hoisted_4\n]\n\nimport {defineModel, watch} from \"vue\";\nimport debounce from \"lodash/debounce\";\nimport { endsWithSeparator, stripNonNumeric } from \"@/functions/numbers\";\nimport InputLabel from \"@/components/UI/InputLabel.vue\";\nimport InputGroup from \"@/components/UI/InputGroup.vue\";\n\ninterface Props {\n\tlabel?: string;\n\tinstructions?: string;\n\tunit?: string;\n\tname: string;\n\tid: string;\n\tinvalid: boolean;\n\tinputmode?: \"decimal\" | \"text\" | \"numeric\" | \"search\" | \"email\" | \"tel\" | \"url\" | \"none\";\n\thidden?: boolean;\n\tonBlur?: () => void;\n\tisLoading?: boolean;\n\tdisabled?: boolean;\n\treadonly?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tdelay?: number;\n\tstep?: number;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DimensionInput',\n  props: /*#__PURE__*/_mergeModels({\n    label: {},\n    instructions: {},\n    unit: {},\n    name: {},\n    id: {},\n    invalid: { type: Boolean },\n    inputmode: { default: \"decimal\" },\n    hidden: { type: Boolean },\n    onBlur: {},\n    isLoading: { type: Boolean },\n    disabled: { type: Boolean },\n    readonly: { type: Boolean },\n    min: {},\n    max: {},\n    delay: { default: 200 },\n    step: { default: 0.1 }\n  }, {\n    \"modelValue\": {},\n    \"modelModifiers\": {},\n  }),\n  emits: [\"update:modelValue\"],\n  setup(__props: any) {\n\nconst model = _useModel(__props, \"modelValue\");\n\nconst props = __props;\n\nconst isNumerical = [ \"decimal\", \"numeric\" ].includes( props.inputmode );\n\n// check if step is set to whole number (without decimal)\nconst isWholeNumber = (): boolean => {\n\treturn props.step ? props.step - Math.floor(props.step) === 0 : false;\n};\n\nwatch( model, ( newValue: string|number ) => {\n\tif (!isNumerical) {\n\t\tmodel.value = newValue;\n\t\treturn;\n\t}\n\tif ( isNumerical && !isWholeNumber() && ( endsWithSeparator( newValue ) || newValue === \"\" ) ) {\n\t\treturn;\n\t}\n\tconst numericNewValue = stripNonNumeric( newValue );\n\tmodel.value = numericNewValue;\n} );\n\nconst describedby = (): string => {\n\tconst ids = [];\n\tif(props.invalid) {\n\t\tids.unshift(`${props.id}-validation-message`);\n\t}\n\treturn ids.join(' ');\n};\n\nreturn (_ctx: any,_cache: any) => {\n  return _withDirectives((_openBlock(), _createBlock(InputGroup, { class: \"dimension-input\" }, {\n    default: _withCtx(() => [\n      (_ctx.label)\n        ? (_openBlock(), _createBlock(InputLabel, {\n            key: 0,\n            class: \"dimension-input__label\",\n            for: props.id,\n            instructions: _ctx.instructions\n          }, {\n            default: _withCtx(() => [\n              _createTextVNode(_toDisplayString(_ctx.label), 1)\n            ]),\n            _: 1\n          }, 8, [\"for\", \"instructions\"]))\n        : _createCommentVNode(\"\", true),\n      _createElementVNode(\"span\", _hoisted_1, [\n        _withDirectives(_createElementVNode(\"input\", {\n          ref: \"input\",\n          class: _normalizeClass({ 'dimension-input__field': true, 'dimension-input__field--invalid': props.invalid }),\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((model).value = $event)),\n          \"aria-describedby\": describedby(),\n          disabled: _ctx.disabled,\n          id: props.id,\n          inputmode: props.inputmode,\n          name: props.name,\n          readonly: _ctx.readonly,\n          type: \"text\",\n          min: props.min ?? null,\n          max: props.max ?? null,\n          onBlur: _cache[1] || (_cache[1] = \n//@ts-ignore\n(...args) => (_ctx.onBlur && _ctx.onBlur(...args)))\n        }, null, 42, _hoisted_2), [\n          [_vModelText, model.value]\n        ]),\n        (props.unit && !_ctx.isLoading)\n          ? (_openBlock(), _createElementBlock(\"span\", {\n              key: 0,\n              class: _normalizeClass({ 'dimension-input__unit': true, 'dimension-input__unit--invalid': props.invalid })\n            }, _toDisplayString(props.unit), 3))\n          : _createCommentVNode(\"\", true),\n        (_ctx.isLoading === true)\n          ? (_openBlock(), _createElementBlock(\"span\", _hoisted_3, _hoisted_5))\n          : _createCommentVNode(\"\", true)\n      ])\n    ]),\n    _: 1\n  }, 512)), [\n    [_vShow, !props.hidden]\n  ])\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {defineModel, watch} from \"vue\";\nimport debounce from \"lodash/debounce\";\nimport { endsWithSeparator, stripNonNumeric } from \"@/functions/numbers\";\nimport InputLabel from \"@/components/UI/InputLabel.vue\";\nimport InputGroup from \"@/components/UI/InputGroup.vue\";\n\ninterface Props {\n\tlabel?: string;\n\tinstructions?: string;\n\tunit?: string;\n\tname: string;\n\tid: string;\n\tinvalid: boolean;\n\tinputmode?: \"decimal\" | \"text\" | \"numeric\" | \"search\" | \"email\" | \"tel\" | \"url\" | \"none\";\n\thidden?: boolean;\n\tonBlur?: () => void;\n\tisLoading?: boolean;\n\tdisabled?: boolean;\n\treadonly?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tdelay?: number;\n\tstep?: number;\n}\n\nconst model = defineModel();\n\nconst props = withDefaults(defineProps<Props>(), {\n\tinputmode: \"decimal\",\n\tdelay: 200,\n\tstep: 0.1,\n});\n\nconst isNumerical = [ \"decimal\", \"numeric\" ].includes( props.inputmode );\n\n// check if step is set to whole number (without decimal)\nconst isWholeNumber = (): boolean => {\n\treturn props.step ? props.step - Math.floor(props.step) === 0 : false;\n};\n\nwatch( model, ( newValue: string|number ) => {\n\tif (!isNumerical) {\n\t\tmodel.value = newValue;\n\t\treturn;\n\t}\n\tif ( isNumerical && !isWholeNumber() && ( endsWithSeparator( newValue ) || newValue === \"\" ) ) {\n\t\treturn;\n\t}\n\tconst numericNewValue = stripNonNumeric( newValue );\n\tmodel.value = numericNewValue;\n} );\n\nconst describedby = (): string => {\n\tconst ids = [];\n\tif(props.invalid) {\n\t\tids.unshift(`${props.id}-validation-message`);\n\t}\n\treturn ids.join(' ');\n};\n</script>\n\n<template>\n\t<input-group v-show=\"!props.hidden\" class=\"dimension-input\">\n\t\t<input-label v-if=\"label\" class=\"dimension-input__label\" :for=\"props.id\" :instructions=\"instructions\">\n\t\t\t{{ label }}\n\t\t</input-label>\n\t\t<span class=\"dimension-input__wrap\">\n\t\t\t<input\n\t\t\t\tref=\"input\"\n\t\t\t\t:class=\"{ 'dimension-input__field': true, 'dimension-input__field--invalid': props.invalid }\"\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:aria-describedby=\"describedby()\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:id=\"props.id\"\n\t\t\t\t:inputmode=\"props.inputmode\"\n\t\t\t\t:name=\"props.name\"\n\t\t\t\t:readonly=\"readonly\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:min=\"props.min ?? null\"\n\t\t\t\t:max=\"props.max ?? null\"\n\t\t\t\t@blur=\"onBlur\"\n\t\t\t/>\n\t\t\t<span\n\t\t\t\tv-if=\"props.unit && !isLoading\"\n\t\t\t\t:class=\"{ 'dimension-input__unit': true, 'dimension-input__unit--invalid': props.invalid }\"\n\t\t\t>{{ props.unit }}</span>\n\t\t\t<span v-if=\"isLoading === true\" class=\"dimension-input__spinner\">\n\t\t\t\t<i class=\"icon icon-spinner2\"></i>\n\t\t\t</span>\n\t\t</span>\n\t</input-group>\n</template>\n\n<style scoped lang=\"scss\">\n.dimension-input__label {\n\t@include font-size(14px, 16px);\n\tdisplay: block;\n\tmargin-bottom: 10px;\n\tcolor: $brand-blue-dark;\n}\n\n.dimension-input__wrap {\n\tposition: relative;\n}\n\n.dimension-input__field {\n\twidth: 100%;\n\tpadding: 2px 15px;\n\tborder-color: $border-color-blue;\n\tborder-radius: 4px;\n\theight: 44px;\n\t&--invalid {\n\t\tcolor: $error-color;\n\t\tborder-color: $error-color;\n\t\tbackground-color: $error-color-lighter;\n\t}\n}\n\n.dimension-input__spinner,\n.dimension-input__unit {\n\t@include font-size(14px, 16px);\n\tposition: absolute;\n\ttop: 50%;\n\tright: 8px;\n\ttransform: translateY(-50%);\n\tcolor: $brand-blue-dark;\n}\n\n.dimension-input__unit {\n\t&--invalid {\n\t\tcolor: $error-color;\n\t}\n}\n\ninput[type=number].dimension-input__field {\n\tpadding-right: 4px;\n}\n\ninput[type=number] + .dimension-input__unit,\ninput[type=number] + .dimension-input__spinner {\n\tright: 25px;\n}\n\n</style>\n","import script from \"./DimensionInput.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DimensionInput.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DimensionInput.vue?vue&type=style&index=0&id=6f986130&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6f986130\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, withCtx as _withCtx, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-94f2bb5a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"shape-inputs\" }\nconst _hoisted_2 = { key: 0 }\n\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeInputFieldsWrapper',\n  setup(__props) {\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"fieldset\", _hoisted_1, [\n    (_ctx.$slots.legend)\n      ? (_openBlock(), _createElementBlock(\"legend\", _hoisted_2, [\n          _createVNode(TextLabel, { class: \"shape-inputs__legend\" }, {\n            default: _withCtx(() => [\n              _renderSlot(_ctx.$slots, \"legend\")\n            ]),\n            _: 3\n          })\n        ]))\n      : _createCommentVNode(\"\", true),\n    _renderSlot(_ctx.$slots, \"default\")\n  ]))\n}\n}\n\n})","import script from \"./ShapeInputFieldsWrapper.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeInputFieldsWrapper.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ShapeInputFieldsWrapper.vue?vue&type=style&index=0&id=94f2bb5a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-94f2bb5a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'RectangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t}\n});\n\nconst length = computed({\n\tget: () => dimensions.value.length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"rectangle-length\",\n        id: `${_ctx.prefix}measurements-rectangle-length`,\n        name: `${_ctx.prefix}measurements[dimensions][length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}rectangle-length`),\n        onBlur: () => _unref(addSizeToDataLayer)('length', +length.value, 'rectangle'),\n        modelValue: length.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((length).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"rectangle-width\",\n        id: `${_ctx.prefix}measurements-rectangle-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}rectangle-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'rectangle'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t}\n});\n\nconst length = computed({\n\tget: () => dimensions.value.length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"rectangle-length\"\n\t\t\t:id=\"`${prefix}measurements-rectangle-length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}rectangle-length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('length', +length, 'rectangle')\"\n\t\t\tv-model=\"length\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"rectangle-width\"\n\t\t\t:id=\"`${prefix}measurements-rectangle-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}rectangle-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'rectangle')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./RectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = [\"value\"]\n\nimport { useStore } from \"vuex\";\nimport { computed } from \"vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'RoundedRectangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'rounded-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst useIndividualCorners = computed(\n\t() => store.getters[\"rounded-rectangle/useIndividualCorners\"]\n);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst length = computed({\n\tget: () => dimensions.value.length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst topRightRadius = computed({\n\tget: () => dimensions.value.top_right_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"top_right_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst bottomRightRadius = computed({\n\tget: () => dimensions.value.bottom_right_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"bottom_right_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst bottomLeftRadius = computed({\n\tget: () => dimensions.value.bottom_left_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"bottom_left_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst topLeftRadius = computed({\n\tget: () => dimensions.value.top_left_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"top_left_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"rounded-rectangle-length\",\n        id: `${_ctx.prefix}measurements-rounded-rectangle-length`,\n        name: `${_ctx.prefix}measurements[dimensions][length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'rounded-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}rounded-rectangle-length`),\n        onBlur: () => _unref(addSizeToDataLayer)('length', +length.value, 'rounded-rectangle'),\n        modelValue: length.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((length).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"rounded-rectangle-width\",\n        id: `${_ctx.prefix}measurements-rounded-rectangle-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'rounded-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}rounded-rectangle-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'rounded-rectangle'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      (useIndividualCorners.value === false)\n        ? (_openBlock(), _createBlock(DimensionInput, {\n            key: 0,\n            inputRef: \"rounded-rectangle-radius\",\n            id: \"measurements-rounded-rectangle-radius\",\n            name: \"measurements[dimensions][radius]\",\n            unit: \"cm\",\n            label: dimensionLabel.value('radius', 'rounded-rectangle'),\n            invalid: !isDimensionValid.value('rounded-rectangle-radius'),\n            onBlur: () => _unref(addSizeToDataLayer)('radius', +radius.value, 'rounded-rectangle'),\n            modelValue: radius.value,\n            \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((radius).value = $event))\n          }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]))\n        : _createCommentVNode(\"\", true),\n      (useIndividualCorners.value)\n        ? (_openBlock(), _createBlock(DimensionInput, {\n            key: 1,\n            inputRef: \"rounded-rectangle-top_left_radius\",\n            id: \"measurements-rounded-rectangle-top_left_radius\",\n            name: \"measurements[dimensions][top_left_radius]\",\n            unit: \"cm\",\n            label: dimensionLabel.value('top_left_radius', 'rounded-rectangle'),\n            invalid: !isDimensionValid.value('rounded-rectangle-top_left_radius'),\n            onBlur: \n\t\t\t\t() =>\n\t\t\t\t\t_unref(addSizeToDataLayer)(\n\t\t\t\t\t\t'top_left_radius',\n\t\t\t\t\t\t+topLeftRadius.value,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t,\n            modelValue: topLeftRadius.value,\n            \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((topLeftRadius).value = $event))\n          }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]))\n        : _createCommentVNode(\"\", true),\n      (useIndividualCorners.value)\n        ? (_openBlock(), _createBlock(DimensionInput, {\n            key: 2,\n            inputRef: \"rounded-rectangle-top_right_radius\",\n            id: \"measurements-rounded-rectangle-top_right_radius\",\n            name: \"measurements[dimensions][top_right_radius]\",\n            unit: \"cm\",\n            label: dimensionLabel.value('top_right_radius', 'rounded-rectangle'),\n            invalid: !isDimensionValid.value('rounded-rectangle-top_right_radius'),\n            onBlur: \n\t\t\t\t() =>\n\t\t\t\t\t_unref(addSizeToDataLayer)(\n\t\t\t\t\t\t'top_right_radius',\n\t\t\t\t\t\t+topRightRadius.value,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t,\n            modelValue: topRightRadius.value,\n            \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((topRightRadius).value = $event))\n          }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]))\n        : _createCommentVNode(\"\", true),\n      (useIndividualCorners.value)\n        ? (_openBlock(), _createBlock(DimensionInput, {\n            key: 3,\n            inputRef: \"rounded-rectangle-bottom_left_radius\",\n            id: \"measurements-rounded-rectangle-bottom_left_radius\",\n            name: \"measurements[dimensions][bottom_left_radius]\",\n            unit: \"cm\",\n            label: dimensionLabel.value('bottom_left_radius', 'rounded-rectangle'),\n            invalid: !isDimensionValid.value('rounded-rectangle-bottom_left_radius'),\n            onBlur: \n\t\t\t\t() =>\n\t\t\t\t\t_unref(addSizeToDataLayer)(\n\t\t\t\t\t\t'bottom_left_radius',\n\t\t\t\t\t\t+bottomLeftRadius.value,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t,\n            modelValue: bottomLeftRadius.value,\n            \"onUpdate:modelValue\": _cache[5] || (_cache[5] = ($event: any) => ((bottomLeftRadius).value = $event))\n          }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]))\n        : _createCommentVNode(\"\", true),\n      (useIndividualCorners.value)\n        ? (_openBlock(), _createBlock(DimensionInput, {\n            key: 4,\n            inputRef: \"rounded-rectangle-bottom_right_radius\",\n            id: \"measurements-rounded-rectangle-bottom_right_radius\",\n            name: \"measurements[dimensions][bottom_right_radius]\",\n            unit: \"cm\",\n            label: dimensionLabel.value('bottom_right_radius', 'rounded-rectangle'),\n            invalid: !isDimensionValid.value('rounded-rectangle-bottom_right_radius'),\n            onBlur: \n\t\t\t\t() =>\n\t\t\t\t\t_unref(addSizeToDataLayer)(\n\t\t\t\t\t\t'bottom_right_radius',\n\t\t\t\t\t\t+bottomRightRadius.value,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t,\n            modelValue: bottomRightRadius.value,\n            \"onUpdate:modelValue\": _cache[6] || (_cache[6] = ($event: any) => ((bottomRightRadius).value = $event))\n          }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]))\n        : _createCommentVNode(\"\", true),\n      _createElementVNode(\"input\", {\n        ref: \"rounded-rectangle-use_individual_corners\",\n        type: \"hidden\",\n        name: \"measurements[modifiers][use_individual_corners]\",\n        key: \"rounded-rectangle-use_individual_corners\",\n        value: useIndividualCorners.value\n      }, null, 8, _hoisted_1)\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport { computed } from \"vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'rounded-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst useIndividualCorners = computed(\n\t() => store.getters[\"rounded-rectangle/useIndividualCorners\"]\n);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst length = computed({\n\tget: () => dimensions.value.length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst topRightRadius = computed({\n\tget: () => dimensions.value.top_right_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"top_right_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst bottomRightRadius = computed({\n\tget: () => dimensions.value.bottom_right_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"bottom_right_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst bottomLeftRadius = computed({\n\tget: () => dimensions.value.bottom_left_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"bottom_left_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst topLeftRadius = computed({\n\tget: () => dimensions.value.top_left_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"top_left_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"rounded-rectangle-length\"\n\t\t\t:id=\"`${prefix}measurements-rounded-rectangle-length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'rounded-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}rounded-rectangle-length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('length', +length, 'rounded-rectangle')\"\n\t\t\tv-model=\"length\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"rounded-rectangle-width\"\n\t\t\t:id=\"`${prefix}measurements-rounded-rectangle-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'rounded-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}rounded-rectangle-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'rounded-rectangle')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tv-if=\"useIndividualCorners === false\"\n\t\t\tinputRef=\"rounded-rectangle-radius\"\n\t\t\tid=\"measurements-rounded-rectangle-radius\"\n\t\t\tname=\"measurements[dimensions][radius]\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('radius', 'rounded-rectangle')\"\n\t\t\t:invalid=\"!isDimensionValid('rounded-rectangle-radius')\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('radius', +radius, 'rounded-rectangle')\"\n\t\t\tv-model=\"radius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tv-if=\"useIndividualCorners\"\n\t\t\tinputRef=\"rounded-rectangle-top_left_radius\"\n\t\t\tid=\"measurements-rounded-rectangle-top_left_radius\"\n\t\t\tname=\"measurements[dimensions][top_left_radius]\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('top_left_radius', 'rounded-rectangle')\"\n\t\t\t:invalid=\"!isDimensionValid('rounded-rectangle-top_left_radius')\"\n\t\t\t:onBlur=\"\n\t\t\t\t() =>\n\t\t\t\t\taddSizeToDataLayer(\n\t\t\t\t\t\t'top_left_radius',\n\t\t\t\t\t\t+topLeftRadius,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t\"\n\t\t\tv-model=\"topLeftRadius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tv-if=\"useIndividualCorners\"\n\t\t\tinputRef=\"rounded-rectangle-top_right_radius\"\n\t\t\tid=\"measurements-rounded-rectangle-top_right_radius\"\n\t\t\tname=\"measurements[dimensions][top_right_radius]\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('top_right_radius', 'rounded-rectangle')\"\n\t\t\t:invalid=\"!isDimensionValid('rounded-rectangle-top_right_radius')\"\n\t\t\t:onBlur=\"\n\t\t\t\t() =>\n\t\t\t\t\taddSizeToDataLayer(\n\t\t\t\t\t\t'top_right_radius',\n\t\t\t\t\t\t+topRightRadius,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t\"\n\t\t\tv-model=\"topRightRadius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tv-if=\"useIndividualCorners\"\n\t\t\tinputRef=\"rounded-rectangle-bottom_left_radius\"\n\t\t\tid=\"measurements-rounded-rectangle-bottom_left_radius\"\n\t\t\tname=\"measurements[dimensions][bottom_left_radius]\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('bottom_left_radius', 'rounded-rectangle')\"\n\t\t\t:invalid=\"!isDimensionValid('rounded-rectangle-bottom_left_radius')\"\n\t\t\t:onBlur=\"\n\t\t\t\t() =>\n\t\t\t\t\taddSizeToDataLayer(\n\t\t\t\t\t\t'bottom_left_radius',\n\t\t\t\t\t\t+bottomLeftRadius,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t\"\n\t\t\tv-model=\"bottomLeftRadius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tv-if=\"useIndividualCorners\"\n\t\t\tinputRef=\"rounded-rectangle-bottom_right_radius\"\n\t\t\tid=\"measurements-rounded-rectangle-bottom_right_radius\"\n\t\t\tname=\"measurements[dimensions][bottom_right_radius]\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('bottom_right_radius', 'rounded-rectangle')\"\n\t\t\t:invalid=\"!isDimensionValid('rounded-rectangle-bottom_right_radius')\"\n\t\t\t:onBlur=\"\n\t\t\t\t() =>\n\t\t\t\t\taddSizeToDataLayer(\n\t\t\t\t\t\t'bottom_right_radius',\n\t\t\t\t\t\t+bottomRightRadius,\n\t\t\t\t\t\t'rounded-rectangle'\n\t\t\t\t\t)\n\t\t\t\"\n\t\t\tv-model=\"bottomRightRadius\"\n\t\t/>\n\n\t\t<input\n\t\t\tref=\"rounded-rectangle-use_individual_corners\"\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements[modifiers][use_individual_corners]\"\n\t\t\tkey=\"rounded-rectangle-use_individual_corners\"\n\t\t\t:value=\"useIndividualCorners\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./RoundedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RoundedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\n\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'CircleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\ndocument.addEventListener('focusin', (event) => store.commit('updateFocusedElement', event));\ndocument.addEventListener('focusout', () => store.commit('updateFocusedElement', ''));\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusout', () => store.commit('updateFocusedElement'));\n\tdocument.removeEventListener('focusin', () => store.commit('updateFocusedElement'));\n});\n\nconst diameter = computed({\n\tget: () => dimensions.value.diameter,\n\tset: (value: string) => {\n\t\tstore.dispatch( action, {\n\t\t\tdimension: \"diameter\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"circle-diameter\",\n        id: `${_ctx.prefix}measurements-circle-diameter`,\n        name: `${_ctx.prefix}measurements[dimensions][diameter]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('diameter', 'circle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('diameter'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}circle-diameter`),\n        onBlur: () => _unref(addSizeToDataLayer)('diameter', +diameter.value, 'circle'),\n        modelValue: diameter.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((diameter).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\n\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\ndocument.addEventListener('focusin', (event) => store.commit('updateFocusedElement', event));\ndocument.addEventListener('focusout', () => store.commit('updateFocusedElement', ''));\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusout', () => store.commit('updateFocusedElement'));\n\tdocument.removeEventListener('focusin', () => store.commit('updateFocusedElement'));\n});\n\nconst diameter = computed({\n\tget: () => dimensions.value.diameter,\n\tset: (value: string) => {\n\t\tstore.dispatch( action, {\n\t\t\tdimension: \"diameter\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"circle-diameter\"\n\t\t\t:id=\"`${prefix}measurements-circle-diameter`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][diameter]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('diameter', 'circle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('diameter')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}circle-diameter`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('diameter', +diameter, 'circle')\"\n\t\t\tv-model=\"diameter\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./CircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport DimensionInput from '@/components/UI/DimensionInput.vue';\nimport { addSizeToDataLayer } from '@/functions/analytics';\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'HalfCircleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'half-circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst diameter = computed({\n\tget: () => dimensions.value.diameter,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"diameter\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"half-circle-diameter\",\n        id: `${_ctx.prefix}measurements-half-circle-diameter`,\n        name: `${_ctx.prefix}measurements[dimensions][diameter]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('diameter', 'half-circle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('diameter'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}half-circle-diameter`),\n        onBlur: () => _unref(addSizeToDataLayer)('diameter', +diameter.value, 'half-circle'),\n        modelValue: diameter.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((diameter).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport DimensionInput from '@/components/UI/DimensionInput.vue';\nimport { addSizeToDataLayer } from '@/functions/analytics';\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'half-circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst diameter = computed({\n\tget: () => dimensions.value.diameter,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"diameter\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"half-circle-diameter\"\n\t\t\t:id=\"`${prefix}measurements-half-circle-diameter`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][diameter]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('diameter', 'half-circle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('diameter')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}half-circle-diameter`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('diameter', +diameter, 'half-circle')\"\n\t\t\tv-model=\"diameter\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./HalfCircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HalfCircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'QuarterCircleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'quarter-circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"quarter-circle-radius\",\n        id: `${_ctx.prefix}measurements-quarter-circle-radius`,\n        name: `${_ctx.prefix}measurements[dimensions][radius]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('radius', 'quarter-circle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('radius'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}quarter-circle-radius`),\n        onBlur: () => _unref(addSizeToDataLayer)('radius', +radius.value, 'quarter-circle'),\n        modelValue: radius.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((radius).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'quarter-circle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"quarter-circle-radius\"\n\t\t\t:id=\"`${prefix}measurements-quarter-circle-radius`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][radius]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('radius', 'quarter-circle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('radius')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}quarter-circle-radius`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('radius', +radius, 'quarter-circle')\"\n\t\t\tv-model=\"radius\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./QuarterCircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./QuarterCircleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'EllipseDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'ellipse', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"ellipse-width\",\n        id: `${_ctx.prefix}measurements-ellipse-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'ellipse'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}ellipse-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'ellipse'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"ellipse-height\",\n        id: `${_ctx.prefix}measurements-ellipse-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'ellipse'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}ellipse-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'ellipse'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'ellipse', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"ellipse-width\"\n\t\t\t:id=\"`${prefix}measurements-ellipse-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'ellipse')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}ellipse-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'ellipse')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"ellipse-height\"\n\t\t\t:id=\"`${prefix}measurements-ellipse-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'ellipse')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}ellipse-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'ellipse')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./EllipseDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./EllipseDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'SlopedRectangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'sloped-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightLeft = computed({\n\tget: () => dimensions.value.height_left,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_left\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightRight = computed({\n\tget: () => dimensions.value.height_right,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_right\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-rectangle-width\",\n        id: `${_ctx.prefix}measurements-sloped-rectangle-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'sloped-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-rectangle-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'sloped-rectangle'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-rectangle-height_left\",\n        id: `${_ctx.prefix}measurements-sloped-rectangle-height_left`,\n        name: `${_ctx.prefix}measurements[dimensions][height_left]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_left', 'sloped-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_left'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-rectangle-height_left`),\n        onBlur: \n\t\t\t\t() => _unref(addSizeToDataLayer)('height_left', +heightLeft.value, 'sloped-rectangle')\n\t\t\t,\n        modelValue: heightLeft.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((heightLeft).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-rectangle-height_right\",\n        id: `${_ctx.prefix}measurements-sloped-rectangle-height_right`,\n        name: `${_ctx.prefix}measurements[dimensions][height_right]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_right', 'sloped-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_right'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-rectangle-height_right`),\n        onBlur: \n\t\t\t\t() => _unref(addSizeToDataLayer)('height_right', +heightRight.value, 'sloped-rectangle')\n\t\t\t,\n        modelValue: heightRight.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((heightRight).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'sloped-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightLeft = computed({\n\tget: () => dimensions.value.height_left,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_left\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightRight = computed({\n\tget: () => dimensions.value.height_right,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_right\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-rectangle-width\"\n\t\t\t:id=\"`${prefix}measurements-sloped-rectangle-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'sloped-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-rectangle-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'sloped-rectangle')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-rectangle-height_left\"\n\t\t\t:id=\"`${prefix}measurements-sloped-rectangle-height_left`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_left]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_left', 'sloped-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_left')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-rectangle-height_left`)\"\n\t\t\t:onBlur=\"\n\t\t\t\t() => addSizeToDataLayer('height_left', +heightLeft, 'sloped-rectangle')\n\t\t\t\"\n\t\t\tv-model=\"heightLeft\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-rectangle-height_right\"\n\t\t\t:id=\"`${prefix}measurements-sloped-rectangle-height_right`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_right]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_right', 'sloped-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_right')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-rectangle-height_right`)\"\n\t\t\t:onBlur=\"\n\t\t\t\t() => addSizeToDataLayer('height_right', +heightRight, 'sloped-rectangle')\n\t\t\t\"\n\t\t\tv-model=\"heightRight\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./SlopedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SlopedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'SlopedRightRectangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'sloped-right-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-right-rectangle-height\",\n        id: `${_ctx.prefix}measurements-sloped-right-rectangle-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'sloped-right-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-right-rectangle-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'sloped-right-rectangle'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-right-rectangle-width_top\",\n        id: `${_ctx.prefix}measurements-sloped-right-rectangle-width_top`,\n        name: `${_ctx.prefix}measurements[dimensions][width_top]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_top', 'sloped-right-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_top'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-right-rectangle-width_top`),\n        onBlur: \n\t\t\t\t() => _unref(addSizeToDataLayer)('width_top', +widthTop.value, 'sloped-right-rectangle')\n\t\t\t,\n        modelValue: widthTop.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((widthTop).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"sloped-right-rectangle-width_bottom\",\n        id: `${_ctx.prefix}measurements-sloped-right-rectangle-width_bottom`,\n        name: `${_ctx.prefix}measurements[dimensions][width_bottom]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_bottom', 'sloped-right-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_bottom'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}sloped-right-rectangle-width_bottom`),\n        onBlur: \n\t\t\t\t() => _unref(addSizeToDataLayer)('width_bottom', +widthBottom.value, 'sloped-right-rectangle')\n\t\t\t,\n        modelValue: widthBottom.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((widthBottom).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'sloped-right-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-right-rectangle-height\"\n\t\t\t:id=\"`${prefix}measurements-sloped-right-rectangle-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'sloped-right-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-right-rectangle-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'sloped-right-rectangle')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-right-rectangle-width_top\"\n\t\t\t:id=\"`${prefix}measurements-sloped-right-rectangle-width_top`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_top]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_top', 'sloped-right-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_top')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-right-rectangle-width_top`)\"\n\t\t\t:onBlur=\"\n\t\t\t\t() => addSizeToDataLayer('width_top', +widthTop, 'sloped-right-rectangle')\n\t\t\t\"\n\t\t\tv-model=\"widthTop\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"sloped-right-rectangle-width_bottom\"\n\t\t\t:id=\"`${prefix}measurements-sloped-right-rectangle-width_bottom`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_bottom]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_bottom', 'sloped-right-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_bottom')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}sloped-right-rectangle-width_bottom`)\"\n\t\t\t:onBlur=\"\n\t\t\t\t() => addSizeToDataLayer('width_bottom', +widthBottom, 'sloped-right-rectangle')\n\t\t\t\"\n\t\t\tv-model=\"widthBottom\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./SlopedRightRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SlopedRightRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'RightAngledTriangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"right-angled-triangle-base\",\n        id: `${_ctx.prefix}measurements-right-angled-triangle-base`,\n        name: `${_ctx.prefix}measurements[dimensions][base]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'right-angled-triangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}right-angled-triangle-base`),\n        onBlur: () => _unref(addSizeToDataLayer)('base', +base.value, 'right-angled-triangle'),\n        modelValue: base.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((base).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"right-angled-triangle-height\",\n        id: `${_ctx.prefix}measurements-right-angled-triangle-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'right-angled-triangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}right-angled-triangle-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'right-angled-triangle'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"right-angled-triangle-base\"\n\t\t\t:id=\"`${prefix}measurements-right-angled-triangle-base`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][base]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'right-angled-triangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}right-angled-triangle-base`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('base', +base, 'right-angled-triangle')\"\n\t\t\tv-model=\"base\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"right-angled-triangle-height\"\n\t\t\t:id=\"`${prefix}measurements-right-angled-triangle-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'right-angled-triangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}right-angled-triangle-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'right-angled-triangle')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./RightAngledTriangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RightAngledTriangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'RightAngledTriangleMirroredDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle-mirrored', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"right-angled-triangle-mirrored-base\",\n        id: `${_ctx.prefix}measurements-right-angled-triangle-mirrored-base`,\n        name: `${_ctx.prefix}measurements[dimensions][base]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'right-angled-triangle-mirrored'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}right-angled-triangle-mirrored-base`),\n        onBlur: () => _unref(addSizeToDataLayer)('base', +base.value, 'right-angled-triangle-mirrored'),\n        modelValue: base.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((base).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"right-angled-triangle-mirrored-height\",\n        id: `${_ctx.prefix}measurements-right-angled-triangle-mirrored-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'right-angled-triangle-mirrored'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}right-angled-triangle-mirrored-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'right-angled-triangle-mirrored'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle-mirrored', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"right-angled-triangle-mirrored-base\"\n\t\t\t:id=\"`${prefix}measurements-right-angled-triangle-mirrored-base`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][base]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'right-angled-triangle-mirrored')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}right-angled-triangle-mirrored-base`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('base', +base, 'right-angled-triangle-mirrored')\"\n\t\t\tv-model=\"base\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"right-angled-triangle-mirrored-height\"\n\t\t\t:id=\"`${prefix}measurements-right-angled-triangle-mirrored-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'right-angled-triangle-mirrored')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}right-angled-triangle-mirrored-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'right-angled-triangle-mirrored')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./RightAngledTriangleMirroredDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./RightAngledTriangleMirroredDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'IsoscelesTriangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'isosceles-triangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"isosceles-triangle-base\",\n        id: `${_ctx.prefix}measurements-isosceles-triangle-base`,\n        name: `${_ctx.prefix}measurements[dimensions][base]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'isosceles-triangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}isosceles-triangle-base`),\n        onBlur: () => _unref(addSizeToDataLayer)('base', +base.value, 'isosceles-triangle'),\n        modelValue: base.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((base).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"isosceles-triangle-height\",\n        id: `${_ctx.prefix}measurements-isosceles-triangle-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'isosceles-triangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}isosceles-triangle-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'isosceles-triangle'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'isosceles-triangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst base = computed({\n\tget: () => dimensions.value.base,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"base\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"isosceles-triangle-base\"\n\t\t\t:id=\"`${prefix}measurements-isosceles-triangle-base`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][base]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'isosceles-triangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}isosceles-triangle-base`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('base', +base, 'isosceles-triangle')\"\n\t\t\tv-model=\"base\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"isosceles-triangle-height\"\n\t\t\t:id=\"`${prefix}measurements-isosceles-triangle-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'isosceles-triangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}isosceles-triangle-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'isosceles-triangle')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./IsoscelesTriangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./IsoscelesTriangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'TrapezoidDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle-mirrored', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tconst numericValue = value;\n\t\tconst widthBottom = dimensions.value.width_bottom;\n\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: ( ( parseFloat(widthBottom) - parseFloat(numericValue) ) / 2 ).toFixed( 1 ),\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tconst numericValue = value;\n\t\tconst widthTop = dimensions.value.width_top;\n\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: ( ( parseFloat(numericValue) - parseFloat(widthTop) ) / 2 ).toFixed( 1 ),\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst offsetLeft = computed({\n\tget: () => dimensions.value.offset_left,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"trapezoid-width_top\",\n        id: `${_ctx.prefix}measurements-trapezoid-width_top`,\n        name: `${_ctx.prefix}measurements[dimensions][width_top]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_top', 'trapezoid'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_top'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}trapezoid-width_top`),\n        onBlur: () => _unref(addSizeToDataLayer)('width_top', +widthTop.value, 'trapezoid'),\n        modelValue: widthTop.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((widthTop).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"trapezoid-width_bottom\",\n        id: `${_ctx.prefix}measurements-trapezoid-width_bottom`,\n        name: `${_ctx.prefix}measurements[dimensions][width_bottom]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_bottom', 'trapezoid'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_bottom'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}trapezoid-width_bottom`),\n        onBlur: () => _unref(addSizeToDataLayer)('width_bottom', +widthBottom.value, 'trapezoid'),\n        modelValue: widthBottom.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((widthBottom).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"trapezoid-height\",\n        id: `${_ctx.prefix}measurements-trapezoid-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'trapezoid'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}trapezoid-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'trapezoid'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"trapezoid-offset_left\",\n        id: `${_ctx.prefix}measurements-trapezoid-offset_left`,\n        name: `${_ctx.prefix}measurements[dimensions][offset_left]`,\n        unit: \"cm\",\n        hidden: \"\",\n        label: dimensionLabel.value('offset_left', 'trapezoid'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('offset_left'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}trapezoid-offset_left`),\n        onBlur: () => _unref(addSizeToDataLayer)('offset_left', +offsetLeft.value, 'trapezoid'),\n        modelValue: offsetLeft.value,\n        \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((offsetLeft).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'right-angled-triangle-mirrored', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tconst numericValue = value;\n\t\tconst widthBottom = dimensions.value.width_bottom;\n\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: ( ( parseFloat(widthBottom) - parseFloat(numericValue) ) / 2 ).toFixed( 1 ),\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tconst numericValue = value;\n\t\tconst widthTop = dimensions.value.width_top;\n\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: ( ( parseFloat(numericValue) - parseFloat(widthTop) ) / 2 ).toFixed( 1 ),\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst offsetLeft = computed({\n\tget: () => dimensions.value.offset_left,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"offset_left\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"trapezoid-width_top\"\n\t\t\t:id=\"`${prefix}measurements-trapezoid-width_top`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_top]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_top', 'trapezoid')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_top')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}trapezoid-width_top`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width_top', +widthTop, 'trapezoid')\"\n\t\t\tv-model=\"widthTop\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"trapezoid-width_bottom\"\n\t\t\t:id=\"`${prefix}measurements-trapezoid-width_bottom`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_bottom]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_bottom', 'trapezoid')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_bottom')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}trapezoid-width_bottom`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width_bottom', +widthBottom, 'trapezoid')\"\n\t\t\tv-model=\"widthBottom\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"trapezoid-height\"\n\t\t\t:id=\"`${prefix}measurements-trapezoid-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'trapezoid')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}trapezoid-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'trapezoid')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"trapezoid-offset_left\"\n\t\t\t:id=\"`${prefix}measurements-trapezoid-offset_left`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][offset_left]`\"\n\t\t\tunit=\"cm\"\n\t\t\thidden\n\t\t\t:label=\"dimensionLabel('offset_left', 'trapezoid')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('offset_left')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}trapezoid-offset_left`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('offset_left', +offsetLeft, 'trapezoid')\"\n\t\t\tv-model=\"offsetLeft\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./TrapezoidDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TrapezoidDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'HexagonDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'hexagon', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst sideLength = computed({\n\tget: () => dimensions.value.side_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"hexagon-side_length\",\n        id: `${_ctx.prefix}measurements-hexagon-side_length`,\n        name: `${_ctx.prefix}measurements[dimensions][side_length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('side_length', 'hexagon'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('side_length'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}hexagon-side_length`),\n        onBlur: () => _unref(addSizeToDataLayer)('side_length', +sideLength.value, 'hexagon'),\n        modelValue: sideLength.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((sideLength).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'hexagon', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst sideLength = computed({\n\tget: () => dimensions.value.side_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"hexagon-side_length\"\n\t\t\t:id=\"`${prefix}measurements-hexagon-side_length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][side_length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('side_length', 'hexagon')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('side_length')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}hexagon-side_length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('side_length', +sideLength, 'hexagon')\"\n\t\t\tv-model=\"sideLength\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./HexagonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HexagonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'HeartDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'heart', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"heart-height\",\n        id: `${_ctx.prefix}measurements-heart-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'heart'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}heart-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'heart'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'heart', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"heart-height\"\n\t\t\t:id=\"`${prefix}measurements-heart-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'heart')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}heart-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'heart')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./HeartDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HeartDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ArrowDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'arrow', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst stemLength = computed({\n\tget: () => dimensions.value.stem_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"stem_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst stemWidth = computed({\n\tget: () => dimensions.value.stem_width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"stem_width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst headLength = computed({\n\tget: () => dimensions.value.head_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"head_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst headWidth = computed({\n\tget: () => dimensions.value.head_width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"head_width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"arrow-stem_length\",\n        id: `${_ctx.prefix}measurements-arrow-stem_length`,\n        name: `${_ctx.prefix}measurements[dimensions][stem_length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('stem_width', 'arrow'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arrow-stem_length`),\n        onBlur: () => _unref(addSizeToDataLayer)('stem_length', +stemLength.value, 'arrow'),\n        modelValue: stemLength.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((stemLength).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"arrow-stem_width\",\n        id: `${_ctx.prefix}measurements-arrow-stem_width`,\n        name: `${_ctx.prefix}measurements[dimensions][stem_width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('stem_height', 'arrow'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arrow-stem_width`),\n        onBlur: () => _unref(addSizeToDataLayer)('stem_width', +stemWidth.value, 'arrow'),\n        modelValue: stemWidth.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((stemWidth).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"arrow-head_length\",\n        id: `${_ctx.prefix}measurements-arrow-head_length`,\n        name: `${_ctx.prefix}measurements[dimensions][head_length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('head_width', 'arrow'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arrow-head_length`),\n        onBlur: () => _unref(addSizeToDataLayer)('head_length', +headLength.value, 'arrow'),\n        modelValue: headLength.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((headLength).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"arrow-head_width\",\n        id: `${_ctx.prefix}measurements-arrow-head_width`,\n        name: `${_ctx.prefix}measurements[dimensions][head_width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('head_height', 'arrow'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arrow-head_width`),\n        onBlur: () => _unref(addSizeToDataLayer)('head_width', +headWidth.value, 'arrow'),\n        modelValue: headWidth.value,\n        \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((headWidth).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'arrow', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => {\n\tif (isCutout) {\n\t\treturn store.getters.isShapeValid(isCutout) && store.getters.isCutoutGroupValid;\n\t}\n\n\treturn store.getters.isShapeValid() && store.getters.isGroupValid;\n});\n\nconst stemLength = computed({\n\tget: () => dimensions.value.stem_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"stem_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst stemWidth = computed({\n\tget: () => dimensions.value.stem_width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"stem_width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst headLength = computed({\n\tget: () => dimensions.value.head_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"head_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst headWidth = computed({\n\tget: () => dimensions.value.head_width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"head_width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"arrow-stem_length\"\n\t\t\t:id=\"`${prefix}measurements-arrow-stem_length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][stem_length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('stem_width', 'arrow')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arrow-stem_length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('stem_length', +stemLength, 'arrow')\"\n\t\t\tv-model=\"stemLength\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"arrow-stem_width\"\n\t\t\t:id=\"`${prefix}measurements-arrow-stem_width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][stem_width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('stem_height', 'arrow')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arrow-stem_width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('stem_width', +stemWidth, 'arrow')\"\n\t\t\tv-model=\"stemWidth\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"arrow-head_length\"\n\t\t\t:id=\"`${prefix}measurements-arrow-head_length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][head_length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('head_width', 'arrow')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arrow-head_length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('head_length', +headLength, 'arrow')\"\n\t\t\tv-model=\"headLength\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"arrow-head_width\"\n\t\t\t:id=\"`${prefix}measurements-arrow-head_width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][head_width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('head_height', 'arrow')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arrow-head_width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('head_width', +headWidth, 'arrow')\"\n\t\t\tv-model=\"headWidth\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./ArrowDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ArrowDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'StarDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'star', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst innerRadius = computed({\n\tget: () => dimensions.value.inner_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"inner_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst outerRadius = computed({\n\tget: () => dimensions.value.outer_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"outer_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst numberOfPoints = computed({\n\tget: () => modifiers.value.number_of_points,\n\tset: (value: number) => {\n\t\tstore.commit(modifierAction, {\n\t\t\tmodifier: \"number_of_points\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"star-inner_radius\",\n        id: `${_ctx.prefix}measurements-star-inner_radius`,\n        name: `${_ctx.prefix}measurements[dimensions][inner_radius]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('inner_radius', 'star'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('inner_radius'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}star-inner_radius`),\n        onBlur: () => _unref(addSizeToDataLayer)('inner_radius', +innerRadius.value, 'star'),\n        modelValue: innerRadius.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((innerRadius).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"star-outer_radius\",\n        id: `${_ctx.prefix}measurements-star-outer_radius`,\n        name: `${_ctx.prefix}measurements[dimensions][outer_radius]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('outer_radius', 'star'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('outer_radius'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}star-outer_radius`),\n        onBlur: () => _unref(addSizeToDataLayer)('outer_radius', +outerRadius.value, 'star'),\n        modelValue: outerRadius.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((outerRadius).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"star-number_of_points\",\n        id: `${_ctx.prefix}measurements-star-number_of_points`,\n        name: `${_ctx.prefix}measurements[modifiers][number_of_points]`,\n        inputmode: \"numeric\",\n        label: dimensionLabel.value('number_of_points', 'star'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}star-number_of_points`),\n        onBlur: () => _unref(addSizeToDataLayer)('number_of_points', +numberOfPoints.value, 'star'),\n        modelValue: numberOfPoints.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((numberOfPoints).value = $event)),\n        step: 1\n      }, null, 8, [\"id\", \"name\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'star', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst innerRadius = computed({\n\tget: () => dimensions.value.inner_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"inner_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst outerRadius = computed({\n\tget: () => dimensions.value.outer_radius,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"outer_radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst numberOfPoints = computed({\n\tget: () => modifiers.value.number_of_points,\n\tset: (value: number) => {\n\t\tstore.commit(modifierAction, {\n\t\t\tmodifier: \"number_of_points\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"star-inner_radius\"\n\t\t\t:id=\"`${prefix}measurements-star-inner_radius`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][inner_radius]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('inner_radius', 'star')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('inner_radius')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}star-inner_radius`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('inner_radius', +innerRadius, 'star')\"\n\t\t\tv-model=\"innerRadius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"star-outer_radius\"\n\t\t\t:id=\"`${prefix}measurements-star-outer_radius`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][outer_radius]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('outer_radius', 'star')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('outer_radius')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}star-outer_radius`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('outer_radius', +outerRadius, 'star')\"\n\t\t\tv-model=\"outerRadius\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"star-number_of_points\"\n\t\t\t:id=\"`${prefix}measurements-star-number_of_points`\"\n\t\t\t:name=\"`${prefix}measurements[modifiers][number_of_points]`\"\n\t\t\tinputmode=\"numeric\"\n\t\t\t:label=\"dimensionLabel('number_of_points', 'star')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}star-number_of_points`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('number_of_points', +numberOfPoints, 'star')\"\n\t\t\tv-model=\"numberOfPoints\"\n\t\t\t:step=\"1\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./StarDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./StarDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, vModelRadio as _vModelRadio, createElementVNode as _createElementVNode, withDirectives as _withDirectives, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-75364fa2\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"text-toggle\" }\nconst _hoisted_2 = [\"id\", \"name\", \"value\", \"checked\"]\nconst _hoisted_3 = [\"for\"]\n\nimport { defineModel } from \"vue\";\n\ninterface Props {\n\tname: string;\n\tvalueA: string;\n\tvalueB: string;\n\tlabelA: string;\n\tlabelB: string;\n\tidPrefix: string;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'TextToggle',\n  props: /*#__PURE__*/_mergeModels({\n    name: {},\n    valueA: {},\n    valueB: {},\n    labelA: {},\n    labelB: {},\n    idPrefix: {}\n  }, {\n    \"modelValue\": { required: true },\n    \"modelModifiers\": {},\n  }),\n  emits: [\"update:modelValue\"],\n  setup(__props: any) {\n\nconst props = __props;\nconst model = _useModel(__props, \"modelValue\");\n\nconst toggleValues = [{\n\tvalue: props.valueA,\n\tlabel: props.labelA,\n}, {\n\tvalue: props.valueB,\n\tlabel: props.labelB,\n}];\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(), _createElementBlock(_Fragment, null, _renderList(toggleValues, (item) => {\n      return (_openBlock(), _createElementBlock(_Fragment, {\n        key: item.value\n      }, [\n        _withDirectives(_createElementVNode(\"input\", {\n          id: _ctx.idPrefix + '-' + item.value,\n          name: _ctx.name,\n          class: \"text-toggle__input\",\n          type: \"radio\",\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((model).value = $event)),\n          value: item.value,\n          checked: model.value === item.value\n        }, null, 8, _hoisted_2), [\n          [_vModelRadio, model.value]\n        ]),\n        _createElementVNode(\"label\", {\n          class: _normalizeClass({\n\t\t\t\t\t'text-toggle__label': true,\n\t\t\t\t\t'text-toggle__label--active': model.value === item.value,\n\t\t\t\t}),\n          for: _ctx.idPrefix + '-' + item.value\n        }, _toDisplayString(item.label), 11, _hoisted_3)\n      ], 64))\n    }), 64))\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { defineModel } from \"vue\";\n\ninterface Props {\n\tname: string;\n\tvalueA: string;\n\tvalueB: string;\n\tlabelA: string;\n\tlabelB: string;\n\tidPrefix: string;\n}\n\nconst props = defineProps<Props>();\nconst model = defineModel({ required: true });\n\nconst toggleValues = [{\n\tvalue: props.valueA,\n\tlabel: props.labelA,\n}, {\n\tvalue: props.valueB,\n\tlabel: props.labelB,\n}];\n\n</script>\n<template>\n\t<div class=\"text-toggle\">\n\t\t<template v-for=\"item in toggleValues\" :key=\"item.value\">\n\t\t\t<input\n\t\t\t\t:id=\"idPrefix + '-' + item.value\"\n\t\t\t\t:name=\"name\"\n\t\t\t\tclass=\"text-toggle__input\"\n\t\t\t\ttype=\"radio\"\n\t\t\t\tv-model=\"model\"\n\t\t\t\t:value=\"item.value\"\n\t\t\t\t:checked=\"model === item.value\"\n\t\t\t/>\n\t\t\t<label\n\t\t\t\t:class=\"{\n\t\t\t\t\t'text-toggle__label': true,\n\t\t\t\t\t'text-toggle__label--active': model === item.value,\n\t\t\t\t}\"\n\t\t\t\t:for=\"idPrefix + '-' + item.value\"\n\t\t\t>\n\t\t\t\t{{ item.label }}\n\t\t\t</label>\n\t\t</template>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.text-toggle {\n\t@include font-size(11px, 23px);\n\tbackground: $measurements-toggle-bg;\n\theight: 23px;\n\tdisplay: inline-block;\n\tborder-radius: 12px;\n\tmargin-top: 10px;\n\tcursor: pointer;\n}\n\n.text-toggle__input {\n\topacity: 0;\n\twidth: 0;\n\theight: 0;\n\tpadding: 0;\n}\n\n.text-toggle__label {\n\tpadding: 0 10px;\n\theight: 23px;\n\tdisplay: inline-block;\n\tcursor: pointer;\n\n\t&--active {\n\t\tborder-radius: 12px;\n\t\tbackground-color: $white;\n\t\tbox-shadow: 0 0 6px 0 rgba($brand-blue-dark, 25%);\n\t}\n}\n\n.text-toggle__input:focus-visible + .text-toggle__label {\n\toutline: auto;\n\toutline-offset: 2px;\n}\n</style>\n","import script from \"./TextToggle.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TextToggle.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./TextToggle.vue?vue&type=style&index=0&id=75364fa2&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-75364fa2\"]])\n\nexport default __exports__","export const FontOptions = [\n\t'Almendra-Bold',\n\t'Almendra-BoldItalic',\n\t'Almendra-Regular',\n\t'AnonymousPro-Bold',\n\t'AnonymousPro-BoldItalic',\n\t'Anton-Regular',\n\t'Antonio-Bold',\n\t'ArchivoNarrow-Bold',\n\t'ArchivoNarrow-BoldItalic',\n\t'ArchivoNarrow-Italic',\n\t'ArchivoNarrow-Regular',\n\t'Arimo-Bold',\n\t'Arimo-BoldItalic',\n\t'Arimo-Italic',\n\t'Arimo-Regular',\n\t'Asap-Bold',\n\t'Asap-BoldItalic',\n\t'Bitter-Bold',\n\t'Bitter-BoldItalic',\n\t'Boogaloo-Regular',\n\t'BreeSerif-Regular',\n\t'Cabin-Bold',\n\t'Cabin-BoldItalic',\n\t'Catamaran-Bold',\n\t'Catamaran-Regular',\n\t'CevicheOne-Regular',\n\t'Chewy-Regular',\n\t'Creepster-Regular',\n\t'CrimsonText-BoldItalic',\n\t'DeliusUnicase-Bold',\n\t'Dosis-Bold',\n\t'Exo-Bold',\n\t'Exo-BoldItalic',\n\t'Exo2-Bold',\n\t'Exo2-BoldItalic',\n\t'Exo2-Italic',\n\t'Exo2-Regular',\n\t'FiraSans-BoldItalic',\n\t'FrancoisOne-Regular',\n\t'FredokaOne-Regular',\n\t'Hind-Bold',\n\t'Hind-Regular',\n\t'Inconsolata-Bold',\n\t'Inconsolata-Regular',\n\t'JosefinSans-Bold',\n\t'JosefinSans-BoldItalic',\n\t'JosefinSans-Regular',\n\t'JosefinSans-SemiBold',\n\t'Karla-Bold',\n\t'Lato-Bold',\n\t'Lato-BoldItalic',\n\t'Lemon-Regular',\n\t'Lora-BoldItalic',\n\t'Merriweather-Regular',\n\t'MerriweatherSans-Bold',\n\t'MerriweatherSans-BoldItalic',\n\t'MerriweatherSans-Italic',\n\t'MerriweatherSans-Regular',\n\t'Montserrat-Bold',\n\t'Montserrat-BoldItalic',\n\t'Mulish-Black',\n\t'Mulish-BlackItalic',\n\t'Mulish-ExtraBold',\n\t'Mulish-ExtraBoldItalic',\n\t'Mulish-SemiBold',\n\t'Mulish-SemiBoldItalic',\n\t'NotoSans-Bold',\n\t'NotoSans-BoldItalic',\n\t'NotoSerif-Bold',\n\t'Nunito-Bold',\n\t'Nunito-BoldItalic',\n\t'OpenSans-Bold',\n\t'OpenSans-BoldItalic',\n\t'OpenSans-ExtraBold',\n\t'OpenSans-ExtraBoldItalic',\n\t'OpenSans-SemiBold',\n\t'OpenSans-SemiBoldItalic',\n\t'OpenSansCondensed-Bold',\n\t'OpenSansHebrew-Bold',\n\t'OpenSansHebrew-BoldItalic',\n\t'OpenSansHebrew-ExtraBold',\n\t'OpenSansHebrew-ExtraBoldItalic',\n\t'OpenSansHebrew-Italic',\n\t'OpenSansHebrew-Light',\n\t'OpenSansHebrew-LightItalic',\n\t'OpenSansHebrew-Regular',\n\t'OpenSansHebrewCondensed-Bold',\n\t'OpenSansHebrewCondensed-BoldItalic',\n\t'OpenSansHebrewCondensed-ExtraBold',\n\t'OpenSansHebrewCondensed-ExtraBoldItalic',\n\t'OpenSansHebrewCondensed-Italic',\n\t'OpenSansHebrewCondensed-Light',\n\t'OpenSansHebrewCondensed-LightItalic',\n\t'OpenSansHebrewCondensed-Regular',\n\t'Orbitron-Black',\n\t'Orbitron-Bold',\n\t'Orbitron-Medium',\n\t'Orbitron-Regular',\n\t'Oswald-Bold',\n\t'Oswald-Regular',\n\t'Oxygen-Bold',\n\t'Oxygen-Regular',\n\t'Poppins-Black',\n\t'Poppins-BlackItalic',\n\t'Poppins-Bold',\n\t'Poppins-BoldItalic',\n\t'Poppins-ExtraBold',\n\t'Poppins-ExtraBoldItalic',\n\t'Poppins-Italic',\n\t'Poppins-Medium',\n\t'Poppins-MediumItalic',\n\t'Poppins-Regular',\n\t'Poppins-SemiBold',\n\t'Poppins-SemiBoldItalic',\n\t'Prociono-Regular',\n\t'Questrial-Regular',\n\t'Quicksand-Bold',\n\t'Quicksand-Regular',\n\t'Raleway-Bold',\n\t'Raleway-Regular',\n\t'RaviPrakash-Regular',\n\t'RobotoMono-Bold',\n\t'RobotoMono-BoldItalic',\n\t'RobotoMono-Italic',\n\t'RobotoMono-Regular',\n\t'RussoOne-Regular',\n\t'Shrikhand-Regular',\n\t'Signika-Bold',\n\t'Signika-Regular',\n\t'SixCaps',\n\t'SourceSansPro-Bold',\n\t'SourceSansPro-BoldItalic',\n\t'SourceSansPro-Italic',\n\t'SourceSansPro-Regular',\n\t'Taviraj-Bold',\n\t'Taviraj-BoldItalic',\n\t'Taviraj-Italic',\n\t'Taviraj-Regular',\n\t'TitilliumWeb-Bold',\n\t'TitilliumWeb-BoldItalic',\n\t'TitilliumWeb-Italic',\n\t'TitilliumWeb-Regular',\n\t'Ubuntu-Bold',\n\t'Ubuntu-BoldItalic',\n\t'Ubuntu-Italic',\n\t'Ubuntu-Medium',\n\t'Ubuntu-MediumItalic',\n\t'Ubuntu-Regular',\n\t'UbuntuCondensed-Regular',\n\t'UbuntuMono-Bold',\n\t'UbuntuMono-BoldItalic',\n\t'UbuntuMono-Italic',\n\t'UbuntuMono-Regular',\n\t'VarelaRound-Regular',\n\t'WorkSans-Bold',\n\t'WorkSans-BoldItalic',\n\t'WorkSans-Regular',\n\t'YanoneKaffeesatz-Bold',\n\t'YanoneKaffeesatz-Regular',\n];\n","import { useModel as _useModel, defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toHandlers as _toHandlers, mergeProps as _mergeProps, createElementVNode as _createElementVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-146b1341\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"required\"]\nconst _hoisted_2 = [\"src\", \"alt\"]\n\nimport { FontOptions } from \"./FontOptions\";\nimport {defineModel, nextTick, ref, watch} from \"vue\";\nimport {useStore} from \"vuex\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'FontSelect',\n  props: {\n    \"modelValue\": { required: true },\n    \"modelModifiers\": {},\n  },\n  emits: [\"update:modelValue\"],\n  setup(__props) {\n\nconst store = useStore();\n\nconst model = _useModel(__props, \"modelValue\");\nconst select = ref(null);\nconst kpsSettings = window.measurementSelectorVariables;\nconst internalModel = ref(model);\n\nwatch( internalModel, ( newValue: string ) => {\n\tupdateModel( newValue );\n} );\n\nconst updateModel = async (newValue: string|number) => {\n\tawait loadFont(newValue);\n\tmodel.value = newValue;\n};\n\nasync function setPosition(): Promise<void> {\n\tawait nextTick();\n\tconst active = select.value.$el.querySelector(\n\t\t\".vs__dropdown-menu .vs__dropdown-option--selected\"\n\t);\n\n\tif (active) {\n\t\tsetTimeout(() => {\n\t\t\tactive.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n\t\t}, 200);\n\t}\n}\n\nasync function loadFont(font): Promise<void> {\n\tconst fontObject = store.getters.getSelectedFontObject;\n\n\tif ( fontObject !== undefined ) {\n\t\treturn fontObject;\n\t}\n\n\tawait store.dispatch( \"loadFont\", font, { root: true } );\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_v_select = _resolveComponent(\"v-select\")!\n\n  return (_openBlock(), _createBlock(_component_v_select, {\n    modelValue: internalModel.value,\n    \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((internalModel).value = $event)),\n    options: _unref(FontOptions),\n    class: \"measurements-selector__font-select\",\n    inputId: \"measurements-selector-font-select\",\n    placeholder: _ctx.$i18n.text.selectFont,\n    ref_key: \"select\",\n    ref: select,\n    onOpen: setPosition\n  }, {\n    search: _withCtx(({ attributes, events }) => [\n      _createElementVNode(\"input\", _mergeProps({\n        class: \"vs__search\",\n        required: !model.value\n      }, attributes, _toHandlers(events, true)), null, 16, _hoisted_1)\n    ]),\n    option: _withCtx((option) => [\n      _createElementVNode(\"img\", {\n        src: _unref(kpsSettings).fontDirUrl + option.label + '-v1.png',\n        alt: option.label,\n        loading: \"lazy\"\n      }, null, 8, _hoisted_2)\n    ]),\n    _: 1\n  }, 8, [\"modelValue\", \"options\", \"placeholder\"]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { FontOptions } from \"./FontOptions\";\nimport {defineModel, nextTick, ref, watch} from \"vue\";\nimport {useStore} from \"vuex\";\n\nconst store = useStore();\n\nconst model = defineModel({ required: true });\nconst select = ref(null);\nconst kpsSettings = window.measurementSelectorVariables;\nconst internalModel = ref(model);\n\nwatch( internalModel, ( newValue: string ) => {\n\tupdateModel( newValue );\n} );\n\nconst updateModel = async (newValue: string|number) => {\n\tawait loadFont(newValue);\n\tmodel.value = newValue;\n};\n\nasync function setPosition(): Promise<void> {\n\tawait nextTick();\n\tconst active = select.value.$el.querySelector(\n\t\t\".vs__dropdown-menu .vs__dropdown-option--selected\"\n\t);\n\n\tif (active) {\n\t\tsetTimeout(() => {\n\t\t\tactive.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n\t\t}, 200);\n\t}\n}\n\nasync function loadFont(font): Promise<void> {\n\tconst fontObject = store.getters.getSelectedFontObject;\n\n\tif ( fontObject !== undefined ) {\n\t\treturn fontObject;\n\t}\n\n\tawait store.dispatch( \"loadFont\", font, { root: true } );\n}\n\n</script>\n<template>\n\t<v-select\n\t\tv-model=\"internalModel\"\n\t\t:options=\"FontOptions\"\n\t\tclass=\"measurements-selector__font-select\"\n\t\tinputId=\"measurements-selector-font-select\"\n\t\t:placeholder=\"$i18n.text.selectFont\"\n\t\tref=\"select\"\n\t\t@open=\"setPosition\"\n\t>\n\t\t<template #search=\"{ attributes, events }\">\n\t\t\t<input\n\t\t\t\tclass=\"vs__search\"\n\t\t\t\t:required=\"!model\"\n\t\t\t\tv-bind=\"attributes\"\n\t\t\t\tv-on=\"events\"\n\t\t\t/>\n\t\t</template>\n\t\t<template v-slot:option=\"option\">\n\t\t\t<img\n\t\t\t\t:src=\"kpsSettings.fontDirUrl + option.label + '-v1.png'\"\n\t\t\t\t:alt=\"option.label\"\n\t\t\t\tloading=\"lazy\"\n\t\t\t/>\n\t\t</template>\n\t</v-select>\n</template>\n\n<style scoped lang=\"scss\">\nimg {\n\twidth: auto;\n\tmax-width: 100%;\n\tmin-height: 15px;\n\tmax-height: 20px;\n}\n</style>\n","import script from \"./FontSelect.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./FontSelect.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./FontSelect.vue?vue&type=style&index=0&id=146b1341&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-146b1341\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, createVNode as _createVNode, normalizeClass as _normalizeClass, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-951dcc18\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"text-notice__icon\"\n}\n\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\ninterface Props {\n\tseverity?: 'notice'|'error';\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'TextNotice',\n  props: {\n    severity: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\nconst cssClasses = () => {\n\tconst classes = [\n\t\t'text-notice'\n\t];\n\n\tif (props.severity) {\n\t\tclasses.push(`text-notice--${props.severity}`);\n\t}\n\n\treturn classes;\n};\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass(cssClasses())\n  }, [\n    (_ctx.$slots.icon)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n          _renderSlot(_ctx.$slots, \"icon\")\n        ]))\n      : _createCommentVNode(\"\", true),\n    _createVNode(TextLabel, null, {\n      default: _withCtx(() => [\n        _renderSlot(_ctx.$slots, \"default\")\n      ]),\n      _: 3\n    })\n  ], 2))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\ninterface Props {\n\tseverity?: 'notice'|'error';\n}\nconst props = defineProps<Props>();\n\nconst cssClasses = () => {\n\tconst classes = [\n\t\t'text-notice'\n\t];\n\n\tif (props.severity) {\n\t\tclasses.push(`text-notice--${props.severity}`);\n\t}\n\n\treturn classes;\n};\n\n</script>\n\n<template>\n\t<div :class=\"cssClasses()\">\n\t\t<div v-if=\"$slots.icon\" class=\"text-notice__icon\" >\n\t\t\t<slot name=\"icon\"></slot>\n\t\t</div>\n\t\t<text-label>\n\t\t\t<slot></slot>\n\t\t</text-label>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.text-notice {\n\tdisplay: flex;\n\tgap: 5px;\n\tflex-direction: row;\n\tflex-wrap: nowrap;\n\n\t&--notice {\n\t\tcolor: $brand-blue-dark;\n\t}\n\n\t&--error {\n\t\tcolor: $error-color;\n\t}\n\n\t&:deep(.text-label) {\n\t\tline-height: 1.333;\n\t}\n\n\t&__icon {\n\t\tdisplay: inline-flex;\n\t\talign-items: flex-start;\n\t\twidth: 20px;\n\t\tpadding: 4px;\n\t\tflex-shrink: 0;\n\n\t\t&:deep(svg) {\n\t\t\twidth: 100%;\n\t\t\theight: auto;\n\t\t}\n\t}\n}\n</style>\n","import script from \"./TextNotice.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TextNotice.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./TextNotice.vue?vue&type=style&index=0&id=951dcc18&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-951dcc18\"]])\n\nexport default __exports__","<template>\n\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M8.986 8c.24 0 .481.025.719.073.66.135 1.173.513 1.44 1.062.327.672.261 1.531-.184 2.42l-.75 1.495c-.4.798-.166.962-.04 1.05.025.018.105.06.304.06.36 0 .775-.139.78-.14a.376.376 0 0 1 .368.637 3.818 3.818 0 0 1-2.361.844c-.239 0-.48-.026-.716-.073-.662-.135-1.174-.512-1.44-1.062-.328-.671-.263-1.53.183-2.419l.75-1.496c.4-.797.165-.963.038-1.052-.024-.017-.104-.058-.301-.058-.36 0-.776.139-.78.14a.375.375 0 0 1-.37-.636 3.814 3.814 0 0 1 2.36-.844Zm1.64-4.499a1.875 1.875 0 1 1 0 3.75 1.875 1.875 0 0 1 0-3.75Z\"  fill-rule=\"nonzero\"/></g></svg>\n</template>\n<style scoped lang=\"scss\">\ncircle {\n\tfill: currentColor;\n}\npath {\n\tfill: $white;\n}\n</style>\n","import { render } from \"./InfoCircleDark.vue?vue&type=template&id=3d8cc308&scoped=true\"\nconst script = {}\n\nimport \"./InfoCircleDark.vue?vue&type=style&index=0&id=3d8cc308&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3d8cc308\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, createElementVNode as _createElementVNode, unref as _unref, openBlock as _openBlock, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-39146dfb\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"text-dimension-inputs__full\" }\n\nimport { computed } from \"vue\";\nimport debounce from \"lodash/debounce\";\nimport isUndefined from \"lodash/isUndefined\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport TextToggle from \"./TextToggle.vue\";\nimport FontSelect from \"./FontSelect.vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport InputLabel from \"@/components/UI/InputLabel.vue\";\nimport TextNotice from \"@/components/UI/TextNotice.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport InfoCircleDark from \"@/components/icons/InfoCircleDark.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'TextDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = __props;\n\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'text', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst isLoading = computed(() => store.getters.fontIsLoading );\n\nconst font = computed({\n\tget: () => modifiers.value.font,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"font\", value });\n\t\tstore.commit(\"setSelectedFont\", value);\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst text = computed({\n\tget: () => modifiers.value.text,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"text\", value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst desiredLength = computed({\n\tget: () => {\n\t\tif ( isUndefined( modifiers.value.text )|| isUndefined( dimensions.value ) ) {\n\t\t\treturn 20;\n\t\t}\n\n\t\treturn dimensions.value.desired_length;\n\t},\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tawait store.dispatch(action, { dimension: \"desired_length\", value: value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst desiredDimension = computed({\n\tget: () => modifiers.value.desired_dimension,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"desired_dimension\", value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, { class: \"text-dimension-inputs\" }, {\n    default: _withCtx(() => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createVNode(InputLabel, {\n          for: \"measurements-text-font\",\n          class: \"text-dimension-inputs__label\"\n        }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(dimensionLabel.value(\"font\", \"text\")), 1)\n          ]),\n          _: 1\n        }),\n        _createVNode(FontSelect, {\n          id: \"measurements-text-font\",\n          modelValue: font.value,\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((font).value = $event)),\n          name: \"measurements[modifiers][font]\",\n          key: \"text-font\"\n        }, null, 8, [\"modelValue\"])\n      ]),\n      _createVNode(DimensionInput, {\n        class: \"text-dimension-inputs__full\",\n        id: \"measurements-text-text\",\n        name: \"measurements[modifiers][text]\",\n        label: dimensionLabel.value('text', 'text'),\n        modelValue: text.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((text).value = $event)),\n        onBlur:  () => _unref(addSizeToDataLayer)('text', +text.value, 'text'),\n        invalid: !isDimensionValid.value('text-text'),\n        isLoading: isLoading.value,\n        readonly: isLoading.value === true,\n        inputmode: \"text\",\n        delay: 0\n      }, null, 8, [\"label\", \"modelValue\", \"onBlur\", \"invalid\", \"isLoading\", \"readonly\"]),\n      _createVNode(DimensionInput, {\n        id: \"measurements-text-desired_length\",\n        name: \"measurements[dimensions][desired_length]\",\n        label: dimensionLabel.value(desiredDimension.value, 'text'),\n        modelValue: desiredLength.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((desiredLength).value = $event)),\n        onBlur:  () => _unref(addSizeToDataLayer)('desired_length', +desiredLength.value, 'text'),\n        invalid: !isDimensionValid.value('text-desired_length'),\n        unit: \"cm\"\n      }, null, 8, [\"label\", \"modelValue\", \"onBlur\", \"invalid\"]),\n      _createElementVNode(\"div\", null, [\n        _createVNode(InputLabel, {\n          for: \"measurements-text-desired_dimension-height\",\n          class: \"text-dimension-inputs__label\"\n        }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(dimensionLabel.value(\"desired_dimension\", \"text\")), 1)\n          ]),\n          _: 1\n        }),\n        _createVNode(TextToggle, {\n          name: \"measurements[modifiers][desired_dimension]\",\n          idPrefix: \"measurements-text-desired_dimension\",\n          valueA: \"height\",\n          valueB: \"width\",\n          modelValue: desiredDimension.value,\n          \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((desiredDimension).value = $event)),\n          labelA: _ctx.$i18n.dimensionNames.height,\n          labelB: _ctx.$i18n.dimensionNames.width\n        }, null, 8, [\"modelValue\", \"labelA\", \"labelB\"])\n      ]),\n      _createVNode(TextNotice, {\n        class: \"text-dimension-inputs__full\",\n        severity: \"notice\"\n      }, {\n        icon: _withCtx(() => [\n          _createVNode(InfoCircleDark)\n        ]),\n        default: _withCtx(() => [\n          _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.text.height_notice), 1)\n        ]),\n        _: 1\n      })\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport debounce from \"lodash/debounce\";\nimport isUndefined from \"lodash/isUndefined\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport TextToggle from \"./TextToggle.vue\";\nimport FontSelect from \"./FontSelect.vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport InputLabel from \"@/components/UI/InputLabel.vue\";\nimport TextNotice from \"@/components/UI/TextNotice.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport InfoCircleDark from \"@/components/icons/InfoCircleDark.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = defineProps<Props>();\n\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'text', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst isLoading = computed(() => store.getters.fontIsLoading );\n\nconst font = computed({\n\tget: () => modifiers.value.font,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"font\", value });\n\t\tstore.commit(\"setSelectedFont\", value);\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst text = computed({\n\tget: () => modifiers.value.text,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"text\", value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst desiredLength = computed({\n\tget: () => {\n\t\tif ( isUndefined( modifiers.value.text )|| isUndefined( dimensions.value ) ) {\n\t\t\treturn 20;\n\t\t}\n\n\t\treturn dimensions.value.desired_length;\n\t},\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tawait store.dispatch(action, { dimension: \"desired_length\", value: value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\nconst desiredDimension = computed({\n\tget: () => modifiers.value.desired_dimension,\n\tset: async(value: string) => {\n\t\tstore.commit(\"updateLoadingState\", true);\n\t\tstore.commit(modifierAction, { modifier: \"desired_dimension\", value });\n\t\tstore.commit(\"updateLoadingState\", false);\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper class=\"text-dimension-inputs\">\n\t\t<div class=\"text-dimension-inputs__full\">\n\t\t\t<input-label\n\t\t\t\tfor=\"measurements-text-font\"\n\t\t\t\tclass=\"text-dimension-inputs__label\"\n\t\t\t>{{ dimensionLabel(\"font\", \"text\") }}</input-label>\n\t\t\t<FontSelect\n\t\t\t\tid=\"measurements-text-font\"\n\t\t\t\tv-model=\"font\"\n\t\t\t\tname=\"measurements[modifiers][font]\"\n\t\t\t\tkey=\"text-font\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<dimension-input\n\t\t\tclass=\"text-dimension-inputs__full\"\n\t\t\tid=\"measurements-text-text\"\n\t\t\tname=\"measurements[modifiers][text]\"\n\t\t\t:label=\"dimensionLabel('text', 'text')\"\n\t\t\tv-model=\"text\"\n\t\t\t:onBlur=\" () => addSizeToDataLayer('text', +text, 'text')\"\n\t\t\t:invalid=\"!isDimensionValid('text-text')\"\n\t\t\t:isLoading=\"isLoading\"\n\t\t\t:readonly=\"isLoading === true\"\n\t\t\tinputmode=\"text\"\n\t\t\t:delay=\"0\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tid=\"measurements-text-desired_length\"\n\t\t\tname=\"measurements[dimensions][desired_length]\"\n\t\t\t:label=\"dimensionLabel(desiredDimension, 'text')\"\n\t\t\tv-model=\"desiredLength\"\n\t\t\t:onBlur=\" () => addSizeToDataLayer('desired_length', +desiredLength, 'text')\"\n\t\t\t:invalid=\"!isDimensionValid('text-desired_length')\"\n\t\t\tunit=\"cm\"\n\t\t/>\n\n\t\t<div>\n\t\t\t<input-label\n\t\t\t\tfor=\"measurements-text-desired_dimension-height\"\n\t\t\t\tclass=\"text-dimension-inputs__label\"\n\t\t\t>{{ dimensionLabel(\"desired_dimension\", \"text\") }}</input-label>\n\t\t\t<TextToggle\n\t\t\t\tname=\"measurements[modifiers][desired_dimension]\"\n\t\t\t\tidPrefix=\"measurements-text-desired_dimension\"\n\t\t\t\tvalueA=\"height\"\n\t\t\t\tvalueB=\"width\"\n\t\t\t\tv-model=\"desiredDimension\"\n\t\t\t\t:labelA=\"$i18n.dimensionNames.height\"\n\t\t\t\t:labelB=\"$i18n.dimensionNames.width\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<text-notice class=\"text-dimension-inputs__full\" severity=\"notice\">\n\t\t\t<template #icon>\n\t\t\t\t<info-circle-dark></info-circle-dark>\n\t\t\t</template>\n\t\t\t{{ $i18n.text.height_notice }}\n\t\t</text-notice>\n\t</shape-input-fields-wrapper>\n</template>\n<style scoped lang=\"scss\">\n.text-dimension-inputs__full {\n\tgrid-column: span 2 / span 2;\n}\n\n.text-dimension-inputs__label {\n\tcolor: $brand-blue-dark;\n\tmargin-bottom: 10px;\n}\n\n</style>\n","import script from \"./TextDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./TextDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./TextDimensionInputs.vue?vue&type=style&index=0&id=39146dfb&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-39146dfb\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ArchedRectangleDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'arched-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"arched-rectangle-width\",\n        id: `${_ctx.prefix}measurements-arched-rectangle-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'arched-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arched-rectangle-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'arched-rectangle'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"arched-rectangle-height\",\n        id: `${_ctx.prefix}measurements-arched-rectangle-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'arched-rectangle'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}arched-rectangle-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'arched-rectangle'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'arched-rectangle', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"arched-rectangle-width\"\n\t\t\t:id=\"`${prefix}measurements-arched-rectangle-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'arched-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arched-rectangle-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'arched-rectangle')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"arched-rectangle-height\"\n\t\t\t:id=\"`${prefix}measurements-arched-rectangle-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'arched-rectangle')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}arched-rectangle-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'arched-rectangle')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./ArchedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ArchedRectangleDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n\t<div>\n\t\t<p>{{ $i18n.shapeFieldsMissing }}</p>\n\t</div>\n</template>\n","import { render } from \"./ShapeFieldsMissing.vue?vue&type=template&id=30a24a4c\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 35 32\"><path d=\"M34.272 26.897a3.368 3.368 0 0 1-2.945 5.004H3.367a3.368 3.368 0 0 1-2.944-5.004l13.98-25.164a3.369 3.369 0 0 1 5.889 0l13.98 25.164zM17.348 3.369 3.368 28.533h27.96L17.348 3.369zm-1.684 9.164a1.684 1.684 0 0 1 3.368 0v5.895a1.684 1.684 0 0 1-3.368 0v-5.895zm1.684 13.473a2.105 2.105 0 1 1 0-4.21 2.105 2.105 0 0 1 0 4.21z\" fill=\"currentColor\"/></svg>\n</template>\n","import { render } from \"./WarningIcon.vue?vue&type=template&id=27164309\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, withCtx as _withCtx, createVNode as _createVNode, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = [\"id\"]\n\nimport TextNotice from \"@/components/UI/TextNotice.vue\";\nimport InfoCircleDark from \"@/components/icons/InfoCircleDark.vue\";\nimport WarningIcon from \"@/components/icons/WarningIcon.vue\";\n\ninterface Props {\n\tinputId?: string;\n\ttype: 'notice' | 'error';\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ValidationMessage',\n  props: {\n    inputId: {},\n    type: { default: 'error' }\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"validation-message\",\n    \"aria-live\": \"assertive\",\n    id: _ctx.inputId ? `${_ctx.inputId}-validation-message` : null\n  }, [\n    _createVNode(TextNotice, { severity: _ctx.type }, {\n      icon: _withCtx(() => [\n        (_ctx.type === 'notice')\n          ? (_openBlock(), _createBlock(InfoCircleDark, { key: 0 }))\n          : _createCommentVNode(\"\", true),\n        (_ctx.type === 'error')\n          ? (_openBlock(), _createBlock(WarningIcon, { key: 1 }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      default: _withCtx(() => [\n        _renderSlot(_ctx.$slots, \"default\")\n      ]),\n      _: 3\n    }, 8, [\"severity\"])\n  ], 8, _hoisted_1))\n}\n}\n\n})","import script from \"./ValidationMessage.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ValidationMessage.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-2368c12a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"full\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"full\"\n}\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'FlatOvalDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\nconst dimensions = computed(() => store.getters.getMeasurements( 'flat-oval', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string|number) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string|number) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"flat-oval-width\",\n        id: `${_ctx.prefix}measurements-flat-oval-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}flat-oval-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'flat-oval'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"flat-oval-radius\",\n        id: `${_ctx.prefix}measurements-flat-oval-radius`,\n        name: `${_ctx.prefix}measurements[dimensions][radius]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('radius'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('radius'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}flat-oval-radius`),\n        onBlur: () => _unref(addSizeToDataLayer)('radius', +radius.value, 'flat-oval'),\n        modelValue: radius.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((radius).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      (message.value('width', 'radius', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('width', 'radius', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true),\n      (message.value('radius', 'width', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('radius', 'width', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true)\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\nconst dimensions = computed(() => store.getters.getMeasurements( 'flat-oval', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string|number) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst radius = computed({\n\tget: () => dimensions.value.radius,\n\tset: (value: string|number) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"radius\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"flat-oval-width\"\n\t\t\t:id=\"`${prefix}measurements-flat-oval-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}flat-oval-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'flat-oval')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"flat-oval-radius\"\n\t\t\t:id=\"`${prefix}measurements-flat-oval-radius`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][radius]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('radius')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('radius')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}flat-oval-radius`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('radius', +radius, 'flat-oval')\"\n\t\t\tv-model=\"radius\"\n\t\t/>\n\n\t\t<div class=\"full\" v-if=\"message('width', 'radius', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('width', 'radius', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t\t<div class=\"full\" v-if=\"message('radius', 'width', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('radius', 'width', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t</shape-input-fields-wrapper>\n</template>\n<style scoped lang=\"scss\">\n.full {\n\tgrid-column: 1 / -1;\n}\n</style>\n","import script from \"./FlatOvalDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./FlatOvalDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./FlatOvalDimensionInputs.vue?vue&type=style&index=0&id=2368c12a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-2368c12a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'OctagonDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'octagon', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst sideLength = computed({\n\tget: () => dimensions.value.side_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"octagon-side_length\",\n        id: `${_ctx.prefix}measurements-octagon-side_length`,\n        name: `${_ctx.prefix}measurements[dimensions][side_length]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('side_length', 'octagon'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('side_length'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}octagon-side_length`),\n        onBlur: () => _unref(addSizeToDataLayer)('side_length', +sideLength.value, 'octagon'),\n        modelValue: sideLength.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((sideLength).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'octagon', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst sideLength = computed({\n\tget: () => dimensions.value.side_length,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_length\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"octagon-side_length\"\n\t\t\t:id=\"`${prefix}measurements-octagon-side_length`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][side_length]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('side_length', 'octagon')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('side_length')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}octagon-side_length`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('side_length', +sideLength, 'octagon')\"\n\t\t\tv-model=\"sideLength\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./OctagonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./OctagonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-c197ff2c\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"full\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"full\"\n}\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DropletDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'droplet', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"droplet-width\",\n        id: `${_ctx.prefix}measurements-droplet-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}droplet-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'droplet'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"droplet-height\",\n        id: `${_ctx.prefix}measurements-droplet-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}droplet-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'droplet'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      (message.value('width', 'height', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('width', 'height', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true),\n      (message.value('height', 'width', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('height', 'width', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true)\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'droplet', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"droplet-width\"\n\t\t\t:id=\"`${prefix}measurements-droplet-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}droplet-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'droplet')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"droplet-height\"\n\t\t\t:id=\"`${prefix}measurements-droplet-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}droplet-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'droplet')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t\t<div class=\"full\" v-if=\"message('width', 'height', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('width', 'height', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t\t<div class=\"full\" v-if=\"message('height', 'width', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('height', 'width', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t</shape-input-fields-wrapper>\n</template>\n<style scoped lang=\"scss\">\n.full {\n\tgrid-column: 1 / -1;\n}\n</style>\n","import script from \"./DropletDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DropletDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DropletDimensionInputs.vue?vue&type=style&index=0&id=c197ff2c&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-c197ff2c\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport { stripNonNumeric, formatForInputField } from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'PolygonDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'polygon', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => formatForInputField(dimensions.value[\"width\"]),\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst sideAmount = computed({\n\tget: () => formatForInputField(modifiers.value[\"side_amount\"]),\n\tset: (value: string) => {\n\t\tstore.commit(modifierAction, {\n\t\t\tmodifier: \"side_amount\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"polygon-width\",\n        id: `${_ctx.prefix}measurements-polygon-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'polygon'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}polygon-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'polygon'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"polygon-side_amount\",\n        id: `${_ctx.prefix}measurements-polygon-side_amount`,\n        name: `${_ctx.prefix}measurements[modifiers][side_amount]`,\n        inputmode: 'numeric',\n        type: 'number',\n        min: 3,\n        max: 30,\n        step: 1,\n        label: dimensionLabel.value('side_amount', 'polygon'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('side_amount'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}polygon-side_amount`),\n        onBlur: () => _unref(addSizeToDataLayer)('side_amount', +sideAmount.value, 'polygon'),\n        modelValue: sideAmount.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((sideAmount).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport { stripNonNumeric, formatForInputField } from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix, modifierAction } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'polygon', isCutout ) );\nconst modifiers = computed(() => store.getters.getModifiers( isCutout ));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => formatForInputField(dimensions.value[\"width\"]),\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst sideAmount = computed({\n\tget: () => formatForInputField(modifiers.value[\"side_amount\"]),\n\tset: (value: string) => {\n\t\tstore.commit(modifierAction, {\n\t\t\tmodifier: \"side_amount\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"polygon-width\"\n\t\t\t:id=\"`${prefix}measurements-polygon-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'polygon')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}polygon-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'polygon')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"polygon-side_amount\"\n\t\t\t:id=\"`${prefix}measurements-polygon-side_amount`\"\n\t\t\t:name=\"`${prefix}measurements[modifiers][side_amount]`\"\n\t\t\t:inputmode=\"'numeric'\"\n\t\t\t:type=\"'number'\"\n\t\t\t:min=\"3\"\n\t\t\t:max=\"30\"\n\t\t\t:step=\"1\"\n\t\t\t:label=\"dimensionLabel('side_amount', 'polygon')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('side_amount')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}polygon-side_amount`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('side_amount', +sideAmount, 'polygon')\"\n\t\t\tv-model=\"sideAmount\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./PolygonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./PolygonDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'EggDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'egg', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"egg-width\",\n        id: `${_ctx.prefix}measurements-egg-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'egg'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}egg-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'egg'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"egg-height\",\n        id: `${_ctx.prefix}measurements-egg-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'egg'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}egg-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'egg'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'egg', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"egg-width\"\n\t\t\t:id=\"`${prefix}measurements-egg-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'egg')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}egg-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'egg')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"egg-height\"\n\t\t\t:id=\"`${prefix}measurements-egg-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'egg')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}egg-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'egg')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./EggDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./EggDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'KiteDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'kite', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightTop = computed({\n\tget: () => dimensions.value.height_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightBottom = computed({\n\tget: () => dimensions.value.height_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"kite-height_top\",\n        id: `${_ctx.prefix}measurements-kite-height_top`,\n        name: `${_ctx.prefix}measurements[dimensions][height_top]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_top', 'kite'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_top'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}kite-height_top`),\n        onBlur: () => _unref(addSizeToDataLayer)('height_top', +heightTop.value, 'kite'),\n        modelValue: heightTop.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((heightTop).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"kite-height_bottom\",\n        id: `${_ctx.prefix}measurements-kite-height_bottom`,\n        name: `${_ctx.prefix}measurements[dimensions][height_bottom]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_bottom', 'kite'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_bottom'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}kite-height_bottom`),\n        onBlur: () => _unref(addSizeToDataLayer)('height_bottom', +heightBottom.value, 'kite'),\n        modelValue: heightBottom.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((heightBottom).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"kite-width\",\n        id: `${_ctx.prefix}measurements-kite-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'kite'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}kite-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'kite'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'kite', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightTop = computed({\n\tget: () => dimensions.value.height_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightBottom = computed({\n\tget: () => dimensions.value.height_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"kite-height_top\"\n\t\t\t:id=\"`${prefix}measurements-kite-height_top`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_top]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_top', 'kite')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_top')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}kite-height_top`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height_top', +heightTop, 'kite')\"\n\t\t\tv-model=\"heightTop\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"kite-height_bottom\"\n\t\t\t:id=\"`${prefix}measurements-kite-height_bottom`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_bottom]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_bottom', 'kite')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_bottom')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}kite-height_bottom`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height_bottom', +heightBottom, 'kite')\"\n\t\t\tv-model=\"heightBottom\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"kite-width\"\n\t\t\t:id=\"`${prefix}measurements-kite-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'kite')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}kite-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'kite')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./KiteDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./KiteDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1fc22a59\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"full\"\n}\nconst _hoisted_2 = {\n  key: 1,\n  class: \"full\"\n}\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'BarrelDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'barrel', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst sideHeight = computed({\n\tget: () => dimensions.value.side_height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"barrel-width\",\n        id: `${_ctx.prefix}measurements-barrel-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}barrel-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'barrel'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"barrel-height\",\n        id: `${_ctx.prefix}measurements-barrel-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height'),\n        instructions: _ctx.isCutout ? '': dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}barrel-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'barrel'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"barrel-side_height\",\n        id: `${_ctx.prefix}measurements-barrel-side_height`,\n        name: `${_ctx.prefix}measurements[dimensions][side_height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('side_height'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('side_height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}barrel-side_height`),\n        onBlur: () => _unref(addSizeToDataLayer)('side_height', +sideHeight.value, 'barrel'),\n        modelValue: sideHeight.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((sideHeight).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      (message.value('height', 'side_height', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('height', 'side_height', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true),\n      (message.value('side_height', 'height', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('side_height', 'height', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true)\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport { Props } from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'barrel', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst sideHeight = computed({\n\tget: () => dimensions.value.side_height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"side_height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"barrel-width\"\n\t\t\t:id=\"`${prefix}measurements-barrel-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}barrel-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'barrel')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"barrel-height\"\n\t\t\t:id=\"`${prefix}measurements-barrel-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height')\"\n\t\t\t:instructions=\"isCutout ? '': dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}barrel-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'barrel')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"barrel-side_height\"\n\t\t\t:id=\"`${prefix}measurements-barrel-side_height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][side_height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('side_height')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('side_height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}barrel-side_height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('side_height', +sideHeight, 'barrel')\"\n\t\t\tv-model=\"sideHeight\"\n\t\t/>\n\t\t<div class=\"full\" v-if=\"message('height', 'side_height', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('height', 'side_height', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t\t<div class=\"full\" v-if=\"message('side_height', 'height', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('side_height', 'height', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t</shape-input-fields-wrapper>\n</template>\n<style scoped lang=\"scss\">\n.full {\n\tgrid-column: 1 / -1;\n}\n</style>\n","import script from \"./BarrelDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./BarrelDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./BarrelDimensionInputs.vue?vue&type=style&index=0&id=1fc22a59&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-1fc22a59\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-13edfad5\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"full\"\n}\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'JewelDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements('jewel', isCutout));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid(isCutout));\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightTop = computed({\n\tget: () => dimensions.value.height_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightBottom = computed({\n\tget: () => dimensions.value.height_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"jewel-height_top\",\n        id: `${_ctx.prefix}measurements-jewel-height_top`,\n        name: `${_ctx.prefix}measurements[dimensions][height_top]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_top'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_top'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}jewel-height_top`),\n        onBlur: () => _unref(addSizeToDataLayer)('height_top', +heightTop.value, 'jewel'),\n        modelValue: heightTop.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((heightTop).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"jewel-height_bottom\",\n        id: `${_ctx.prefix}measurements-jewel-height_bottom`,\n        name: `${_ctx.prefix}measurements[dimensions][height_bottom]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height_bottom'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height_bottom'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}jewel-height_bottom`),\n        onBlur: () => _unref(addSizeToDataLayer)('height_bottom', +heightBottom.value, 'jewel'),\n        modelValue: heightBottom.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((heightBottom).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"jewel-width_top\",\n        id: `${_ctx.prefix}measurements-jewel-width_top`,\n        name: `${_ctx.prefix}measurements[dimensions][width_top]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_top'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_top'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}jewel-width_top`),\n        onBlur: () => _unref(addSizeToDataLayer)('width_top', +widthTop.value, 'jewel'),\n        modelValue: widthTop.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((widthTop).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"jewel-width_bottom\",\n        id: `${_ctx.prefix}measurements-jewel-width_bottom`,\n        name: `${_ctx.prefix}measurements[dimensions][width_bottom]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width_bottom'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width_bottom'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}jewel-width_bottom`),\n        onBlur: () => _unref(addSizeToDataLayer)('width_bottom', +widthBottom.value, 'jewel'),\n        modelValue: widthBottom.value,\n        \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((widthBottom).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      (message.value('width_top', 'width_bottom', _ctx.isCutout))\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n            _createVNode(ValidationMessage, { type: \"notice\" }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(message.value('width_top', 'width_bottom', _ctx.isCutout)), 1)\n              ]),\n              _: 1\n            })\n          ]))\n        : _createCommentVNode(\"\", true)\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\nimport ValidationMessage from '@/components/UI/ValidationMessage.vue';\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements('jewel', isCutout));\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid(isCutout));\nconst message = computed(() => store.getters.getInstructionsForDimension);\n\nconst widthTop = computed({\n\tget: () => dimensions.value.width_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst widthBottom = computed({\n\tget: () => dimensions.value.width_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightTop = computed({\n\tget: () => dimensions.value.height_top,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_top\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst heightBottom = computed({\n\tget: () => dimensions.value.height_bottom,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height_bottom\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"jewel-height_top\"\n\t\t\t:id=\"`${prefix}measurements-jewel-height_top`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_top]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_top')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_top')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}jewel-height_top`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height_top', +heightTop, 'jewel')\"\n\t\t\tv-model=\"heightTop\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"jewel-height_bottom\"\n\t\t\t:id=\"`${prefix}measurements-jewel-height_bottom`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height_bottom]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height_bottom')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height_bottom')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}jewel-height_bottom`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height_bottom', +heightBottom, 'jewel')\"\n\t\t\tv-model=\"heightBottom\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"jewel-width_top\"\n\t\t\t:id=\"`${prefix}measurements-jewel-width_top`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_top]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_top')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_top')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}jewel-width_top`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width_top', +widthTop, 'jewel')\"\n\t\t\tv-model=\"widthTop\"\n\t\t/>\n\t\t<dimension-input\n\t\t\tinputRef=\"jewel-width_bottom\"\n\t\t\t:id=\"`${prefix}measurements-jewel-width_bottom`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width_bottom]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width_bottom')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width_bottom')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}jewel-width_bottom`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width_bottom', +widthBottom, 'jewel')\"\n\t\t\tv-model=\"widthBottom\"\n\t\t/>\n\t\t<div class=\"full\" v-if=\"message('width_top', 'width_bottom', isCutout)\">\n\t\t\t<validation-message type=\"notice\">\n\t\t\t\t{{ message('width_top', 'width_bottom', isCutout) }}\n\t\t\t</validation-message>\n\t\t</div>\n\t</shape-input-fields-wrapper>\n</template>\n<style scoped lang=\"scss\">\n.full {\n\tgrid-column: 1 / -1;\n}\n</style>\n","import script from \"./JewelDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./JewelDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./JewelDimensionInputs.vue?vue&type=style&index=0&id=13edfad5&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-13edfad5\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ParallelogramDimensionInputs',\n  props: {\n    disabledShapes: {},\n    storeShapeGetter: {},\n    storeShapeUpdater: {},\n    action: {},\n    prefix: {},\n    isCutout: { type: Boolean },\n    modifierAction: {}\n  },\n  setup(__props: any) {\n\nconst store = useStore();\nconst { isCutout, action, prefix } = __props;\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'parallelogram', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ShapeInputFieldsWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(DimensionInput, {\n        inputRef: \"parallelogram-width\",\n        id: `${_ctx.prefix}measurements-parallelogram-width`,\n        name: `${_ctx.prefix}measurements[dimensions][width]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('width', 'parallelogram'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('width'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}parallelogram-width`),\n        onBlur: () => _unref(addSizeToDataLayer)('width', +width.value, 'parallelogram'),\n        modelValue: width.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((width).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"parallelogram-height\",\n        id: `${_ctx.prefix}measurements-parallelogram-height`,\n        name: `${_ctx.prefix}measurements[dimensions][height]`,\n        unit: \"cm\",\n        label: dimensionLabel.value('height', 'parallelogram'),\n        instructions: _ctx.isCutout ? '' : dimensionMaxLabel.value('height'),\n        invalid: !isDimensionValid.value(`${_ctx.prefix}parallelogram-height`),\n        onBlur: () => _unref(addSizeToDataLayer)('height', +height.value, 'parallelogram'),\n        modelValue: height.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((height).value = $event))\n      }, null, 8, [\"id\", \"name\", \"label\", \"instructions\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport {Props} from \"@/components/ShapeType.vue\";\n\nconst store = useStore();\nconst { isCutout, action, prefix } = defineProps<Props>();\n\nconst dimensions = computed(() => store.getters.getMeasurements( 'parallelogram', isCutout ) );\nconst dimensionLabel = computed(() => store.getters.dimensionLabel);\nconst dimensionMaxLabel = computed(() => store.getters.getMaxLabelForDimension);\nconst isDimensionValid = computed(() => store.getters.isShapeValid( isCutout ) );\n\nconst width = computed({\n\tget: () => dimensions.value.width,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"width\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n\nconst height = computed({\n\tget: () => dimensions.value.height,\n\tset: (value: string) => {\n\t\tstore.dispatch(action, {\n\t\t\tdimension: \"height\",\n\t\t\tvalue: value,\n\t\t});\n\t},\n});\n</script>\n<template>\n\t<shape-input-fields-wrapper>\n\t\t<dimension-input\n\t\t\tinputRef=\"parallelogram-width\"\n\t\t\t:id=\"`${prefix}measurements-parallelogram-width`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][width]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('width', 'parallelogram')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('width')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}parallelogram-width`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('width', +width, 'parallelogram')\"\n\t\t\tv-model=\"width\"\n\t\t/>\n\n\t\t<dimension-input\n\t\t\tinputRef=\"parallelogram-height\"\n\t\t\t:id=\"`${prefix}measurements-parallelogram-height`\"\n\t\t\t:name=\"`${prefix}measurements[dimensions][height]`\"\n\t\t\tunit=\"cm\"\n\t\t\t:label=\"dimensionLabel('height', 'parallelogram')\"\n\t\t\t:instructions=\"isCutout ? '' : dimensionMaxLabel('height')\"\n\t\t\t:invalid=\"!isDimensionValid(`${prefix}parallelogram-height`)\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer('height', +height, 'parallelogram')\"\n\t\t\tv-model=\"height\"\n\t\t/>\n\t</shape-input-fields-wrapper>\n</template>\n","import script from \"./ParallelogramDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ParallelogramDimensionInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import RectangleDimensionInputs from '@/components/shapes/Rectangle/RectangleDimensionInputs.vue';\nimport RoundedRectangleDimensionInputs from '@/components/shapes/RoundedRectangle/RoundedRectangleDimensionInputs.vue';\nimport CircleDimensionInputs from '@/components/shapes/Circle/CircleDimensionInputs.vue';\nimport HalfCircleDimensionInputs from '@/components/shapes/HalfCircle/HalfCircleDimensionInputs.vue';\nimport QuarterCircleDimensionInputs from '@/components/shapes/QuarterCircle/QuarterCircleDimensionInputs.vue';\nimport EllipseDimensionInputs from '@/components/shapes/Ellipse/EllipseDimensionInputs.vue';\nimport SlopedRectangleDimensionInputs from '@/components/shapes/SlopedRectangle/SlopedRectangleDimensionInputs.vue';\nimport SlopedRightRectangleDimensionInputs from './SlopedRightRectangle/SlopedRightRectangleDimensionInputs.vue';\nimport RightAngledTriangleDimensionInputs from '@/components/shapes/RightAngledTriangle/RightAngledTriangleDimensionInputs.vue';\nimport RightAngledTriangleMirroredDimensionInputs from '@/components/shapes/RightAngledTriangleMirrored/RightAngledTriangleMirroredDimensionInputs.vue';\nimport IsoscelesTriangleDimensionInputs from '@/components/shapes/IsoscelesTriangle/IsoscelesTriangleDimensionInputs.vue';\nimport TrapezoidDimensionInputs from '@/components/shapes/Trapezoid/TrapezoidDimensionInputs.vue';\nimport HexagonDimensionInputs from '@/components/shapes/Hexagon/HexagonDimensionInputs.vue';\nimport HeartDimensionInputs from '@/components/shapes/Heart/HeartDimensionInputs.vue';\nimport ArrowDimensionInputs from '@/components/shapes/Arrow/ArrowDimensionInputs.vue';\nimport StarDimensionInputs from '@/components/shapes/Star/StarDimensionInputs.vue';\nimport TextDimensionInputs from '@/components/shapes/Text/TextDimensionInputs.vue';\nimport ArchedRectangleInputs from '@/components/shapes/ArchedRectangle/ArchedRectangleDimensionInputs.vue';\nimport ShapeFieldsMissing from './ShapeFieldsMissing.vue';\nimport { Raw } from 'vue';\nimport FlatOvalDimensionInputs from './FlatOval/FlatOvalDimensionInputs.vue';\nimport OctagonDimensionInputs from './Octagon/OctagonDimensionInputs.vue';\nimport DropletDimensionInputs from './Droplet/DropletDimensionInputs.vue';\nimport PolygonDimensionInputs from './Polygon/PolygonDimensionInputs.vue';\nimport EggDimensionInputs from './Egg/EggDimensionInputs.vue';\nimport KiteDimensionInputs from './Kite/KiteDimensionInputs.vue';\nimport BarrelDimensionInputs from './Barrel/BarrelDimensionInputs.vue';\nimport JewelDimensionInputs from './Jewel/JewelDimensionInputs.vue';\nimport ParallelogramDimensionInputs from './Parallelogram/ParallelogramDimensionInputs.vue';\n\nexport const getCurrentShapeInputComponent = (shape: string): Raw<any> => {\n\tswitch (shape) {\n\t\tcase 'rectangle':\n\t\t\treturn RectangleDimensionInputs;\n\t\tcase 'rounded-rectangle':\n\t\t\treturn RoundedRectangleDimensionInputs;\n\t\tcase 'circle':\n\t\t\treturn CircleDimensionInputs;\n\t\tcase 'half-circle':\n\t\t\treturn HalfCircleDimensionInputs;\n\t\tcase 'quarter-circle':\n\t\t\treturn QuarterCircleDimensionInputs;\n\t\tcase 'egg':\n\t\t\treturn EggDimensionInputs;\n\t\tcase 'ellipse':\n\t\t\treturn EllipseDimensionInputs;\n\t\tcase 'flat-oval':\n\t\t\treturn FlatOvalDimensionInputs;\n\t\tcase 'sloped-rectangle':\n\t\t\treturn SlopedRectangleDimensionInputs;\n\t\tcase 'sloped-right-rectangle':\n\t\t\treturn SlopedRightRectangleDimensionInputs;\n\t\tcase 'right-angled-triangle':\n\t\t\treturn RightAngledTriangleDimensionInputs;\n\t\tcase 'right-angled-triangle-mirrored':\n\t\t\treturn RightAngledTriangleMirroredDimensionInputs;\n\t\tcase 'isosceles-triangle':\n\t\t\treturn IsoscelesTriangleDimensionInputs;\n\t\tcase 'trapezoid':\n\t\t\treturn TrapezoidDimensionInputs;\n\t\tcase 'hexagon':\n\t\t\treturn HexagonDimensionInputs;\n\t\tcase 'octagon':\n\t\t\treturn OctagonDimensionInputs;\n\t\tcase 'polygon':\n\t\t\treturn PolygonDimensionInputs;\n\t\tcase 'heart':\n\t\t\treturn HeartDimensionInputs;\n\t\tcase 'arrow':\n\t\t\treturn ArrowDimensionInputs;\n\t\tcase 'star':\n\t\t\treturn StarDimensionInputs;\n\t\tcase 'text':\n\t\t\treturn TextDimensionInputs;\n\t\tcase 'arched-rectangle':\n\t\t\treturn ArchedRectangleInputs;\n\t\tcase 'droplet':\n\t\t\treturn DropletDimensionInputs;\n\t\tcase 'kite':\n\t\t\treturn KiteDimensionInputs;\n\t\tcase 'barrel':\n\t\t\treturn BarrelDimensionInputs;\n\t\tcase 'jewel':\n\t\t\treturn JewelDimensionInputs;\n\t\tcase 'parallelogram':\n\t\t\treturn ParallelogramDimensionInputs;\n\t\tdefault:\n\t\t\treturn ShapeFieldsMissing;\n\t}\n};\n","// Apparently it is really hard to check if a slot contains stuff under certain circumstances\n// https://github.com/vuejs/core/issues/4733\n\nimport { Comment, Fragment, Text, type Slot, type VNode } from 'vue';\n\nexport function hasSlotContent(slot: Slot | undefined | null, props: any = {}): boolean {\n\treturn !isSlotEmpty(slot, props);\n}\n\nexport function isSlotEmpty(slot: Slot | undefined | null, props: any = {}): boolean {\n\treturn isVNodeEmpty(slot?.(props));\n}\nexport function asArray<T>(arg: T | T[] | null): T[] {\n\treturn Array.isArray(arg) ? arg : arg !== null ? [arg] : [];\n}\n\nexport function isVNodeEmpty(vnode: VNode | VNode[] | undefined | null): boolean {\n\treturn (\n\t\t!vnode ||\n\t\tasArray(vnode).every(\n\t\t\t(vnode) =>\n\t\t\t\tvnode.type === Comment ||\n\t\t\t\t(vnode.type === Text && !vnode.children?.length) ||\n\t\t\t\t(vnode.type === Fragment && !vnode.children?.length)\n\t\t)\n\t);\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-3e4fbddb\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"message-container\"\n}\n\nimport { hasSlotContent } from \"@/utilities/EmptySlotCheck\";\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'MessageContainer',\n  setup(__props) {\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_unref(hasSlotContent)(_ctx.$slots.default))\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        _renderSlot(_ctx.$slots, \"default\")\n      ]))\n    : _createCommentVNode(\"\", true)\n}\n}\n\n})","import script from \"./MessageContainer.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./MessageContainer.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./MessageContainer.vue?vue&type=style&index=0&id=3e4fbddb&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-3e4fbddb\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveDynamicComponent as _resolveDynamicComponent, normalizeProps as _normalizeProps, guardReactiveProps as _guardReactiveProps, openBlock as _openBlock, createBlock as _createBlock, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, createCommentVNode as _createCommentVNode, createVNode as _createVNode } from \"vue\"\n\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { getCurrentShapeInputComponent } from \"@/components/shapes/ShapeHelper\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeInputs',\n  setup(__props) {\n\nconst store = useStore();\nconst shape = computed(() => store.getters.shape);\nconst dimensions = computed(() => store.getters.dimensions);\nconst modifiers = computed(() => store.getters.modifiers);\nconst hasGroupedDimensionValidatorErrors = computed(\n\t() => store.getters.hasGroupedDimensionValidatorErrors\n);\nconst getGroupedDimensionValidationMessage = computed(\n\t() => store.getters.getGroupedDimensionValidationMessage\n);\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\nconst validationDimensionMessages = computed(() => {\n\tconst validators = store.getters.getDimensionValidatorErrors;\n\treturn validators.map((validator) => {\n\t\treturn {\n\t\t\tkey: validator.field,\n\t\t\tid: `measurements-${validator.field}`,\n\t\t\tmessage: validator.getMessage(),\n\t\t};\n\t});\n});\n\ndocument.addEventListener('focusin', (event) => store.commit('updateFocusedElement', event));\ndocument.addEventListener('focusout', () => store.commit('updateFocusedElement', ''));\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusout', () => store.commit('updateFocusedElement'));\n\tdocument.removeEventListener('focusin', () => store.commit('updateFocusedElement'));\n});\n\nconst currentProps = computed(() => {\n\tswitch (shape.value) {\n\t\tcase \"rectangle\":\n\t\tcase \"rounded-rectangle\":\n\t\tcase \"circle\":\n\t\tcase \"half-circle\":\n\t\tcase \"quarter-circle\":\n\t\tcase \"egg\":\n\t\tcase \"ellipse\":\n\t\tcase \"flat-oval\":\n\t\tcase \"sloped-rectangle\":\n\t\tcase \"sloped-right-rectangle\":\n\t\tcase \"right-angled-triangle\":\n\t\tcase \"right-angled-triangle-mirrored\":\n\t\tcase \"isosceles-triangle\":\n\t\tcase \"trapezoid\":\n\t\tcase \"hexagon\":\n\t\tcase \"octagon\":\n\t\tcase \"polygon\":\n\t\tcase \"heart\":\n\t\tcase \"arrow\":\n\t\tcase \"star\":\n\t\tcase \"text\":\n\t\tcase \"droplet\":\n\t\tcase \"kite\":\n\t\tcase \"barrel\":\n\t\tcase \"jewel\":\n\t\tcase \"parallelogram\":\n\t\tcase \"arched-rectangle\":\n\t\t\treturn {\n\t\t\t\taction: \"updatePlateDimension\",\n\t\t\t\tmodifierAction: \"updateModifier\",\n\t\t\t\tisCutout: false,\n\t\t\t\tprefix: '',\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tvalue: dimensions.value,\n\t\t\t\tmodifiers: modifiers.value,\n\t\t\t};\n\t}\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", null, [\n    (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getCurrentShapeInputComponent)(shape.value)), _normalizeProps(_guardReactiveProps(currentProps.value)), null, 16)),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validationDimensionMessages.value, (field) => {\n          return (_openBlock(), _createBlock(ValidationMessage, {\n            key: field.key + '-validation-message',\n            \"input-id\": field.id\n          }, {\n            default: _withCtx(() => [\n              _createTextVNode(_toDisplayString(field.message), 1)\n            ]),\n            _: 2\n          }, 1032, [\"input-id\"]))\n        }), 128)),\n        (hasProblematicCorners.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.problematicCornersNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (hasGroupedDimensionValidatorErrors.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 1,\n              \"input-id\": \"grouped-validation-message\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(getGroupedDimensionValidationMessage.value), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    })\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount } from \"vue\";\nimport { useStore } from \"vuex\";\nimport { getCurrentShapeInputComponent } from \"@/components/shapes/ShapeHelper\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\nconst shape = computed(() => store.getters.shape);\nconst dimensions = computed(() => store.getters.dimensions);\nconst modifiers = computed(() => store.getters.modifiers);\nconst hasGroupedDimensionValidatorErrors = computed(\n\t() => store.getters.hasGroupedDimensionValidatorErrors\n);\nconst getGroupedDimensionValidationMessage = computed(\n\t() => store.getters.getGroupedDimensionValidationMessage\n);\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\nconst validationDimensionMessages = computed(() => {\n\tconst validators = store.getters.getDimensionValidatorErrors;\n\treturn validators.map((validator) => {\n\t\treturn {\n\t\t\tkey: validator.field,\n\t\t\tid: `measurements-${validator.field}`,\n\t\t\tmessage: validator.getMessage(),\n\t\t};\n\t});\n});\n\ndocument.addEventListener('focusin', (event) => store.commit('updateFocusedElement', event));\ndocument.addEventListener('focusout', () => store.commit('updateFocusedElement', ''));\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusout', () => store.commit('updateFocusedElement'));\n\tdocument.removeEventListener('focusin', () => store.commit('updateFocusedElement'));\n});\n\nconst currentProps = computed(() => {\n\tswitch (shape.value) {\n\t\tcase \"rectangle\":\n\t\tcase \"rounded-rectangle\":\n\t\tcase \"circle\":\n\t\tcase \"half-circle\":\n\t\tcase \"quarter-circle\":\n\t\tcase \"egg\":\n\t\tcase \"ellipse\":\n\t\tcase \"flat-oval\":\n\t\tcase \"sloped-rectangle\":\n\t\tcase \"sloped-right-rectangle\":\n\t\tcase \"right-angled-triangle\":\n\t\tcase \"right-angled-triangle-mirrored\":\n\t\tcase \"isosceles-triangle\":\n\t\tcase \"trapezoid\":\n\t\tcase \"hexagon\":\n\t\tcase \"octagon\":\n\t\tcase \"polygon\":\n\t\tcase \"heart\":\n\t\tcase \"arrow\":\n\t\tcase \"star\":\n\t\tcase \"text\":\n\t\tcase \"droplet\":\n\t\tcase \"kite\":\n\t\tcase \"barrel\":\n\t\tcase \"jewel\":\n\t\tcase \"parallelogram\":\n\t\tcase \"arched-rectangle\":\n\t\t\treturn {\n\t\t\t\taction: \"updatePlateDimension\",\n\t\t\t\tmodifierAction: \"updateModifier\",\n\t\t\t\tisCutout: false,\n\t\t\t\tprefix: '',\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tvalue: dimensions.value,\n\t\t\t\tmodifiers: modifiers.value,\n\t\t\t};\n\t}\n});\n</script>\n\n<template>\n\t<div>\n\t\t<component\n\t\t\t:is=\"getCurrentShapeInputComponent(shape)\"\n\t\t\tv-bind=\"currentProps\"\n\t\t/>\n\n\t\t<message-container>\n\t\t\t<validation-message\n\t\t\t\tv-for=\"field in validationDimensionMessages\"\n\t\t\t\t:key=\"field.key + '-validation-message'\"\n\t\t\t\t:input-id=\"field.id\"\n\t\t\t>\n\t\t\t\t{{ field.message }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-if=\"hasProblematicCorners\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.problematicCornersNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-if=\"hasGroupedDimensionValidatorErrors\"\n\t\t\t\tinput-id=\"grouped-validation-message\"\n\t\t\t>\n\t\t\t\t{{ getGroupedDimensionValidationMessage }}\n\t\t\t</validation-message>\n\t\t</message-container>\n\t</div>\n</template>\n","import script from \"./ShapeInputs.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeInputs.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-054addec\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"shape-settings\" }\n\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport ShapeType from './ShapeType.vue';\nimport ShapeInputs from '@/components/ShapeInputs.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeSettings',\n  setup(__props) {\n\nconst store = useStore();\nconst selectedMenuItem = computed(() => store.getters.selectedMenuItem);\nconst shape = computed(() => store.getters.shape);\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (selectedMenuItem.value === 'shapes')\n      ? (_openBlock(), _createBlock(ShapeType, {\n          key: 0,\n          disabledShapes: ['dxf', 'text', 'rectangle'],\n          storeShapeGetter: 'shape',\n          storeShapeUpdater: 'updatePlateShape'\n        }))\n      : _createCommentVNode(\"\", true),\n    (shape.value !== '')\n      ? (_openBlock(), _createBlock(ShapeInputs, { key: 1 }))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport ShapeType from './ShapeType.vue';\nimport ShapeInputs from '@/components/ShapeInputs.vue';\n\nconst store = useStore();\nconst selectedMenuItem = computed(() => store.getters.selectedMenuItem);\nconst shape = computed(() => store.getters.shape);\n\n</script>\n<template>\n\t<div class=\"shape-settings\">\n\t\t<ShapeType\n\t\t\tv-if=\"selectedMenuItem === 'shapes'\"\n\t\t\t:disabledShapes=\"['dxf', 'text', 'rectangle']\"\n\t\t\t:storeShapeGetter=\"'shape'\"\n\t\t\t:storeShapeUpdater=\"'updatePlateShape'\"\n\t\t/>\n\n\t\t<shape-inputs v-if=\"shape !== ''\" />\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n\t.shape-settings {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 16px;\n\t\tborder-radius: 8px;\n\t\tpadding: 20px;\n\t\tbackground-color: $brand-blue-background;\n\t}\n</style>\n","import script from \"./ShapeSettings.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeSettings.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ShapeSettings.vue?vue&type=style&index=0&id=054addec&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-054addec\"]])\n\nexport default __exports__","import { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, createBlock as _createBlock, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, Teleport as _Teleport, createVNode as _createVNode, normalizeClass as _normalizeClass, vShow as _vShow, withDirectives as _withDirectives, withCtx as _withCtx } from \"vue\"\n\nconst _hoisted_1 = { class: \"measurements-selector__meta-information\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"measurements-selector__product-price-total\"\n}\nconst _hoisted_3 = { class: \"measurements-selector__product-price measurements-selector__product-price--large\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"icon icon-spinner2\"\n}\nconst _hoisted_5 = { class: \"measurements-selector__price measurements-selector__product-price--small\" }\nconst _hoisted_6 = {\n  key: 0,\n  class: \"icon icon-spinner2\"\n}\nconst _hoisted_7 = { class: \"measurements-selector__price-structure\" }\nconst _hoisted_8 = { class: \"measurements-selector__price-structure-nav\" }\nconst _hoisted_9 = { class: \"btn__icon\" }\nconst _hoisted_10 = { class: \"btn__text\" }\nconst _hoisted_11 = { class: \"measurements-selector__save-and-share\" }\nconst _hoisted_12 = { class: \"measurements-selector__save-and-share\" }\nconst _hoisted_13 = [\"aria-hidden\"]\nconst _hoisted_14 = {\n  key: 0,\n  class: \"measurements-selector__pricing-table\"\n}\nconst _hoisted_15 = { key: 0 }\nconst _hoisted_16 = { key: 1 }\nconst _hoisted_17 = {\n  key: 2,\n  class: \"measurements-selector__pricing-table__addition\"\n}\nconst _hoisted_18 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_19 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_20 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_21 = [\n  _hoisted_18,\n  _hoisted_19,\n  _hoisted_20\n]\nconst _hoisted_22 = { key: 3 }\nconst _hoisted_23 = { key: 4 }\nconst _hoisted_24 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_25 = {\n  key: 5,\n  class: \"measurements-selector__pricing-table__addition\"\n}\nconst _hoisted_26 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_27 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_28 = /*#__PURE__*/_createElementVNode(\"td\", null, null, -1)\nconst _hoisted_29 = [\n  _hoisted_26,\n  _hoisted_27,\n  _hoisted_28\n]\nconst _hoisted_30 = { key: 6 }\nconst _hoisted_31 = {\n  key: 1,\n  class: \"measurements-selector__pricing-table\"\n}\nconst _hoisted_32 = { class: \"measurements-selector__pricing-section\" }\nconst _hoisted_33 = [\"innerHTML\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n  const _component_FormattedPrice = _resolveComponent(\"FormattedPrice\")!\n  const _component_ChevronRightIcon = _resolveComponent(\"ChevronRightIcon\")!\n  const _component_StoreButton = _resolveComponent(\"StoreButton\")!\n  const _component_StoreModal = _resolveComponent(\"StoreModal\")!\n  const _component_ShareButton = _resolveComponent(\"ShareButton\")!\n  const _component_ShareModal = _resolveComponent(\"ShareModal\")!\n  const _component_PriceStructureComponent = _resolveComponent(\"PriceStructureComponent\")!\n  const _component_measurements_height_transition = _resolveComponent(\"measurements-height-transition\")!\n  const _component_BulkPriceTable = _resolveComponent(\"BulkPriceTable\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (_openBlock(), _createBlock(_Teleport, { to: \"#measurements-selector-pricing-table\" }, [\n      ($props.isShapeComplete || $options.shouldShowSpinner)\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n            _createElementVNode(\"div\", _hoisted_3, [\n              (this.shouldShowSpinner)\n                ? (_openBlock(), _createElementBlock(\"i\", _hoisted_4))\n                : (_openBlock(), _createBlock(_component_FormattedPrice, {\n                    key: 1,\n                    price: $options.totalPriceIncVat\n                  }, null, 8, [\"price\"]))\n            ]),\n            _createElementVNode(\"div\", _hoisted_5, [\n              (this.shouldShowSpinner)\n                ? (_openBlock(), _createElementBlock(\"i\", _hoisted_6))\n                : (_openBlock(), _createBlock(_component_FormattedPrice, {\n                    key: 1,\n                    price: $options.totalPriceExVat\n                  }, null, 8, [\"price\"])),\n              _createTextVNode(\" \" + _toDisplayString($options.i18n.vatExcluded), 1)\n            ])\n          ]))\n        : _createCommentVNode(\"\", true)\n    ])),\n    _createElementVNode(\"div\", _hoisted_7, [\n      _createElementVNode(\"ul\", _hoisted_8, [\n        _createElementVNode(\"li\", {\n          class: _normalizeClass([\"measurements-selector__price-structure-nav-item\", { 'measurements-selector__price-structure-nav-item--active': _ctx.showPriceStructure }])\n        }, [\n          ($props.isShapeComplete)\n            ? (_openBlock(), _createElementBlock(\"button\", {\n                key: 0,\n                class: \"btn btn--extra-small btn--clean-link btn--clean-icon\",\n                type: \"button\",\n                onClick: _cache[0] || (_cache[0] = ($event: any) => {_ctx.showPriceStructure = ! _ctx.showPriceStructure; $options.addDataLayerEvent()})\n              }, [\n                _createElementVNode(\"span\", _hoisted_9, [\n                  _createVNode(_component_ChevronRightIcon, {\n                    class: \"icon-inline icon-inline--expanded svg-icon-chevron-right-icon\",\n                    \"aria-hidden\": \"true\"\n                  })\n                ]),\n                _createElementVNode(\"span\", _hoisted_10, _toDisplayString(_ctx.showPriceStructure ? $options.i18n.meta.hidePriceStructure : $options.i18n.meta.showPriceStructure), 1)\n              ]))\n            : _createCommentVNode(\"\", true)\n        ], 2),\n        _createElementVNode(\"li\", {\n          class: _normalizeClass([\"measurements-selector__price-structure-nav-item\", { 'measurements-selector__price-structure-nav-item--faded': _ctx.showPriceStructure }])\n        }, [\n          _createElementVNode(\"div\", _hoisted_11, [\n            _createVNode(_component_StoreButton),\n            _createVNode(_component_StoreModal)\n          ])\n        ], 2),\n        _createElementVNode(\"li\", {\n          class: _normalizeClass([\"measurements-selector__price-structure-nav-item\", { 'measurements-selector__price-structure-nav-item--faded': _ctx.showPriceStructure }])\n        }, [\n          _createElementVNode(\"div\", _hoisted_12, [\n            _createVNode(_component_ShareButton),\n            _createVNode(_component_ShareModal)\n          ])\n        ], 2)\n      ]),\n      _createVNode(_component_measurements_height_transition, {\n        appear: \"\",\n        mode: \"out-in\"\n      }, {\n        default: _withCtx(() => [\n          _withDirectives(_createElementVNode(\"div\", {\n            class: \"measurements-selector__pricing\",\n            \"aria-hidden\": !_ctx.showPriceStructure\n          }, [\n            ($props.isShapeComplete || $options.shouldShowSpinner)\n              ? (_openBlock(), _createElementBlock(\"table\", _hoisted_14, [\n                  _createElementVNode(\"tbody\", null, [\n                    _createElementVNode(\"tr\", null, [\n                      _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.materialPrice), 1),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesIncVat.material,\n                        isEx: false,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"]),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesExVat.material,\n                        isEx: true,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"])\n                    ]),\n                    _createElementVNode(\"tr\", null, [\n                      _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.sawingCosts), 1),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesIncVat.sawing,\n                        isEx: false,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"]),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesExVat.sawing,\n                        isEx: true,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"])\n                    ]),\n                    ($options.showMinimumFee)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_15, [\n                          _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.minimumPriceFee), 1),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: this.pricesIncVat.minimumPriceFee,\n                            isEx: false,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"]),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: this.pricesExVat.minimumPriceFee,\n                            isEx: true,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"])\n                        ]))\n                      : _createCommentVNode(\"\", true),\n                    ($options.showBulkPrice && $options.pricesIncVat.bulkDiscount > 0)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_16, [\n                          _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.bulkDiscount), 1),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: -1 * $options.pricesIncVat.bulkDiscount,\n                            isEx: false,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"]),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: -1 * $options.pricesExVat.bulkDiscount,\n                            isEx: true,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"])\n                        ]))\n                      : _createCommentVNode(\"\", true),\n                    ($options.showComplexStructure)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_17, _hoisted_21))\n                      : _createCommentVNode(\"\", true),\n                    ($options.showComplexStructure)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_22, [\n                          _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.unitPrice), 1),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: $options.pricesIncVat.bulkUnitPrice,\n                            isEx: false,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"]),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: $options.pricesExVat.bulkUnitPrice,\n                            isEx: true,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"])\n                        ]))\n                      : _createCommentVNode(\"\", true),\n                    ($options.showComplexStructure)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_23, [\n                          _hoisted_24,\n                          _createElementVNode(\"td\", null, \"x \" + _toDisplayString(this.quantity), 1),\n                          _createElementVNode(\"td\", null, \"x \" + _toDisplayString(this.quantity), 1)\n                        ]))\n                      : _createCommentVNode(\"\", true),\n                    _createElementVNode(\"tr\", null, [\n                      _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.shapeFee), 1),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesIncVat.fee,\n                        isEx: false,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"]),\n                      _createVNode(_component_PriceStructureComponent, {\n                        price: this.pricesExVat.fee,\n                        isEx: true,\n                        showSpinner: $options.shouldShowSpinner\n                      }, null, 8, [\"price\", \"showSpinner\"])\n                    ]),\n                    ($options.showComplexStructure)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_25, _hoisted_29))\n                      : _createCommentVNode(\"\", true),\n                    ($options.showComplexStructure)\n                      ? (_openBlock(), _createElementBlock(\"tr\", _hoisted_30, [\n                          _createElementVNode(\"td\", null, _toDisplayString($options.i18n.meta.total), 1),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: this.totalPriceIncVat,\n                            isEx: false,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"]),\n                          _createVNode(_component_PriceStructureComponent, {\n                            price: this.totalPriceExVat,\n                            isEx: true,\n                            showSpinner: $options.shouldShowSpinner\n                          }, null, 8, [\"price\", \"showSpinner\"])\n                        ]))\n                      : _createCommentVNode(\"\", true)\n                  ])\n                ]))\n              : (_openBlock(), _createElementBlock(\"table\", _hoisted_31, [\n                  _createElementVNode(\"tbody\", null, [\n                    _createElementVNode(\"tr\", null, [\n                      _createElementVNode(\"td\", _hoisted_32, [\n                        _createElementVNode(\"strong\", null, _toDisplayString($options.translatedShapeName), 1)\n                      ])\n                    ])\n                  ])\n                ]))\n          ], 8, _hoisted_13), [\n            [_vShow, _ctx.showPriceStructure]\n          ])\n        ]),\n        _: 1\n      })\n    ]),\n    (_openBlock(), _createBlock(_Teleport, { to: \"#measurements-selector-availability\" }, [\n      ($props.availability)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 0,\n            class: \"measurements-selector__availability\",\n            innerHTML: $props.availability\n          }, null, 8, _hoisted_33))\n        : _createCommentVNode(\"\", true)\n    ])),\n    _createVNode(_component_BulkPriceTable, {\n      price: $options.originalPriceExVat,\n      shape: $props.shape,\n      primitives: $props.primitives,\n      onDiscountedPrice: $options.updateDiscountedPrice,\n      onQuantity: $options.updateQuantity\n    }, null, 8, [\"price\", \"shape\", \"primitives\", \"onDiscountedPrice\", \"onQuantity\"])\n  ]))\n}","<template>\n\t<div class=\"measurements-selector__meta-information\">\n\t\t<Teleport to=\"#measurements-selector-pricing-table\">\n\t\t\t<div\n\t\t\t\tv-if=\"isShapeComplete || shouldShowSpinner\"\n\t\t\t\tclass=\"measurements-selector__product-price-total\"\n\t\t\t>\n\t\t\t\t<div class=\"measurements-selector__product-price measurements-selector__product-price--large\">\n\t\t\t\t\t<i v-if=\"this.shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t\t\t<FormattedPrice v-else :price=\"totalPriceIncVat\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"measurements-selector__price measurements-selector__product-price--small\">\n\t\t\t\t\t<i v-if=\"this.shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t\t\t<FormattedPrice v-else :price=\"totalPriceExVat\" /> {{ i18n.vatExcluded }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Teleport>\n\t\t<div class=\"measurements-selector__price-structure\">\n\t\t\t<ul class=\"measurements-selector__price-structure-nav\">\n\t\t\t\t<li class=\"measurements-selector__price-structure-nav-item\" :class=\"{ 'measurements-selector__price-structure-nav-item--active': showPriceStructure }\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-if=\"isShapeComplete\"\n\t\t\t\t\t\tclass=\"btn btn--extra-small btn--clean-link btn--clean-icon\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t@click=\"showPriceStructure = ! showPriceStructure; addDataLayerEvent()\">\n\t\t\t\t\t\t<span class=\"btn__icon\">\n\t\t\t\t\t\t\t<ChevronRightIcon class=\"icon-inline icon-inline--expanded svg-icon-chevron-right-icon\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"btn__text\">{{ showPriceStructure ? i18n.meta.hidePriceStructure : i18n.meta.showPriceStructure }}</span>\n\t\t\t\t\t</button>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"measurements-selector__price-structure-nav-item\" :class=\"{ 'measurements-selector__price-structure-nav-item--faded': showPriceStructure }\">\n\t\t\t\t\t<div class=\"measurements-selector__save-and-share\">\n\t\t\t\t\t\t<StoreButton />\n\t\t\t\t\t\t<StoreModal />\n\t\t\t\t\t</div>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"measurements-selector__price-structure-nav-item\" :class=\"{ 'measurements-selector__price-structure-nav-item--faded': showPriceStructure }\">\n\t\t\t\t\t<div class=\"measurements-selector__save-and-share\">\n\t\t\t\t\t\t<ShareButton />\n\t\t\t\t\t\t<ShareModal />\n\t\t\t\t\t</div>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t\t<div class=\"measurements-selector__pricing\" :aria-hidden=\"!showPriceStructure\" v-show=\"showPriceStructure\">\n\t\t\t\t\t<table class=\"measurements-selector__pricing-table\"  v-if=\"isShapeComplete || shouldShowSpinner\">\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.materialPrice }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesIncVat.material\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesExVat.material\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.sawingCosts }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesIncVat.sawing\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesExVat.sawing\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"showMinimumFee\">\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.minimumPriceFee }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesIncVat.minimumPriceFee\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesExVat.minimumPriceFee\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"showBulkPrice && pricesIncVat.bulkDiscount > 0\">\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.bulkDiscount }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"-1 * pricesIncVat.bulkDiscount\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"-1 * pricesExVat.bulkDiscount\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"showComplexStructure\" class=\"measurements-selector__pricing-table__addition\"><td></td><td></td><td></td></tr>\n\t\t\t\t\t\t\t<tr v-if=\"showComplexStructure\">\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.unitPrice }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"pricesIncVat.bulkUnitPrice\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"pricesExVat.bulkUnitPrice\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"showComplexStructure\">\n\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t<td>x {{ this.quantity }}</td>\n\t\t\t\t\t\t\t\t<td>x {{ this.quantity }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.shapeFee }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesIncVat.fee\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.pricesExVat.fee\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr v-if=\"showComplexStructure\" class=\"measurements-selector__pricing-table__addition\"><td></td><td></td><td></td></tr>\n\t\t\t\t\t\t\t<tr v-if=\"showComplexStructure\">\n\t\t\t\t\t\t\t\t<td>{{ i18n.meta.total }}</td>\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.totalPriceIncVat\" :isEx=\"false\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t\t<PriceStructureComponent :price=\"this.totalPriceExVat\" :isEx=\"true\" :showSpinner=\"shouldShowSpinner\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t\t<table\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tclass=\"measurements-selector__pricing-table\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td class=\"measurements-selector__pricing-section\">\n\t\t\t\t\t\t\t\t\t<strong>{{ translatedShapeName }}</strong>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t</measurements-height-transition>\n\t\t</div>\n\t\t<Teleport to=\"#measurements-selector-availability\">\n\t\t\t<div class=\"measurements-selector__availability\" v-if=\"availability\" v-html=\"availability\"></div>\n\t\t</Teleport>\n\t\t<BulkPriceTable\n\t\t\t:price=\"originalPriceExVat\"\n\t\t\t:shape=\"shape\"\n\t\t\t:primitives=\"primitives\"\n\t\t\tv-on:discounted-price=\"updateDiscountedPrice\"\n\t\t\tv-on:quantity=\"updateQuantity\"\n\t\t/>\n\t</div>\n</template>\n\n<script lang=\"ts\">\nimport { roundPrice } from \"./../functions/prices\";\nimport BulkPriceTable from \"./BulkPriceTable.vue\";\nimport PriceStructureComponent from \"./PriceStructureComponent.vue\";\nimport { mapGetters, mapMutations } from \"vuex\";\nimport mapValues from \"lodash/mapValues\";\nimport FormattedPrice from \"./FormattedPrice.vue\";\nimport { PriceCalculator } from \"@/Models/PriceCalculator\";\nimport {formatForInputField, formatToLocaleString} from \"../functions/numbers\";\nimport ShareButton from \"@/components/ShareButton.vue\";\nimport ShareModal from \"@/components/ShareModal.vue\";\nimport StoreButton from \"@/components/StoreButton.vue\";\nimport StoreModal from \"@/components/StoreModal.vue\";\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport ChevronRightIcon from \"./icons/ChevronRightIcon.vue\";\n\nexport default {\n\tprops: {\n\t\tisShapeComplete: Boolean,\n\t\tavailability: String,\n\t\tshape: String,\n\t\tedgeFinish: String,\n\t\tprimitives: Object,\n\t\tsettings: Object,\n\t\tcurrency: String,\n\t\tlocale: String,\n\t\tdxfDefinition: Object,\n\t},\n\tdata: function() {\n\t\treturn {\n\t\t\tdiscountedPriceExVat: null,\n\t\t\tshowPriceStructure: false,\n\t\t\tpriceStructureToggleUsed: false,\n\t\t\tquantity: 1,\n\t\t};\n\t},\n\tcomputed: {\n\t\tshowMinimumFee() {\n\t\t\treturn this.minimumPrice !== 0 &&\n\t\t\t\tthis.pricesExVat.totalWithoutMinimum !== 0 &&\n\t\t\t\tthis.minimumPrice > this.pricesExVat.totalWithoutMinimum;\n\t\t},\n\t\tminimumPrice: function() {\n\t\t\treturn Math.max(\n\t\t\t\tthis.settings.minimumPrice,\n\t\t\t\tthis.getPricingGroup.get_minimum_selling_price( this.shape )\n\t\t\t);\n\t\t},\n\t\tcalculator: function() {\n\t\t\treturn new PriceCalculator(\n\t\t\t\tthis.settings.pricePerM2ExcludingTax,\n\t\t\t\tthis.minimumPrice,\n\t\t\t\tthis.getPricingGroup.get_sawing_selling_price_per_m( this.activeEdgeFinish, this.shape )\n\t\t\t);\n\t\t},\n\t\ti18n: function() { return this.$i18n; },\n\t\tkpsSettings: function() { return this.$kpsSettings; },\n\t\tshowPrices: function() {\n\t\t\tif ( this.shape === '' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.isRetrievingProperties || this.isShapeComplete || this.isRetrievingBulkPricing;\n\t\t},\n\t\tshowComplexStructure() {\n\t\t\treturn this.quantity > 1;\n\t\t},\n\t\tshowBulkPrice() {\n\t\t\tconst FIRST_BULK_THRESHOLD = 50;\n\n\t\t\treturn (\n\t\t\t\tthis.originalPriceExVat !== this.discountedPriceExVat && ! this.isRetrievingBulkPricing\n\t\t\t) || (\n\t\t\t\tthis.originalPriceExVat !== this.discountedPriceExVat && this.isRetrievingBulkPricing && this.quantity >= FIRST_BULK_THRESHOLD\n\t\t\t);\n\t\t},\n\t\tshouldShowSpinner() {\n\t\t\treturn ( this.usePriceFromServer && this.isRetrievingProperties ) || this.isRetrievingBulkPricing;\n\t\t},\n\t\ttranslatedShapeName: function() {\n\t\t\treturn this.i18n.shapeNames[ this.shape ] ?? '';\n\t\t},\n\t\tpriceExVat: function() {\n\t\t\treturn null === this.discountedPriceExVat ? this.originalPriceExVat : this.discountedPriceExVat;\n\t\t},\n\t\toriginalPriceExVat: function() {\n\t\t\tif ( ! this.isShapeComplete ) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tif ( this.usePriceFromServer ) {\n\t\t\t\treturn this.dxfDefinition?.price ?? 0;\n\t\t\t}\n\n\t\t\treturn this.calculator.calculate( this.shapeObject );\n\t\t},\n\t\tshapeFee() {\n\t\t\treturn this.shape === 'rectangle' ? 0 : this.getPricingGroup.get_selling_starting_price();\n\t\t},\n\t\tpricesExVatBase: function() {\n\t\t\tif ( ! this.isShapeComplete ) {\n\t\t\t\treturn {\n\t\t\t\t\tmaterial: 0,\n\t\t\t\t\tsawing: 0,\n\t\t\t\t\tfee: 0,\n\t\t\t\t\tminimumPrice: this.minimumPrice,\n\t\t\t\t\ttotalWithoutMinimum: 0\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ( this.usePriceFromServer ) {\n\t\t\t\tconst { material, sawing } = this.dxfDefinition?.prices ?? { material: 0, sawing: 0 };\n\t\t\t\treturn {\n\t\t\t\t\tmaterial,\n\t\t\t\t\tsawing,\n\t\t\t\t\tfee: this.shapeFee,\n\t\t\t\t\tminimumPrice: this.minimumPrice,\n\t\t\t\t\ttotalWithoutMinimum: material + sawing,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst material = this.calculator.calculate_material_price( this.shapeObject );\n\t\t\tconst sawing   = this.calculator.calculate_sawing_price( this.shapeObject );\n\n\t\t\treturn {\n\t\t\t\tmaterial: material,\n\t\t\t\tsawing: sawing,\n\t\t\t\tfee: this.shapeFee,\n\t\t\t\tminimumPrice: this.minimumPrice,\n\t\t\t\ttotalWithoutMinimum: material + sawing,\n\t\t\t};\n\t\t},\n\t\tpricesExVat() {\n\t\t\tconst prices = Object.assign({}, this.pricesExVatBase);\n\n\t\t\tprices.unitPrice = Math.max( prices.minimumPrice, prices.totalWithoutMinimum );\n\t\t\tprices.bulkUnitPrice = this.discountedPriceExVat;\n\n\t\t\tprices.minimumPriceFee = 0;\n\t\t\tif ( prices.totalWithoutMinimum < prices.minimumPrice ) {\n\t\t\t\tprices.minimumPriceFee = prices.minimumPrice - prices.totalWithoutMinimum;\n\t\t\t}\n\n\t\t\tprices.bulkDiscount = 0;\n\t\t\tif ( prices.bulkUnitPrice !== null && prices.bulkUnitPrice < prices.unitPrice ) {\n\t\t\t\tprices.bulkDiscount = prices.unitPrice - prices.bulkUnitPrice;\n\t\t\t}\n\n\t\t\treturn prices;\n\t\t},\n\t\tpricesIncVat() {\n\t\t\treturn mapValues( this.pricesExVat, ( price ) => {\n\t\t\t\treturn price * this.settings.vatRate;\n\t\t\t} );\n\t\t},\n\t\tpriceIncVat() {\n\n\t\t\t// This calculation is only necessary because of the minimum price.\n\t\t\t// In wooCommerce there is a correction of rounding in the vat calculation to fix an issue in Correct. We need to reproduce this here.\n\t\t\treturn roundPrice( roundPrice(this.priceExVat) * this.settings.vatRate );\n\t\t},\n\t\ttotalPriceExVat() {\n\t\t\tconst price = roundPrice( this.priceExVat ) * this.quantity + this.shapeFee;\n\t\t\tthis.updatePriceExcVat( price );\n\t\t\treturn price;\n\t\t},\n\t\ttotalPriceIncVat() {\n\t\t\tconst vat = roundPrice( this.priceExVat * this.quantity ) * ( this.settings.vatRate - 1 );\n\t\t\tconst exVat = this.priceExVat * this.quantity;\n\t\t\tconst price = roundPrice( exVat + vat ) + ( this.shapeFee * this.settings.vatRate );\n\t\t\tthis.updatePriceIncVat( price );\n\t\t\treturn price;\n\t\t},\n\t\t...mapGetters( [\n\t\t\t'usePriceFromServer',\n\t\t\t'isRetrievingProperties',\n\t\t\t'isRetrievingBulkPricing',\n\t\t\t'activeEdgeFinish',\n\t\t\t'getPricingGroup',\n\t\t\t'shapeObject'\n\t\t] ),\n\t},\n\tmethods: {\n\t\tformatForInputField,\n\t\tformatToLocaleString,\n\t\tupdateDiscountedPrice( discountedPrice ) {\n\t\t\tif ( 0 === discountedPrice ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.discountedPriceExVat = discountedPrice;\n\t\t},\n\t\tupdateQuantity( quantity ) {\n\t\t\tthis.quantity = quantity;\n\t\t},\n\t\taddDataLayerEvent() {\n\t\t\tif ( ! this.priceStructureToggleUsed ) {\n\t\t\t\twindow.dataLayer.push( {\n\t\t\t\t\tevent: 'price_structure_toggle',\n\t\t\t\t\teventCategory: 'Price structure toggle',\n\t\t\t\t\teventAction: document.title,\n\t\t\t\t} );\n\n\t\t\t\tthis.priceStructureToggleUsed = true;\n\t\t\t}\n\t\t},\n\t\t...mapMutations( [\n\t\t\t'updatePriceExcVat',\n\t\t\t'updatePriceIncVat',\n\t\t] ),\n\t},\n\tcomponents: {\n\t\tFormattedPrice,\n\t\tBulkPriceTable,\n\t\tPriceStructureComponent,\n\t\tShareModal,\n\t\tShareButton,\n\t\tStoreModal,\n\t\tStoreButton,\n\t\tMeasurementsHeightTransition,\n\t\tChevronRightIcon,\n\t},\n};\n</script>\n","export function roundPrice( price ): number {\n\treturn Math.round( price * 100 ) / 100;\n}\n","<template>\n\t<Teleport to=\"#kps_bulk_price_table_container\" append=\"true\">\n\t\t<table id=\"kps_bulk_price_table\" v-if=\"shouldShowTable && bulkPrices.length > 0\">\n\t\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<td class=\"unit-quantity\">{{ i18n.quantity }}</td>\n\t\t\t\t<td class=\"unit-price\">{{ i18n.unitPrice }}</td>\n\t\t\t\t<td class=\"unit-quantity\">{{ i18n.quantity }}</td>\n\t\t\t\t<td class=\"unit-price\">{{ i18n.unitPrice }}</td>\n\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody id=\"kps_bulk_price_table_body\">\n\t\t\t\t<tr v-for=\"(row, i) in leftColumn\" :key=\"row.quantity\">\n\t\t\t\t\t<td>{{ leftColumn[ i ].quantity }}</td>\n\t\t\t\t\t<td><FormattedPrice :price=\"leftColumn[ i ].price\" /></td>\n\t\t\t\t\t<td>{{ ( rightColumn[ i ] || {} ).quantity }}</td>\n\t\t\t\t\t<td><FormattedPrice :price=\"( rightColumn[ i ] || {} ).price\" /></td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t</Teleport>\n</template>\n\n<script>\nimport mapValues from \"lodash/mapValues\";\nimport memoize from \"lodash/memoize\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport { getMeasurementsCacheKey } from \"@/functions/cache\";\nimport { mapGetters, mapMutations } from \"vuex\";\nimport FormattedPrice from \"@/components/FormattedPrice\";\n\nexport default {\n\tcomponents: { FormattedPrice },\n\tprops: {\n\t\tprice: Number,\n\t\tshape: String,\n\t\tprimitives: Object,\n\t\tproductId: String,\n\t},\n\temits: ['discounted-price', 'quantity'],\n\tdata: function() {\n\t\treturn {\n\t\t\ti18n: this.$i18n,\n\t\t\tkpsSettings: this.$kpsSettings,\n\t\t\trequestCount: 0,\n\t\t\tbulkPrices: [],\n\t\t\tlastRequest: '',\n\t\t\tquantity: 1,\n\t\t};\n\t},\n\tcreated() {\n\t\tthis.retrieveBulkItems = memoize( this.retrieveBulkItems, this.getCacheKey );\n\t},\n\tmounted() {\n\t\tjQuery( () => {\n\t\t\tconst $quantityInput = jQuery( 'div.quantity input.input-text.qty' );\n\t\t\tif($quantityInput.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst self = this; //eslint-disable-line @typescript-eslint/no-this-alias\n\n\t\t\tself.quantity = parseInt( $quantityInput.val(), 10 );\n\t\t\t$quantityInput.on( 'change', () => {\n\t\t\t\tself.quantity = parseInt( $quantityInput.val(), 10 );\n\t\t\t} );\n\t\t} );\n\t},\n\tcomputed: {\n\t\t...mapGetters( [\n\t\t\t'activeEdgeFinish',\n\t\t] ),\n\t\tshouldShowTable() {\n\t\t\tconst minimumPrice = parseFloat( this.kpsSettings.settings.minimumPrice );\n\n\t\t\treturn 0 !== minimumPrice && this.price === minimumPrice;\n\t\t},\n\t\thasTwoColumns() {\n\t\t\treturn this.bulkPrices.length > 5;\n\t\t},\n\t\thalfPoint() {\n\t\t\treturn Math.ceil( this.bulkPrices.length / 2 );\n\t\t},\n\t\tleftColumn() {\n\t\t\treturn this.hasTwoColumns ? this.bulkPrices.slice( 0, this.halfPoint ): this.bulkPrices;\n\t\t},\n\t\trightColumn() {\n\t\t\treturn this.hasTwoColumns ? this.bulkPrices.slice( this.halfPoint ) : [];\n\t\t},\n\t\trows() {\n\n\t\t\t// Create 2 columns when there are more than 5 items\n\t\t\tif ( this.bulkPrices.length <= 5 ) {\n\t\t\t\treturn this.bulkPrices;\n\t\t\t}\n\t\t\treturn [];\n\t\t},\n\t\tdiscountedPrice() {\n\t\t\tif ( ! this.shouldShowTable ) {\n\t\t\t\treturn this.price;\n\t\t\t}\n\n\t\t\t// If the quantity doesn't meet the first discount, bail.\n\t\t\tif ( this.bulkPrices.length === 0 || this.quantity < this.bulkPrices[ 0 ] ) {\n\t\t\t\treturn this.price;\n\t\t\t}\n\n\t\t\t// Try to match the last one\n\t\t\tif ( this.quantity >= this.bulkPrices[ this.bulkPrices.length - 1 ].quantity ) {\n\t\t\t\treturn this.bulkPrices[ this.bulkPrices.length - 1 ].price;\n\t\t\t}\n\n\t\t\t// Match everything except the last one\n\t\t\tfor ( let i = 0; i < this.bulkPrices.length - 1; i++ ) {\n\t\t\t\tif (\n\t\t\t\t\tthis.quantity >= this.bulkPrices[ i ].quantity &&\n\t\t\t\t\tthis.quantity < this.bulkPrices[ i + 1 ].quantity\n\t\t\t\t) {\n\t\t\t\t\treturn this.bulkPrices[ i ].price;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.price;\n\t\t}\n\t},\n\tmethods: {\n\t\tasync refreshTable( shape, primitives ) {\n\n\t\t\t// Immediately emit the discounted price, because we know there is no bulk discount.\n\t\t\tif ( ! this.shouldShowTable ) {\n\t\t\t\tthis.$emit( 'discounted-price', this.discountedPrice );\n\t\t\t\tthis.$emit( 'quantity', this.quantity );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst thisRequest = this.getCacheKey( shape, primitives, this.activeEdgeFinish );\n\t\t\tthis.lastRequest = thisRequest;\n\n\t\t\tconst response = await this.retrieveBulkItems( shape, primitives, this.activeEdgeFinish );\n\n\t\t\t// When multiple AJAX requests are dispatched, we need to make sure we only\n\t\t\t// update the prices with the last one.\n\t\t\tif ( this.lastRequest === thisRequest ) {\n\t\t\t\tthis.bulkPrices = response.prices || [];\n\t\t\t\tthis.$emit( 'discounted-price', this.discountedPrice );\n\t\t\t\tthis.$emit( 'quantity', this.quantity );\n\t\t\t}\n\t\t},\n\t\tasync retrieveBulkItems( shape, primitives, edgeFinish ) {\n\t\t\tthis.requestCount++;\n\n\t\t\tprimitives = mapValues( primitives, ( dimensionValue, dimensionName ) => {\n\t\t\t\tif ( 'number_of_points' === dimensionName ) {\n\t\t\t\t\treturn dimensionValue;\n\t\t\t\t}\n\n\t\t\t\treturn Length.from_cm( dimensionValue ).in_mm();\n\t\t\t} );\n\n\t\t\tconst params = Object.keys( primitives ).map( ( dimension ) => {\n\t\t\t\treturn `measurements[${ dimension }]=${ primitives[ dimension ] }`;\n\t\t\t} );\n\t\t\tparams.push( `measurements[shape]=${ shape }` );\n\t\t\tparams.push( `sawing_method=${edgeFinish}` );\n\t\t\tparams.push( `product=${ this.kpsSettings.product_id }` );\n\t\t\tparams.push( `request_id=${ this.requestCount }` );\n\n\t\t\tconst requestUrl = `${ this.kpsSettings.restUrl }kps/v1/bulkprice?` + params.join( '&' );\n\n\t\t\tthis.updateIsRetrievingBulkPricing( true );\n\n\t\t\t// This turns the jQuery deferred into an ES6 Promise.\n\t\t\tconst results = await Promise.resolve( jQuery.get( requestUrl ) );\n\n\t\t\tthis.updateIsRetrievingBulkPricing( false );\n\n\t\t\treturn results;\n\t\t},\n\t\tgetCacheKey( shape, primitives) {\n\t\t\treturn getMeasurementsCacheKey( { shape, primitives, edgeFinish: this.activeEdgeFinish } );\n\t\t},\n\t\t...mapMutations( [\n\t\t\t'updateIsRetrievingBulkPricing',\n\t\t] )\n\t},\n\twatch: {\n\t\tactiveEdgeFinish( oldShape, newShape ) {\n\t\t\tif ( oldShape !== newShape ) {\n\t\t\t\tthis.refreshTable( this.shape, this.primitives );\n\t\t\t}\n\t\t},\n\t\tshape( oldShape, newShape ) {\n\t\t\tif ( oldShape !== newShape ) {\n\t\t\t\tthis.refreshTable( this.shape, this.primitives );\n\t\t\t}\n\t\t},\n\t\tprimitives( oldDimensions, newDimensions ) {\n\t\t\tif ( oldDimensions !== newDimensions ) {\n\t\t\t\tthis.refreshTable( this.shape, this.primitives );\n\t\t\t}\n\t\t},\n\t\tprice( oldPrice, newPrice ) {\n\t\t\tif ( oldPrice !== newPrice ) {\n\t\t\t\tthis.refreshTable( this.shape, this.primitives );\n\t\t\t}\n\t\t},\n\t\tquantity( newQuantity, oldQuantity ) {\n\t\t\tif ( newQuantity !== oldQuantity ) {\n\t\t\t\tthis.refreshTable( this.shape, this.primitives );\n\t\t\t}\n\t\t}\n\t}\n};\n</script>\n","export function getMeasurementsCacheKey( obj: { shape: string; primitives: object; edgeFinish: string }, dxfExport = '' ): string {\n\tconst primitivesIdentifier = Object.keys( obj.primitives ).map( ( dimension ) => {\n\t\treturn `${dimension}-${obj.primitives[ dimension ]}`;\n\t} ).join( ',' );\n\n\treturn `${obj.shape}:${primitivesIdentifier}:${dxfExport}:${obj.edgeFinish}`;\n}\n","<template>\n\t<span>{{ renderedPrice }}</span>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\tprice: Number,\n\t},\n\tcomputed: {\n\t\ti18n() { return this.$i18n; },\n\t\tsettings() { return this.$kpsSettings; },\n\t\tcanFormat() {\n\t\t\treturn !! this.price && ! isNaN( this.price );\n\t\t},\n\t\trenderedPrice() {\n\t\t\tif ( ! this.canFormat ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst numberFormatter = new Intl.NumberFormat( this.settings.shop.locale.replace( '_', '-' ), {\n\t\t\t\tstyle: 'currency',\n\t\t\t\tcurrency: this.settings.shop.currency,\n\t\t\t} );\n\n\t\t\treturn numberFormatter.format( this.price );\n\t\t}\n\t},\n};\n</script>\n","import { render } from \"./FormattedPrice.vue?vue&type=template&id=0da32e2e\"\nimport script from \"./FormattedPrice.vue?vue&type=script&lang=js\"\nexport * from \"./FormattedPrice.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./BulkPriceTable.vue?vue&type=template&id=506c4eee\"\nimport script from \"./BulkPriceTable.vue?vue&type=script&lang=js\"\nexport * from \"./BulkPriceTable.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<td>\n\t\t<template v-if=\"showSpinner\">\n\t\t\t<i class=\"icon icon-spinner2\"></i>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<template v-if=\"isFree\">\n\t\t\t\t<strong>{{ i18n.meta.free }}</strong>\n\t\t\t</template>\n\t\t\t<span v-else>\n\t\t\t\t<strong><FormattedPrice :price=\"price\" /></strong>\n\t\t\t\t{{ isEx ? i18n.meta.excl : i18n.meta.incl }}\n\t\t\t</span>\n\t\t</template>\n\t</td>\n</template>\n\n<script>\nimport FormattedPrice from \"@/components/FormattedPrice\";\nexport default {\n\tcomponents: { FormattedPrice },\n\tprops: {\n\t\tprice: Number,\n\t\tisEx: Boolean,\n\t\tshowSpinner: Boolean,\n\t},\n\tcomputed: {\n\t\ti18n() {\n\t\t\treturn this.$i18n;\n\t\t},\n\t\tsettings() {\n\t\t\treturn this.$kpsSettings;\n\t\t},\n\t\tisFree() {\n\t\t\treturn this.price === 0;\n\t\t},\n\t}\n};\n</script>\n","import { render } from \"./PriceStructureComponent.vue?vue&type=template&id=40bb9746\"\nimport script from \"./PriceStructureComponent.vue?vue&type=script&lang=js\"\nexport * from \"./PriceStructureComponent.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import AbstractShape from '../../../source/js/shared/models/Geometry/AbstractShape';\n\nexport class PriceCalculator {\n\tprivate price_per_square_meter: number;\n\tprivate minimum_price: number;\n\tprivate circumference_price_per_meter: number;\n\n\tconstructor( price_per_square_meter: number, minimum_price: number, circumference_price_per_meter: number ) {\n\t\tthis.price_per_square_meter = price_per_square_meter;\n\t\tthis.minimum_price = minimum_price;\n\t\tthis.circumference_price_per_meter = circumference_price_per_meter;\n\t}\n\n\tcalculate_material_price( shape: AbstractShape ): number {\n\t\tconst required_material = shape.get_required_material();\n\t\tconst price = this.price_per_square_meter * required_material.get_area().in_m2();\n\t\treturn price;\n\t}\n\n\tcalculate_sawing_price( shape: AbstractShape ): number {\n\t\treturn this.circumference_price_per_meter * shape.get_circumference().in_m();\n\t}\n\n\tcalculate( shape: AbstractShape ): number {\n\t\tlet price = this.calculate_material_price( shape );\n\t\tprice += this.calculate_sawing_price( shape );\n\n\t\tif ( price < this.minimum_price ) {\n\t\t\tprice = this.minimum_price;\n\t\t}\n\n\t\treturn price;\n\t}\n}\n","<template>\n\t<button\n\t\tclass=\"btn btn--extra-small btn--clean-link\"\n\t\ttype=\"button\"\n\t\t:aria-label=\"i18n.share\"\n\t\tref=\"shareLink\"\n\t\tdata-module=\"modal\"\n\t\tdata-config='{\"modalID\": \"modal-share\" }'\n\t\tv-on:click=\"openPopup\"\n\t>\n\t\t<span class=\"btn__icon\">\n\t\t\t<ShareIcon class=\"icon-inline icon-inline--expanded svg-icon-share\" aria-hidden=\"true\" />\n\t\t</span>\n\t\t<span class=\"btn__text\">{{ i18n.shareConfiguration }}</span>\n\t</button>\n</template>\n\n<script>\nimport ShareIcon from \"./icons/ShareIcon\";\nimport {MrModal} from \"@level-level/recyclops\";\n\nexport default {\n\tcomponents: {\n\t\tShareIcon\n\t},\n\tcomputed: {\n\t\ti18n: function() { return this.$i18n; },\n\t},\n\tmethods: {\n\t\topenPopup: function() {\n\t\t\tconst button = this.$refs.shareLink;\n\n\t\t\tnew MrModal( button, {} );\n\n\t\t\tbutton.addEventListener( 'openMrModal', () => {} );\n\t\t\tbutton.addEventListener( 'closeMrModal', () => {} );\n\t\t}\n\t}\n};\n</script>\n","<template>\n\t<svg\n\t\twidth=\"32\"\n\t\theight=\"32\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\">\n\t\t\t<path fill=\"#00ABEF\" d=\"m17.296 8.44-.117.082c-.368.293-.529.75-.529 1.3l-.001 1.416.18-.019a10.06 10.06 0 0 0-3.834 1.107 10.484 10.484 0 0 0-3.06 2.37A10.823 10.823 0 0 0 7.94 18.04a10.492 10.492 0 0 0-.689 3.975l.053 2.673 1.345-2.31a8.916 8.916 0 0 1 2.907-3.046 8.637 8.637 0 0 1 4.008-1.363l.323-.014c.211-.007.414-.007.608-.002l.153.006.001 1.883c0 .603.193 1.093.637 1.383.493.324 1.056.244 1.549-.123l7.33-5.157c.375-.275.584-.658.584-1.1 0-.211-.05-.415-.148-.602a1.292 1.292 0 0 0-.335-.423l-.013-.016-.09-.073-7.316-5.135c-.49-.38-1.052-.475-1.552-.157Zm.853 1.496 6.983 4.902-6.983 4.913.001-3.136-.65-.088a10.856 10.856 0 0 0-2.042-.054c-1.732.15-3.3.684-4.716 1.6l-.32.215c-.422.294-.817.614-1.184.959l-.168.162.027-.099c.07-.248.153-.493.246-.737a9.325 9.325 0 0 1 1.717-2.885 8.985 8.985 0 0 1 2.626-2.031 8.552 8.552 0 0 1 3.258-.942l.395-.021h.811l-.001-2.758Z\" />\n\t</svg>\n</template>\n\n<script>\nexport default {};\n</script>\n","import { render } from \"./ShareIcon.vue?vue&type=template&id=7f790fe6\"\nimport script from \"./ShareIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ShareIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./ShareButton.vue?vue&type=template&id=45ebb491\"\nimport script from \"./ShareButton.vue?vue&type=script&lang=js\"\nexport * from \"./ShareButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<div class=\"measurements-selector__modal\" id=\"modal-share\" aria-hidden=\"true\" role=\"dialog\">\n\t\t<div class=\"measurements-selector__modal-overlay\"></div>\n\t\t<div class=\"measurements-selector__modal-window\" role=\"document\">\n\t\t\t<div class=\"measurements-selector__modal-header\">\n\t\t\t\t<h2 class=\"measurements-selector__modal-title\">{{ i18n.shareConfiguration }}</h2>\n\t\t\t\t<a class=\"measurements-selector__modal-close btn btn--secondary btn--highlight-icon btn--js-modal-close\" :aria-label=\"i18n.closeModal\">\n\t\t\t\t\t<span class=\"btn__icon\">\n\t\t\t\t\t\t<span class=\"icon icon-close\"></span>\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<div class=\"measurements-selector__modal-body\">\n\t\t\t\t<div class=\"measurements-selector__share-generate\" v-if=\"!hasShortLink || hasAlteredConfiguration\">\n\t\t\t\t\t<span v-if=\"isGeneratingLink\">\n\t\t\t\t\t\t<i class=\"icon icon-spinner2\"></i> {{ i18n.generatingLink }}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\tclass=\"btn btn--secondary btn--small\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tv-on:click=\"generateShareableLink()\"\n\t\t\t\t\t\t:aria-label=\"i18n.generateLink\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"btn__text\">\n\t\t\t\t\t\t\t{{ i18n.generateLink }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"measurements-selector__share-link\" v-if=\"hasShortLink && ! hasAlteredConfiguration\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t\tclass=\"measurements-selector__share-link-text\"\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tname=\"shareableLink\"\n\t\t\t\t\t\t\t:value=\"shortLink\"\n\t\t\t\t\t\t\tref=\"shareableUrl\"\n\t\t\t\t\t\t\treadonly\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"btn btn--secondary btn--copy btn--small\"\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tv-on:click=\"copyShareableLink()\"\n\t\t\t\t\t\t\t:aria-label=\"i18n.copyLink\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"btn__text\">\n\t\t\t\t\t\t\t{{ i18n.copyLink }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"measurements-selector__share-apps\" v-if=\"hasShortLink && ! hasAlteredConfiguration\">\n\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"btn btn--secondary btn--highlight-icon btn--share btn--share-whatsapp btn--small\"\n\t\t\t\t\t\t\t:href=\"whatsappUrl\"\n\t\t\t\t\t\t\t:aria-label=\"i18n.shareWhatsApp\"\n\t\t\t\t\t\t\tdata-action=\"share/whatsapp/share\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"btn__icon\">\n\t\t\t\t\t\t\t<WhatsApp class=\"icon-inline icon-inline--expanded svg-icon-whatsapp\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"btn__text\">\n\t\t\t\t\t\t\t{{ i18n.shareWhatsApp }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</a>\n\n\t\t\t\t\t<a\n\t\t\t\t\t\t\tclass=\"btn btn--secondary btn--highlight-icon btn--share btn--small\"\n\t\t\t\t\t\t\t:href=\"emailUrl\"\n\t\t\t\t\t\t\t:aria-label=\"i18n.shareMail\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"btn__icon\">\n\t\t\t\t\t\t\t<EmailIcon class=\"icon-inline icon-inline--expanded svg-icon-email\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"btn__text\">\n\t\t\t\t\t\t\t{{ i18n.shareMail }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n</template>\n\n<script>\nimport EmailIcon from \"@/components/icons/EmailIcon\";\nimport WhatsApp from \"@/components/icons/WhatsApp\";\nimport {mapGetters, mapActions} from \"vuex\";\nimport { sprintf } from 'sprintf-js';\n\nexport default {\n\tcomponents: {\n\t\tEmailIcon,\n\t\tWhatsApp,\n\t},\n\tcomputed: {\n\t\ti18n: function() { return this.$i18n; },\n\t\twhatsappUrl: function() { return `whatsapp://send?text=${ sprintf( this.i18n.viewMyConfiguration, window.measurementSelectorVariables.shop.name)} ${this.shortLink}`;},\n\t\temailUrl: function() {\n\t\t\treturn sprintf(\n\t\t\t\t`mailto:?subject=%s&body=%s`,\n\t\t\t\tencodeURIComponent( sprintf( this.i18n.viewMyConfiguration, window.measurementSelectorVariables.shop.name ) ),\n\t\t\t\tencodeURIComponent( `${this.shortLink}` )\n\t\t\t);\n\t\t},\n\t\thasShortLink: function() {\n\t\t\treturn this.shortLink !== '' && this.shortLink !== undefined;\n\t\t},\n\t\t...mapGetters( [\n\t\t\t'isGeneratingLink',\n\t\t\t'shortLink',\n\t\t\t'hasAlteredConfiguration',\n\t\t]),\n\t\t...mapActions( [\n\t\t\t'createShareableLink',\n\t\t] ),\n\t},\n\tmethods: {\n\t\tcopyShareableLink: function() {\n\t\t\tconst url = this.$refs.shareableUrl;\n\n\t\t\turl.select();\n\n\t\t\tdocument.execCommand( 'copy' );\n\t\t},\n\t\tgenerateShareableLink: function() {\n\t\t\tthis.$store.dispatch( 'createShareableLink' );\n\t\t}\n\t},\n};\n</script>\n","<template>\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 43 32\"><path d=\"M42.667 10.958V28c0 2.208-1.792 4-4 4H4c-2.208 0-4-1.792-4-4V10.967c0-.417.475-.65.808-.392 1.867 1.45 4.342 3.292 12.842 9.467 1.758 1.283 4.725 3.983 7.683 3.967 2.975.025 6-2.733 7.692-3.967 8.5-6.175 10.967-8.025 12.833-9.475a.501.501 0 0 1 .808.392zM38.667 0c2.208 0 4 1.792 4 4v1.583c0 .617-.283 1.2-.767 1.575l-.934.733-.138.108c-1.96 1.533-3.978 3.062-13.378 9.884-1.4 1.017-4.183 3.483-6.117 3.45-1.933.033-4.717-2.433-6.117-3.45C5.927 11.142 3.847 9.564 1.908 8.051l-.138-.108-1.003-.785A2.007 2.007 0 0 1 0 5.583V4c0-2.208 1.792-4 4-4z\"/></svg>\n</template>\n\n<script>\nexport default {};\n</script>\n","import { render } from \"./EmailIcon.vue?vue&type=template&id=eafe09ea\"\nimport script from \"./EmailIcon.vue?vue&type=script&lang=js\"\nexport * from \"./EmailIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><path d=\"M15.993 0c4.236 0 8.221 1.65 11.214 4.65S32 11.629 32 15.864c0 8.655-7.127 15.715-15.746 15.855l-.269.002a15.82 15.82 0 0 1-7.506-1.889l-.072-.039L0 32l2.25-8.214a15.872 15.872 0 0 1-2.114-7.929C.136 7.114 7.25 0 15.993 0zM16 2.679c-7.271 0-13.186 5.914-13.186 13.179 0 2.468.679 4.866 1.975 6.951l.039.063.314.5-1.329 4.864 4.986-1.307.479.286a13.156 13.156 0 0 0 6.714 1.836c7.264 0 13.329-5.914 13.329-13.186.007-3.521-1.521-6.829-4.007-9.321S19.521 2.68 16 2.68zm-5.497 5.864a10.291 10.291 0 0 1 .687.016h.055c.226 0 .503.024.776.677.122.293.307.745.497 1.208l.031.075.015.038.046.113c.293.713.575 1.395.632 1.509.1.2.164.429.036.693-.757 1.514-1.571 1.464-1.164 2.164 1.536 2.636 3.064 3.55 5.393 4.714.393.2.629.164.857-.1.236-.271.993-1.157 1.257-1.557s.529-.336.893-.2c.172.061.698.306 1.247.57l.077.037a88.95 88.95 0 0 1 1.383.679c.393.193.657.293.75.471.1.164.1.957-.229 1.886s-1.907 1.771-2.671 1.886c-1.257.186-2.243.093-4.757-.993-3.979-1.721-6.571-5.721-6.771-5.986-.193-.264-1.614-2.15-1.614-4.1S8.95 9.436 9.315 9.036a1.467 1.467 0 0 1 1.057-.493z\"/></svg>\n</template>\n\n<script>\nexport default {};\n</script>\n","import { render } from \"./WhatsApp.vue?vue&type=template&id=24eeab00\"\nimport script from \"./WhatsApp.vue?vue&type=script&lang=js\"\nexport * from \"./WhatsApp.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./ShareModal.vue?vue&type=template&id=f773a758\"\nimport script from \"./ShareModal.vue?vue&type=script&lang=js\"\nexport * from \"./ShareModal.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<button\n\t\tv-if=\"isLoggedIn\"\n\t\tclass=\"btn btn--extra-small btn--clean-link\"\n\t\ttype=\"button\"\n\t\t:aria-label=\"i18n.storeConfiguration\"\n\t\tref=\"storeLink\"\n\t\tdata-module=\"modal\"\n\t\t:data-config=\"getModalID()\"\n\t\tv-on:click=\"openPopup\"\n\t>\n\t\t<span class=\"btn__icon\">\n\t\t\t<DownloadIcon class=\"icon-inline icon-inline--expanded svg-icon-share\" aria-hidden=\"true\" />\n\t\t</span>\n\t\t<span class=\"btn__text\">{{ i18n.storeConfiguration }}</span>\n\t</button>\n</template>\n\n<script>\nimport DownloadIcon from \"./icons/DownloadIcon\";\nimport {MrModal} from \"@level-level/recyclops\";\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tisLoggedIn: window.measurementSelectorVariables.loggedInUser,\n\t\t};\n\t},\n\twatch: {\n\t\t'window.measurementSelectorVariables.loggedInUser': function(newVal) {\n\t\t\tthis.isLoggedIn = newVal;\n\t\t}\n\t},\n\tcomputed: {\n\t\ti18n: function() { return this.$i18n; },\n\t},\n\tmethods: {\n\t\topenPopup: function() {\n\t\t\tconst button = this.$refs.storeLink;\n\n\t\t\tnew MrModal( button, {} );\n\n\t\t\tbutton.addEventListener( 'openMrModal', () => {} );\n\t\t\tbutton.addEventListener( 'closeMrModal', () => {} );\n\t\t},\n\t\tgetModalID: function() {\n\t\t\tconst modalID = window.measurementSelectorVariables.loggedInUser !== '' ? '{\"modalID\": \"modal-store\" }' : '{\"modalID\": \"modal-favorite-login-cta\" }';\n\t\t\treturn modalID;\n\t\t}\n\t}\n};\n</script>\n","import { render } from \"./StoreButton.vue?vue&type=template&id=06736231\"\nimport script from \"./StoreButton.vue?vue&type=script&lang=js\"\nexport * from \"./StoreButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n    <div class=\"measurements-selector__modal\" id=\"modal-store\" aria-hidden=\"true\" role=\"dialog\">\n        <div class=\"measurements-selector__modal-overlay\"></div>\n        <div class=\"measurements-selector__modal-window\" role=\"document\">\n            <div class=\"measurements-selector__modal-header\">\n                <h2 class=\"measurements-selector__modal-title\">{{ i18n.storeConfiguration }}</h2>\n                <a class=\"measurements-selector__modal-close btn btn--secondary btn--highlight-icon btn--js-modal-close\" :aria-label=\"i18n.closeModal\">\n                    <span class=\"btn__icon\">\n                        <span class=\"icon icon-close\"></span>\n                    </span>\n                </a>\n            </div>\n            <div class=\"measurements-selector__modal-body\">\n                <div v-if=\"!hasShortLink || hasAlteredConfiguration\">\n                    <label for=\"measurements-selector-config-name\">\n                        {{ i18n.storeConfigurationName }}\n                    </label>\n                    <div class=\"measurements-selector__store\">\n                        <input\n                            id=\"measurements-selector-config-name\"\n                            class=\"measurements-selector__store-name\"\n                            type=\"text\"\n                            name=\"ConfigurationName\"\n                            ref=\"storeConfigName\"\n                            v-model=\"name\"\n                            required\n                        />\n                        <button\n                            class=\"btn btn--secondary btn--small\"\n                            type=\"button\"\n                            v-on:click=\"storeConfig()\"\n                            :aria-label=\"i18n.storeConfigurationButton\"\n                        >\n                            <span class=\"btn__text\">\n                                {{ i18n.storeConfigurationButton }}\n                            </span>\n                        </button>\n                    </div>\n                </div>\n                <validation-message\n                    v-if=\"invalidName\"\n                    input-id=\"measurements-selector-config-name\"\n                >\n                    {{ i18n.storeConfigurationNameRequired }}\n                </validation-message>\n                <div class=\"measurements-selector__share-link\" v-if=\"hasShortLink && !hasAlteredConfiguration\">\n                    {{ i18n.storeConfigurationSucces }}\n                </div>\n\t\t\t\t<div>\n\t\t\t\t\t<a :href=\"myAcccountConfigurations\">\n\t\t\t\t\t\t{{ i18n.storeConfigurationLink }}\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script>\nimport { mapGetters, mapActions, mapMutations } from \"vuex\";\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tname: '',\n\t\t\tmyAcccountConfigurations: window.measurementSelectorVariables.storedConfigurationsUrl,\n\t\t\tinvalidName: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\ti18n() { return this.$i18n; },\n\t\thasShortLink() {\n\t\t\treturn this.shortLink !== '' && this.shortLink !== undefined;\n\t\t},\n\t\t...mapGetters([\n\t\t\t'hasAlteredConfiguration',\n\t\t\t'measurementsConfig',\n\t\t\t'configurationName',\n\t\t\t'stringifiedConfig',\n\t\t\t'shortLink',\n\t\t]),\n\t},\n\tmethods: {\n\t\t...mapActions([\n\t\t\t'createConfigurationLink',\n\t\t]),\n\t\t...mapMutations([\n\t\t\t'updateConfigurationName',\n\t\t]),\n\t\tasync storeConfig() {\n\t\t\tif (this.name) {\n\t\t\t\tthis.invalidName = false;\n\t\t\t\tthis.$store.commit('updateConfigurationName', this.name);\n\t\t\t\tawait this.generateConfigurationLink();\n\t\t\t} else {\n\t\t\t\tthis.invalidName = true;\n\t\t\t\tthis.$refs.storeConfigName.focus();\n\t\t\t}\n\t\t},\n\t\tasync generateConfigurationLink() {\n\t\t\tawait this.$store.dispatch('createConfigurationLink');\n\t\t},\n\t},\n};\n</script>\n","import { render } from \"./StoreModal.vue?vue&type=template&id=73e7d57c\"\nimport script from \"./StoreModal.vue?vue&type=script&lang=js\"\nexport * from \"./StoreModal.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.542 20.849a.2.2 0 0 1-.29 0l-1.12-1.173a.2.2 0 0 1 0-.276l7.074-7.4-7.074-7.4a.2.2 0 0 1 0-.276l1.12-1.173a.2.2 0 0 1 .29 0l8.326 8.71a.2.2 0 0 1 0 .277l-8.326 8.71Z\" fill=\"#00ABEF\"/>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./ChevronRightIcon.vue?vue&type=template&id=234a5fd8\"\nimport script from \"./ChevronRightIcon.vue?vue&type=script&lang=js\"\nexport * from \"./ChevronRightIcon.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./MetaInformation.vue?vue&type=template&id=26189c3c&ts=true\"\nimport script from \"./MetaInformation.vue?vue&type=script&lang=ts\"\nexport * from \"./MetaInformation.vue?vue&type=script&lang=ts\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { useCssVars as _useCssVars, unref as _unref, defineComponent as _defineComponent } from 'vue'\nimport { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-4cf9f3dc\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"button-strip\" }\n\nimport {computed, ref, watch} from 'vue';\n\ninterface Props {\n\tbuttonsPerRow: number;\n\ttotalButtons: number;\n\tselectedItem?: number;\n}\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ButtonStrip',\n  props: {\n    buttonsPerRow: {},\n    totalButtons: {},\n    selectedItem: {}\n  },\n  setup(__props: any) {\n\n_useCssVars(_ctx => ({\n  \"3f80983e\": (_ctx.totalButtons),\n  \"54638e88\": (col.value)\n}))\n\nconst props = __props;\nconst activeItem = ref(0);\n\nconst col = computed(() => props.selectedItem % props.buttonsPerRow);\n\nwatch( props, ({ selectedItem } ) => {\n\tactiveItem.value = selectedItem;\n} );\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _renderSlot(_ctx.$slots, \"default\")\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {computed, ref, watch} from 'vue';\n\ninterface Props {\n\tbuttonsPerRow: number;\n\ttotalButtons: number;\n\tselectedItem?: number;\n}\n\nconst props = defineProps<Props>();\nconst activeItem = ref(0);\n\nconst col = computed(() => props.selectedItem % props.buttonsPerRow);\n\nwatch( props, ({ selectedItem } ) => {\n\tactiveItem.value = selectedItem;\n} );\n\n</script>\n\n<template>\n\t<div class=\"button-strip\">\n\t\t<slot></slot>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.button-strip {\n\t@include hide-scrollbars;\n\t--size: 80px;\n\tdisplay: grid;\n\tgrid-template-columns: repeat(v-bind('totalButtons'), var(--size));\n\theight: var(--size);\n\twidth: calc(100% + (var(--accordion-item-px) * 2));\n\tmargin-inline-start: calc(var(--accordion-item-px) * -1);\n\tpadding-inline: var(--accordion-item-px);\n\toverflow: auto;\n\toverscroll-behavior-x: contain;\n\tposition: relative;\n\n\t&:before {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: var(--accordion-item-px);\n\t\tz-index:-1;\n\t\twidth: var(--size);\n\t\theight: var(--size);\n\t\tbackground-color: $brand-blue-background;\n\t\ttransform: translateX(calc(v-bind('col') * 100%));\n\t\twill-change: transform;\n\t\ttransition: transform .2s ease-in-out;\n\t}\n\n\t:deep(.button) {\n\t\twidth: var(--size);\n\t\theight: var(--size);\n\t\tborder: 1px solid $border-color;\n\t\tborder-right-width: 0;\n\t\tborder-radius: 0;\n\t\tcolor: $brand-blue-dark;\n\n\t\t&:first-child {\n\t\t\tborder-top-left-radius: 3px;\n\t\t\tborder-bottom-left-radius: 3px;\n\t\t}\n\t\t&:last-child {\n\t\t\tborder-top-right-radius: 3px;\n\t\t\tborder-bottom-right-radius: 3px;\n\t\t\tborder-right-width: 1px;\n\t\t}\n\t\t@include hover-focus-style {\n\t\t\tborder-color: $border-color;\n\t\t}\n\t}\n\n\t:deep(.button--active) {\n\t\tborder: 1px solid $brand-blue-dark;\n\t\twidth: calc(var(--size) + 1px);\n\t\tposition: relative;\n\t\tz-index: 1;\n\t\t@include hover-focus-style {\n\t\t\tborder-color: $brand-blue-dark;\n\t\t}\n\t\t&:last-child {\n\t\t\twidth: var(--size);\n\t\t}\n\t}\n}\n</style>\n","import script from \"./ButtonStrip.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ButtonStrip.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ButtonStrip.vue?vue&type=style&index=0&id=4cf9f3dc&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-4cf9f3dc\"]])\n\nexport default __exports__","import {DrillHoleConfiguration} from \"@/Models/DrillHoleConfigurations/DrillHoleConfiguration\";\n\nexport default class RadialDrillHoleConfiguration implements DrillHoleConfiguration {\n\tget_input_keys(): string[] {\n\t\treturn [\n\t\t\t'drillHoleRadialAmount',\n\t\t\t'drillHoleDiameter',\n\t\t\t'drillHoleRadialDiameter',\n\t\t\t'drillHoleRadialOffsetX',\n\t\t\t'drillHoleRadialOffsetY',\n\t\t];\n\t}\n}\n","import {DrillHoleConfiguration} from \"@/Models/DrillHoleConfigurations/DrillHoleConfiguration\";\n\nexport default class GridDrillHoleConfiguration implements DrillHoleConfiguration {\n\tget_input_keys(): string[] {\n\t\treturn [\n\t\t\t'drillHoleDiameter',\n\t\t\t'drillHoleOffset',\n\t\t\t'drillHoleHorizontalAmount',\n\t\t\t'drillHoleVerticalAmount',\n\t\t];\n\t}\n}\n","import {DrillHoleConfiguration} from \"@/Models/DrillHoleConfigurations/DrillHoleConfiguration\";\n\nexport default class EdgeDrillHoleConfiguration implements DrillHoleConfiguration {\n\tget_input_keys(): string[] {\n\t\treturn [\n\t\t\t'drillHoleOffset',\n\t\t\t'drillHoleDiameter',\n\t\t];\n\t}\n}\n","import {DrillHoleConfiguration} from \"@/Models/DrillHoleConfigurations/DrillHoleConfiguration\";\n\nexport default class NullDrillHoleConfiguration implements DrillHoleConfiguration {\n\tget_input_keys(): string[] {\n\t\treturn [];\n\t}\n}\n","import {DrillHoleConfiguration} from \"@/Models/DrillHoleConfigurations/DrillHoleConfiguration\";\nimport RadialDrillHoleConfiguration from \"@/Models/DrillHoleConfigurations/RadialDrillHoleConfiguration\";\nimport GridDrillHoleConfiguration from \"@/Models/DrillHoleConfigurations/GridDrillHoleConfiguration\";\nimport EdgeDrillHoleConfiguration from \"@/Models/DrillHoleConfigurations/EdgeDrillHoleConfiguration\";\nimport NullDrillHoleConfiguration from \"@/Models/DrillHoleConfigurations/NullDrillHoleConfiguration\";\n\nexport default class DrillHoleConfigurationFactory {\n\tget_configuration( drillHoleType: string ): DrillHoleConfiguration {\n\t\tswitch( drillHoleType ) {\n\t\t\tcase 'radial':\n\t\t\t\treturn new RadialDrillHoleConfiguration();\n\t\t\tcase 'grid':\n\t\t\t\treturn new GridDrillHoleConfiguration();\n\t\t\tcase 'edge':\n\t\t\t\treturn new EdgeDrillHoleConfiguration();\n\t\t\tdefault:\n\t\t\t\treturn new NullDrillHoleConfiguration();\n\t\t}\n\t}\n}\n","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\"\n\t>\n\t\t<g transform=\"translate(1 1)\" fill=\"#FFF\" fill-rule=\"nonzero\" stroke=\"#0074B5\">\n\t\t\t<rect width=\"30\" height=\"30\" rx=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"23\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"23\" r=\"2\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleEdgeTypeCorner.vue?vue&type=template&id=ce386260\"\nimport script from \"./DrillHoleEdgeTypeCorner.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleEdgeTypeCorner.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\"\n\t>\n\t\t<g transform=\"translate(1 1)\" fill=\"#FFF\" fill-rule=\"nonzero\" stroke=\"#0074B5\">\n\t\t\t<rect width=\"30\" height=\"30\" rx=\"2\"/>\n\t\t\t<circle cx=\"6\" cy=\"15\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"6\" r=\"2\"/>\n\t\t\t<circle cx=\"24\" cy=\"6\" r=\"2\"/>\n\t\t\t<circle cx=\"24\" cy=\"24\" r=\"2\"/>\n\t\t\t<circle cx=\"6\" cy=\"24\" r=\"2\"/>\n\t\t\t<circle cx=\"6\" cy=\"6\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"24\" r=\"2\"/>\n\t\t\t<circle cx=\"24\" cy=\"15\" r=\"2\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleEdgeTypeAround.vue?vue&type=template&id=fa6a2064\"\nimport script from \"./DrillHoleEdgeTypeAround.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleEdgeTypeAround.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\"\n\t>\n\t\t<g transform=\"translate(1 1)\" fill=\"#FFF\" fill-rule=\"nonzero\" stroke=\"#0074B5\">\n\t\t\t<rect width=\"30\" height=\"30\" rx=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"23\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"23\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"23\" r=\"2\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleEdgeTypeTopBottom.vue?vue&type=template&id=2ed6770e\"\nimport script from \"./DrillHoleEdgeTypeTopBottom.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleEdgeTypeTopBottom.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n\t<svg\n\t\t:alt=\"alt\"\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 32 32\"\n\t>\n\t\t<g transform=\"translate(1 1)\" fill=\"#FFF\" fill-rule=\"nonzero\" stroke=\"#0074B5\">\n\t\t\t<rect width=\"30\" height=\"30\" rx=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"7\" r=\"2\"/>\n\t\t\t<circle cx=\"7\" cy=\"23\" r=\"2\"/>\n\t\t\t<circle cx=\"15\" cy=\"23\" r=\"2\"/>\n\t\t\t<circle cx=\"23\" cy=\"23\" r=\"2\"/>\n\t\t</g>\n\t</svg>\n</template>\n\n<script>\nexport default {\n\tprops: {\n\t\talt: String\n\t}\n};\n</script>\n","import { render } from \"./DrillHoleEdgeTypeLeftRight.vue?vue&type=template&id=0a555c64\"\nimport script from \"./DrillHoleEdgeTypeLeftRight.vue?vue&type=script&lang=js\"\nexport * from \"./DrillHoleEdgeTypeLeftRight.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","export default class Invalid {\n\tprimitives: object;\n\tconstructor( primitives ) {\n\t\tthis.primitives = primitives;\n\t}\n}","import {IModel, IPoint} from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\n\nexport enum OffsetLineType {\n\tprimary = 'primary',\n\tsecondary = 'secondary',\n\tdefault = 'default',\n}\n\nexport default class OffsetLine {\n\tprivate readonly startPoint: IPoint;\n\tprivate readonly endPoint: IPoint;\n\tprivate readonly label: string;\n\tprivate readonly unit: string;\n\tprivate offset: IPoint;\n\tprivate readonly type: OffsetLineType;\n\n\tconstructor( startPoint: IPoint, endPoint: IPoint, label: string, offset: IPoint = [0, 0], type = OffsetLineType.default, unit = 'cm' ) {\n\t\tthis.startPoint = startPoint;\n\t\tthis.endPoint = endPoint;\n\t\tthis.label = label;\n\t\tthis.unit = unit;\n\t\tthis.offset = offset;\n\t\tthis.type = type;\n\t}\n\n\tgetModel(): IModel {\n\t\tconst model = {} as IModel;\n\t\tconst subModel = {} as IModel;\n\t\tmakerjs.model.addPath(model, new makerjs.paths.Line(this.startPoint, this.endPoint), 'line');\n\t\tconst measure =\tmakerjs.measure.modelExtents(model);\n\n\t\tlet captionStartPoint = this.startPoint;\n\t\tlet captionEndPoint = this.endPoint;\n\n\t\t// If the line is too short, we move the caption next to the line.\n\t\tif(measure && (measure.height <= 60 && measure.width <= 60) && this.startPoint[0] > 0 && this.endPoint[0] > 0) {\n\t\t\tcaptionStartPoint = [this.startPoint[0] - 25, this.startPoint[1]];\n\t\t\tcaptionEndPoint = [this.endPoint[0] - 25, this.endPoint[1]];\n\t\t}\n\n\t\tmakerjs.model.addCaption(subModel, this.label, captionStartPoint, captionEndPoint);\n\t\tmakerjs.model.addModel(model, subModel, 'cap');\n\n\t\t// Used to set an active state for the dimension line caption\n\t\tif (this.type === 'primary') {\n\t\t\tsubModel.layer = 'white';\n\t\t}\n\n\t\tmakerjs.model.moveRelative(model, this.offset);\n\n\t\treturn model;\n\t}\n}\n","import makerjs from 'makerjs';\n\nfunction createModelForArrow( primitives ) {\n\tconst difference = primitives.stem_width - primitives.head_width;\n\n\treturn new makerjs.models.ConnectTheDots(\n\t\ttrue, // Closed,\n\t\t[\n\t\t\t[ 0, 0 ],\n\t\t\t[ primitives.stem_length, 0 ],\n\t\t\t[ primitives.stem_length, difference / 2 ],\n\t\t\t[ primitives.stem_length + primitives.head_length, primitives.stem_width / 2 ],\n\t\t\t[ primitives.stem_length, primitives.stem_width - ( difference / 2 ) ],\n\t\t\t[ primitives.stem_length, primitives.stem_width ],\n\t\t\t[ 0, primitives.stem_width ],\n\t\t]\n\t);\n}\n\nfunction createModelForHeart( { height } ) {\n\tconst a = height / ( ( 3 / 4 * Math.sqrt( 2 ) ) + ( 1 / 2 ) );\n\n\tconst diagonal = a * Math.sqrt( 2 );\n\tconst halfDiagonal = diagonal / 2;\n\n\treturn {\n\t\tpaths: {\n\t\t\tright_line: new makerjs.paths.Line( [ 0, -1 * halfDiagonal ], [ halfDiagonal, 0 ] ),\n\t\t\tleft_line: new makerjs.paths.Line( [ 0, -1 * halfDiagonal ], [ -1 * halfDiagonal, 0 ] ),\n\t\t\tright_arc: new makerjs.paths.Arc( [ halfDiagonal / 2, halfDiagonal / 2 ], a / 2, -45, 135 ),\n\t\t\tleft_arc: new makerjs.paths.Arc( [ -1 * halfDiagonal / 2, halfDiagonal / 2 ], a / 2, 45, 225 ),\n\t\t},\n\t\torigin: [ 0, 0 ],\n\t};\n}\n\nfunction createModelForArchedRectangle( dimensions ) {\n\tconst height = Math.max( dimensions.height - ( dimensions.width / 2 ), 0 );\n\treturn {\n\t\tpaths: {\n\t\t\tbottom_line: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.width, 0 ] ),\n\t\t\tleft_line: new makerjs.paths.Line( [ 0, 0 ], [ 0, height ] ),\n\t\t\tright_line: new makerjs.paths.Line( [ dimensions.width, 0 ], [ dimensions.width, height ] ),\n\t\t\tarc: new makerjs.paths.Arc(\n\t\t\t\t[ dimensions.width / 2, height ],\n\t\t\t\tdimensions.width / 2,\n\t\t\t\t0,\n\t\t\t\t180\n\t\t\t),\n\t\t},\n\t\torigin: [ 0, 0 ],\n\t};\n}\n\nfunction createModelForRoundedRectangle( dimensions ) {\n\tconst useIndividualCorners = dimensions[ 'use_individual_corners' ] === 'true' || dimensions[ 'use_individual_corners' ] === true;\n\n\t// Invert length and width to properly render the shape.\n\tconst { length: width, width: length, top_right_radius, bottom_right_radius, bottom_left_radius, top_left_radius, radius } = dimensions;\n\n\tconst maxRadius = Math.min( length, width ) / 2;\n\n\tconst topRightRadius = Math.min( useIndividualCorners ? top_right_radius : radius, maxRadius );\n\tconst bottomRightRadius = Math.min( useIndividualCorners ? bottom_right_radius : radius, maxRadius );\n\tconst bottomLeftRadius = Math.min( useIndividualCorners ? bottom_left_radius : radius, maxRadius );\n\tconst topLeftRadius = Math.min( useIndividualCorners ? top_left_radius : radius, maxRadius );\n\n\treturn {\n\t\tpaths: {\n\t\t\tBottomLeft: new makerjs.paths.Arc( [bottomLeftRadius, bottomLeftRadius], bottomLeftRadius, 180, 270 ),\n\t\t\tBottomRight: new makerjs.paths.Arc( [width - bottomRightRadius, bottomRightRadius], bottomRightRadius, 270, 0 ),\n\t\t\tTopRight: new makerjs.paths.Arc( [width - topRightRadius, length - topRightRadius], topRightRadius, 0, 90 ),\n\t\t\tTopLeft: new makerjs.paths.Arc( [topLeftRadius, length - topLeftRadius], topLeftRadius, 90, 180 ),\n\t\t\tBottom: new makerjs.paths.Line( [bottomLeftRadius, 0], [width - bottomRightRadius, 0] ),\n\t\t\tTop: new makerjs.paths.Line( [width - topRightRadius, length], [topLeftRadius, length] ),\n\t\t\tRight: new makerjs.paths.Line( [width, bottomRightRadius], [width, length - topRightRadius] ),\n\t\t\tLeft: new makerjs.paths.Line( [0, length - topLeftRadius], [0, bottomLeftRadius] )\n\t\t},\n\t\torigin: [ 0, 0 ],\n\t};\n}\n\nfunction createModelForFlatOval( width, radius ) {\n\tconst model = new makerjs.models.Belt(\n\t\tradius,\n\t\twidth - ( radius * 2 ),\n\t\tradius\n\t);\n\n\tmakerjs.model.originate( model );\n\tmakerjs.model.zero( model );\n\n\treturn model;\n}\n\nfunction createModelForOctagon( sideLength ) {\n\tconst sides = 8;\n\tconst angleInRadians = Math.PI / sides;\n\tconst sinAngle = Math.sin( angleInRadians );\n\n\t// Calculate the radius of the octagon based on the side length.\n\tconst radius = sideLength / ( 2 * sinAngle );\n\treturn new makerjs.models.Polygon(\n\t\tsides,\n\t\tradius,\n\t\t22.5 // Rotate the octagon by 22.5 degrees to make it symmetrical.\n\t);\n}\n\n// See app-measurements-selector/docs/droplet.js for more information.\nfunction createModelForDroplet( height, width ) {\n\tconst xAxisMiddle = width / 2;\n\n\t/**\n\t * The base_circle is a circle that is as wide as the total with of the droplet, and touches the bottom of the\n\t * border. This base_circle is used to calculate the eventual arc of the droplet_base.\n\t */\n\tconst baseCircleRadius = xAxisMiddle;\n\tconst baseCircleOrigin = [baseCircleRadius, baseCircleRadius];\n\tconst baseCircle = new makerjs.paths.Circle( baseCircleOrigin, baseCircleRadius );\n\n\t/**\n\t * The droplet_tip is an iscoceles triangle. This triangle has a top point that is at the top of the border in the\n\t * middle. The base of the triangle starts at an exact point where the angled line of the triangle and the arc of\n\t * the circle connect. To calculate this point, we need an imaginary instersect_circle that intersects with the\n\t * base_circle. This intersect_circle is touches the origin point of the base_circle, and the top of the border.\n\t *\n\t * Since the origin point of a circle is in it's middle, we have to calculate the radius of the circle first, and\n\t * then add that radius to the Y axis of the origin point of the base_circle.\n\t */\n\tconst intersectCircleRadius = ( height - xAxisMiddle ) / 2;\n\tconst intersectCircleOrigin = [baseCircleOrigin[ 0 ], baseCircleOrigin[ 1 ] + intersectCircleRadius];\n\tconst intersectCircle = new makerjs.paths.Circle( intersectCircleOrigin, intersectCircleRadius );\n\n\t/**\n\t * Calculate the intersection_point_a and intersection_point_b, which are the points where the base of the\n\t * droplet_tip will start.\n\t */\n\tconst intersectionPoints = makerjs.path.intersection( intersectCircle, baseCircle );\n\n\tif( ! intersectionPoints ) {\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\tbaseCircle: baseCircle,\n\t\t\t}\n\t\t};\n\t}\n\n\tconst intersectionPointA = intersectionPoints.intersectionPoints[ 0 ];\n\tconst intersectionPointB = intersectionPoints.intersectionPoints[ 1 ];\n\n\t/**\n\t * The droplet_tip is an iscoceles triangle. This triangle has a top point that is at the top of the border in the\n\t * middle, and connects to intersection_point_a and intersection_point_b.\n\t */\n\tconst dropletTipTop = [xAxisMiddle, height];\n\tconst dropletTipLineA = new makerjs.paths.Line( intersectionPointA, dropletTipTop );\n\tconst dropletTipLineB = new makerjs.paths.Line( intersectionPointB, dropletTipTop );\n\n\t/**\n\t * Draw the base of the circle by drawing an Arc that has the same origin and radius as the base_circle, and the\n\t * angles that are calculated by the intersection.\n\t */\n\tconst dropletBase = new makerjs.paths.Arc( baseCircleOrigin, baseCircleRadius, intersectionPoints.path2Angles[ 1 ], intersectionPoints.path2Angles[ 0 ] );\n\n\treturn {\n\t\tpaths : {\n\t\t\tdropletTipLineA: dropletTipLineA,\n\t\t\tdropletTipLineB: dropletTipLineB,\n\t\t\tdropletBase: dropletBase\n\t\t}\n\t};\n}\n\nfunction createModelForEgg( height, width ) {\n\tconst startAngle = 0;\n\tconst endAngle = 180;\n\tconst radiusY = height / 3;\n\tconst radiusX = width / 2;\n\n\tconst arcTop = new makerjs.models.EllipticArc( startAngle, endAngle, radiusX, radiusY * 2 );\n\tconst arcBottom = new makerjs.models.EllipticArc( startAngle, endAngle, radiusX, radiusY );\n\n\tconst model = {\n\t\tmodels: {\n\t\t\tarcTop: arcTop,\n\t\t\tarcBottom: makerjs.model.rotate( arcBottom, -180 ),\n\t\t}\n\t};\n\n\treturn model;\n}\n\nfunction createModelForBarrel( width, height, sideHeight ) {\n\tlet arcHeight = Math.max( 0, ( height - sideHeight ) / 2 );\n\n\t// Make sure the makerjs shape can't fail by having a 0 height arc.\n\tif( arcHeight === 0 ) {\n\t\tarcHeight = 5;\n\t}\n\n\treturn {\n\t\tpaths: {\n\t\t\tlineLeft: new makerjs.paths.Line( [0, 0], [0, sideHeight] ),\n\t\t\tlineRight: new makerjs.paths.Line( [width, 0], [width, sideHeight] ),\n\t\t\tarcTop: new makerjs.paths.Arc( [0, sideHeight], [width/2, arcHeight + sideHeight], [width, sideHeight] ),\n\t\t\tarcBottom: new makerjs.paths.Arc( [0, 0], [width/2, -arcHeight], [width, 0] )\n\t\t}\n\t};\n}\n\nfunction createModelForParallelogram( height, width ) {\n\tconst angle = 60; // Angle in degrees\n\n\t// Calculate the x-offset for the slanted side\n\tconst offset = height / Math.tan( makerjs.angle.toRadians( angle ) );\n\n\t// Create a new model for the parallelogram\n\treturn new makerjs.models.ConnectTheDots( true, [\n\t\t[0, 0], // Bottom left corner\n\t\t[width, 0], // Bottom right corner\n\t\t[width + offset, height], // Top right corner\n\t\t[offset, height] // Top left corner\n\t] );\n}\n\nexport function createModelFromShape( shape, dimensions ) {\n\tconst offset_top = ( shape === 'trapezoid' && ( dimensions.width_bottom > dimensions.width_top ) ) ? ( dimensions.width_bottom - dimensions.width_top ) / 2 : 0;\n\tconst offset_bottom = ( shape === 'trapezoid' && ( dimensions.width_top > dimensions.width_bottom ) ) ? ( dimensions.width_top - dimensions.width_bottom ) / 2 : 0;\n\n\tswitch ( shape ) {\n\tdefault:\n\tcase 'rectangle':\n\t\treturn new makerjs.models.Rectangle(\n\t\t\tdimensions.length,\n\t\t\tdimensions.width\n\t\t);\n\tcase 'circle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\tcircle: {\n\t\t\t\t\ttype: 'circle',\n\t\t\t\t\torigin: [ 0, 0 ],\n\t\t\t\t\tradius: dimensions.diameter / 2,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\tcase 'right-angled-triangle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\ta: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.base, 0 ] ),\n\t\t\t\tb: new makerjs.paths.Line( [ dimensions.base, 0 ], [ dimensions.base, dimensions.height ] ),\n\t\t\t\tc: new makerjs.paths.Line( [ dimensions.base, dimensions.height ], [ 0, 0 ] ),\n\t\t\t},\n\t\t};\n\tcase 'right-angled-triangle-mirrored':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\ta: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.base, 0 ] ),\n\t\t\t\tb: new makerjs.paths.Line( [ dimensions.base, 0 ], [ 0, dimensions.height ] ),\n\t\t\t\tc: new makerjs.paths.Line( [ 0, dimensions.height ], [ 0, 0 ] ),\n\t\t\t},\n\t\t};\n\tcase 'arched-rectangle':\n\t\treturn createModelForArchedRectangle( dimensions );\n\tcase 'rounded-rectangle':\n\t\treturn createModelForRoundedRectangle( dimensions );\n\tcase 'egg':\n\t\treturn createModelForEgg( dimensions.height, dimensions.width );\n\tcase 'ellipse':\n\t\treturn new makerjs.models.Ellipse(\n\t\t\tdimensions.width / 2,\n\t\t\tdimensions.height / 2\n\t\t);\n\tcase 'flat-oval':\n\t\treturn createModelForFlatOval( dimensions.width, dimensions.radius );\n\tcase 'isosceles-triangle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\ta: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.base, 0 ] ),\n\t\t\t\tb: new makerjs.paths.Line( [ dimensions.base, 0 ], [ dimensions.base / 2, dimensions.height ] ),\n\t\t\t\tc: new makerjs.paths.Line( [ dimensions.base / 2, dimensions.height ], [ 0, 0 ] ),\n\t\t\t},\n\t\t};\n\tcase 'arrow':\n\t\treturn createModelForArrow( dimensions );\n\tcase 'half-circle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\tbase: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.diameter, 0 ] ),\n\t\t\t\tarc: new makerjs.paths.Arc(\n\t\t\t\t\t[ dimensions.diameter / 2, 0 ],\n\t\t\t\t\tdimensions.diameter / 2,\n\t\t\t\t\t0,\n\t\t\t\t\t180\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\tcase 'quarter-circle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\tbase: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.radius, 0 ] ),\n\t\t\t\theight: new makerjs.paths.Line( [ 0, 0 ], [ 0, dimensions.radius ] ),\n\t\t\t\tarc: new makerjs.paths.Arc(\n\t\t\t\t\t[ 0, 0 ],\n\t\t\t\t\tdimensions.radius,\n\t\t\t\t\t0,\n\t\t\t\t\t90\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\tcase 'hexagon':\n\t\treturn new makerjs.models.Polygon(\n\t\t\t6,\n\t\t\tdimensions.side_length\n\t\t);\n\tcase 'polygon':\n\t\treturn new makerjs.models.Polygon(\n\t\t\t( dimensions.side_amount ?? 8 ) < 3 ? 3 : dimensions.side_amount,\n\t\t\tdimensions.width / 2\n\t\t);\n\tcase 'octagon':\n\t\treturn createModelForOctagon( dimensions.side_length );\n\tcase 'star':\n\t\treturn new makerjs.models.Star(\n\t\t\tdimensions.number_of_points,\n\t\t\tdimensions.outer_radius,\n\t\t\tdimensions.inner_radius,\n\t\t\t0\n\t\t);\n\tcase 'sloped-rectangle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\twidth: new makerjs.paths.Line( [ 0, 0 ], [ dimensions.width, 0 ] ),\n\t\t\t\tright_height: new makerjs.paths.Line(\n\t\t\t\t\t[ dimensions.width, 0 ],\n\t\t\t\t\t[ dimensions.width, dimensions.height_right ]\n\t\t\t\t),\n\t\t\t\tdiagonal: new makerjs.paths.Line(\n\t\t\t\t\t[ dimensions.width, dimensions.height_right ],\n\t\t\t\t\t[ 0, dimensions.height_left ]\n\t\t\t\t),\n\t\t\t\tleft_height: new makerjs.paths.Line(\n\t\t\t\t\t[ 0, dimensions.height_left ],\n\t\t\t\t\t[ 0, 0 ]\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\tcase 'sloped-right-rectangle':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\twidth_top: new makerjs.paths.Line( [ 0, dimensions.height ], [ dimensions.width_top, dimensions.height ] ),\n\t\t\t\tdiagonal: new makerjs.paths.Line( [ dimensions.width_top, dimensions.height ], [ dimensions.width_bottom, 0 ] ),\n\t\t\t\twidth_bottom: new makerjs.paths.Line( [ dimensions.width_bottom, 0 ], [ 0, 0 ] ),\n\t\t\t\theight: new makerjs.paths.Line( [ 0, 0 ], [ 0, dimensions.height ] ),\n\t\t\t},\n\t\t};\n\tcase 'trapezoid':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\twidth_bottom: new makerjs.paths.Line( [ offset_bottom, 0 ], [ dimensions.width_bottom + offset_bottom, 0 ] ),\n\t\t\t\tright_side: new makerjs.paths.Line(\n\t\t\t\t\t[ dimensions.width_bottom + offset_bottom, 0 ],\n\t\t\t\t\t[ dimensions.width_top + offset_top, dimensions.height ]\n\t\t\t\t),\n\t\t\t\twidth_top: new makerjs.paths.Line(\n\t\t\t\t\t[ offset_top, dimensions.height ],\n\t\t\t\t\t[ dimensions.width_top + offset_top, dimensions.height ]\n\t\t\t\t),\n\t\t\t\tleft_side: new makerjs.paths.Line(\n\t\t\t\t\t[ offset_top, dimensions.height ],\n\t\t\t\t\t[ offset_bottom, 0 ]\n\t\t\t\t),\n\t\t\t},\n\t\t};\n\tcase 'heart':\n\t\treturn createModelForHeart( dimensions );\n\tcase 'kite':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\ttopLeft: new makerjs.paths.Line( [-dimensions.width/2, 0], [0, dimensions.height_top] ),\n\t\t\t\ttopRight: new makerjs.paths.Line( [dimensions.width/2, 0], [0, dimensions.height_top] ),\n\t\t\t\tbottomLeft: new makerjs.paths.Line( [-dimensions.width/2, 0], [0, -dimensions.height_bottom] ),\n\t\t\t\tbottomRight: new makerjs.paths.Line( [dimensions.width/2, 0], [0, -dimensions.height_bottom] ),\n\t\t\t}\n\t\t};\n\tcase 'barrel':\n\t\treturn createModelForBarrel( dimensions.width, dimensions.height, dimensions.side_height );\n\tcase 'jewel':\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\ttopBase: new makerjs.paths.Line( [-dimensions.width_top/2, dimensions.height_top], [dimensions.width_top/2, dimensions.height_top] ),\n\t\t\t\ttopLeft: new makerjs.paths.Line( [-dimensions.width_bottom/2, 0], [-dimensions.width_top/2, dimensions.height_top] ),\n\t\t\t\ttopRight: new makerjs.paths.Line( [dimensions.width_top/2, dimensions.height_top], [dimensions.width_bottom/2, 0] ),\n\t\t\t\tbottomLeft: new makerjs.paths.Line( [-dimensions.width_bottom/2, 0], [0, -dimensions.height_bottom] ),\n\t\t\t\tbottomRight: new makerjs.paths.Line( [dimensions.width_bottom/2, 0], [0, -dimensions.height_bottom] )\n\t\t\t}\n\t\t};\n\tcase 'droplet':\n\t\treturn createModelForDroplet( dimensions.height, dimensions.width );\n\tcase 'parallelogram':\n\t\treturn createModelForParallelogram( dimensions.height, dimensions.width );\n\t}\n\n}\n\n// Re-export makerjs, so we can load this file as a dynamic import and include MakerJS in that partial bundle.\nexport { makerjs };\n","import {formatToLocaleString} from \"@/functions/numbers\";\n\nexport function roundLength( length ): number {\n\n\t// First round the long tail to prevent floating point issues\n\tlength = Math.round( length * 10000000 ) / 10000000;\n\n\treturn Math.round( length * 100 ) / 100;\n}\n\nexport function renderLength( length: number, unit = 'cm' ): string {\n\tlength = roundLength( length );\n\n\treturn formatToLocaleString( length ) + ' ' + unit;\n}\n\nexport const renderMaxLength = roundLength;\n","import makerjs, {IModel} from 'makerjs';\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport OffsetLine from './Lines/OffsetLine';\nimport { renderLength } from '@/functions/lengths';\n\nexport default class DrillHole {\n\tx: Length;\n\ty: Length;\n\tdiameter: Length;\n\tedge: number;\n\n\tconstructor( x: Length, y: Length, diameter: Length, edge = 0 ) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.diameter = diameter;\n\t\tthis.edge = edge;\n\t}\n\n\tgetId(): string {\n\t\treturn 'hole-' + this.x.millimeters + '-' + this.y.millimeters + '-' + this.edge;\n\t}\n\n\tgetPath(): MakerJs.paths.Circle {\n\t\tconst diameter = ( this.diameter.in_cm() / 2 ) + 0.001; // Add 0.001 to let machine accept this drillhole. See https://app.asana.com/0/0/1201857836504279/1202032991548094/f\n\t\treturn new makerjs.paths.Circle( [this.x.in_cm(), this.y.in_cm()], diameter );\n\t}\n\n\tgetAsModel(): IModel {\n\t\treturn {\n\t\t\tpaths: {\n\t\t\t\t[ this.getId() ]: this.getPath(),\n\t\t\t},\n\t\t\ttype: 'drillhole',\n\t\t};\n\t}\n\n\tgetOffsetLines(focusedElement = ''): OffsetLine[] {\n\t\tif(focusedElement.includes(\"drillHoleOffsetY\")) {\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[ this.x.in_mm(), 0 ],\n\t\t\t\t\t[ this.x.in_mm(), this.y.in_mm() ],\n\t\t\t\t\trenderLength(this.y.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"drillHoleOffsetX\")) {\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[ 0, this.y.in_mm() ],\n\t\t\t\t\t[ this.x.in_mm(), this.y.in_mm() ],\n\t\t\t\t\trenderLength(this.x.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n}\n","export type Step = {\n\tid: StepTypes;\n\ttitle: string;\n\tshortTitle: string;\n\ttext: string,\n\tstatus: '' | 'completed' | 'invalid',\n\tinformation: string,\n};\n\nexport enum StepTypes {\n\tshapeSize = 'shape-and-size',\n\tcutouts = 'cutouts',\n\tdrillholes = 'drillholes',\n\tthickness = 'thickness',\n\tedgeFinish = 'edge-finish',\n\tmaterial = 'material',\n\tsideSelection = 'side-selection',\n}\n","import Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DrillHole from \"../DrillHole\";\nimport { svgPathProperties } from \"svg-path-properties\";\nimport makerjs, {IModel, IPath, IPathLine, IPoint} from \"makerjs\";\nimport isEmpty from \"lodash/isEmpty\";\nimport has from \"lodash/has\";\nimport map from \"lodash/map\";\n\nexport default class Shape {\n\tprotected parentModel: IModel;\n\n\tconstructor( parentModel: IModel ) {\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetOffsetModel( offset: Length ): IModel {\n\n\t\t// If there's no offset, we want to create them around the original model.\n\t\tif ( offset.in_cm() <= 0 ) {\n\t\t\treturn { models: { 0: this.parentModel } };\n\t\t}\n\n\t\treturn makerjs.model.outline( this.parentModel, offset.in_cm(), 1, true );\n\t}\n\n\tgetPath( offset: Length ): object[] {\n\t\tlet offsetModel = null;\n\n\t\t// We'll make 5 attempts to create an offset\n\t\tfor( let i = 0; i < 5; i++ ) {\n\t\t\toffsetModel = this.getOffsetModel( offset.add( new Length( 0.0001 ).multiply( i ) ) );\n\n\t\t\tif ( ! isEmpty( offsetModel.models ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( isEmpty( offsetModel ) || isEmpty( offsetModel.models ) || isEmpty( offsetModel.models[ 0 ].paths ) ) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn map( offsetModel.models[ 0 ].paths, ( entry, key ) => {\n\t\t\tentry.name = key;\n\n\t\t\treturn entry;\n\t\t} );\n\t}\n\n\tgetCorners( offset: Length, diameter: Length ): DrillHole[] {\n\t\tconst resultPath = this.getPath( offset );\n\n\t\treturn resultPath.map( ( point ) => {\n\t\t\tif ( ! has( point, 'origin' ) || ! has( point, 'end' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn new DrillHole( Length.from_cm( point[ 'origin' ][ 0 ] ), Length.from_cm( point[ 'origin' ][ 1 ] ), diameter );\n\t\t} ).filter( element => ! isEmpty( element ) );\n\t}\n\n\tcountEdges( offset: Length ): number {\n\t\tconst resultPath = this.getPath( offset );\n\n\t\treturn resultPath.length;\n\t}\n\n\t/**\n\t * Generates drillholes around the inner perimeter of the shape.\n\t */\n\tgetAround( holeCounts: Array<number>, offset: Length, diameter: Length ): DrillHole[] {\n\t\tlet resultPath = this.getPath( offset );\n\n\t\tif ( isEmpty( resultPath ) ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tresultPath = resultPath.reverse(); // Add holes clockwise manner.\n\n\t\tlet previousPoint = resultPath.shift();\n\t\tresultPath.push( previousPoint );\n\t\tlet holes = [];\n\t\tlet edgeCount = 0;\n\n\t\tfor ( const currentPoint of resultPath ) {\n\t\t\tconst [ prevX, prevY ] = previousPoint[ 'origin' ];\n\t\t\tconst [ curX, curY ] = currentPoint[ 'origin' ];\n\n\t\t\tconst newLine = new svgPathProperties( `M ${ Length.from_cm( prevX ).in_mm() } ${ Length.from_cm( prevY ).in_mm() } L ${ Length.from_cm( curX ).in_mm() } ${ Length.from_cm( curY ).in_mm() }` );\n\n\t\t\tedgeCount++;\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tif ( holeCounts[ edgeCount-1 ] == 1 ) {\n\t\t\t\tconst lineLength = newLine.getTotalLength();\n\t\t\t\tconst holePoint = newLine.getPointAtLength( ( lineLength / 2 ) );\n\t\t\t\tholes.push( new DrillHole( new Length( holePoint.x ), new Length( holePoint.y ), diameter, edgeCount ) );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( holeCounts[ edgeCount-1 ] < 1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor ( let index = 0; index < holeCounts[ edgeCount-1 ]; index++ ) {\n\t\t\t\tconst holeCount = holeCounts[ edgeCount-1 ];\n\t\t\t\tconst lineLength = newLine.getTotalLength();\n\t\t\t\tconst holePoint = newLine.getPointAtLength( ( lineLength/( holeCount-1 ) )*index );\n\t\t\t\tholes.push( new DrillHole( new Length( holePoint.x ), new Length( holePoint.y ), diameter, edgeCount ) );\n\t\t\t}\n\t\t}\n\t\tholes = this.deduplicate( holes );\n\t\treturn holes;\n\t}\n\n\tdeduplicate( drillholes: DrillHole[] ): DrillHole[] {\n\t\tconst found = [];\n\t\tconst deduplicated = [];\n\t\tfor ( const drillhole of drillholes ) {\n\t\t\tif ( !found.includes( ( Math.round( drillhole.x.in_mm() * 100 ) / 100 +'-'+ Math.round( drillhole.y.in_mm() * 100 ) / 100 ) ) ) {\n\t\t\t\tdeduplicated.push( drillhole );\n\t\t\t\tfound.push( ( Math.round( drillhole.x.in_mm() * 100 ) / 100 +'-'+ Math.round( drillhole.y.in_mm() * 100 ) / 100 ) );\n\t\t\t}\n\t\t}\n\t\treturn deduplicated;\n\t}\n\n\tcreateEdgePath( holeCounts: number[], offsetTopBottom: Length, offsetLeftRight: Length, startingPoint: Length ): IModel {\n\t\tlet i = 0;\n\t\tconst mapped = map( this.parentModel.paths, ( entry, key ) => {\n\t\t\tif ( holeCounts[ i ] === 0 || entry.type !== 'line' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst newEntry = this.createOffsettedLine( entry, i, offsetLeftRight, offsetTopBottom, startingPoint );\n\n\t\t\tnewEntry[ 'name' ] = key;\n\n\t\t\ti++;\n\n\t\t\treturn newEntry;\n\t\t} ).filter( ( item: boolean|IPath ) => item !== false );\n\n\t\tconst cloned = makerjs.cloneObject( {\n\t\t\tpaths: { ...mapped }\n\t\t} );\n\n\t\tif ( isEmpty( cloned.paths ) || Object.keys( cloned.paths ).length === 1 ) {\n\t\t\treturn {};\n\t\t}\n\n\t\treturn cloned;\n\t}\n\n\tcreateOffsettedLine( path: IPathLine, index: number, offsetLeftRight: Length, offsetTopBottom: Length, startingPoint: Length ): IModel {\n\t\tconst cloned = makerjs.cloneObject( path );\n\n\t\t// Bottom Left to Bottom Right\n\t\tif ( index === 0 ) {\n\t\t\tcloned.origin[ 0 ] = startingPoint.in_cm();\n\t\t\tcloned.origin[ 1 ] = offsetTopBottom.in_cm();\n\n\t\t\tcloned.end[ 0 ] = cloned.end[ 0 ] - startingPoint.in_cm();\n\t\t\tcloned.end[ 1 ] = offsetTopBottom.in_cm();\n\t\t}\n\n\t\t// Bottom Right to Top Right\n\t\tif ( index === 1 ) {\n\t\t\tcloned.origin[ 0 ] = cloned.origin[ 0 ] - offsetLeftRight.in_cm();\n\t\t\tcloned.origin[ 1 ] = startingPoint.in_cm();\n\n\t\t\tcloned.end[ 0 ] = cloned.end[ 0 ] - offsetLeftRight.in_cm();\n\t\t\tcloned.end[ 1 ] = cloned.end[ 1 ] - startingPoint.in_cm();\n\t\t}\n\n\t\t// Top Right to Top Left\n\t\tif ( index === 2 ) {\n\t\t\tcloned.origin[ 0 ] = cloned.origin[ 0 ] - startingPoint.in_cm();\n\t\t\tcloned.origin[ 1 ] = cloned.origin[ 1 ] - offsetTopBottom.in_cm();\n\n\t\t\tcloned.end[ 0 ] = startingPoint.in_cm();\n\t\t\tcloned.end[ 1 ] = cloned.end[ 1 ] - offsetTopBottom.in_cm();\n\t\t}\n\n\t\t// Top Left to Bottom Right\n\t\tif ( index === 3 ) {\n\t\t\tcloned.origin[ 0 ] = offsetLeftRight.in_cm();\n\t\t\tcloned.origin[ 1 ] = cloned.origin[ 1 ] - startingPoint.in_cm();\n\n\t\t\tcloned.end[ 0 ] = offsetLeftRight.in_cm();\n\t\t\tcloned.end[ 1 ] = startingPoint.in_cm();\n\t\t}\n\n\t\treturn cloned;\n\t}\n\n\tfromEdge( holeCounts: number[], offsetTopBottom: Length, offsetLeftRight: Length, diameter: Length, startingPoint: Length ): DrillHole[] {\n\t\tlet holes = [];\n\n\t\tconst edgePath = this.createEdgePath( holeCounts, offsetTopBottom, offsetLeftRight, startingPoint );\n\n\t\tif ( isEmpty( edgePath ) ) {\n\t\t\treturn holes;\n\t\t}\n\n\t\tfor ( const [ key, side ] of Object.entries( edgePath.paths ) ) {\n\t\t\tconst holesPerSide = holeCounts[ key ];\n\t\t\tconst points = makerjs.path.toPoints( side as IPath, holesPerSide );\n\n\t\t\tpoints.forEach( function ( coordinates: IPoint ) {\n\t\t\t\tholes.push( new DrillHole( Length.from_cm( coordinates[ 0 ] ), Length.from_cm( coordinates[ 1 ] ), diameter ) );\n\t\t\t} );\n\t\t}\n\n\t\tholes = this.deduplicate( holes );\n\n\t\treturn holes;\n\t}\n}\n","import Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport Shape from \"./Shape\";\n\nexport default class Trapezoid extends Shape {\n\n\tgetPath( offset: Length ): object[] {\n\t\tconst originalPaths = super.getPath( offset );\n\n\t\treturn originalPaths.map( entry => {\n\t\t\tif ( entry[ 'name' ] === 'width_top_Bottom' ) {\n\t\t\t\tentry[ 'origin' ] = entry[ 'end' ];\n\t\t\t}\n\n\t\t\treturn entry;\n\t\t} );\n\t}\n}\n","import Shape from \"./Shape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport makerjs, {IModel} from \"makerjs\";\nimport {createModelFromShape} from \"../../../../source/js/shared/rendering/makerjs\";\n\nexport default class RoundedRectangle extends Shape {\n\n\tgetOffsetModel( offset: Length ): IModel {\n\t\tconst enclosed = makerjs.measure.modelExtents( this.parentModel );\n\t\tconst enclosedRectangle = createModelFromShape(\n\t\t\t'rectangle',\n\t\t\t{ length: enclosed.width, width: enclosed.height }\n\t\t);\n\n\t\tif ( offset.in_cm() <= 0 ) {\n\t\t\treturn { models: { 0: enclosedRectangle } };\n\t\t}\n\n\t\treturn makerjs.model.outline( enclosedRectangle, offset.in_cm(), 1, true );\n\t}\n}\n","import InvalidDrillHoleGenerator from \"./DrillHoleGenerators/Invalid\";\nimport Trapezoid from \"./DrillHoleGenerators/Trapezoid\";\nimport Shape from \"./DrillHoleGenerators/Shape\";\nimport Invalid from \"./DrillHoleGenerators/Invalid\";\nimport RoundedRectangle from \"./DrillHoleGenerators/RoundedRectangle\";\n\nexport default class ShapeDrillHoleGeneratorFactory {\n\tgetShapeDrillHoleGenerator( shape, parentModel ): Shape|Invalid {\n\t\tswitch( shape ) {\n\t\t\tcase \"rectangle\":\n\t\t\tcase \"isosceles-triangle\":\n\t\t\tcase \"right-angled-triangle\":\n\t\t\tcase \"right-angled-triangle-mirrored\":\n\t\t\tcase \"sloped-rectangle\":\n\t\t\tcase \"sloped-right-rectangle\":\n\t\t\t\treturn new Shape( parentModel );\n\t\t\tcase \"trapezoid\":\n\t\t\t\treturn new Trapezoid( parentModel );\n\t\t\tcase \"rounded-rectangle\":\n\t\t\t\treturn new RoundedRectangle( parentModel );\n\t\t\tdefault:\n\t\t\t\treturn new InvalidDrillHoleGenerator( parentModel );\n\t\t}\n\t}\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createVNode as _createVNode, normalizeClass as _normalizeClass, unref as _unref, resolveComponent as _resolveComponent, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-629c590a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"grid\"\n}\nconst _hoisted_2 = { class: \"center\" }\n\nimport ShapeDrillHoleGeneratorFactory from '../Models/ShapeDrillHoleGeneratorFactory';\n\nimport {computed, onBeforeUnmount, onMounted} from \"vue\";\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { stripNonNumeric } from '@/functions/numbers';\nimport { StepTypes } from '@/types/step';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoleEdgeCounts',\n  setup(__props) {\n\nconst store = useStore();\n\nconst shape = computed(() => store.getters.shape );\nconst model = computed(() => store.getters.model );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst drillHoleEdgeHoles = computed(() => store.getters.drillHoleEdgeHoles );\nconst drillHoleOffset = computed( () => store.getters.drillHoleOffset );\nconst isMediaMobileSize = computed( () => store.getters.isMediaMobileSize );\nconst currentStepName = computed( () => store.getters.currentStepName );\n\nfunction countEdges() {\n\tconst shapeDrillHoleGenerator = (new ShapeDrillHoleGeneratorFactory()).getShapeDrillHoleGenerator( shape.value, model.value );\n\n\tif ( ( 'getPath' in shapeDrillHoleGenerator ) ) {\n\t\treturn shapeDrillHoleGenerator.getPath( drillHoleOffset.value ).length;\n\t}\n\n\treturn 0;\n}\n\nconst edges = computed(() => {\n\tconst edges = [];\n\tconst sides = countEdges();\n\n\tconst classes = sides === 4 ? [ 'top', 'right', 'bottom', 'left' ] : [ 'right', 'bottom', 'left' ];\n\n\tfor( let i = 0; i < sides; i++ ) {\n\t\tedges.push( { side: classes[ i ], holes: Math.round( drillHoleEdgeHoles.value[ i ] ?? 1 ) } );\n\t}\n\n\treturn edges;\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event) {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for edge drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'edges' && lastGeneratedConfiguration.value.drillholes?.edgeType === 'around' ) {\n\t\treturn;\n\t}\n\n\tconst defaultHoles = new Array( countEdges() );\n\n\tdefaultHoles.fill( 1 );\n\n\tstore.commit('updateEdgeHoles', defaultHoles );\n});\n\nonBeforeUnmount(() => {\n\tstore.commit( 'updateEdgeHoles', [] );\n\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\nfunction updateDrillEdgeHoles(value, index) {\n\tconst data = [...drillHoleEdgeHoles.value]; // Make a shallow copy to prevent modifying the original object. This woudl break reactivity.\n\tdata[index] = stripNonNumeric(value);\n\n\tstore.commit( 'updateEdgeHoles', data);\n}\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_portal_target = _resolveComponent(\"portal-target\")!\n\n  return (isMediaMobileSize.value)\n    ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(edges.value, (holeInfo, index) => {\n          return (_openBlock(), _createElementBlock(\"div\", {\n            key: index,\n            class: _normalizeClass({ [holeInfo.side]: true })\n          }, [\n            _createVNode(DimensionInput, {\n              inputRef: `drillHoleEdgeCount_${index}`,\n              id: `drillHoleEdgeCount_${index}`,\n              name: `drillHoleEdgeCount_${index}`,\n              inputmode: \"numeric\",\n              type: \"text\",\n              step: 1,\n              min: 0,\n              modelValue: holeInfo.holes,\n              \"onUpdate:modelValue\": ($event: any) => (updateDrillEdgeHoles($event, index)),\n              invalid: false\n            }, null, 8, [\"inputRef\", \"id\", \"name\", \"modelValue\", \"onUpdate:modelValue\"])\n          ], 2))\n        }), 128)),\n        _createElementVNode(\"div\", _hoisted_2, [\n          (isMediaMobileSize.value && currentStepName.value === _unref(StepTypes).drillholes)\n            ? (_openBlock(), _createBlock(_component_portal_target, {\n                key: 0,\n                name: \"mobile-accordion-preview\"\n              }))\n            : _createCommentVNode(\"\", true)\n        ])\n      ]))\n    : (_openBlock(true), _createElementBlock(_Fragment, { key: 1 }, _renderList(edges.value, (holeInfo, index) => {\n        return (_openBlock(), _createBlock(DimensionInput, {\n          key: index,\n          inputRef: `drillHoleEdgeCount_${index}`,\n          id: `drillHoleEdgeCount_${index}`,\n          name: `drillHoleEdgeCount_${index}`,\n          inputmode: \"numeric\",\n          step: 1,\n          min: 0,\n          label: `${_ctx.$i18n.drillHoleConfiguration.edge} ${index +1}`,\n          modelValue: holeInfo.holes,\n          \"onUpdate:modelValue\": ($event: any) => (updateDrillEdgeHoles($event, index)),\n          invalid: false\n        }, null, 8, [\"inputRef\", \"id\", \"name\", \"label\", \"modelValue\", \"onUpdate:modelValue\"]))\n      }), 128))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport ShapeDrillHoleGeneratorFactory from '../Models/ShapeDrillHoleGeneratorFactory';\n\nimport {computed, onBeforeUnmount, onMounted} from \"vue\";\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport { stripNonNumeric } from '@/functions/numbers';\nimport { StepTypes } from '@/types/step';\n\nconst store = useStore();\n\nconst shape = computed(() => store.getters.shape );\nconst model = computed(() => store.getters.model );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst drillHoleEdgeHoles = computed(() => store.getters.drillHoleEdgeHoles );\nconst drillHoleOffset = computed( () => store.getters.drillHoleOffset );\nconst isMediaMobileSize = computed( () => store.getters.isMediaMobileSize );\nconst currentStepName = computed( () => store.getters.currentStepName );\n\nfunction countEdges() {\n\tconst shapeDrillHoleGenerator = (new ShapeDrillHoleGeneratorFactory()).getShapeDrillHoleGenerator( shape.value, model.value );\n\n\tif ( ( 'getPath' in shapeDrillHoleGenerator ) ) {\n\t\treturn shapeDrillHoleGenerator.getPath( drillHoleOffset.value ).length;\n\t}\n\n\treturn 0;\n}\n\nconst edges = computed(() => {\n\tconst edges = [];\n\tconst sides = countEdges();\n\n\tconst classes = sides === 4 ? [ 'top', 'right', 'bottom', 'left' ] : [ 'right', 'bottom', 'left' ];\n\n\tfor( let i = 0; i < sides; i++ ) {\n\t\tedges.push( { side: classes[ i ], holes: Math.round( drillHoleEdgeHoles.value[ i ] ?? 1 ) } );\n\t}\n\n\treturn edges;\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event) {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for edge drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'edges' && lastGeneratedConfiguration.value.drillholes?.edgeType === 'around' ) {\n\t\treturn;\n\t}\n\n\tconst defaultHoles = new Array( countEdges() );\n\n\tdefaultHoles.fill( 1 );\n\n\tstore.commit('updateEdgeHoles', defaultHoles );\n});\n\nonBeforeUnmount(() => {\n\tstore.commit( 'updateEdgeHoles', [] );\n\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\nfunction updateDrillEdgeHoles(value, index) {\n\tconst data = [...drillHoleEdgeHoles.value]; // Make a shallow copy to prevent modifying the original object. This woudl break reactivity.\n\tdata[index] = stripNonNumeric(value);\n\n\tstore.commit( 'updateEdgeHoles', data);\n}\n</script>\n\n<template>\n\t<div class=\"grid\" v-if=\"isMediaMobileSize\">\n\t\t<div v-for=\"(holeInfo, index) in edges\" :key=\"index\" :class=\"{ [holeInfo.side]: true }\">\n\t\t\t<!-- Force this to be text as the arrows make it so that the field doesn't properly fit on mobile. -->\n\t\t\t<dimension-input\n\t\t\t\t:inputRef='`drillHoleEdgeCount_${index}`'\n\t\t\t\t:id='`drillHoleEdgeCount_${index}`'\n\t\t\t\t:name='`drillHoleEdgeCount_${index}`'\n\t\t\t\tinputmode=\"numeric\"\n\t\t\t\ttype=\"text\"\n\t\t\t\t:step=\"1\"\n\t\t\t\t:min=\"0\"\n\t\t\t\t:modelValue=\"holeInfo.holes\"\n\t\t\t\t@update:modelValue=\"updateDrillEdgeHoles($event, index)\"\n\t\t\t\t:invalid=\"false\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div class=\"center\">\n\t\t\t<portal-target name=\"mobile-accordion-preview\" v-if=\"isMediaMobileSize && currentStepName === StepTypes.drillholes\"></portal-target>\n\t\t</div>\n\t</div>\n\t<dimension-input\n\t\tv-else\n\t\tv-for=\"(holeInfo, index) in edges\"\n\t\t:key=\"index\"\n\t\t:inputRef='`drillHoleEdgeCount_${index}`'\n\t\t:id='`drillHoleEdgeCount_${index}`'\n\t\t:name='`drillHoleEdgeCount_${index}`'\n\t\tinputmode=\"numeric\"\n\t\t:step=\"1\"\n\t\t:min=\"0\"\n\t\t:label=\"`${$i18n.drillHoleConfiguration.edge} ${index +1}`\"\n\t\t:modelValue=\"holeInfo.holes\"\n\t\t@update:modelValue=\"updateDrillEdgeHoles($event, index)\"\n\t\t:invalid=\"false\"\n\t/>\n</template>\n\n<style lang=\"scss\">\n\n.center,\n.top,\n.right,\n.bottom,\n.left {\n\tinput[type=number],\n\tinput[type=text] {\n\t\ttext-align: center;\n\t\twidth: 2rem;\n\t\tpadding: 2px !important;\n\t}\n}\n</style>\n\n<style scoped lang=\"scss\">\n\n.grid {\n\tdisplay: grid;\n\tgrid-template-columns: 10% minmax(0, 1fr) 10%;\n\tgrid-template-rows: repeat(3, auto);\n\tgrid-template-areas:\n\t\t\". top .\"\n\t\t\"left center right\"\n\t\t\". bottom .\";\n\tbackground-color: $brand-blue-background;\n\tjustify-items: center;\n\talign-items: center;\n\twidth: 100%;\n\tgrid-column: 1/-1;\n}\n\n.center,\n.top,\n.right,\n.bottom,\n.left {\n\tdisplay: grid;\n\tmax-width: unset;\n\tflex-direction: row;\n\tjustify-content: center;\n\twidth: 100%;\n}\n\n.top {\n\tgrid-area: top;\n}\n\n.right {\n\tgrid-area: right;\n}\n\n.bottom {\n\tgrid-area: bottom;\n}\n\n.left {\n\tgrid-area: left;\n}\n\n.center {\n\tgrid-area: center;\n\twidth: 100%;\n}\n\n</style>\n","import script from \"./DrillHoleEdgeCounts.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoleEdgeCounts.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DrillHoleEdgeCounts.vue?vue&type=style&index=0&id=629c590a&lang=scss\"\nimport \"./DrillHoleEdgeCounts.vue?vue&type=style&index=1&id=629c590a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-629c590a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createVNode as _createVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, unref as _unref, createBlock as _createBlock, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-4c187413\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"measurements-selector__sub-section\" }\nconst _hoisted_2 = { class: \"label\" }\nconst _hoisted_3 = { class: \"measurements-selector__menu\" }\nconst _hoisted_4 = {\n  key: 0,\n  class: \"input-container\"\n}\nconst _hoisted_5 = { class: \"drill-hole-inputs\" }\n\nimport {computed, onBeforeUnmount, onMounted } from \"vue\";\nimport { useStore } from \"vuex\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport {formatForInputField, endsWithSeparator, stripNonNumeric} from \"@/functions/numbers\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport DrillHoleEdgeTypeCorner from \"@/components/icons/DrillHoleEdgeTypeCorner.vue\";\nimport DrillHoleEdgeTypeAround from \"@/components/icons/DrillHoleEdgeTypeAround.vue\";\nimport DrillHoleEdgeTypeTopBottom from \"@/components/icons/DrillHoleEdgeTypeTopBottom.vue\";\nimport DrillHoleEdgeTypeLeftRight from \"@/components/icons/DrillHoleEdgeTypeLeftRight.vue\";\nimport DrillHoleEdgeCounts from \"@/components/DrillHoleEdgeCounts.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoleEdgeTypes',\n  setup(__props) {\n\nconst store = useStore();\n\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst drillHoleEdgeType = computed(() => store.getters.drillHoleEdgeType );\nconst drillHoleTypeEnabled = computed(() => store.getters.drillHoleTypeEnabled );\nconst getEdgeCount = computed(() => store.getters.getEdgeCount );\nconst drillOption = computed(() => store.getters.drillOption );\n\nconst drillHoleOffset = computed({\n\tget: () => formatForInputField( store.getters.drillHoleOffset.in_cm() ),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit( 'updateDrillHoleOffset', Length.from_cm( stripNonNumeric( value ) ).in_mm() );\n\t\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t\t}\n\t},\n});\nconst drillHoleDiameter = computed({\n\tget: () => formatForInputField( store.getters.drillHoleDiameter.in_cm() ),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit( 'updateDrillHoleDiameter', Length.from_cm( stripNonNumeric( value ) ).in_mm() );\n\t\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t\t}\n\t},\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'edge' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'edges' ) {\n\t\treturn;\n\t}\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\nfunction updateDrillHoleEdgeType( type: string ) {\n\tstore.commit( 'updateDrillHoleEdgeType', type );\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", null, [\n    _createElementVNode(\"div\", _hoisted_1, [\n      _createElementVNode(\"p\", _hoisted_2, _toDisplayString(_ctx.$i18n.drillHolesChoosePosition), 1),\n      _createElementVNode(\"div\", _hoisted_3, [\n        (drillHoleTypeEnabled.value('corners'))\n          ? (_openBlock(), _createElementBlock(\"button\", {\n              key: 0,\n              type: \"button\",\n              onClick: _cache[0] || (_cache[0] = ($event: any) => {updateDrillHoleEdgeType('corners');}),\n              class: _normalizeClass({\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-corners\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType.value === \"corners\",\n\t\t\t\t\t})\n            }, [\n              _createVNode(DrillHoleEdgeTypeCorner, { alt: \"\" }),\n              _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.drillHoleEdgeTypes.corners), 1)\n            ], 2))\n          : _createCommentVNode(\"\", true),\n        (drillHoleTypeEnabled.value('around'))\n          ? (_openBlock(), _createElementBlock(\"button\", {\n              key: 1,\n              type: \"button\",\n              onClick: _cache[1] || (_cache[1] = ($event: any) => {updateDrillHoleEdgeType('around');}),\n              class: _normalizeClass({\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-around\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType.value === \"around\",\n\t\t\t\t\t})\n            }, [\n              _createVNode(DrillHoleEdgeTypeAround, { alt: \"\" }),\n              _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.drillHoleEdgeTypes.around), 1)\n            ], 2))\n          : _createCommentVNode(\"\", true),\n        (drillHoleTypeEnabled.value('top_bottom'))\n          ? (_openBlock(), _createElementBlock(\"button\", {\n              key: 2,\n              type: \"button\",\n              onClick: _cache[2] || (_cache[2] = ($event: any) => {updateDrillHoleEdgeType('top_bottom');}),\n              class: _normalizeClass({\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-top_bottom\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType.value === \"top_bottom\",\n\t\t\t\t\t})\n            }, [\n              _createVNode(DrillHoleEdgeTypeTopBottom, { alt: \"\" }),\n              _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.drillHoleEdgeTypes.top_bottom), 1)\n            ], 2))\n          : _createCommentVNode(\"\", true),\n        (drillHoleTypeEnabled.value('left_right'))\n          ? (_openBlock(), _createElementBlock(\"button\", {\n              key: 3,\n              type: \"button\",\n              onClick: _cache[3] || (_cache[3] = ($event: any) => {updateDrillHoleEdgeType('left_right');}),\n              class: _normalizeClass({\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-left_right\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType.value === \"left_right\",\n\t\t\t\t\t})\n            }, [\n              _createVNode(DrillHoleEdgeTypeLeftRight, { alt: \"\" }),\n              _createTextVNode(\" \" + _toDisplayString(_ctx.$i18n.drillHoleEdgeTypes.left_right), 1)\n            ], 2))\n          : _createCommentVNode(\"\", true)\n      ])\n    ]),\n    (drillHoleEdgeType.value !== null)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n          _createElementVNode(\"div\", _hoisted_5, [\n            _createVNode(DimensionInput, {\n              inputRef: \"drillHoleOffset\",\n              id: \"drillHoleOffset\",\n              name: \"drillHoleOffset\",\n              inputmode: \"decimal\",\n              unit: \"cm\",\n              label: _ctx.$i18n.drillHoleConfiguration.distance_from_edge,\n              invalid: !isDrillHoleValid.value('drillHoleOffset'),\n              onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.distance_from_edge, drillHoleOffset.value, 'drill-hole-offset'),\n              modelValue: drillHoleOffset.value,\n              \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((drillHoleOffset).value = $event))\n            }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n            _createVNode(DimensionInput, {\n              inputRef: \"drillHoleDiameter\",\n              id: \"drillHoleDiameter\",\n              name: \"drillHoleDiameter\",\n              inputmode: \"decimal\",\n              unit: \"cm\",\n              min: minimumDrillHoleDiameter.value,\n              label: `${_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole}`,\n              invalid: !isDrillHoleValid.value('drillHoleDiameter'),\n              onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter.value, 'drill-hole-diameter'),\n              modelValue: drillHoleDiameter.value,\n              \"onUpdate:modelValue\": _cache[5] || (_cache[5] = ($event: any) => ((drillHoleDiameter).value = $event))\n            }, null, 8, [\"min\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n            (drillHoleTypeEnabled.value('around') && drillHoleEdgeType.value === 'around' && getEdgeCount.value)\n              ? (_openBlock(), _createBlock(DrillHoleEdgeCounts, { key: 0 }))\n              : _createCommentVNode(\"\", true)\n          ]),\n          _createVNode(MessageContainer, null, {\n            default: _withCtx(() => [\n              (drillOption.value !== 'none')\n                ? (_openBlock(), _createBlock(ValidationMessage, {\n                    key: 0,\n                    type: \"notice\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createTextVNode(_toDisplayString(_ctx.$i18n.drillHolesNotice), 1)\n                    ]),\n                    _: 1\n                  }))\n                : _createCommentVNode(\"\", true),\n              (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(drillHoleFieldsWithMessage(), (field) => {\n                return (_openBlock(), _createBlock(ValidationMessage, {\n                  key: field.key + '-validation-message',\n                  \"input-id\": field.key\n                }, {\n                  default: _withCtx(() => [\n                    _createTextVNode(_toDisplayString(field.message), 1)\n                  ]),\n                  _: 2\n                }, 1032, [\"input-id\"]))\n              }), 128))\n            ]),\n            _: 1\n          })\n        ]))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {computed, onBeforeUnmount, onMounted } from \"vue\";\nimport { useStore } from \"vuex\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport {formatForInputField, endsWithSeparator, stripNonNumeric} from \"@/functions/numbers\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport DrillHoleEdgeTypeCorner from \"@/components/icons/DrillHoleEdgeTypeCorner.vue\";\nimport DrillHoleEdgeTypeAround from \"@/components/icons/DrillHoleEdgeTypeAround.vue\";\nimport DrillHoleEdgeTypeTopBottom from \"@/components/icons/DrillHoleEdgeTypeTopBottom.vue\";\nimport DrillHoleEdgeTypeLeftRight from \"@/components/icons/DrillHoleEdgeTypeLeftRight.vue\";\nimport DrillHoleEdgeCounts from \"@/components/DrillHoleEdgeCounts.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst drillHoleEdgeType = computed(() => store.getters.drillHoleEdgeType );\nconst drillHoleTypeEnabled = computed(() => store.getters.drillHoleTypeEnabled );\nconst getEdgeCount = computed(() => store.getters.getEdgeCount );\nconst drillOption = computed(() => store.getters.drillOption );\n\nconst drillHoleOffset = computed({\n\tget: () => formatForInputField( store.getters.drillHoleOffset.in_cm() ),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit( 'updateDrillHoleOffset', Length.from_cm( stripNonNumeric( value ) ).in_mm() );\n\t\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t\t}\n\t},\n});\nconst drillHoleDiameter = computed({\n\tget: () => formatForInputField( store.getters.drillHoleDiameter.in_cm() ),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit( 'updateDrillHoleDiameter', Length.from_cm( stripNonNumeric( value ) ).in_mm() );\n\t\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t\t}\n\t},\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'edge' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'edges' ) {\n\t\treturn;\n\t}\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\nfunction updateDrillHoleEdgeType( type: string ) {\n\tstore.commit( 'updateDrillHoleEdgeType', type );\n}\n</script>\n\n<template>\n\t<div>\n\t\t<div class=\"measurements-selector__sub-section\">\n\t\t\t<p class=\"label\">{{ $i18n.drillHolesChoosePosition }}</p>\n\t\t\t<div class=\"measurements-selector__menu\">\n\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"drillHoleTypeEnabled('corners')\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tv-on:click=\"updateDrillHoleEdgeType('corners');\"\n\t\t\t\t\tv-bind:class='{\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-corners\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType === \"corners\",\n\t\t\t\t\t}'\n\t\t\t\t>\n\t\t\t\t\t<drill-hole-edge-type-corner alt='' />\n\t\t\t\t\t{{ $i18n.drillHoleEdgeTypes.corners }}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"drillHoleTypeEnabled('around')\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tv-on:click=\"updateDrillHoleEdgeType('around');\"\n\t\t\t\t\tv-bind:class='{\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-around\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType === \"around\",\n\t\t\t\t\t}'\n\t\t\t\t>\n\t\t\t\t\t<drill-hole-edge-type-around alt='' />\n\t\t\t\t\t{{ $i18n.drillHoleEdgeTypes.around }}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"drillHoleTypeEnabled('top_bottom')\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tv-on:click=\"updateDrillHoleEdgeType('top_bottom');\"\n\t\t\t\t\tv-bind:class='{\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-top_bottom\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType === \"top_bottom\",\n\t\t\t\t\t}'\n\t\t\t\t>\n\t\t\t\t\t<drill-hole-edge-type-top-bottom alt='' />\n\t\t\t\t\t{{ $i18n.drillHoleEdgeTypes.top_bottom }}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"drillHoleTypeEnabled('left_right')\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tv-on:click=\"updateDrillHoleEdgeType('left_right');\"\n\t\t\t\t\tv-bind:class='{\n\t\t\t\t\t\t\"measurements-selector__menu-button\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--wide\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button-drill-edge-type-left_right\": true,\n\t\t\t\t\t\t\"measurements-selector__menu-button--active\": drillHoleEdgeType === \"left_right\",\n\t\t\t\t\t}'\n\t\t\t\t>\n\t\t\t\t\t<drill-hole-edge-type-left-right alt='' />\n\t\t\t\t\t{{ $i18n.drillHoleEdgeTypes.left_right }}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"input-container\" v-if=\"drillHoleEdgeType !== null\">\n\t\t\t<div class=\"drill-hole-inputs\">\n\t\t\t\t<dimension-input\n\t\t\t\t\tinputRef=\"drillHoleOffset\"\n\t\t\t\t\tid=\"drillHoleOffset\"\n\t\t\t\t\tname=\"drillHoleOffset\"\n\t\t\t\t\tinputmode=\"decimal\"\n\t\t\t\t\tunit=\"cm\"\n\t\t\t\t\t:label=\"$i18n.drillHoleConfiguration.distance_from_edge\"\n\t\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleOffset')\"\n\t\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.distance_from_edge, drillHoleOffset, 'drill-hole-offset')\"\n\t\t\t\t\tv-model=\"drillHoleOffset\"\n\t\t\t\t/>\n\n\t\t\t\t<dimension-input\n\t\t\t\t\tinputRef=\"drillHoleDiameter\"\n\t\t\t\t\tid=\"drillHoleDiameter\"\n\t\t\t\t\tname=\"drillHoleDiameter\"\n\t\t\t\t\tinputmode=\"decimal\"\n\t\t\t\t\tunit=\"cm\"\n\t\t\t\t\t:min=\"minimumDrillHoleDiameter\"\n\t\t\t\t\t:label=\"`${$i18n.drillHoleConfiguration.diameter_drill_hole}`\"\n\t\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleDiameter')\"\n\t\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter, 'drill-hole-diameter')\"\n\t\t\t\t\tv-model=\"drillHoleDiameter\"\n\t\t\t\t/>\n\n\t\t\t\t<drill-hole-edge-counts v-if=\"drillHoleTypeEnabled('around') && drillHoleEdgeType === 'around' && getEdgeCount\" />\n\t\t\t</div>\n\n\t\t\t<message-container>\n\t\t\t\t<validation-message\n\t\t\t\t\tv-if=\"drillOption !== 'none'\"\n\t\t\t\t\ttype=\"notice\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.drillHolesNotice }}\n\t\t\t\t</validation-message>\n\n\t\t\t\t<validation-message\n\t\t\t\t\tv-for=\"field in drillHoleFieldsWithMessage()\"\n\t\t\t\t\t:key=\"field.key + '-validation-message'\"\n\t\t\t\t\t:input-id=\"field.key\"\n\t\t\t\t>\n\t\t\t\t\t{{ field.message }}\n\t\t\t\t</validation-message>\n\t\t\t</message-container>\n\t\t</div>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.input-container {\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n}\n\n.drill-hole-inputs {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, 1fr);\n\tgap: 12px;\n}\n\n.label {\n\t@include font-size(14px, 16px);\n\tcolor: var(--text-color);\n\tfont-weight: 700;\n\tmargin-bottom: 10px;\n}\n\n</style>\n","import script from \"./DrillHoleEdgeTypes.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoleEdgeTypes.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DrillHoleEdgeTypes.vue?vue&type=style&index=0&id=4c187413&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-4c187413\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, createCommentVNode as _createCommentVNode, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-6122b3b6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"input-container\" }\nconst _hoisted_2 = {\n  key: 0,\n  class: \"editable-list\"\n}\nconst _hoisted_3 = { key: 1 }\nconst _hoisted_4 = { class: \"shape-inputs\" }\n\nimport type {Ref} from \"vue\";\nimport {computed, onBeforeUnmount, ref, watch} from \"vue\";\nimport {useStore} from \"vuex\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEmpty from \"lodash/isEmpty\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport { endsWithSeparator, limitDecimals, stripNonNumeric, toDecimalPoint } from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport EditableItem from \"@/components/EditableItem.vue\";\nimport CustomDrillHole from \"@/Models/CustomDrillHole\";\nimport InputGroup from \"@/components/UI/InputGroup.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoleCustom',\n  setup(__props) {\n\nconst kpsSettings = window.measurementSelectorVariables;\n\nconst activeHole:Ref<CustomDrillHole> = ref({\n\tx: 0,\n\ty: 0,\n\tdiameter: 0,\n});\n\nconst activeIndex: Ref<number|null> = ref(0);\nconst isEditorVisible = ref(true);\nconst isRemoveButtonActive = ref(false);\nconst isEditingExistingHole = ref(false);\nconst listHasHoles = ref(false);\n\nconst store = useStore();\n\nconst customDrillHoles = computed(() => store.getters.customDrillHoles );\nconst editableCustomDrillHoles = computed(() => customDrillHoles.value.filter( ( value: CustomDrillHole, index: number ) => index !== activeIndex.value ) );\nconst drillHoleDiameter = computed(() => store.getters.drillHoleDiameter.in_cm() );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameterLabel = computed(() => store.getters.minimumDrillHoleDiameterLabel );\nconst activeIndexPlusOne = computed(() => activeIndex.value + 1);\n\nconst x = computed({\n\tget: () => activeHole.value.x ? new Length( activeHole.value.x).in_cm(): activeHole.value.x,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.x = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst y = computed({\n\tget: () => activeHole.value.y ? new Length( activeHole.value[\"y\"] ).in_cm() : activeHole.value.y,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.y = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst diameter = computed({\n\tget: () => activeHole.value.diameter ? new Length( activeHole.value[\"diameter\"] ).in_cm() : activeHole.value.diameter,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.diameter = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst getCenter = computed(() => store.getters.getCenter).value;\n\nfunction created(): void {\n\tdocument.addEventListener(\"focusin\", ( event ) =>\n\t\tstore.commit(\"updateFocusedElement\", event )\n\t);\n\n\tconst { drillHoleSettings } = kpsSettings;\n\n\tlet drillHoles = drillHoleSettings.prefilledDrillHoles;\n\n\tif (store.getters.lastGeneratedConfiguration.drillholes?.settings) {\n\t\tdrillHoles = store.getters.lastGeneratedConfiguration.drillholes?.settings;\n\t}\n\n\tif (! isEmpty(drillHoles)) {\n\n\t\t// If we don't set these properties, then we don't have access to the custom drill holes in the sidebar.\n\t\tisEditorVisible.value = false;\n\t\tactiveIndex.value = null;\n\n\t\tsetRemoveButtonActiveState();\n\n\t\treturn;\n\t}\n\n\taddHole();\n\n\tactiveHole.value = customDrillHoles.value[activeIndex.value];\n}\n\nfunction getI18nNumber(value: number): string {\n\treturn new Length(value).in_cm_i18n();\n}\n\nfunction removeHole(index: number): void {\n\tstore.commit(\"removeCustomHole\", index);\n\tactiveIndex.value = null;\n\n\tsetRemoveButtonActiveState();\n}\n\nfunction addHole(): void {\n\tconst center = getCenter(true, 'mm');\n\n\tstore.commit(\"addCustomHole\", {\n\t\tx: center.x,\n\t\ty: center.y,\n\t\tdiameter: Length.from_cm( drillHoleDiameter.value ).in_mm()\n\t});\n}\n\nfunction editHole( holeNumber: number ): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingHole.value = true;\n\tactiveIndex.value = holeNumber;\n}\n\nfunction saveHole(): void {\n\tsetRemoveButtonActiveState();\n\n\tisEditorVisible.value = false;\n\tactiveIndex.value = null;\n}\n\nfunction addNewHole(): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingHole.value = false;\n\tactiveIndex.value = customDrillHoles.value.length;\n\n\taddHole();\n}\n\nfunction setRemoveButtonActiveState(): void {\n\tisRemoveButtonActive.value = customDrillHoles.value.length > 1;\n}\n\nfunction setListHasHoles(index: null|number): boolean {\n\n\t// if no hole is being edited check customDrillHoles length\n\tif (index < 0 || index === null) {\n\t\treturn customDrillHoles.value.length > 0;\n\t}\n\n\t// if a hole is being edited remove active hole from customDrillHoles and check length\n\tconst holes = [...customDrillHoles.value]; // clone customDrillHoles\n\tholes.splice(index, 1);\n\n\treturn holes.length > 0;\n}\n\nwatch(activeIndex, async(index: null|number): Promise<void> => {\n\tactiveHole.value = index !== null ? customDrillHoles.value[index] : {};\n\tlistHasHoles.value = setListHasHoles(index);\n\n\tstore.commit(\"updateCurrentCustomDrillhole\", index);\n} );\n\nwatch(activeHole, async (newValue: CustomDrillHole, oldValue: CustomDrillHole): Promise<void> => {\n\tfor (const key in newValue) {\n\t\tif (! isUndefined(oldValue[key])) {\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false);\n\t\t}\n\n\t\tcustomDrillHoles.value[ activeIndex.value ][ key ] =\n\t\t\ttypeof newValue[key] === \"string\"\n\t\t\t\t? toDecimalPoint( newValue[ key ] )\n\t\t\t\t: newValue[key];\n\t}\n} );\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", () =>\n\t\tstore.commit(\"updateFocusedElement\")\n\t);\n\n\tstore.commit(\"resetCustomHoles\");\n\tstore.commit(\"forceRefresh\");\n});\n\ncreated();\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (listHasHoles.value)\n      ? (_openBlock(), _createElementBlock(\"ul\", _hoisted_2, [\n          (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(editableCustomDrillHoles.value, (hole, index) => {\n            return (_openBlock(), _createElementBlock(\"li\", {\n              class: \"editable-list__item\",\n              key: `hole-${index}`\n            }, [\n              _createVNode(EditableItem, {\n                edit: { index, title: _ctx.$i18n.drillHoleConfiguration.edit_hole, disabled: isEditorVisible.value, onClick: editHole, hidden: false, },\n                remove: { index, title: _ctx.$i18n.drillHoleConfiguration.remove_hole, disabled: !isRemoveButtonActive.value, onClick: removeHole, hidden: false }\n              }, {\n                default: _withCtx(() => [\n                  _createTextVNode(_toDisplayString(_ctx.$i18n.drillHoleConfiguration.singular_hole) + \" \" + _toDisplayString(index + 1) + \" \", 1),\n                  _createElementVNode(\"strong\", null, \" X - \" + _toDisplayString(getI18nNumber( hole.x )) + \" | Y - \" + _toDisplayString(getI18nNumber( hole.y )) + \" | \" + _toDisplayString(_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole_short) + \" - \" + _toDisplayString(getI18nNumber( hole.diameter )), 1)\n                ]),\n                _: 2\n              }, 1032, [\"edit\", \"remove\"])\n            ]))\n          }), 128))\n        ]))\n      : _createCommentVNode(\"\", true),\n    (isEditorVisible.value)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n          _createElementVNode(\"div\", _hoisted_4, [\n            _createVNode(DimensionInput, {\n              inputRef: \"drillHoleOffsetX\",\n              id: \"drillHoleOffsetX\",\n              name: \"drillHoleOffsetX\",\n              unit: \"cm\",\n              label: _ctx.$i18n.drillHoleConfiguration.distance_from_edge_left,\n              invalid: !isDrillHoleValid.value('drillHoleOffsetX', activeIndexPlusOne.value),\n              modelValue: x.value,\n              \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((x).value = $event))\n            }, null, 8, [\"label\", \"invalid\", \"modelValue\"]),\n            _createVNode(DimensionInput, {\n              inputRef: \"drillHoleOffsetY\",\n              id: \"drillHoleOffsetY\",\n              name: \"drillHoleOffsetY\",\n              unit: \"cm\",\n              label: _ctx.$i18n.drillHoleConfiguration.distance_from_edge_bottom,\n              invalid: !isDrillHoleValid.value('drillHoleOffsetY', activeIndexPlusOne.value),\n              modelValue: y.value,\n              \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((y).value = $event))\n            }, null, 8, [\"label\", \"invalid\", \"modelValue\"]),\n            _createVNode(DimensionInput, {\n              inputRef: \"drillHoleDiameter\",\n              id: \"drillHoleDiameter\",\n              name: \"drillHoleDiameter\",\n              unit: \"cm\",\n              label: `${_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole} (${minimumDrillHoleDiameterLabel.value})`,\n              invalid: !isDrillHoleValid.value('drillHoleDiameter', activeIndexPlusOne.value),\n              modelValue: diameter.value,\n              \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((diameter).value = $event))\n            }, null, 8, [\"label\", \"invalid\", \"modelValue\"]),\n            _createVNode(InputGroup, { \"flex-justify\": \"bottom\" }, {\n              default: _withCtx(() => [\n                _createElementVNode(\"button\", {\n                  type: \"button\",\n                  onClick: _cache[3] || (_cache[3] = ($event: any) => {saveHole();}),\n                  class: \"measurements-selector__button-add\"\n                }, _toDisplayString(isEditingExistingHole.value ? _ctx.$i18n.drillHoleConfiguration.edit_hole : _ctx.$i18n.drillHoleConfiguration.add_hole), 1)\n              ]),\n              _: 1\n            })\n          ]),\n          _createVNode(MessageContainer, null, {\n            default: _withCtx(() => [\n              (!isDrillHoleValid.value(`drillHoleDiameter_${activeIndexPlusOne.value}`))\n                ? (_openBlock(), _createBlock(ValidationMessage, {\n                    key: 0,\n                    \"input-id\": \"drillHoleDiameter\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createTextVNode(_toDisplayString(getDrillHoleValidationMessage.value(`drillHoleDiameter_${activeIndexPlusOne.value}`)), 1)\n                    ]),\n                    _: 1\n                  }))\n                : _createCommentVNode(\"\", true),\n              (!isDrillHoleValid.value(`drillHoleOffsetX`, activeIndexPlusOne.value))\n                ? (_openBlock(), _createBlock(ValidationMessage, {\n                    key: 1,\n                    \"input-id\": \"drillHoleOffsetX\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createTextVNode(_toDisplayString(getDrillHoleValidationMessage.value(`drillHoleOffsetX`, activeIndexPlusOne.value)), 1)\n                    ]),\n                    _: 1\n                  }))\n                : _createCommentVNode(\"\", true),\n              (!isDrillHoleValid.value(`drillHoleOffsetY`, activeIndexPlusOne.value))\n                ? (_openBlock(), _createBlock(ValidationMessage, {\n                    key: 2,\n                    \"input-id\": \"drillHoleOffsetY\"\n                  }, {\n                    default: _withCtx(() => [\n                      _createTextVNode(_toDisplayString(getDrillHoleValidationMessage.value(`drillHoleOffsetY`, activeIndexPlusOne.value)), 1)\n                    ]),\n                    _: 1\n                  }))\n                : _createCommentVNode(\"\", true)\n            ]),\n            _: 1\n          })\n        ]))\n      : _createCommentVNode(\"\", true),\n    (!isEditorVisible.value)\n      ? (_openBlock(), _createBlock(InputGroup, {\n          key: 2,\n          \"flex-justify\": \"bottom\"\n        }, {\n          default: _withCtx(() => [\n            _createElementVNode(\"button\", {\n              type: \"button\",\n              onClick: _cache[4] || (_cache[4] = ($event: any) => {addNewHole();}),\n              class: \"measurements-selector__button-add\"\n            }, _toDisplayString(_ctx.$i18n.drillHoleConfiguration.add_hole_long), 1)\n          ]),\n          _: 1\n        }))\n      : _createCommentVNode(\"\", true),\n    (! isDrillHoleValid.value(`drillHoleUnique_${activeIndexPlusOne.value}`))\n      ? (_openBlock(), _createBlock(ValidationMessage, { key: 3 }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(getDrillHoleValidationMessage.value(`drillHoleUnique_${activeIndexPlusOne.value}`)), 1)\n          ]),\n          _: 1\n        }))\n      : _createCommentVNode(\"\", true),\n    (! isDrillHoleValid.value(`drillHoleMissing_${activeIndexPlusOne.value}`))\n      ? (_openBlock(), _createBlock(ValidationMessage, { key: 4 }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(getDrillHoleValidationMessage.value(`drillHoleMissing_${activeIndexPlusOne.value}`)), 1)\n          ]),\n          _: 1\n        }))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport type {Ref} from \"vue\";\nimport {computed, onBeforeUnmount, ref, watch} from \"vue\";\nimport {useStore} from \"vuex\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEmpty from \"lodash/isEmpty\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport { endsWithSeparator, limitDecimals, stripNonNumeric, toDecimalPoint } from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport EditableItem from \"@/components/EditableItem.vue\";\nimport CustomDrillHole from \"@/Models/CustomDrillHole\";\nimport InputGroup from \"@/components/UI/InputGroup.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst kpsSettings = window.measurementSelectorVariables;\n\nconst activeHole:Ref<CustomDrillHole> = ref({\n\tx: 0,\n\ty: 0,\n\tdiameter: 0,\n});\n\nconst activeIndex: Ref<number|null> = ref(0);\nconst isEditorVisible = ref(true);\nconst isRemoveButtonActive = ref(false);\nconst isEditingExistingHole = ref(false);\nconst listHasHoles = ref(false);\n\nconst store = useStore();\n\nconst customDrillHoles = computed(() => store.getters.customDrillHoles );\nconst editableCustomDrillHoles = computed(() => customDrillHoles.value.filter( ( value: CustomDrillHole, index: number ) => index !== activeIndex.value ) );\nconst drillHoleDiameter = computed(() => store.getters.drillHoleDiameter.in_cm() );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameterLabel = computed(() => store.getters.minimumDrillHoleDiameterLabel );\nconst activeIndexPlusOne = computed(() => activeIndex.value + 1);\n\nconst x = computed({\n\tget: () => activeHole.value.x ? new Length( activeHole.value.x).in_cm(): activeHole.value.x,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.x = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst y = computed({\n\tget: () => activeHole.value.y ? new Length( activeHole.value[\"y\"] ).in_cm() : activeHole.value.y,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.y = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst diameter = computed({\n\tget: () => activeHole.value.diameter ? new Length( activeHole.value[\"diameter\"] ).in_cm() : activeHole.value.diameter,\n\tset: (value: string|number) => {\n\t\tif(!endsWithSeparator(value)) {\n\t\t\tactiveHole.value.diameter = Length.from_cm(limitDecimals(stripNonNumeric(value), 1)).in_mm();\n\t\t}\n\t}\n});\nconst getCenter = computed(() => store.getters.getCenter).value;\n\nfunction created(): void {\n\tdocument.addEventListener(\"focusin\", ( event ) =>\n\t\tstore.commit(\"updateFocusedElement\", event )\n\t);\n\n\tconst { drillHoleSettings } = kpsSettings;\n\n\tlet drillHoles = drillHoleSettings.prefilledDrillHoles;\n\n\tif (store.getters.lastGeneratedConfiguration.drillholes?.settings) {\n\t\tdrillHoles = store.getters.lastGeneratedConfiguration.drillholes?.settings;\n\t}\n\n\tif (! isEmpty(drillHoles)) {\n\n\t\t// If we don't set these properties, then we don't have access to the custom drill holes in the sidebar.\n\t\tisEditorVisible.value = false;\n\t\tactiveIndex.value = null;\n\n\t\tsetRemoveButtonActiveState();\n\n\t\treturn;\n\t}\n\n\taddHole();\n\n\tactiveHole.value = customDrillHoles.value[activeIndex.value];\n}\n\nfunction getI18nNumber(value: number): string {\n\treturn new Length(value).in_cm_i18n();\n}\n\nfunction removeHole(index: number): void {\n\tstore.commit(\"removeCustomHole\", index);\n\tactiveIndex.value = null;\n\n\tsetRemoveButtonActiveState();\n}\n\nfunction addHole(): void {\n\tconst center = getCenter(true, 'mm');\n\n\tstore.commit(\"addCustomHole\", {\n\t\tx: center.x,\n\t\ty: center.y,\n\t\tdiameter: Length.from_cm( drillHoleDiameter.value ).in_mm()\n\t});\n}\n\nfunction editHole( holeNumber: number ): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingHole.value = true;\n\tactiveIndex.value = holeNumber;\n}\n\nfunction saveHole(): void {\n\tsetRemoveButtonActiveState();\n\n\tisEditorVisible.value = false;\n\tactiveIndex.value = null;\n}\n\nfunction addNewHole(): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingHole.value = false;\n\tactiveIndex.value = customDrillHoles.value.length;\n\n\taddHole();\n}\n\nfunction setRemoveButtonActiveState(): void {\n\tisRemoveButtonActive.value = customDrillHoles.value.length > 1;\n}\n\nfunction setListHasHoles(index: null|number): boolean {\n\n\t// if no hole is being edited check customDrillHoles length\n\tif (index < 0 || index === null) {\n\t\treturn customDrillHoles.value.length > 0;\n\t}\n\n\t// if a hole is being edited remove active hole from customDrillHoles and check length\n\tconst holes = [...customDrillHoles.value]; // clone customDrillHoles\n\tholes.splice(index, 1);\n\n\treturn holes.length > 0;\n}\n\nwatch(activeIndex, async(index: null|number): Promise<void> => {\n\tactiveHole.value = index !== null ? customDrillHoles.value[index] : {};\n\tlistHasHoles.value = setListHasHoles(index);\n\n\tstore.commit(\"updateCurrentCustomDrillhole\", index);\n} );\n\nwatch(activeHole, async (newValue: CustomDrillHole, oldValue: CustomDrillHole): Promise<void> => {\n\tfor (const key in newValue) {\n\t\tif (! isUndefined(oldValue[key])) {\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false);\n\t\t}\n\n\t\tcustomDrillHoles.value[ activeIndex.value ][ key ] =\n\t\t\ttypeof newValue[key] === \"string\"\n\t\t\t\t? toDecimalPoint( newValue[ key ] )\n\t\t\t\t: newValue[key];\n\t}\n} );\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", () =>\n\t\tstore.commit(\"updateFocusedElement\")\n\t);\n\n\tstore.commit(\"resetCustomHoles\");\n\tstore.commit(\"forceRefresh\");\n});\n\ncreated();\n\n</script>\n\n<template>\n\t<div class=\"input-container\">\n\t\t<ul class=\"editable-list\" v-if=\"listHasHoles\">\n\t\t\t<li\n\t\t\t\tclass=\"editable-list__item\"\n\t\t\t\tv-for=\"(hole, index) in editableCustomDrillHoles\"\n\t\t\t\t:key=\"`hole-${index}`\"\n\t\t\t>\n\t\t\t\t<EditableItem\n\t\t\t\t\t:edit=\"{ index, title: $i18n.drillHoleConfiguration.edit_hole, disabled: isEditorVisible, onClick: editHole, hidden: false, }\"\n\t\t\t\t\t:remove=\"{ index, title: $i18n.drillHoleConfiguration.remove_hole, disabled: !isRemoveButtonActive, onClick: removeHole, hidden: false }\"\n\t\t\t\t>\n\n\t\t\t\t\t{{ $i18n.drillHoleConfiguration.singular_hole }} {{ index + 1 }}\n\t\t\t\t\t<strong>\n\t\t\t\t\t\tX - {{ getI18nNumber( hole.x ) }} |\n\t\t\t\t\t\tY - {{ getI18nNumber( hole.y ) }} |\n\t\t\t\t\t\t{{ $i18n.drillHoleConfiguration.diameter_drill_hole_short }} - {{ getI18nNumber( hole.diameter ) }}\n\t\t\t\t\t</strong>\n\t\t\t\t</EditableItem>\n\t\t\t</li>\n\t\t</ul>\n\t\t<div v-if=\"isEditorVisible\">\n\t\t\t<div class=\"shape-inputs\">\n\t\t\t\t<dimension-input\n\t\t\t\t\tinputRef=\"drillHoleOffsetX\"\n\t\t\t\t\tid=\"drillHoleOffsetX\"\n\t\t\t\t\tname=\"drillHoleOffsetX\"\n\t\t\t\t\tunit=\"cm\"\n\t\t\t\t\t:label=\"$i18n.drillHoleConfiguration.distance_from_edge_left\"\n\t\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleOffsetX', activeIndexPlusOne)\"\n\t\t\t\t\tv-model=\"x\"\n\t\t\t\t/>\n\n\t\t\t\t<dimension-input\n\t\t\t\t\tinputRef=\"drillHoleOffsetY\"\n\t\t\t\t\tid=\"drillHoleOffsetY\"\n\t\t\t\t\tname=\"drillHoleOffsetY\"\n\t\t\t\t\tunit=\"cm\"\n\t\t\t\t\t:label=\"$i18n.drillHoleConfiguration.distance_from_edge_bottom\"\n\t\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleOffsetY', activeIndexPlusOne)\"\n\t\t\t\t\tv-model=\"y\"\n\t\t\t\t/>\n\n\t\t\t\t<dimension-input\n\t\t\t\t\tinputRef=\"drillHoleDiameter\"\n\t\t\t\t\tid=\"drillHoleDiameter\"\n\t\t\t\t\tname=\"drillHoleDiameter\"\n\t\t\t\t\tunit=\"cm\"\n\t\t\t\t\t:label=\"`${$i18n.drillHoleConfiguration.diameter_drill_hole} (${minimumDrillHoleDiameterLabel})`\"\n\t\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleDiameter', activeIndexPlusOne)\"\n\t\t\t\t\tv-model=\"diameter\"\n\t\t\t\t/>\n\n\t\t\t\t<input-group flex-justify=\"bottom\">\n\t\t\t\t\t<button type=\"button\" v-on:click=\"saveHole();\" class=\"measurements-selector__button-add\">\n\t\t\t\t\t\t{{ isEditingExistingHole ? $i18n.drillHoleConfiguration.edit_hole : $i18n.drillHoleConfiguration.add_hole }}\n\t\t\t\t\t</button>\n\t\t\t\t</input-group>\n\t\t\t</div>\n\n\t\t\t<message-container>\n\t\t\t\t<!-- Message for drillHoleDiameter -->\n\t\t\t\t<validation-message\n\t\t\t\t\tv-if=\"!isDrillHoleValid(`drillHoleDiameter_${activeIndexPlusOne}`)\"\n\t\t\t\t\tinput-id=\"drillHoleDiameter\"\n\t\t\t\t>\n\t\t\t\t\t{{ getDrillHoleValidationMessage(`drillHoleDiameter_${activeIndexPlusOne}`) }}\n\t\t\t\t</validation-message>\n\n\t\t\t\t<validation-message\n\t\t\t\t\tv-if=\"!isDrillHoleValid(`drillHoleOffsetX`, activeIndexPlusOne)\"\n\t\t\t\t\tinput-id=\"drillHoleOffsetX\"\n\t\t\t\t>\n\t\t\t\t\t{{ getDrillHoleValidationMessage(`drillHoleOffsetX`, activeIndexPlusOne) }}\n\t\t\t\t</validation-message>\n\n\t\t\t\t<validation-message\n\t\t\t\t\tv-if=\"!isDrillHoleValid(`drillHoleOffsetY`, activeIndexPlusOne)\"\n\t\t\t\t\tinput-id=\"drillHoleOffsetY\"\n\t\t\t\t>\n\t\t\t\t\t{{ getDrillHoleValidationMessage(`drillHoleOffsetY`, activeIndexPlusOne) }}\n\t\t\t\t</validation-message>\n\t\t\t</message-container>\n\t\t</div>\n\n\t\t<input-group v-if=\"!isEditorVisible\" flex-justify=\"bottom\">\n\t\t\t<button type=\"button\" v-on:click=\"addNewHole();\" class=\"measurements-selector__button-add\">\n\t\t\t\t{{ $i18n.drillHoleConfiguration.add_hole_long }}\n\t\t\t</button>\n\t\t</input-group>\n\n\t\t<validation-message\n\t\t\tv-if=\"! isDrillHoleValid(`drillHoleUnique_${activeIndexPlusOne}`)\"\n\t\t>\n\t\t\t{{ getDrillHoleValidationMessage(`drillHoleUnique_${activeIndexPlusOne}`) }}\n\t\t</validation-message>\n\n\t\t<validation-message\n\t\t\tv-if=\"! isDrillHoleValid(`drillHoleMissing_${activeIndexPlusOne}`)\"\n\t\t>\n\t\t\t{{ getDrillHoleValidationMessage(`drillHoleMissing_${activeIndexPlusOne}`) }}\n\t\t</validation-message>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.input-container {\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n\tmargin-top: 20px;\n\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 10px;\n\tgrid-column: 1/-1;\n\tjustify-content: space-between;\n\tmin-width: 0;\n}\n\n.shape-inputs {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, 1fr);\n\tgap: 12px;\n}\n</style>\n","import script from \"./DrillHoleCustom.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoleCustom.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DrillHoleCustom.vue?vue&type=style&index=0&id=6122b3b6&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6122b3b6\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-4373032a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"input-container\" }\nconst _hoisted_2 = { class: \"drill-hole-inputs\" }\n\nimport {computed, onBeforeMount, onBeforeUnmount} from \"vue\";\nimport { useStore } from \"vuex\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport {stripNonNumeric, endsWithSeparator, limitDecimals, toNumber} from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoleRadialSettings',\n  setup(__props) {\n\nconst store = useStore();\n\nconst enclosingRectangle = computed(() => store.getters.enclosingRectangle );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\n\nconst drillOption = computed(() => store.getters.drillOption);\nconst drillHoleRadialAmount = computed({\n\tget: () => store.getters.drillHoleRadialAmount,\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit('updateDrillHoleRadialAmount', toNumber(stripNonNumeric(value)));\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleDiameter = computed({\n\tget: () => store.getters.drillHoleDiameter.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleDiameter', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialDiameter = computed({\n\tget: () => store.getters.drillHoleRadialDiameter.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialDiameter', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialOffsetX = computed({\n\tget: () => store.getters.drillHoleRadialOffsetX.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialOffsetX', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialOffsetY = computed({\n\tget: () => store.getters.drillHoleRadialOffsetY.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialOffsetY', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\nconst getCenter = computed(() => store.getters.getCenter).value;\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'radial' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonBeforeMount(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'radial' ) {\n\t\treturn;\n\t}\n\n\tconst radialDiameter = Length.from_cm( enclosingRectangle.value.width ).min( Length.from_cm( enclosingRectangle.value.height ) ).subtract( new Length( 30 ) );\n\tconst center = getCenter(true, 'mm');\n\n\tawait store.dispatch( 'updateDrillHolesFromConfig', {\n\t\ttype: 'radial',\n\t\tdiameter: Length.from_cm( drillHoleDiameter.value ).round( 1 ).in_mm(),\n\t\tamount: drillHoleRadialAmount.value,\n\t\tposition: {\n\t\t\tleft: center.x,\n\t\t\tbottom: center.y,\n\t\t},\n\t\tradialDiameter: radialDiameter.divide( 2 ).round( 0 ).in_mm()\n\t} );\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleRadialAmount\",\n        id: \"drillHoleRadialAmount\",\n        name: \"drillHoleRadialAmount\",\n        inputmode: \"numeric\",\n        min: 1,\n        label: _ctx.$i18n.drillHoleConfiguration.radial.amount,\n        invalid: !isDrillHoleValid.value('drillHoleRadialAmount'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.radial.amount, drillHoleRadialAmount.value, 'radial-drill-hole'),\n        modelValue: drillHoleRadialAmount.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((drillHoleRadialAmount).value = $event)),\n        step: 1\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleDiameter\",\n        id: \"drillHoleDiameter\",\n        name: \"drillHoleDiameter\",\n        unit: \"cm\",\n        min: minimumDrillHoleDiameter.value,\n        label: `${_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole}`,\n        invalid: !isDrillHoleValid.value('drillHoleDiameter'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter.value, 'radial-drill-hole'),\n        modelValue: drillHoleDiameter.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((drillHoleDiameter).value = $event))\n      }, null, 8, [\"min\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleRadialDiameter\",\n        id: \"drillHoleRadialDiameter\",\n        name: \"drillHoleRadialDiameter\",\n        unit: \"cm\",\n        label: _ctx.$i18n.drillHoleConfiguration.radial.diameter_from_center,\n        invalid: !isDrillHoleValid.value('drillHoleRadialDiameter'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.radial.diameter_from_center, drillHoleRadialDiameter.value, 'radial-drill-hole'),\n        modelValue: drillHoleRadialDiameter.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((drillHoleRadialDiameter).value = $event))\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleRadialOffsetX\",\n        id: \"drillHoleRadialOffsetX\",\n        name: \"drillHoleRadialOffsetX\",\n        unit: \"cm\",\n        label: _ctx.$i18n.drillHoleConfiguration.radial.offset_x,\n        invalid: !isDrillHoleValid.value('drillHoleRadialOffsetX'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.radial.offset_x, drillHoleRadialOffsetX.value, 'radial-drill-hole'),\n        modelValue: drillHoleRadialOffsetX.value,\n        \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((drillHoleRadialOffsetX).value = $event)),\n        class: \"half-width\"\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleRadialOffsetY\",\n        id: \"drillHoleRadialOffsetY\",\n        name: \"drillHoleRadialOffsetY\",\n        unit: \"cm\",\n        label: _ctx.$i18n.drillHoleConfiguration.radial.offset_y,\n        invalid: !isDrillHoleValid.value('drillHoleRadialOffsetY'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.radial.offset_y, drillHoleRadialOffsetY.value, 'radial-drill-hole'),\n        modelValue: drillHoleRadialOffsetY.value,\n        \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((drillHoleRadialOffsetY).value = $event)),\n        class: \"half-width\"\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (drillOption.value !== 'none')\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.drillHolesNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(drillHoleFieldsWithMessage(), (field) => {\n          return (_openBlock(), _createBlock(ValidationMessage, {\n            key: field.key + '-validation-message',\n            \"input-id\": field.key\n          }, {\n            default: _withCtx(() => [\n              _createTextVNode(_toDisplayString(field.message), 1)\n            ]),\n            _: 2\n          }, 1032, [\"input-id\"]))\n        }), 128))\n      ]),\n      _: 1\n    })\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {computed, onBeforeMount, onBeforeUnmount} from \"vue\";\nimport { useStore } from \"vuex\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport {stripNonNumeric, endsWithSeparator, limitDecimals, toNumber} from \"@/functions/numbers\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst enclosingRectangle = computed(() => store.getters.enclosingRectangle );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\n\nconst drillOption = computed(() => store.getters.drillOption);\nconst drillHoleRadialAmount = computed({\n\tget: () => store.getters.drillHoleRadialAmount,\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit('updateDrillHoleRadialAmount', toNumber(stripNonNumeric(value)));\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleDiameter = computed({\n\tget: () => store.getters.drillHoleDiameter.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleDiameter', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialDiameter = computed({\n\tget: () => store.getters.drillHoleRadialDiameter.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialDiameter', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialOffsetX = computed({\n\tget: () => store.getters.drillHoleRadialOffsetX.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialOffsetX', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\n\nconst drillHoleRadialOffsetY = computed({\n\tget: () => store.getters.drillHoleRadialOffsetY.round( 0 ).in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit('updateDrillHoleRadialOffsetY', Length.from_cm( limitDecimals( stripNonNumeric(value), 1 ) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultDrillHoleDimensions', false);\n\t\t}\n\t}\n});\nconst getCenter = computed(() => store.getters.getCenter).value;\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'radial' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonBeforeMount(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'radial' ) {\n\t\treturn;\n\t}\n\n\tconst radialDiameter = Length.from_cm( enclosingRectangle.value.width ).min( Length.from_cm( enclosingRectangle.value.height ) ).subtract( new Length( 30 ) );\n\tconst center = getCenter(true, 'mm');\n\n\tawait store.dispatch( 'updateDrillHolesFromConfig', {\n\t\ttype: 'radial',\n\t\tdiameter: Length.from_cm( drillHoleDiameter.value ).round( 1 ).in_mm(),\n\t\tamount: drillHoleRadialAmount.value,\n\t\tposition: {\n\t\t\tleft: center.x,\n\t\t\tbottom: center.y,\n\t\t},\n\t\tradialDiameter: radialDiameter.divide( 2 ).round( 0 ).in_mm()\n\t} );\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\n</script>\n\n<template>\n\t<div class=\"input-container\">\n\t\t<div class=\"drill-hole-inputs\">\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleRadialAmount\"\n\t\t\t\tid=\"drillHoleRadialAmount\"\n\t\t\t\tname=\"drillHoleRadialAmount\"\n\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t:min=\"1\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.radial.amount\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleRadialAmount')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.radial.amount, drillHoleRadialAmount, 'radial-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleRadialAmount\"\n\t\t\t\t:step=\"1\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleDiameter\"\n\t\t\t\tid=\"drillHoleDiameter\"\n\t\t\t\tname=\"drillHoleDiameter\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:min=\"minimumDrillHoleDiameter\"\n\t\t\t\t:label=\"`${$i18n.drillHoleConfiguration.diameter_drill_hole}`\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleDiameter')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter, 'radial-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleDiameter\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleRadialDiameter\"\n\t\t\t\tid=\"drillHoleRadialDiameter\"\n\t\t\t\tname=\"drillHoleRadialDiameter\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.radial.diameter_from_center\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleRadialDiameter')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.radial.diameter_from_center, drillHoleRadialDiameter, 'radial-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleRadialDiameter\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleRadialOffsetX\"\n\t\t\t\tid=\"drillHoleRadialOffsetX\"\n\t\t\t\tname=\"drillHoleRadialOffsetX\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.radial.offset_x\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleRadialOffsetX')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.radial.offset_x, drillHoleRadialOffsetX, 'radial-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleRadialOffsetX\"\n\t\t\t\tclass=\"half-width\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleRadialOffsetY\"\n\t\t\t\tid=\"drillHoleRadialOffsetY\"\n\t\t\t\tname=\"drillHoleRadialOffsetY\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.radial.offset_y\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleRadialOffsetY')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.radial.offset_y, drillHoleRadialOffsetY, 'radial-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleRadialOffsetY\"\n\t\t\t\tclass=\"half-width\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<message-container>\n\t\t\t<validation-message\n\t\t\t\tv-if=\"drillOption !== 'none'\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.drillHolesNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-for=\"field in drillHoleFieldsWithMessage()\"\n\t\t\t\t:key=\"field.key + '-validation-message'\"\n\t\t\t\t:input-id=\"field.key\"\n\t\t\t>\n\t\t\t\t{{ field.message }}\n\t\t\t</validation-message>\n\t\t</message-container>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.input-container {\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n}\n\n.drill-hole-inputs {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(6, 1fr);\n\tgap: 12px;\n}\n\n.dimension-input {\n\tgrid-column: span 2;\n}\n\n.dimension-input.half-width {\n\tgrid-column: span 3;\n}\n</style>\n","import script from \"./DrillHoleRadialSettings.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoleRadialSettings.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DrillHoleRadialSettings.vue?vue&type=style&index=0&id=4373032a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-4373032a\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, renderList as _renderList, Fragment as _Fragment, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-557f9a68\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"input-container\" }\nconst _hoisted_2 = { class: \"drill-hole-inputs\" }\n\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { endsWithSeparator, limitDecimals } from \"@/functions/numbers\";\nimport {computed, onBeforeUnmount, onMounted} from \"vue\";\nimport { useStore } from \"vuex\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoleGridSettings',\n  setup(__props) {\n\nconst store = useStore();\n\nconst drillOption = computed(() => store.getters.drillOption );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst hasDrillHoleValidatorErrors = computed(() => store.getters.hasDrillHoleValidatorErrors );\n\nconst drillHoleDiameter = computed({\n\tget: () => store.getters.drillHoleDiameter.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit(\"updateDrillHoleDiameter\", Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleHorizontalAmount = computed({\n\tget: () => store.getters.drillHoleHorizontalAmount,\n\tset: (value: number|string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit(\"updateDrillHoleHorizontalAmount\", value);\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleVerticalAmount = computed({\n\tget: () => store.getters.drillHoleVerticalAmount,\n\tset: (value: number|string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit(\"updateDrillHoleVerticalAmount\", value);\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleOffset = computed({\n\tget: () => store.getters.drillHoleOffset.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit(\"updateDrillHoleOffset\", Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'grid' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'grid' ) {\n\t\treturn;\n\t}\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createElementVNode(\"div\", _hoisted_2, [\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleHorizontalAmount\",\n        id: \"drillHoleHorizontalAmount\",\n        name: \"drillHoleHorizontalAmount\",\n        inputmode: \"numeric\",\n        min: 1,\n        max: 1000,\n        label: _ctx.$i18n.drillHoleConfiguration.grid.holes_amount_horizontally,\n        invalid: !isDrillHoleValid.value('drillHoleHorizontalAmount'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.grid.holes_amount_horizontally, drillHoleHorizontalAmount.value, 'grid-drill-hole'),\n        modelValue: drillHoleHorizontalAmount.value,\n        \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((drillHoleHorizontalAmount).value = $event)),\n        step: 1\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleVerticalAmount\",\n        id: \"drillHoleVerticalAmount\",\n        name: \"drillHoleVerticalAmount\",\n        inputmode: \"numeric\",\n        min: 1,\n        max: 1000,\n        label: _ctx.$i18n.drillHoleConfiguration.grid.holes_amount_vertically,\n        invalid: !isDrillHoleValid.value('drillHoleVerticalAmount'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.grid.holes_amount_vertically, drillHoleVerticalAmount.value, 'grid-drill-hole'),\n        modelValue: drillHoleVerticalAmount.value,\n        \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((drillHoleVerticalAmount).value = $event)),\n        step: 1\n      }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleDiameter\",\n        id: \"drillHoleDiameter\",\n        name: \"drillHoleDiameter\",\n        unit: \"cm\",\n        min: minimumDrillHoleDiameter.value,\n        label: `${_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole}`,\n        invalid: !isDrillHoleValid.value('drillHoleDiameter'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter.value, 'grid-drill-hole'),\n        modelValue: drillHoleDiameter.value,\n        \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((drillHoleDiameter).value = $event))\n      }, null, 8, [\"min\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n      _createVNode(DimensionInput, {\n        inputRef: \"drillHoleOffset\",\n        id: \"drillHoleOffset\",\n        name: \"drillHoleOffset\",\n        unit: \"cm\",\n        min: minimumDrillHoleDiameter.value,\n        label: `${_ctx.$i18n.drillHoleConfiguration.distance_from_edge}`,\n        invalid: !isDrillHoleValid.value('drillHoleOffset'),\n        onBlur: () => _unref(addSizeToDataLayer)(_ctx.$i18n.drillHoleConfiguration.distance_from_edge, drillHoleOffset.value, 'grid-drill-hole'),\n        modelValue: drillHoleOffset.value,\n        \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((drillHoleOffset).value = $event))\n      }, null, 8, [\"min\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"])\n    ]),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (drillOption.value !== 'none')\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.drillHolesNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(drillHoleFieldsWithMessage(), (field) => {\n          return (_openBlock(), _createBlock(ValidationMessage, {\n            key: field.key + '-validation-message',\n            \"input-id\": field.key\n          }, {\n            default: _withCtx(() => [\n              _createTextVNode(_toDisplayString(field.message), 1)\n            ]),\n            _: 2\n          }, 1032, [\"input-id\"]))\n        }), 128))\n      ]),\n      _: 1\n    })\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { endsWithSeparator, limitDecimals } from \"@/functions/numbers\";\nimport {computed, onBeforeUnmount, onMounted} from \"vue\";\nimport { useStore } from \"vuex\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DrillHoleConfigurationFactory from \"@/Models/DrillHoleConfigurations/DrillHoleConfigurationFactory\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst drillOption = computed(() => store.getters.drillOption );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid );\nconst getDrillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage );\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration );\nconst hasDrillHoleValidatorErrors = computed(() => store.getters.hasDrillHoleValidatorErrors );\n\nconst drillHoleDiameter = computed({\n\tget: () => store.getters.drillHoleDiameter.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit(\"updateDrillHoleDiameter\", Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleHorizontalAmount = computed({\n\tget: () => store.getters.drillHoleHorizontalAmount,\n\tset: (value: number|string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit(\"updateDrillHoleHorizontalAmount\", value);\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleVerticalAmount = computed({\n\tget: () => store.getters.drillHoleVerticalAmount,\n\tset: (value: number|string) => {\n\t\tif ( ! endsWithSeparator( value ) && value !== '' ) {\n\t\t\tstore.commit(\"updateDrillHoleVerticalAmount\", value);\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\nconst drillHoleOffset = computed({\n\tget: () => store.getters.drillHoleOffset.in_cm(),\n\tset: (value: string) => {\n\t\tif ( ! endsWithSeparator( value ) ) {\n\t\t\tstore.commit(\"updateDrillHoleOffset\", Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\t\tstore.commit(\"updateUsingDefaultDrillHoleDimensions\", false );\n\t\t}\n\t},\n});\n\ndocument.addEventListener(\"focusin\", focusChanged);\n\nfunction focusChanged(event): void {\n\tstore.commit(\"updateFocusedElement\", event.target);\n}\n\nfunction drillHoleFieldsWithMessage(): {key: string, message: string}[] {\n\tconst configuration = new DrillHoleConfigurationFactory().get_configuration( 'grid' );\n\n\t// filter out keys with valid dimensions\n\tconst invalidKeys = configuration.get_input_keys().filter((field) => !isDrillHoleValid.value(field));\n\n\t// get the data we need to render a notice\n\treturn invalidKeys.map((field) => {\n\t\treturn {\n\t\t\tkey: field,\n\t\t\tmessage: getDrillHoleValidationMessage.value(field),\n\t\t};\n\t});\n}\n\nonMounted(async () => {\n\n\t// Don't set defaults if we have an old configuration available for radial drill holes.\n\tif ( lastGeneratedConfiguration.value.drillholes?.type === 'grid' ) {\n\t\treturn;\n\t}\n});\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener(\"focusin\", focusChanged);\n});\n\n</script>\n\n<template>\n\t<div class=\"input-container\">\n\t\t<div class=\"drill-hole-inputs\">\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleHorizontalAmount\"\n\t\t\t\tid=\"drillHoleHorizontalAmount\"\n\t\t\t\tname=\"drillHoleHorizontalAmount\"\n\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t:min=\"1\"\n\t\t\t\t:max=\"1000\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.grid.holes_amount_horizontally\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleHorizontalAmount')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.grid.holes_amount_horizontally, drillHoleHorizontalAmount, 'grid-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleHorizontalAmount\"\n\t\t\t\t:step=\"1\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleVerticalAmount\"\n\t\t\t\tid=\"drillHoleVerticalAmount\"\n\t\t\t\tname=\"drillHoleVerticalAmount\"\n\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t:min=\"1\"\n\t\t\t\t:max=\"1000\"\n\t\t\t\t:label=\"$i18n.drillHoleConfiguration.grid.holes_amount_vertically\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleVerticalAmount')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.grid.holes_amount_vertically, drillHoleVerticalAmount, 'grid-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleVerticalAmount\"\n\t\t\t\t:step=\"1\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleDiameter\"\n\t\t\t\tid=\"drillHoleDiameter\"\n\t\t\t\tname=\"drillHoleDiameter\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:min=\"minimumDrillHoleDiameter\"\n\t\t\t\t:label=\"`${$i18n.drillHoleConfiguration.diameter_drill_hole}`\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleDiameter')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.diameter_drill_hole, drillHoleDiameter, 'grid-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleDiameter\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"drillHoleOffset\"\n\t\t\t\tid=\"drillHoleOffset\"\n\t\t\t\tname=\"drillHoleOffset\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:min=\"minimumDrillHoleDiameter\"\n\t\t\t\t:label=\"`${$i18n.drillHoleConfiguration.distance_from_edge}`\"\n\t\t\t\t:invalid=\"!isDrillHoleValid('drillHoleOffset')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer($i18n.drillHoleConfiguration.distance_from_edge, drillHoleOffset, 'grid-drill-hole')\"\n\t\t\t\tv-model=\"drillHoleOffset\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<message-container>\n\t\t\t<validation-message\n\t\t\t\tv-if=\"drillOption !== 'none'\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.drillHolesNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-for=\"field in drillHoleFieldsWithMessage()\"\n\t\t\t\t:key=\"field.key + '-validation-message'\"\n\t\t\t\t:input-id=\"field.key\"\n\t\t\t>\n\t\t\t\t{{ field.message }}\n\t\t\t</validation-message>\n\t\t</message-container>\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.input-container {\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n}\n\n.drill-hole-inputs {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(2, 1fr);\n\tgap: 12px;\n}\n\n</style>\n","import script from \"./DrillHoleGridSettings.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoleGridSettings.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./DrillHoleGridSettings.vue?vue&type=style&index=0&id=557f9a68&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-557f9a68\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createVNode as _createVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"measurements-selector__sub-section\" }\n\nimport { computed, onBeforeUnmount } from 'vue';\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport Length from '../../../source/js/shared/models/Geometry/Length';\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { endsWithSeparator, limitDecimals } from \"@/functions/numbers\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHolePreset',\n  setup(__props) {\n\nconst $i18n = window.measurementSelectorVariables.i18n;\n\nconst store = useStore();\nconst drillHoleDiameter = computed(() => store.getters.drillHoleDiameter.in_cm() );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid);\nconst drillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage);\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst minimumDrillHoleDiameterLabel = computed(() => store.getters.minimumDrillHoleDiameterLabel );\n\nfunction onUpdate( value: string ) {\n\tif ( ! endsWithSeparator( value ) ) {\n\t\tstore.commit( `updateDrillHoleDiameter`, Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t}\n}\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createVNode(DimensionInput, {\n      class: \"drill-hole-input\",\n      inputRef: \"drillHoleDiameter\",\n      id: \"measurements-drillHoleDiameter\",\n      name: \"drillHoleDiameter\",\n      unit: \"cm\",\n      min: minimumDrillHoleDiameter.value,\n      label: `${_unref($i18n).drillHoleConfiguration.diameter_drill_hole} (${minimumDrillHoleDiameterLabel.value})`,\n      invalid: !isDrillHoleValid.value('drillHoleDiameter'),\n      onBlur: () => _unref(addSizeToDataLayer)( 'drillHoleDiameter', drillHoleDiameter.value, 'preset-drill-holes' ),\n      modelValue: drillHoleDiameter.value,\n      \"onUpdate:modelValue\": [\n        _cache[0] || (_cache[0] = ($event: any) => ((drillHoleDiameter).value = $event)),\n        _cache[1] || (_cache[1] = ($event: any) => (onUpdate($event)))\n      ]\n    }, null, 8, [\"min\", \"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n    (!isDrillHoleValid.value('drillHoleDiameter'))\n      ? (_openBlock(), _createBlock(ValidationMessage, {\n          key: 0,\n          \"input-id\": \"drillHoleDiameter\"\n        }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(drillHoleValidationMessage.value('drillHoleDiameter')), 1)\n          ]),\n          _: 1\n        }))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount } from 'vue';\nimport { useStore } from \"vuex\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport Length from '../../../source/js/shared/models/Geometry/Length';\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { endsWithSeparator, limitDecimals } from \"@/functions/numbers\";\nimport { addSizeToDataLayer } from \"@/functions/analytics\";\n\nconst $i18n = window.measurementSelectorVariables.i18n;\n\nconst store = useStore();\nconst drillHoleDiameter = computed(() => store.getters.drillHoleDiameter.in_cm() );\nconst isDrillHoleValid = computed(() => store.getters.isDrillHoleValid);\nconst drillHoleValidationMessage = computed(() => store.getters.getDrillHoleValidationMessage);\nconst minimumDrillHoleDiameter = computed(() => store.getters.minimumDrillHoleDiameter );\nconst minimumDrillHoleDiameterLabel = computed(() => store.getters.minimumDrillHoleDiameterLabel );\n\nfunction onUpdate( value: string ) {\n\tif ( ! endsWithSeparator( value ) ) {\n\t\tstore.commit( `updateDrillHoleDiameter`, Length.from_cm( limitDecimals( value, 1 ) ).in_mm() );\n\t\tstore.commit( 'updateUsingDefaultDrillHoleDimensions', false );\n\t}\n}\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n\n</script>\n<template>\n\t<div class=\"measurements-selector__sub-section\">\n\t\t<dimension-input\n\t\t\tclass=\"drill-hole-input\"\n\t\t\tinputRef=\"drillHoleDiameter\"\n\t\t\tid=\"measurements-drillHoleDiameter\"\n\t\t\tname=\"drillHoleDiameter\"\n\t\t\tunit=\"cm\"\n\t\t\t:min=\"minimumDrillHoleDiameter\"\n\t\t\t:label=\"`${$i18n.drillHoleConfiguration.diameter_drill_hole} (${minimumDrillHoleDiameterLabel})`\"\n\t\t\t:invalid=\"!isDrillHoleValid('drillHoleDiameter')\"\n\t\t\t:onBlur=\"() => addSizeToDataLayer( 'drillHoleDiameter', drillHoleDiameter, 'preset-drill-holes' )\"\n\t\t\tv-model=\"drillHoleDiameter\"\n\t\t\tv-on:update:modelValue=\"onUpdate($event)\"\n\t\t/>\n\n\t\t<validation-message\n\t\t\tv-if=\"!isDrillHoleValid('drillHoleDiameter')\"\n\t\t\tinput-id=\"drillHoleDiameter\"\n\t\t>\n\t\t\t{{ drillHoleValidationMessage('drillHoleDiameter') }}\n\t\t</validation-message>\n\t</div>\n</template>\n","import script from \"./DrillHolePreset.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHolePreset.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, withCtx as _withCtx, createVNode as _createVNode, createCommentVNode as _createCommentVNode, unref as _unref, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode } from \"vue\"\n\nimport { useStore } from \"vuex\";\nimport { computed } from \"vue\";\n\nimport ButtonStrip from \"@/components/UI/ButtonStrip.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport MeasurementsHeightTransition from \"@/components/UI/MeasurementsHeightTransition.vue\";\nimport DrillHoleEdgeTypes from \"@/components/DrillHoleEdgeTypes.vue\";\nimport DrillHoleCustom from \"@/components/DrillHoleCustom.vue\";\nimport DrillHoleRadialSettings from \"@/components/DrillHoleRadialSettings.vue\";\nimport DrillHoleGridSettings from \"@/components/DrillHoleGridSettings.vue\";\nimport DrillHolePreset from \"@/components/DrillHolePreset.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'DrillHoles',\n  setup(__props) {\n\n\nconst store = useStore();\n\nconst $i18n = window.measurementSelectorVariables.i18n;\n\nconst drillOption = computed(() => store.getters.drillOption );\nconst shape = computed(() => store.getters.shape );\nconst primitives = computed(() => store.getters.primitives );\nconst canUseExactCenter = computed(() => store.getters.canUseExactCenter );\nconst usesDefaultDrillHoleDimensions = computed(() => store.getters.usesDefaultDrillHoleDimensions );\nconst drillHoleSelectorButtons = computed(() => store.getters.drillHoleSelectorButtons );\nconst isCenteredDrillHoles = computed(() => [ 'none', 'custom', 'edges' ].includes( drillOption.value ) );\nconst activeItemIndex = computed(() => {\n\tconst index = drillHoleSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} )=> item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\nconst showCenterOfShapeNotice = computed(() =>\n\tcanUseExactCenter.value === false\n\t&& isCenteredDrillHoles.value\n\t&& usesDefaultDrillHoleDimensions.value === true\n);\nconst showDrillHolesNotice = computed(() =>\n\tdrillOption.value !== 'none'\n\t&& drillOption.value !== 'radial'\n\t&& drillOption.value !== 'grid'\n\t&& drillOption.value !== 'edges'\n);\n\nfunction updateDrillOption( option: string ) {\n\tstore.commit(\"updateDrillOption\", option );\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    _createVNode(ButtonStrip, {\n      \"total-buttons\": drillHoleSelectorButtons.value.length,\n      \"buttons-per-row\": 5,\n      \"selected-item\": activeItemIndex.value\n    }, {\n      default: _withCtx(() => [\n        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(drillHoleSelectorButtons.value, (item, index) => {\n          return (_openBlock(), _createBlock(ButtonPrimitive, {\n            \"on-click\": () => updateDrillOption(item.selection),\n            icon: item.icon,\n            text: item.text,\n            index: index,\n            \"is-active\": item.selection === drillOption.value\n          }, null, 8, [\"on-click\", \"icon\", \"text\", \"index\", \"is-active\"]))\n        }), 256))\n      ]),\n      _: 1\n    }, 8, [\"total-buttons\", \"selected-item\"]),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (drillOption.value === 'edges')\n          ? (_openBlock(), _createBlock(DrillHoleEdgeTypes, {\n              key: 0,\n              shape: shape.value,\n              primitives: primitives.value\n            }, null, 8, [\"shape\", \"primitives\"]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (drillOption.value === 'custom')\n          ? (_openBlock(), _createBlock(DrillHoleCustom, {\n              key: 0,\n              shape: shape.value,\n              primitives: primitives.value\n            }, null, 8, [\"shape\", \"primitives\"]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (drillOption.value === 'radial')\n          ? (_openBlock(), _createBlock(DrillHoleRadialSettings, { key: 0 }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (drillOption.value === 'grid')\n          ? (_openBlock(), _createBlock(DrillHoleGridSettings, { key: 0 }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (drillOption.value === 'preset')\n          ? (_openBlock(), _createBlock(DrillHolePreset, { key: 0 }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (showDrillHolesNotice.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_unref($i18n).drillHolesNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (showCenterOfShapeNotice.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 1,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_unref($i18n).centerOfShapeNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    })\n  ], 64))\n}\n}\n\n})","<script setup lang=\"ts\">\n\nimport { useStore } from \"vuex\";\nimport { computed } from \"vue\";\n\nimport ButtonStrip from \"@/components/UI/ButtonStrip.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport MeasurementsHeightTransition from \"@/components/UI/MeasurementsHeightTransition.vue\";\nimport DrillHoleEdgeTypes from \"@/components/DrillHoleEdgeTypes.vue\";\nimport DrillHoleCustom from \"@/components/DrillHoleCustom.vue\";\nimport DrillHoleRadialSettings from \"@/components/DrillHoleRadialSettings.vue\";\nimport DrillHoleGridSettings from \"@/components/DrillHoleGridSettings.vue\";\nimport DrillHolePreset from \"@/components/DrillHolePreset.vue\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst $i18n = window.measurementSelectorVariables.i18n;\n\nconst drillOption = computed(() => store.getters.drillOption );\nconst shape = computed(() => store.getters.shape );\nconst primitives = computed(() => store.getters.primitives );\nconst canUseExactCenter = computed(() => store.getters.canUseExactCenter );\nconst usesDefaultDrillHoleDimensions = computed(() => store.getters.usesDefaultDrillHoleDimensions );\nconst drillHoleSelectorButtons = computed(() => store.getters.drillHoleSelectorButtons );\nconst isCenteredDrillHoles = computed(() => [ 'none', 'custom', 'edges' ].includes( drillOption.value ) );\nconst activeItemIndex = computed(() => {\n\tconst index = drillHoleSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} )=> item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\nconst showCenterOfShapeNotice = computed(() =>\n\tcanUseExactCenter.value === false\n\t&& isCenteredDrillHoles.value\n\t&& usesDefaultDrillHoleDimensions.value === true\n);\nconst showDrillHolesNotice = computed(() =>\n\tdrillOption.value !== 'none'\n\t&& drillOption.value !== 'radial'\n\t&& drillOption.value !== 'grid'\n\t&& drillOption.value !== 'edges'\n);\n\nfunction updateDrillOption( option: string ) {\n\tstore.commit(\"updateDrillOption\", option );\n}\n\n</script>\n\n<template>\n\t<button-strip :total-buttons=\"drillHoleSelectorButtons.length\" :buttons-per-row=\"5\" :selected-item=\"activeItemIndex\">\n\t\t<button-primitive\n\t\t\tv-for=\"(item, index) in drillHoleSelectorButtons\"\n\t\t\t:on-click=\"() => updateDrillOption(item.selection)\"\n\t\t\t:icon=\"item.icon\"\n\t\t\t:text=\"item.text\"\n\t\t\t:index=\"index\"\n\t\t\t:is-active=\"item.selection === drillOption\"\n\t\t/>\n\t</button-strip>\n\n\t<measurements-height-transition appear mode=\"out-in\">\n\t\t<drill-hole-edge-types v-if=\"drillOption === 'edges'\" :shape=\"shape\" :primitives=\"primitives\" />\n\t</measurements-height-transition>\n\n\t<measurements-height-transition appear mode=\"out-in\">\n\t\t<drill-hole-custom v-if=\"drillOption === 'custom'\" :shape=\"shape\" :primitives=\"primitives\" />\n\t</measurements-height-transition>\n\n\t<measurements-height-transition appear mode=\"out-in\">\n\t\t<drill-hole-radial-settings v-if=\"drillOption === 'radial'\" />\n\t</measurements-height-transition>\n\n\t<measurements-height-transition appear mode=\"out-in\">\n\t\t<drill-hole-grid-settings v-if=\"drillOption === 'grid'\" />\n\t</measurements-height-transition>\n\n\t<measurements-height-transition appear mode=\"out-in\">\n\t\t<drill-hole-preset v-if=\"drillOption === 'preset'\" />\n\t</measurements-height-transition>\n\n\t<message-container>\n\t\t<validation-message\n\t\t\tv-if=\"showDrillHolesNotice\"\n\t\t\ttype=\"notice\"\n\t\t>\n\t\t\t{{ $i18n.drillHolesNotice }}\n\t\t</validation-message>\n\n\t\t<validation-message\n\t\t\tv-if=\"showCenterOfShapeNotice\"\n\t\t\ttype=\"notice\"\n\t\t>\n\t\t\t{{ $i18n.centerOfShapeNotice }}\n\t\t</validation-message>\n\t</message-container>\n</template>\n","import script from \"./DrillHoles.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./DrillHoles.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, unref as _unref, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, withCtx as _withCtx, createElementBlock as _createElementBlock } from \"vue\"\n\nimport { useStore } from \"vuex\";\nimport { computed, onBeforeUnmount, customRef, watch } from \"vue\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport {formatForInputField, stripNonNumeric} from \"@/functions/numbers\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'CutoutPosition',\n  setup(__props) {\n\nconst store = useStore();\n\nconst isCutoutValid = computed(() => store.getters.isCutoutValid);\nconst getCutoutValidationMessage = computed(() => store.getters.getCutoutValidationMessage);\nconst shapeSupportCutoutRotation = computed(() => store.getters.shapeSupportCutoutRotation);\nconst cutoutOutsideModel = computed(() => store.getters.cutoutOutsideModel);\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration);\nconst cutoutOffsetLeft = computed( () => store.getters.cutoutOffsetLeft );\nconst cutoutOffsetBottom = computed( () => store.getters.cutoutOffsetBottom );\nconst cutoutShape = computed( () => store.getters.cutoutShape );\nconst cutoutRotation = computed( () => store.getters.cutoutRotation );\n\nconst rotation = customRef(() => {\n\treturn {\n\t\tget: () => cutoutRotation.value,\n\t\tset: (value) => {\n\t\t\tif ( value.length === 0 ) return;\n\n\t\t\tstore.commit('updateCutoutRotation', stripNonNumeric( value ));\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false);\n\t\t},\n\t};\n});\n\nconst offsetLeft = customRef(() => {\n\treturn {\n\t\tget: () => formatForInputField( new Length( cutoutOffsetLeft.value ).in_cm() ),\n\t\tset: (value: string|number) => {\n\t\t\tstore.commit('updateCutoutOffsetLeft', Length.from_cm( stripNonNumeric(value) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false );\n\t\t},\n\t};\n});\n\nconst offsetBottom = customRef(() => {\n\treturn {\n\t\tget: () => formatForInputField( new Length( cutoutOffsetBottom.value ).in_cm() ),\n\t\tset: (value: string|number) => {\n\t\t\tstore.commit('updateCutoutOffsetBottom', Length.from_cm( stripNonNumeric(value) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false );\n\t\t},\n\t};\n});\n\nwatch(cutoutShape, async( newShape, previousShape ) => {\n\tif ( newShape !== previousShape ) {\n\t\tstore.commit('resetCutoutDimension', previousShape );\n\t}\n});\n\nif (lastGeneratedConfiguration.value.cutout) {\n\tstore.commit('updateUsingDefaultCutoutDimensions', false);\n}\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", null, [\n    _createVNode(ShapeInputFieldsWrapper, null, {\n      legend: _withCtx(() => [\n        _createTextVNode(_toDisplayString(_ctx.$i18n.cutout.position.title), 1)\n      ]),\n      default: _withCtx(() => [\n        _createVNode(DimensionInput, {\n          inputRef: \"cutoutOffsetLeft\",\n          id: \"cutoutOffsetLeft\",\n          name: \"cutoutOffsetLeft\",\n          unit: \"cm\",\n          label: _ctx.$i18n.cutout.position.offset_left,\n          invalid: !isCutoutValid.value('cutoutOffsetLeft') || !isCutoutValid.value('cutoutOffset'),\n          onBlur: () => _unref(addSizeToDataLayer)('cutoutOffsetLeft', +offsetLeft.value, `${cutoutShape.value} (cutout)`),\n          modelValue: offsetLeft.value,\n          \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((offsetLeft).value = $event))\n        }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n        _createVNode(DimensionInput, {\n          inputRef: \"cutoutOffsetBottom\",\n          id: \"cutoutOffsetBottom\",\n          name: \"cutoutOffsetBottom\",\n          unit: \"cm\",\n          label: _ctx.$i18n.cutout.position.offset_bottom,\n          invalid: !isCutoutValid.value('cutoutOffsetBottom') || !isCutoutValid.value('cutoutOffset'),\n          onBlur: () => _unref(addSizeToDataLayer)('cutoutOffsetBottom', +offsetBottom.value, `${cutoutShape.value} (cutout)`),\n          modelValue: offsetBottom.value,\n          \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((offsetBottom).value = $event))\n        }, null, 8, [\"label\", \"invalid\", \"onBlur\", \"modelValue\"]),\n        (shapeSupportCutoutRotation.value)\n          ? (_openBlock(), _createBlock(DimensionInput, {\n              key: 0,\n              inputRef: \"cutoutRotation\",\n              id: \"cutoutRotation\",\n              name: \"cutoutRotation\",\n              type: \"number\",\n              unit: \"°\",\n              label: _ctx.$i18n.cutout.position.rotation,\n              onBlur: () => _unref(addSizeToDataLayer)('cutoutRotation', +rotation.value, `${cutoutShape.value} (cutout)`),\n              modelValue: rotation.value,\n              \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((rotation).value = $event)),\n              step: 1,\n              invalid: false\n            }, null, 8, [\"label\", \"onBlur\", \"modelValue\"]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (!isCutoutValid.value('cutoutOffset'))\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              \"input-id\": \"cutoutOffset\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(getCutoutValidationMessage.value('cutoutOffset')), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (!isCutoutValid.value('cutoutOffsetLeft'))\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 1,\n              \"input-id\": \"cutoutOffsetLeft\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(getCutoutValidationMessage.value('cutoutOffsetLeft')), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (!isCutoutValid.value('cutoutOffsetBottom'))\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 2,\n              \"input-id\": \"cutoutOffsetBottom\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(getCutoutValidationMessage.value('cutoutOffsetBottom')), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        _createVNode(ValidationMessage, { type: \"notice\" }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(_ctx.$i18n.cutoutNotice), 1)\n          ]),\n          _: 1\n        }),\n        (cutoutOutsideModel.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 3,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.cutoutOutsideShapeNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    })\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport { computed, onBeforeUnmount, customRef, watch } from \"vue\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ValidationMessage from \"./UI/ValidationMessage.vue\";\nimport {formatForInputField, stripNonNumeric} from \"@/functions/numbers\";\nimport {addSizeToDataLayer} from \"@/functions/analytics\";\nimport DimensionInput from \"@/components/UI/DimensionInput.vue\";\nimport ShapeInputFieldsWrapper from \"@/components/UI/ShapeInputFieldsWrapper.vue\";\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst isCutoutValid = computed(() => store.getters.isCutoutValid);\nconst getCutoutValidationMessage = computed(() => store.getters.getCutoutValidationMessage);\nconst shapeSupportCutoutRotation = computed(() => store.getters.shapeSupportCutoutRotation);\nconst cutoutOutsideModel = computed(() => store.getters.cutoutOutsideModel);\nconst lastGeneratedConfiguration = computed(() => store.getters.lastGeneratedConfiguration);\nconst cutoutOffsetLeft = computed( () => store.getters.cutoutOffsetLeft );\nconst cutoutOffsetBottom = computed( () => store.getters.cutoutOffsetBottom );\nconst cutoutShape = computed( () => store.getters.cutoutShape );\nconst cutoutRotation = computed( () => store.getters.cutoutRotation );\n\nconst rotation = customRef(() => {\n\treturn {\n\t\tget: () => cutoutRotation.value,\n\t\tset: (value) => {\n\t\t\tif ( value.length === 0 ) return;\n\n\t\t\tstore.commit('updateCutoutRotation', stripNonNumeric( value ));\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false);\n\t\t},\n\t};\n});\n\nconst offsetLeft = customRef(() => {\n\treturn {\n\t\tget: () => formatForInputField( new Length( cutoutOffsetLeft.value ).in_cm() ),\n\t\tset: (value: string|number) => {\n\t\t\tstore.commit('updateCutoutOffsetLeft', Length.from_cm( stripNonNumeric(value) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false );\n\t\t},\n\t};\n});\n\nconst offsetBottom = customRef(() => {\n\treturn {\n\t\tget: () => formatForInputField( new Length( cutoutOffsetBottom.value ).in_cm() ),\n\t\tset: (value: string|number) => {\n\t\t\tstore.commit('updateCutoutOffsetBottom', Length.from_cm( stripNonNumeric(value) ).in_mm() );\n\t\t\tstore.commit('updateUsingDefaultCutoutDimensions', false );\n\t\t},\n\t};\n});\n\nwatch(cutoutShape, async( newShape, previousShape ) => {\n\tif ( newShape !== previousShape ) {\n\t\tstore.commit('resetCutoutDimension', previousShape );\n\t}\n});\n\nif (lastGeneratedConfiguration.value.cutout) {\n\tstore.commit('updateUsingDefaultCutoutDimensions', false);\n}\n\ndocument.addEventListener('focusin', (event) =>\n\tstore.commit('updateFocusedElement', event)\n);\n\nonBeforeUnmount(() => {\n\tdocument.removeEventListener('focusin', () =>\n\t\tstore.commit('updateFocusedElement')\n\t);\n});\n</script>\n\n<template>\n\t<div>\n\t\t<shape-input-fields-wrapper>\n\t\t\t<template #legend>\n\t\t\t\t{{ $i18n.cutout.position.title }}\n\t\t\t</template>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"cutoutOffsetLeft\"\n\t\t\t\tid=\"cutoutOffsetLeft\"\n\t\t\t\tname=\"cutoutOffsetLeft\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:label=\"$i18n.cutout.position.offset_left\"\n\t\t\t\t:invalid=\"!isCutoutValid('cutoutOffsetLeft') || !isCutoutValid('cutoutOffset')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer('cutoutOffsetLeft', +offsetLeft, `${cutoutShape} (cutout)`)\"\n\t\t\t\tv-model=\"offsetLeft\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tinputRef=\"cutoutOffsetBottom\"\n\t\t\t\tid=\"cutoutOffsetBottom\"\n\t\t\t\tname=\"cutoutOffsetBottom\"\n\t\t\t\tunit=\"cm\"\n\t\t\t\t:label=\"$i18n.cutout.position.offset_bottom\"\n\t\t\t\t:invalid=\"!isCutoutValid('cutoutOffsetBottom') || !isCutoutValid('cutoutOffset')\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer('cutoutOffsetBottom', +offsetBottom, `${cutoutShape} (cutout)`)\"\n\t\t\t\tv-model=\"offsetBottom\"\n\t\t\t/>\n\n\t\t\t<dimension-input\n\t\t\t\tv-if=\"shapeSupportCutoutRotation\"\n\t\t\t\tinputRef=\"cutoutRotation\"\n\t\t\t\tid=\"cutoutRotation\"\n\t\t\t\tname=\"cutoutRotation\"\n\t\t\t\ttype=\"number\"\n\t\t\t\tunit=\"&deg;\"\n\t\t\t\t:label=\"$i18n.cutout.position.rotation\"\n\t\t\t\t:onBlur=\"() => addSizeToDataLayer('cutoutRotation', +rotation, `${cutoutShape} (cutout)`)\"\n\t\t\t\tv-model=\"rotation\"\n\t\t\t\t:step=\"1\"\n\t\t\t\t:invalid=\"false\"\n\t\t\t/>\n\t\t</shape-input-fields-wrapper>\n\n\t\t<message-container>\n\t\t\t<!-- Message for cutoutOffset -->\n\t\t\t<validation-message\n\t\t\t\tv-if=\"!isCutoutValid('cutoutOffset')\"\n\t\t\t\tinput-id=\"cutoutOffset\"\n\t\t\t>\n\t\t\t\t{{ getCutoutValidationMessage('cutoutOffset') }}\n\t\t\t</validation-message>\n\n\t\t\t<!-- Message for cutoutOffsetLeft -->\n\t\t\t<validation-message\n\t\t\t\tv-if=\"!isCutoutValid('cutoutOffsetLeft')\"\n\t\t\t\tinput-id=\"cutoutOffsetLeft\"\n\t\t\t>\n\t\t\t\t{{ getCutoutValidationMessage('cutoutOffsetLeft') }}\n\t\t\t</validation-message>\n\n\t\t\t<!-- Message for cutoutOffsetBottom -->\n\t\t\t<validation-message\n\t\t\t\tv-if=\"!isCutoutValid('cutoutOffsetBottom')\"\n\t\t\t\tinput-id=\"cutoutOffsetBottom\"\n\t\t\t>\n\t\t\t\t{{ getCutoutValidationMessage('cutoutOffsetBottom') }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.cutoutNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-if=\"cutoutOutsideModel\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.cutoutOutsideShapeNotice }}\n\t\t\t</validation-message>\n\t\t</message-container>\n\t</div>\n</template>\n","import script from \"./CutoutPosition.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CutoutPosition.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","export enum CutoutTypes{\n    none = 'none',\n    shape = 'shape',\n    text = 'text',\n    dxf = 'dxf',\n}","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, createBlock as _createBlock, withCtx as _withCtx } from \"vue\"\n\nimport {useStore} from \"vuex\";\nimport {computed} from \"vue\";\n\nimport ButtonStrip from \"@/components/UI/ButtonStrip.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport {CutoutTypes} from \"@/Models/CutoutTypes\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'CutoutType',\n  setup(__props) {\n\nconst store = useStore();\nconst cutoutType = computed(() => store.getters.cutoutType );\nconst cutoutSelectorButtons = computed(() => store.getters.cutoutSelectorButtons );\nconst activeItemIndex = computed(() => {\n\tconst index = cutoutSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} ) => item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\n\nasync function updateCutoutType( type: CutoutTypes ) {\n\n\t// Get current type\n\tif ( cutoutType.value === CutoutTypes.none && type !== CutoutTypes.none ) {\n\t\tstore.commit(\"updateCutoutType\", type );\n\n\t\tawait store.dispatch(\"updateDefaultCutoutMeasurements\");\n\t}\n\n\t// reset correctly when going from text to shape\n\tif ( cutoutType.value === CutoutTypes.text && type === CutoutTypes.shape ) {\n\t\tawait store.dispatch( \"resetCutouts\" );\n\t\tstore.commit(\"updateCutoutType\", type );\n\t\tawait store.dispatch(\"updateDefaultCutoutMeasurements\");\n\t}\n\n\tif ( type === CutoutTypes.text ) {\n\t\tstore.commit(\"updateCutoutShape\", \"text\");\n\t\tawait store.dispatch( \"text/setDefaults\", true, { root: true } );\n\t}\n\n\tstore.commit(\"updateCutoutType\", type );\n\n\tif( type === CutoutTypes.none ) {\n\t\tawait store.dispatch( \"resetCutouts\" );\n\t}\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(ButtonStrip, {\n    \"total-buttons\": cutoutSelectorButtons.value.length,\n    \"buttons-per-row\": 5,\n    \"selected-item\": activeItemIndex.value\n  }, {\n    default: _withCtx(() => [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(cutoutSelectorButtons.value, (item, index) => {\n        return (_openBlock(), _createBlock(ButtonPrimitive, {\n          \"on-click\": () => updateCutoutType(item.selection),\n          icon: item.icon,\n          text: item.text,\n          index: index,\n          \"is-active\": item.selection === cutoutType.value\n        }, null, 8, [\"on-click\", \"icon\", \"text\", \"index\", \"is-active\"]))\n      }), 256))\n    ]),\n    _: 1\n  }, 8, [\"total-buttons\", \"selected-item\"]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport {useStore} from \"vuex\";\nimport {computed} from \"vue\";\n\nimport ButtonStrip from \"@/components/UI/ButtonStrip.vue\";\nimport ButtonPrimitive from \"@/components/UI/ButtonPrimitive.vue\";\nimport {CutoutTypes} from \"@/Models/CutoutTypes\";\n\nconst store = useStore();\nconst cutoutType = computed(() => store.getters.cutoutType );\nconst cutoutSelectorButtons = computed(() => store.getters.cutoutSelectorButtons );\nconst activeItemIndex = computed(() => {\n\tconst index = cutoutSelectorButtons.value.findIndex( ( item: {\n\t\tactive: boolean;\n\t} ) => item.active === true);\n\n\treturn index === -1 ? 0 : index;\n});\n\nasync function updateCutoutType( type: CutoutTypes ) {\n\n\t// Get current type\n\tif ( cutoutType.value === CutoutTypes.none && type !== CutoutTypes.none ) {\n\t\tstore.commit(\"updateCutoutType\", type );\n\n\t\tawait store.dispatch(\"updateDefaultCutoutMeasurements\");\n\t}\n\n\t// reset correctly when going from text to shape\n\tif ( cutoutType.value === CutoutTypes.text && type === CutoutTypes.shape ) {\n\t\tawait store.dispatch( \"resetCutouts\" );\n\t\tstore.commit(\"updateCutoutType\", type );\n\t\tawait store.dispatch(\"updateDefaultCutoutMeasurements\");\n\t}\n\n\tif ( type === CutoutTypes.text ) {\n\t\tstore.commit(\"updateCutoutShape\", \"text\");\n\t\tawait store.dispatch( \"text/setDefaults\", true, { root: true } );\n\t}\n\n\tstore.commit(\"updateCutoutType\", type );\n\n\tif( type === CutoutTypes.none ) {\n\t\tawait store.dispatch( \"resetCutouts\" );\n\t}\n}\n\n</script>\n\n<template>\n\t<button-strip :total-buttons=\"cutoutSelectorButtons.length\" :buttons-per-row=\"5\" :selected-item=\"activeItemIndex\">\n\t\t<button-primitive\n\t\t\tv-for=\"(item, index) in cutoutSelectorButtons\"\n\t\t\t:on-click=\"() => updateCutoutType(item.selection)\"\n\t\t\t:icon=\"item.icon\"\n\t\t\t:text=\"item.text\"\n\t\t\t:index=\"index\"\n\t\t\t:is-active=\"item.selection === cutoutType\"\n\t\t/>\n\t</button-strip>\n</template>\n","import script from \"./CutoutType.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CutoutType.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, withCtx as _withCtx, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, unref as _unref, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, createCommentVNode as _createCommentVNode, createBlock as _createBlock, resolveDynamicComponent as _resolveDynamicComponent, normalizeProps as _normalizeProps, guardReactiveProps as _guardReactiveProps, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-0424b2b1\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 0,\n  class: \"group\"\n}\nconst _hoisted_2 = { class: \"editable-list\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"group\"\n}\nconst _hoisted_4 = { key: 1 }\nconst _hoisted_5 = { class: \"shape-inputs\" }\nconst _hoisted_6 = { key: 0 }\n\nimport { useStore } from 'vuex';\nimport CutoutPosition from './CutoutPosition.vue';\nimport CutoutType from './CutoutType.vue';\nimport ShapeType from './ShapeType.vue';\nimport ValidationMessage from './UI/ValidationMessage.vue';\nimport {computed, ref, Ref, watch} from 'vue';\nimport EditableItem from './EditableItem.vue';\nimport MeasurementsHeightTransition from './UI/MeasurementsHeightTransition.vue';\nimport {getCurrentShapeInputComponent} from \"@/components/shapes/ShapeHelper\";\nimport { renderLength } from '@/functions/lengths';\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'CutoutsConfiguration',\n  setup(__props) {\n\nconst store = useStore();\n\nconst isEditorVisible = ref<boolean>(true);\nconst isAddingCutout = ref<boolean>(false);\nconst isEditingExistingCutout = ref<boolean>(false);\nconst containerRef = ref<HTMLElement | null>(null);\n\nconst cutoutType = computed(() => store.getters.cutoutType);\nconst cutoutShape = computed(() => store.getters.cutoutShape);\nconst canUseExactCenter = computed(() => store.getters.canUseExactCenter);\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\nconst usesDefaultCutoutDimensions = computed(() => store.getters.usesDefaultCutoutDimensions);\nconst cutouts = computed(() => store.getters.cutouts);\nconst cutout = computed(() => store.getters.cutout);\nconst currentCutoutIndex = computed(() => store.getters.currentCutoutIndex);\nconst hasGroupedDimensionValidatorErrors = computed(() => store.getters.hasGroupedCutoutValidatorErrors);\nconst getGroupedDimensionValidationMessage = computed(() => store.getters.getGroupedCutoutValidationMessage);\nconst validationDimensionMessages = computed(() => {\n\tconst validators = store.getters.getCutoutValidatorErrors;\n\tconst excludedFields = ['cutoutOffset', 'cutoutOffsetLeft', 'cutoutOffsetBottom'];\n\tconst filteredValidators = [...validators].filter((validator) => !excludedFields.includes(validator.field));\n\n\treturn filteredValidators.map((validator) => {\n\t\treturn {\n\t\t\tkey: validator.field,\n\t\t\tid: `measurements-${validator.field}`,\n\t\t\tmessage: validator.getMessage(),\n\t\t};\n\t});\n});\n\nwatch(cutout, async(newValue, oldValue) => {\n\n\t// Set the default cutout\n\tif (newValue && cutouts.value.length === 0) {\n\t\tstore.commit(\"addCutout\", newValue);\n\t\teditCutout(0);\n\t}\n\n\t// Update current cutout\n\tif(newValue != oldValue && newValue != null) {\n\t\tstore.commit(\"updateCutoutByIndex\", { index: currentCutoutIndex.value, cutout: newValue });\n\t}\n});\n\n// Add cutout when shape is selected\nwatch(cutoutShape, async(newValue, oldValue) => {\n\tif(newValue === '') {\n\t\treturn;\n\t}\n\n\tif (newValue !== oldValue && isAddingCutout.value) {\n\t\tstore.commit('updateCutoutIndex', store.getters.cutouts.length );\n\t\tstore.commit('addCutout', store.getters.cutout );\n\t}\n\n\tisAddingCutout.value = false;\n});\n\nconst isMaxSafeCutoutReached = computed(() => {\n\tconst maxSafeCutoutPercentage = window.measurementSelectorVariables.pricingGroup.other_settings.max_safe_cutout_percentage;\n\n\tif ( store.getters.cutout === null || store.getters.getCutoutArea === 0 || store.getters.getShapeArea === 0 || maxSafeCutoutPercentage == 0 ) {\n\t\treturn false;\n\t}\n\n\treturn ( store.getters.getCutoutArea / store.getters.getShapeArea ) * 100 > maxSafeCutoutPercentage;\n});\n\nconst currentProps = computed( () => {\n\treturn {\n\t\tisCutout: true,\n\t\taction: \"updateCutoutDimension\",\n\t\tprefix: \"cutout_\",\n\t\tmodifierAction: \"updateCutoutModifier\",\n\t};\n} );\n\n// Start with a empty cutout, add after shape is selected\nasync function addCutout(): Promise<void> {\n\tisEditorVisible.value = true;\n\tisEditingExistingCutout.value = false;\n\tisAddingCutout.value = true;\n\n\tawait store.dispatch('resetCutoutShapeAndDimension', '');\n}\n\nfunction saveCutout(): void {\n\tisEditorVisible.value = false;\n\tscrollTo(containerRef);\n\n\tif ( !isEditingExistingCutout.value ) {\n\t\tstore.commit('updateCutoutIndex', -1);\n\t\tstore.commit('updateUsingDefaultCutoutDimensions', true);\n\n\t\treturn;\n\t}\n\n\tstore.commit('updateCutoutByIndex', { index: currentCutoutIndex.value, cutout: cutout.value } );\n\tstore.commit('updateCutoutIndex', -1);\n}\n\nfunction editCutout(index: number): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingCutout.value = true;\n\n\tstore.commit('updateCutoutIndex', index );\n\tstore.dispatch('updateCurrentCutout');\n}\n\nfunction removeCutout(index: number): void {\n\tisEditorVisible.value = false;\n\tstore.dispatch('removeCutout', index);\n}\n\nfunction scrollTo(view: Ref<HTMLElement | null>) {\n\tview.value?.scrollIntoView({ behavior: 'smooth' });\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: \"cutouts-container\",\n    ref_key: \"containerRef\",\n    ref: containerRef\n  }, [\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        _createVNode(CutoutType)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (cutouts.value.length > 0)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n              _createElementVNode(\"ul\", _hoisted_2, [\n                (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(cutouts.value, (cutout, index) => {\n                  return (_openBlock(), _createElementBlock(\"li\", {\n                    class: _normalizeClass({\n\t\t\t\t\t\t\t\"editable-list__item\": true,\n\t\t\t\t\t\t\t\"editable-list__item--active\": currentCutoutIndex.value === index && isEditorVisible.value\n\t\t\t\t\t\t}),\n                    key: index\n                  }, [\n                    _createVNode(EditableItem, {\n                      edit: { index, title: _ctx.$i18n.cutout.edit, disabled: false, onClick: editCutout, hidden: currentCutoutIndex.value !== index && isEditorVisible.value },\n                      remove: { index, title: _ctx.$i18n.cutout.remove, disabled: false, onClick: removeCutout, hidden: false }\n                    }, {\n                      default: _withCtx(() => [\n                        _createTextVNode(_toDisplayString(_ctx.$i18n.cutout.title) + \" \" + _toDisplayString(index + 1) + \" - \", 1),\n                        _createElementVNode(\"strong\", null, _toDisplayString(_ctx.$i18n.shapeNames[cutout.shape]) + \" | X - \" + _toDisplayString(_unref(renderLength)(cutout.offsets[0].in_cm())) + \" | Y - \" + _toDisplayString(_unref(renderLength)(cutout.offsets[1].in_cm())), 1)\n                      ]),\n                      _: 2\n                    }, 1032, [\"edit\", \"remove\"])\n                  ], 2))\n                }), 128))\n              ])\n            ]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MeasurementsHeightTransition, {\n      appear: \"\",\n      mode: \"out-in\"\n    }, {\n      default: _withCtx(() => [\n        (cutoutType.value !== 'none' && isEditorVisible.value)\n          ? (_openBlock(), _createElementBlock(\"div\", _hoisted_3, [\n              (cutoutType.value === 'shape')\n                ? (_openBlock(), _createBlock(ShapeType, {\n                    key: 0,\n                    disabledShapes: ['dxf', 'text'],\n                    storeShapeGetter: 'cutoutShape',\n                    storeShapeUpdater: 'resetCutoutShapeAndDimension',\n                    \"is-cutout\": true\n                  }))\n                : _createCommentVNode(\"\", true),\n              (cutoutShape.value !== '' && cutoutShape.value !== 'dxf')\n                ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n                    _createElementVNode(\"div\", _hoisted_5, [\n                      (_openBlock(), _createBlock(_resolveDynamicComponent(_unref(getCurrentShapeInputComponent)(cutoutShape.value)), _normalizeProps(_guardReactiveProps(currentProps.value)), null, 16))\n                    ]),\n                    _createVNode(MessageContainer, null, {\n                      default: _withCtx(() => [\n                        (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(validationDimensionMessages.value, (field) => {\n                          return (_openBlock(), _createBlock(ValidationMessage, {\n                            key: field.key + '-validation-message',\n                            \"input-id\": field.id\n                          }, {\n                            default: _withCtx(() => [\n                              _createTextVNode(_toDisplayString(field.message), 1)\n                            ]),\n                            _: 2\n                          }, 1032, [\"input-id\"]))\n                        }), 128)),\n                        (hasGroupedDimensionValidatorErrors.value)\n                          ? (_openBlock(), _createBlock(ValidationMessage, {\n                              key: 0,\n                              \"input-id\": \"grouped-validation-message\"\n                            }, {\n                              default: _withCtx(() => [\n                                _createTextVNode(_toDisplayString(getGroupedDimensionValidationMessage.value), 1)\n                              ]),\n                              _: 1\n                            }))\n                          : _createCommentVNode(\"\", true)\n                      ]),\n                      _: 1\n                    })\n                  ]))\n                : _createCommentVNode(\"\", true),\n              (cutoutShape.value !== '')\n                ? (_openBlock(), _createBlock(CutoutPosition, { key: 2 }))\n                : _createCommentVNode(\"\", true),\n              (cutoutShape.value)\n                ? (_openBlock(), _createElementBlock(\"button\", {\n                    key: 3,\n                    onClick: saveCutout,\n                    class: \"measurements-selector__button-add measurements-selector__button-add--block\",\n                    type: \"button\"\n                  }, _toDisplayString(_ctx.$i18n.cutout.save), 1))\n                : _createCommentVNode(\"\", true)\n            ]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MessageContainer, null, {\n      default: _withCtx(() => [\n        (isMaxSafeCutoutReached.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 0,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.largeCutoutNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (canUseExactCenter.value === false && usesDefaultCutoutDimensions.value === true)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 1,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.centerOfShapeNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true),\n        (hasProblematicCorners.value)\n          ? (_openBlock(), _createBlock(ValidationMessage, {\n              key: 2,\n              type: \"notice\"\n            }, {\n              default: _withCtx(() => [\n                _createTextVNode(_toDisplayString(_ctx.$i18n.problematicCornersNotice), 1)\n              ]),\n              _: 1\n            }))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    (cutoutType.value !== 'none' && !isEditorVisible.value)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_6, [\n          _createElementVNode(\"button\", {\n            onClick: addCutout,\n            class: \"measurements-selector__button-add\",\n            type: \"button\"\n          }, _toDisplayString(_ctx.$i18n.cutout.add), 1)\n        ]))\n      : _createCommentVNode(\"\", true)\n  ], 512))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from 'vuex';\nimport CutoutPosition from './CutoutPosition.vue';\nimport CutoutType from './CutoutType.vue';\nimport ShapeType from './ShapeType.vue';\nimport ValidationMessage from './UI/ValidationMessage.vue';\nimport {computed, ref, Ref, watch} from 'vue';\nimport EditableItem from './EditableItem.vue';\nimport MeasurementsHeightTransition from './UI/MeasurementsHeightTransition.vue';\nimport {getCurrentShapeInputComponent} from \"@/components/shapes/ShapeHelper\";\nimport { renderLength } from '@/functions/lengths';\nimport MessageContainer from \"@/components/UI/MessageContainer.vue\";\n\nconst store = useStore();\n\nconst isEditorVisible = ref<boolean>(true);\nconst isAddingCutout = ref<boolean>(false);\nconst isEditingExistingCutout = ref<boolean>(false);\nconst containerRef = ref<HTMLElement | null>(null);\n\nconst cutoutType = computed(() => store.getters.cutoutType);\nconst cutoutShape = computed(() => store.getters.cutoutShape);\nconst canUseExactCenter = computed(() => store.getters.canUseExactCenter);\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\nconst usesDefaultCutoutDimensions = computed(() => store.getters.usesDefaultCutoutDimensions);\nconst cutouts = computed(() => store.getters.cutouts);\nconst cutout = computed(() => store.getters.cutout);\nconst currentCutoutIndex = computed(() => store.getters.currentCutoutIndex);\nconst hasGroupedDimensionValidatorErrors = computed(() => store.getters.hasGroupedCutoutValidatorErrors);\nconst getGroupedDimensionValidationMessage = computed(() => store.getters.getGroupedCutoutValidationMessage);\nconst validationDimensionMessages = computed(() => {\n\tconst validators = store.getters.getCutoutValidatorErrors;\n\tconst excludedFields = ['cutoutOffset', 'cutoutOffsetLeft', 'cutoutOffsetBottom'];\n\tconst filteredValidators = [...validators].filter((validator) => !excludedFields.includes(validator.field));\n\n\treturn filteredValidators.map((validator) => {\n\t\treturn {\n\t\t\tkey: validator.field,\n\t\t\tid: `measurements-${validator.field}`,\n\t\t\tmessage: validator.getMessage(),\n\t\t};\n\t});\n});\n\nwatch(cutout, async(newValue, oldValue) => {\n\n\t// Set the default cutout\n\tif (newValue && cutouts.value.length === 0) {\n\t\tstore.commit(\"addCutout\", newValue);\n\t\teditCutout(0);\n\t}\n\n\t// Update current cutout\n\tif(newValue != oldValue && newValue != null) {\n\t\tstore.commit(\"updateCutoutByIndex\", { index: currentCutoutIndex.value, cutout: newValue });\n\t}\n});\n\n// Add cutout when shape is selected\nwatch(cutoutShape, async(newValue, oldValue) => {\n\tif(newValue === '') {\n\t\treturn;\n\t}\n\n\tif (newValue !== oldValue && isAddingCutout.value) {\n\t\tstore.commit('updateCutoutIndex', store.getters.cutouts.length );\n\t\tstore.commit('addCutout', store.getters.cutout );\n\t}\n\n\tisAddingCutout.value = false;\n});\n\nconst isMaxSafeCutoutReached = computed(() => {\n\tconst maxSafeCutoutPercentage = window.measurementSelectorVariables.pricingGroup.other_settings.max_safe_cutout_percentage;\n\n\tif ( store.getters.cutout === null || store.getters.getCutoutArea === 0 || store.getters.getShapeArea === 0 || maxSafeCutoutPercentage == 0 ) {\n\t\treturn false;\n\t}\n\n\treturn ( store.getters.getCutoutArea / store.getters.getShapeArea ) * 100 > maxSafeCutoutPercentage;\n});\n\nconst currentProps = computed( () => {\n\treturn {\n\t\tisCutout: true,\n\t\taction: \"updateCutoutDimension\",\n\t\tprefix: \"cutout_\",\n\t\tmodifierAction: \"updateCutoutModifier\",\n\t};\n} );\n\n// Start with a empty cutout, add after shape is selected\nasync function addCutout(): Promise<void> {\n\tisEditorVisible.value = true;\n\tisEditingExistingCutout.value = false;\n\tisAddingCutout.value = true;\n\n\tawait store.dispatch('resetCutoutShapeAndDimension', '');\n}\n\nfunction saveCutout(): void {\n\tisEditorVisible.value = false;\n\tscrollTo(containerRef);\n\n\tif ( !isEditingExistingCutout.value ) {\n\t\tstore.commit('updateCutoutIndex', -1);\n\t\tstore.commit('updateUsingDefaultCutoutDimensions', true);\n\n\t\treturn;\n\t}\n\n\tstore.commit('updateCutoutByIndex', { index: currentCutoutIndex.value, cutout: cutout.value } );\n\tstore.commit('updateCutoutIndex', -1);\n}\n\nfunction editCutout(index: number): void {\n\tisEditorVisible.value = true;\n\tisEditingExistingCutout.value = true;\n\n\tstore.commit('updateCutoutIndex', index );\n\tstore.dispatch('updateCurrentCutout');\n}\n\nfunction removeCutout(index: number): void {\n\tisEditorVisible.value = false;\n\tstore.dispatch('removeCutout', index);\n}\n\nfunction scrollTo(view: Ref<HTMLElement | null>) {\n\tview.value?.scrollIntoView({ behavior: 'smooth' });\n}\n\n</script>\n\n<template>\n\t<div class=\"cutouts-container\" ref=\"containerRef\">\n\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t<CutoutType />\n\t\t</measurements-height-transition>\n\n\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t<div class=\"group\" v-if=\"cutouts.length > 0\">\n\t\t\t\t<ul class=\"editable-list\">\n\t\t\t\t\t<li\n\t\t\t\t\t\t:class='{\n\t\t\t\t\t\t\t\"editable-list__item\": true,\n\t\t\t\t\t\t\t\"editable-list__item--active\": currentCutoutIndex === index && isEditorVisible\n\t\t\t\t\t\t}'\n\t\t\t\t\t\tv-for=\"(cutout, index) in cutouts\"\n\t\t\t\t\t\t:key=\"index\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<EditableItem\n\t\t\t\t\t\t\t:edit=\"{ index, title: $i18n.cutout.edit, disabled: false, onClick: editCutout, hidden: currentCutoutIndex !== index && isEditorVisible }\"\n\t\t\t\t\t\t\t:remove=\"{ index, title: $i18n.cutout.remove, disabled: false, onClick: removeCutout, hidden: false }\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ $i18n.cutout.title }} {{ index + 1 }} -\n\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\t{{ $i18n.shapeNames[cutout.shape] }} |\n\t\t\t\t\t\t\t\tX - {{ renderLength(cutout.offsets[0].in_cm()) }} |\n\t\t\t\t\t\t\t\tY - {{ renderLength(cutout.offsets[1].in_cm()) }}\n\t\t\t\t\t\t\t</strong>\n\n\t\t\t\t\t\t</EditableItem>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</measurements-height-transition>\n\n\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t<div class=\"group\" v-if=\"cutoutType !== 'none' && isEditorVisible\">\n\n\t\t\t\t<ShapeType\n\t\t\t\t\tv-if=\"cutoutType === 'shape'\"\n\t\t\t\t\t:disabledShapes=\"['dxf', 'text']\"\n\t\t\t\t\t:storeShapeGetter=\"'cutoutShape'\"\n\t\t\t\t\t:storeShapeUpdater=\"'resetCutoutShapeAndDimension'\"\n\t\t\t\t\t:is-cutout=\"true\"\n\t\t\t\t/>\n\n\t\t\t\t<div v-if=\"cutoutShape !== '' && cutoutShape !== 'dxf'\">\n\t\t\t\t\t<div class=\"shape-inputs\">\n\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t:is=\"getCurrentShapeInputComponent(cutoutShape)\"\n\t\t\t\t\t\t\tv-bind=\"currentProps\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<message-container>\n\t\t\t\t\t\t<validation-message\n\t\t\t\t\t\t\tv-for=\"field in validationDimensionMessages\"\n\t\t\t\t\t\t\t:key=\"field.key + '-validation-message'\"\n\t\t\t\t\t\t\t:input-id=\"field.id\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ field.message }}\n\t\t\t\t\t\t</validation-message>\n\n\t\t\t\t\t\t<validation-message\n\t\t\t\t\t\t\tv-if=\"hasGroupedDimensionValidatorErrors\"\n\t\t\t\t\t\t\tinput-id=\"grouped-validation-message\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ getGroupedDimensionValidationMessage }}\n\t\t\t\t\t\t</validation-message>\n\t\t\t\t\t</message-container>\n\t\t\t\t</div>\n\n\t\t\t\t<CutoutPosition v-if=\"cutoutShape !== ''\"/>\n\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"cutoutShape\"\n\t\t\t\t\t@click=\"saveCutout\"\n\t\t\t\t\tclass=\"measurements-selector__button-add measurements-selector__button-add--block\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t>\n\t\t\t\t\t{{ $i18n.cutout.save }}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</measurements-height-transition>\n\n\t\t<message-container>\n\t\t\t<validation-message\n\t\t\t\tv-if=\"isMaxSafeCutoutReached\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.largeCutoutNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-if=\"canUseExactCenter === false && usesDefaultCutoutDimensions === true\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.centerOfShapeNotice }}\n\t\t\t</validation-message>\n\n\t\t\t<validation-message\n\t\t\t\tv-if=\"hasProblematicCorners\"\n\t\t\t\ttype=\"notice\"\n\t\t\t>\n\t\t\t\t{{ $i18n.problematicCornersNotice }}\n\t\t\t</validation-message>\n\t\t</message-container>\n\n\t\t<div v-if=\"cutoutType !== 'none' && !isEditorVisible\">\n\t\t\t<button\n\t\t\t\t@click=\"addCutout\"\n\t\t\t\tclass=\"measurements-selector__button-add\"\n\t\t\t\ttype=\"button\"\n\t\t\t>\n\t\t\t\t{{ $i18n.cutout.add }}\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.cutouts-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n\tscroll-margin-block-start: calc(var(--header-height) + 70px);\n}\n\n.group {\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n}\n</style>\n","import script from \"./CutoutsConfiguration.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./CutoutsConfiguration.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./CutoutsConfiguration.vue?vue&type=style&index=0&id=0424b2b1&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-0424b2b1\"]])\n\nexport default __exports__","export const FILE_INPUT_NAME = 'measurements[dxf]';\n\nexport default class Client {\n\trestUrl: string;\n\n\tconstructor( restUrl: string ) {\n\t\tthis.restUrl = restUrl;\n\t}\n\n\tasync getProperties( productId, file, shape, edgeFinish: string ): Promise<object> {\n\t\tconst url = this.restUrl + 'kps/v1/shape_file/get_properties';\n\n\t\tconst formData = new FormData();\n\t\tformData.append( 'productId', productId );\n\t\tformData.append( 'shape', shape );\n\t\tformData.append( 'edgeFinish', edgeFinish );\n\n\t\t// The server checks for the dxf extension so make sure we send one with a Blob.\n\t\tif ( file instanceof Blob ) {\n\t\t\tformData.append( FILE_INPUT_NAME, file, 'blob.dxf' );\n\t\t} else {\n\t\t\tformData.append( FILE_INPUT_NAME, file );\n\t\t}\n\n\t\tconst response = await fetch( url, { method: 'POST', body: formData } );\n\n\t\tconst data = await response.json();\n\t\tif (\n\t\t\t! response.ok ||\n\t\t\tdata.data && data.data.status && data.data.status === 500\n\t\t) {\n\t\t\tthrow new Error( data.message );\n\t\t}\n\n\t\tif( data.svg_path === \"\" ) {\n\n\t\t\tthrow new Error( window.measurementSelectorVariables.i18n.uploadingError );\n\t\t}\n\n\t\treturn data;\n\t}\n\n}\n","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, withModifiers as _withModifiers, resolveComponent as _resolveComponent, createVNode as _createVNode, normalizeClass as _normalizeClass, withCtx as _withCtx, createBlock as _createBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"upload-container\" }\nconst _hoisted_2 = [\"href\"]\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"span\", {\n  \"aria-hidden\": \"true\",\n  class: \"icon icon-info-sign\"\n}, null, -1)\nconst _hoisted_4 = { key: 1 }\nconst _hoisted_5 = { class: \"uploaded-file\" }\nconst _hoisted_6 = /*#__PURE__*/_createElementVNode(\"span\", {\n  \"aria-hidden\": \"true\",\n  class: \"icon icon-delete\"\n}, null, -1)\nconst _hoisted_7 = { class: \"screen-reader-text\" }\nconst _hoisted_8 = { class: \"small\" }\nconst _hoisted_9 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_10 = { for: \"measurements-selector-file-upload\" }\nconst _hoisted_11 = { class: \"button button--blue\" }\nconst _hoisted_12 = [\"name\", \"accept\"]\nconst _hoisted_13 = {\n  key: 0,\n  class: \"small\"\n}\nconst _hoisted_14 = /*#__PURE__*/_createElementVNode(\"br\", null, null, -1)\nconst _hoisted_15 = [\"href\"]\nconst _hoisted_16 = { key: 1 }\n\nimport { FILE_INPUT_NAME } from \"@/utilities/Client\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { computed, ref } from \"vue\";\nimport { useStore } from \"vuex\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ShapeUpload',\n  setup(__props) {\n\nconst store = useStore();\nconst measurementSelectorVariables = computed(() => window.measurementSelectorVariables);\nconst { measurementsConfig, drawingRules, drawingExplainer, i18n } = measurementSelectorVariables.value;\nconst showDrawingRules = !!drawingRules;\nconst showDrawingExplanation = !!drawingExplainer;\n\nconst isHoveringFile = ref(false);\nconst fileUpload = ref(null);\nconst filename = computed(() => store.getters.getOriginalFilename);\nconst fileInputName = ref(FILE_INPUT_NAME);\nconst isUploading = computed(() => store.getters.getIsParsingFile);\nconst hasSucceeded = computed(() => store.getters.uploadedContent !== \"\");\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\n\nconst allowed_mime_types = [\n\t'application/dxf',\n\t'application/x-autocad',\n\t'application/x-dxf',\n\t'drawing/x-dxf',\n\t'image/vnd.dxf',\n\t'image/x-autocad',\n\t'image/x-dxf',\n\t'zz-application/zz-winassoc-dxf',\n];\nconst allowed_file_extensions = [\n\t'.dxf',\n];\n\nif ( measurementsConfig && measurementsConfig['base'] && measurementsConfig['base'].shape === \"dxf\") {\n\tfilename.value = measurementsConfig['base'].dxfDefinition.original_filename;\n}\n\nfunction hasAllowedMimeType ( mimetype: string ): boolean {\n\n\t// dxf tend to miss mimetype, so we allow empty mimetype\n\tif ( mimetype.length === 0 ) {\n\t\treturn true;\n\t}\n\n\tif ( allowed_mime_types.includes( mimetype ) ) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction handleFileUpload(): void {\n\tconst files = fileUpload.value.files;\n\n\tif (files.length < 1) {\n\t\treturn;\n\t}\n\n\tconst file = files[0];\n\n\tif (!hasAllowedMimeType(file.type)) {\n\t\treturn;\n\t}\n\n\tuploadFile(file);\n}\n\nfunction resetInput(): void {\n\tfileUpload.value.value = \"\";\n}\n\nfunction reset(): void {\n\tresetInput();\n\n\tstore.commit('updateDxfDefinition', { svgPath: '' } );\n\tstore.commit('setUploadedContent', {result: '', filename: ''} );\n}\n\nfunction setIsHoveringFile(value: boolean): void {\n\tisHoveringFile.value = value;\n}\n\nfunction processDroppedFile(event: DragEvent): void {\n\n\t// Put it in the input and use the same code path for both upload methods (drag, select file).\n\tfileUpload.value.files = event.dataTransfer.files;\n\n\thandleFileUpload();\n}\n\nconst uploadFile = async (file: File): Promise<void> => {\n\tstore.dispatch(\"updateUploadedContent\", file);\n};\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_portal_target = _resolveComponent(\"portal-target\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    showDrawingRules\n      ? (_openBlock(), _createElementBlock(\"a\", {\n          key: 0,\n          href: _unref(drawingRules).url,\n          class: \"text-link\"\n        }, [\n          _hoisted_3,\n          _createTextVNode(\" \" + _toDisplayString(_unref(drawingRules).title), 1)\n        ], 8, _hoisted_2))\n      : _createCommentVNode(\"\", true),\n    (hasSucceeded.value)\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_4, [\n          _createElementVNode(\"div\", _hoisted_5, [\n            _createElementVNode(\"span\", null, _toDisplayString(_ctx.$i18n.file), 1),\n            _createElementVNode(\"strong\", null, _toDisplayString(filename.value), 1),\n            _createElementVNode(\"button\", {\n              onClick: _cache[0] || (_cache[0] = _withModifiers(($event: any) => (reset()), [\"prevent\"]))\n            }, [\n              _hoisted_6,\n              _createElementVNode(\"span\", _hoisted_7, _toDisplayString(_ctx.$i18n.removeFile.replace(\"%s\", filename.value)), 1)\n            ])\n          ]),\n          _createElementVNode(\"div\", null, [\n            _createVNode(_component_portal_target, { name: \"shape-preview\" })\n          ])\n        ]))\n      : _createCommentVNode(\"\", true),\n    _createElementVNode(\"div\", {\n      class: _normalizeClass({\n\t\t\t\t'file-dropbox': true,\n\t\t\t\t'file-dropbox--hovering': isHoveringFile.value,\n\t\t\t}),\n      onDragover: _cache[1] || (_cache[1] = _withModifiers(($event: any) => (setIsHoveringFile(true)), [\"prevent\"])),\n      onDragenter: _cache[2] || (_cache[2] = _withModifiers(($event: any) => (setIsHoveringFile(true)), [\"prevent\"])),\n      onDragleave: _cache[3] || (_cache[3] = _withModifiers(($event: any) => (setIsHoveringFile(false)), [\"prevent\"])),\n      onDragend: _cache[4] || (_cache[4] = _withModifiers(($event: any) => (setIsHoveringFile(false)), [\"prevent\"])),\n      onDragdrop: _cache[5] || (_cache[5] = _withModifiers(($event: any) => (setIsHoveringFile(false)), [\"prevent\"])),\n      onDrop: _cache[6] || (_cache[6] = _withModifiers(($event: any) => {\n\t\t\t\tsetIsHoveringFile(false);\n\t\t\t\tprocessDroppedFile($event);\n\t\t\t}, [\"prevent\"]))\n    }, [\n      _createElementVNode(\"p\", null, [\n        _createTextVNode(_toDisplayString(hasSucceeded.value ? _ctx.$i18n.messages.dragNewFilesToUpload : _ctx.$i18n.messages.dragFilesToUpload) + \" \", 1),\n        _createElementVNode(\"span\", _hoisted_8, \"(\" + _toDisplayString(allowed_file_extensions.join('/')) + \")\", 1),\n        _hoisted_9,\n        _createElementVNode(\"span\", null, _toDisplayString(_ctx.$i18n.or), 1)\n      ]),\n      _createElementVNode(\"label\", _hoisted_10, [\n        _createElementVNode(\"span\", _hoisted_11, _toDisplayString(_ctx.$i18n.selectFile), 1)\n      ]),\n      _createElementVNode(\"input\", {\n        class: \"file-upload\",\n        id: \"measurements-selector-file-upload\",\n        ref_key: \"fileUpload\",\n        ref: fileUpload,\n        name: fileInputName.value,\n        type: \"file\",\n        accept: `${allowed_file_extensions.join(',')},${allowed_mime_types.join(',')}`,\n        onChange: handleFileUpload,\n        \"aria-describedby\": \"measurements-selector-file-upload-validation-message\"\n      }, null, 40, _hoisted_12),\n      showDrawingExplanation\n        ? (_openBlock(), _createElementBlock(\"div\", _hoisted_13, [\n            _createTextVNode(_toDisplayString(_ctx.$i18n.dxfExplainer), 1),\n            _hoisted_14,\n            _createElementVNode(\"a\", {\n              href: _unref(drawingExplainer).url\n            }, _toDisplayString(_unref(drawingExplainer).title), 9, _hoisted_15)\n          ]))\n        : _createCommentVNode(\"\", true),\n      (isUploading.value)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_16, _toDisplayString(_ctx.$i18n.uploadingFile), 1))\n        : _createCommentVNode(\"\", true)\n    ], 34),\n    (hasProblematicCorners.value)\n      ? (_openBlock(), _createBlock(ValidationMessage, {\n          key: 2,\n          type: \"notice\"\n        }, {\n          default: _withCtx(() => [\n            _createTextVNode(_toDisplayString(_ctx.$i18n.problematicCornersNotice), 1)\n          ]),\n          _: 1\n        }))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { FILE_INPUT_NAME } from \"@/utilities/Client\";\nimport ValidationMessage from \"@/components/UI/ValidationMessage.vue\";\nimport { computed, ref } from \"vue\";\nimport { useStore } from \"vuex\";\n\nconst store = useStore();\nconst measurementSelectorVariables = computed(() => window.measurementSelectorVariables);\nconst { measurementsConfig, drawingRules, drawingExplainer, i18n } = measurementSelectorVariables.value;\nconst showDrawingRules = !!drawingRules;\nconst showDrawingExplanation = !!drawingExplainer;\n\nconst isHoveringFile = ref(false);\nconst fileUpload = ref(null);\nconst filename = computed(() => store.getters.getOriginalFilename);\nconst fileInputName = ref(FILE_INPUT_NAME);\nconst isUploading = computed(() => store.getters.getIsParsingFile);\nconst hasSucceeded = computed(() => store.getters.uploadedContent !== \"\");\nconst hasProblematicCorners = computed(() => store.getters.hasProblematicCorners);\n\nconst allowed_mime_types = [\n\t'application/dxf',\n\t'application/x-autocad',\n\t'application/x-dxf',\n\t'drawing/x-dxf',\n\t'image/vnd.dxf',\n\t'image/x-autocad',\n\t'image/x-dxf',\n\t'zz-application/zz-winassoc-dxf',\n];\nconst allowed_file_extensions = [\n\t'.dxf',\n];\n\nif ( measurementsConfig && measurementsConfig['base'] && measurementsConfig['base'].shape === \"dxf\") {\n\tfilename.value = measurementsConfig['base'].dxfDefinition.original_filename;\n}\n\nfunction hasAllowedMimeType ( mimetype: string ): boolean {\n\n\t// dxf tend to miss mimetype, so we allow empty mimetype\n\tif ( mimetype.length === 0 ) {\n\t\treturn true;\n\t}\n\n\tif ( allowed_mime_types.includes( mimetype ) ) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction handleFileUpload(): void {\n\tconst files = fileUpload.value.files;\n\n\tif (files.length < 1) {\n\t\treturn;\n\t}\n\n\tconst file = files[0];\n\n\tif (!hasAllowedMimeType(file.type)) {\n\t\treturn;\n\t}\n\n\tuploadFile(file);\n}\n\nfunction resetInput(): void {\n\tfileUpload.value.value = \"\";\n}\n\nfunction reset(): void {\n\tresetInput();\n\n\tstore.commit('updateDxfDefinition', { svgPath: '' } );\n\tstore.commit('setUploadedContent', {result: '', filename: ''} );\n}\n\nfunction setIsHoveringFile(value: boolean): void {\n\tisHoveringFile.value = value;\n}\n\nfunction processDroppedFile(event: DragEvent): void {\n\n\t// Put it in the input and use the same code path for both upload methods (drag, select file).\n\tfileUpload.value.files = event.dataTransfer.files;\n\n\thandleFileUpload();\n}\n\nconst uploadFile = async (file: File): Promise<void> => {\n\tstore.dispatch(\"updateUploadedContent\", file);\n};\n</script>\n<template>\n\t<div class=\"upload-container\">\n\t\t<a v-if=\"showDrawingRules\" :href=\"drawingRules.url\" class=\"text-link\">\n\t\t\t<span aria-hidden=\"true\" class=\"icon icon-info-sign\"></span>\n\t\t\t{{ drawingRules.title }}\n\t\t</a>\n\n\t\t<div v-if=\"hasSucceeded\">\n\t\t\t<div class=\"uploaded-file\">\n\t\t\t\t<span>{{ $i18n.file }}</span>\n\t\t\t\t<strong>{{ filename }}</strong>\n\t\t\t\t<button @click.prevent=\"reset()\">\n\t\t\t\t\t<span aria-hidden=\"true\" class=\"icon icon-delete\"></span>\n\t\t\t\t\t<span class=\"screen-reader-text\">\n\t\t\t\t\t\t{{ $i18n.removeFile.replace(\"%s\", filename) }}\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<portal-target name=\"shape-preview\" />\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div\n\t\t\t:class=\"{\n\t\t\t\t'file-dropbox': true,\n\t\t\t\t'file-dropbox--hovering': isHoveringFile,\n\t\t\t}\"\n\t\t\t@dragover.prevent=\"setIsHoveringFile(true)\"\n\t\t\t@dragenter.prevent=\"setIsHoveringFile(true)\"\n\t\t\t@dragleave.prevent=\"setIsHoveringFile(false)\"\n\t\t\t@dragend.prevent=\"setIsHoveringFile(false)\"\n\t\t\t@dragdrop.prevent=\"setIsHoveringFile(false)\"\n\t\t\t@drop.prevent=\"\n\t\t\t\tsetIsHoveringFile(false);\n\t\t\t\tprocessDroppedFile($event);\n\t\t\t\"\n\t\t>\n\t\t\t<p>\n\t\t\t\t{{ hasSucceeded ? $i18n.messages.dragNewFilesToUpload : $i18n.messages.dragFilesToUpload }}\n\t\t\t\t<span class=\"small\">({{ allowed_file_extensions.join('/') }})</span>\n\t\t\t\t<br>\n\t\t\t\t<span>{{ $i18n.or }}</span>\n\t\t\t</p>\n\n\t\t\t<label for=\"measurements-selector-file-upload\">\n\t\t\t\t<span class=\"button button--blue\">{{ $i18n.selectFile }}</span>\n\t\t\t</label>\n\t\t\t<input\n\t\t\t\tclass=\"file-upload\"\n\t\t\t\tid=\"measurements-selector-file-upload\"\n\t\t\t\tref=\"fileUpload\"\n\t\t\t\t:name=\"fileInputName\"\n\t\t\t\ttype=\"file\"\n\t\t\t\t:accept=\"`${allowed_file_extensions.join(',')},${allowed_mime_types.join(',')}`\"\n\t\t\t\tv-on:change=\"handleFileUpload\"\n\t\t\t\taria-describedby=\"measurements-selector-file-upload-validation-message\"\n\t\t\t/>\n\n\t\t\t<div v-if=\"showDrawingExplanation\" class=\"small\">\n\t\t\t\t{{ $i18n.dxfExplainer }}<br>\n\t\t\t\t<a :href=\"drawingExplainer.url\">\n\t\t\t\t\t{{ drawingExplainer.title }}\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t\t<span v-if=\"isUploading\">\n\t\t\t\t{{ $i18n.uploadingFile }}\n\t\t\t</span>\n\t\t</div>\n\t\t<validation-message\n\t\t\tv-if=\"hasProblematicCorners\"\n\t\t\ttype=\"notice\"\n\t\t>\n\t\t\t{{ $i18n.problematicCornersNotice }}\n\t\t</validation-message>\n\t</div>\n</template>\n<style scoepd lang=\"scss\">\n.upload-container {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n\tbackground-color: $brand-blue-background;\n\tborder-radius: 8px;\n\tpadding: 20px;\n}\n\n.small {\n\t@include font-size(12px);\n}\n\n.uploaded-file {\n\t@include font-size(12px);\n\tdisplay: flex;\n\tborder: 1px solid $border-color-blue;\n\talign-items: center;\n\tgap: 8px;\n\tpadding-left: 8px;\n\n\tbutton {\n\t\tmargin-left: auto;\n\t\tbackground-color: transparent;\n\t\tpadding-block: 4px;\n\t}\n}\n\n.text-link {\n\t@include font-size(12px);\n\tcolor: $brand-blue-dark;\n\tdisplay: flex;\n\tgap: 16px;\n\talign-items: center;\n\tfont-weight: 600;\n\n\t.icon {\n\t\t@include font-size(18px);\n\t}\n}\n\n.file-dropbox {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tborder: 1px dashed $brand-blue-dark;\n\tborder-radius: 8px;\n\ttext-align: center;\n\tposition: relative;\n\tpadding: 10px;\n\twidth: 100%;\n\n\t&--hovering {\n\t\tborder-style: solid;\n\t}\n\n\t&--uploaded {\n\t\tborder-style: none;\n\t}\n\n\tp {\n\t\ttext-align: center;\n\t\tmargin: 0;\n\t}\n}\n\n.file-upload {\n\tcursor: pointer;\n\topacity: 0;\n\twidth: 0;\n\theight: 0;\n}\n</style>\n","import script from \"./ShapeUpload.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ShapeUpload.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ShapeUpload.vue?vue&type=style&index=0&id=379fa182&scoepd=true&lang=scss\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n\t<div>\n\t\t<small>{{ i18n.sideSelection.explanation }}</small>\n\t\t<br />\n\t\t<SideToggle\n\t\t\t:value=\"sideSelection\"\n\t\t\tname=\"measurements[side_selection]\"\n\t\t\tidPrefix=\"measurements-side-selection\"\n\t\t\t@input=\"(value) => updateSideSelection(value)\"\n\t\t/>\n\t</div>\n</template>\n\n<script>\nimport { mapGetters, mapMutations } from \"vuex\";\nimport SideToggle from \"@/components/SideToggle\";\n\nexport default {\n\tcomponents: { SideToggle },\n\tcomputed: {\n\t\ti18n() { return this.$i18n; },\n\t\t...mapGetters( [\n\t\t\t'sideSelection',\n\t\t] ),\n\t},\n\tmethods: {\n\t\t...mapMutations( [\n\t\t\t'updateSideSelection',\n\t\t] ),\n\t},\n};\n</script>\n","// Adds background to captions in SVG string\nexport const addCaptionBackgrounds = (\n\tsvgString: string,\n\tratio: number\n): string => {\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\tconst svgElement = doc.documentElement;\n\tconst captions = svgElement.querySelector(\"#captions\");\n\n\tif (!captions) {\n\t\treturn svgString;\n\t}\n\n\tconst textElements = captions.querySelectorAll(\"text\");\n\ttextElements.forEach((element) => {\n\t\tconst isActive = element.getAttribute(\"stroke\");\n\n\t\tconst fontSize = 4 * ratio;\n\t\telement.setAttribute(\"font-size\", `${fontSize}mm`);\n\n\t\tif(isActive) {\n\t\t\telement.style.removeProperty(\"stroke\");\n\t\t\telement.style.setProperty(\"fill\", \"white\");\n\t\t\telement.setAttribute(\"stroke\", \"none\");\n\t\t}\n\n\t\t// Create temporary SVG element to calculate the bounding box of the text element\n\t\tconst tempSvg = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"svg\"\n\t\t);\n\t\tconst tempText = element.cloneNode(true) as SVGTextElement;\n\t\tif(!tempText.getBBox) {\n\t\t\treturn;\n\t\t}\n\t\ttempSvg.appendChild(tempText);\n\t\tdocument.body.appendChild(tempSvg);\n\n\t\tconst bbox = tempText.getBBox();\n\t\tdocument.body.removeChild(tempSvg);\n\n\t\tconst xPadding = 20 * ratio;\n\t\tconst yPadding = 8 * ratio;\n\t\tconst width = bbox.width + xPadding;\n\t\tconst height = bbox.height + yPadding;\n\t\tconst x = +element.getAttribute(\"x\") - width / 2;\n\t\tconst y = +element.getAttribute(\"y\") - height / 2;\n\n\t\t// Create background rectangel for label\n\t\tconst rect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n\t\trect.setAttribute(\"x\", `${x}`);\n\t\trect.setAttribute(\"y\", `${y}`);\n\t\trect.setAttribute(\"transform\", element.getAttribute(\"transform\"));\n\t\trect.setAttribute(\"width\", `${width}`);\n\t\trect.setAttribute(\"height\", `${height}`);\n\t\trect.setAttribute(\"rx\", `${2 * ratio}`);\n\t\trect.setAttribute(\"stroke\", \"none\");\n\t\trect.setAttribute(\"fill\", isActive ? \"#00adef\" : \"white\");\n\n\t\tcaptions.prepend(rect);\n\t});\n\n\t// Serialize the SVG element back to string\n\tconst serializer = new XMLSerializer();\n\treturn serializer.serializeToString(svgElement);\n};\n\nexport const dottedGuideLines = (\n\tsvgString: string\n): string => {\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\tconst svgElement = doc.documentElement;\n\tconst guideLines = svgElement.querySelector(\"#guide-lines\");\n\tif(guideLines === null) {\n\t\treturn svgString;\n\t}\n\tconst dotDash = 7;\n\tguideLines.setAttribute(\"stroke-dasharray\", `${dotDash},${dotDash}`);\n\tconst serializer = new XMLSerializer();\n\treturn serializer.serializeToString(svgElement);\n};\n\nexport const getTexturedSVG = (\n\tsvgString: string,\n\tsideColor: string,\n\tsideAppearance: string,\n\tpreserveAspectRatio?: string\n): string => {\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\tconst svgElement = doc.documentElement;\n\tconst shapePath = svgElement.querySelector(\"#shape\");\n\tif (preserveAspectRatio) {\n\t\tsvgElement.setAttribute(\"preserveAspectRatio\", preserveAspectRatio);\n\t}\n\n\tconst defs = document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n\n\t// Add metallic texture\n\tif(sideAppearance === \"metallic\") {\n\t\tconst metallicGradient = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"linearGradient\"\n\t\t);\n\t\tmetallicGradient.setAttribute(\"id\", \"metallicGradient\");\n\t\tmetallicGradient.setAttribute(\"x1\", \"0\");\n\t\tmetallicGradient.setAttribute(\"x2\", \"0\");\n\t\tmetallicGradient.setAttribute(\"y1\", \"0\");\n\t\tmetallicGradient.setAttribute(\"y2\", \"1\");\n\t\tmetallicGradient.setAttribute(\"gradientTransform\", \"rotate(80, 0.5, 0.5)\");\n\t\tmetallicGradient.innerHTML = `\n\t\t\t<stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"0.1\" />\n\t\t\t<stop offset=\"10%\" stop-color=\"white\" stop-opacity=\"0.3\" />\n\t\t\t<stop offset=\"30%\" stop-color=\"white\" stop-opacity=\"0.1\" />\n\t\t\t<stop offset=\"40%\" stop-color=\"black\" stop-opacity=\"0.1\" />\n\t\t\t<stop offset=\"50%\" stop-color=\"black\" stop-opacity=\"0.3\" />\n\t\t\t<stop offset=\"60%\" stop-color=\"black\" stop-opacity=\"0.1\" />\n\t\t\t<stop offset=\"70%\" stop-color=\"white\" stop-opacity=\"0.1\" />\n\t\t\t<stop offset=\"90%\" stop-color=\"white\" stop-opacity=\"0.3\" />\n\t\t\t<stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"0.1\" />\n\t\t`;\n\t\tdefs.appendChild(metallicGradient);\n\n\t\t// Clone shape path so the texture is applied to the whole shape\n\t\tconst clonedPath = shapePath.cloneNode(true) as SVGPathElement;\n\t\tclonedPath.removeAttribute(\"id\");\n\t\tclonedPath.setAttribute(\"stroke\", \"none\");\n\t\tclonedPath.setAttribute(\"fill\", 'url(#metallicGradient)');\n\t\tshapePath.after(clonedPath);\n\t}\n\n\t// Add gloss texture\n\tif(sideAppearance === \"gloss\") {\n\t\tdefs.innerHTML = `\n\t\t\t<linearGradient id=\"glossTextureGradient\" gradientTransform=\"rotate(-100, 0.5, 0.5)\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t\t<stop offset=\"59.999%\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t\t<stop offset=\"60%\" stop-color=\"white\" stop-opacity=\"30%\" />\n\t\t\t\t<stop offset=\"90%\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient id=\"glossTextureFade\" y2=\"1\" x2=\"0\">\n\t\t\t\t<stop offset=\"0\" stop-color=\"white\" stop-opacity=\"1\" />\n\t\t\t\t<stop offset=\"0.7\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<mask id=\"glossTextureMask\" maskContentUnits=\"objectBoundingBox\">\n\t\t\t\t<rect width=\"1\" height=\"1\" fill=\"url(#glossTextureFade)\" />\n\t\t\t</mask>\n\t\t`;\n\n\t\t// Clone shape path so the texture is applied to the whole shape\n\t\tconst clonedPath = shapePath.cloneNode(true) as SVGPathElement;\n\t\tclonedPath.removeAttribute(\"id\");\n\t\tclonedPath.setAttribute(\"stroke\", \"none\");\n\t\tclonedPath.setAttribute(\"fill\", 'url(#glossTextureGradient)');\n\t\tclonedPath.setAttribute(\"mask\", 'url(#glossTextureMask)');\n\t\tshapePath.after(clonedPath);\n\t}\n\n\tif(sideAppearance === \"transparent\") {\n\t\tdefs.innerHTML = `\n\t\t\t<linearGradient id=\"transparentTextureGradient\" gradientTransform=\"rotate(-100, 0.5, 0.5)\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t<stop stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t\t<stop offset=\"59.999%\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t\t<stop offset=\"60%\" stop-color=\"black\" stop-opacity=\"15%\" />\n\t\t\t\t<stop offset=\"90%\" stop-color=\"black\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<linearGradient id=\"transparentTextureFade\" y2=\"1\" x2=\"0\">\n\t\t\t\t<stop offset=\"0\" stop-color=\"white\" stop-opacity=\"1\" />\n\t\t\t\t<stop offset=\"0.7\" stop-color=\"white\" stop-opacity=\"0\" />\n\t\t\t</linearGradient>\n\t\t\t<mask id=\"transparentTextureMask\" maskContentUnits=\"objectBoundingBox\">\n\t\t\t\t<rect width=\"1\" height=\"1\" fill=\"url(#transparentTextureFade)\" />\n\t\t\t</mask>\n\t\t`;\n\n\t\t// Clone shape path so the texture is applied to the whole shape\n\t\tconst clonedPath = shapePath.cloneNode(true) as SVGPathElement;\n\t\tclonedPath.removeAttribute(\"id\");\n\t\tclonedPath.setAttribute(\"stroke\", \"none\");\n\t\tclonedPath.setAttribute(\"fill\", 'url(#transparentTextureGradient)');\n\t\tclonedPath.setAttribute(\"mask\", 'url(#transparentTextureMask)');\n\t\tshapePath.after(clonedPath);\n\t}\n\n\t// Add brushed or copper texture\n\tif(sideAppearance === \"copper\" || sideAppearance === \"brushed\" || sideAppearance === \"black\") {\n\t\tsideColor = sideAppearance === 'copper' ? '#d1793b' : sideColor;\n\n\t\tconst brushedTextureHighlightGradient = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"linearGradient\"\n\t\t);\n\t\tbrushedTextureHighlightGradient.setAttribute(\"id\", \"brushedTextureHighlight\");\n\t\tbrushedTextureHighlightGradient.setAttribute(\"x1\", \"0\");\n\t\tbrushedTextureHighlightGradient.setAttribute(\"x2\", \"0\");\n\t\tbrushedTextureHighlightGradient.setAttribute(\"y1\", \"0\");\n\t\tbrushedTextureHighlightGradient.setAttribute(\"y2\", \"1\");\n\t\tbrushedTextureHighlightGradient.setAttribute(\"gradientTransform\", \"rotate(80, 0.5, 0.5)\");\n\t\tbrushedTextureHighlightGradient.innerHTML = `\n\t\t\t<stop offset=\"0%\" stop-color=\"black\" stop-opacity=\"0.3\" />\n\t\t\t<stop offset=\"10%\" stop-color=\"black\" stop-opacity=\"0\" />\n\t\t\t<stop offset=\"30%\" stop-color=\"black\" stop-opacity=\"0\" />\n\t\t\t<stop offset=\"40%\" stop-color=\"white\" stop-opacity=\"0.15\" />\n\t\t\t<stop offset=\"50%\" stop-color=\"white\" stop-opacity=\"0.4\" />\n\t\t\t<stop offset=\"60%\" stop-color=\"white\" stop-opacity=\"0.15\" />\n\t\t\t<stop offset=\"70%\" stop-color=\"black\" stop-opacity=\"0\" />\n\t\t\t<stop offset=\"90%\" stop-color=\"black\" stop-opacity=\"0\" />\n\t\t\t<stop offset=\"100%\" stop-color=\"black\" stop-opacity=\"0.3\" />\n\t\t`;\n\t\tdefs.appendChild(brushedTextureHighlightGradient);\n\n\t\tconst brushedTextureBrushingFilter = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"filter\"\n\t\t);\n\n\t\tbrushedTextureBrushingFilter.setAttribute(\"id\", \"brushedTextureBrushing\");\n\t\tbrushedTextureBrushingFilter.innerHTML = `\n\t\t\t<feTurbulence type=\"fractalNoise\" baseFrequency=\".0006 10\" numOctaves=\"5\" />\n\t\t\t<feColorMatrix type=\"matrix\" values=\"1   0   0   0   0\n\t\t\t\t1   0   0   0   0\n\t\t\t\t1   0   0   0   0\n\t\t\t\t0   0   0   1   0 \" />\n\t\t\t<feColorMatrix\n\t\t\t\tcolor-interpolation-filters=\"sRGB\"\n\t\t\t\ttype=\"matrix\"\n\t\t\t\tvalues=\"${getColorMatrixValues(sideColor, sideAppearance)}\"\n\t\t\t/>\n\t\t\t<feComposite operator=\"in\" in2=\"SourceGraphic\" />\n\t\t`;\n\n\t\tsvgElement.prepend(brushedTextureBrushingFilter);\n\n\t\tconst brushedTextureNoiseFilter = document.createElementNS(\n\t\t\t\"http://www.w3.org/2000/svg\",\n\t\t\t\"filter\"\n\t\t);\n\n\t\tbrushedTextureNoiseFilter.setAttribute(\"id\", \"brushedTextureNoise\");\n\t\tbrushedTextureNoiseFilter.innerHTML = `\n\t\t\t<feTurbulence type=\"fractalNoise\" baseFrequency=\"10\" numOctaves=\"3\" stitchTiles=\"stitch\" />\n\t\t\t<feComposite operator=\"in\" in2=\"SourceGraphic\" />\n\t\t`;\n\n\t\tsvgElement.prepend(brushedTextureNoiseFilter);\n\n\t\t// Clone shape path so the textures are applied to the whole shape\n\t\tconst brushedTextureHighlight = shapePath.cloneNode(true) as SVGPathElement;\n\t\tbrushedTextureHighlight.removeAttribute(\"id\");\n\t\tbrushedTextureHighlight.setAttribute(\"stroke\", \"none\");\n\t\tbrushedTextureHighlight.setAttribute(\"fill\", 'url(#brushedTextureHighlight)');\n\t\tshapePath.after(brushedTextureHighlight);\n\n\t\tconst brushedTextureBrushing = shapePath.cloneNode(true) as SVGPathElement;\n\t\tbrushedTextureBrushing.removeAttribute(\"id\");\n\t\tbrushedTextureBrushing.setAttribute(\"stroke\", \"none\");\n\t\tbrushedTextureBrushing.setAttribute(\"fill\", sideColor);\n\t\tbrushedTextureBrushing.setAttribute(\"filter\", 'url(#brushedTextureBrushing)');\n\t\tshapePath.after(brushedTextureBrushing);\n\n\t\tconst brushedTextureNoise = shapePath.cloneNode(true) as SVGPathElement;\n\t\tbrushedTextureNoise.removeAttribute(\"id\");\n\t\tbrushedTextureNoise.setAttribute(\"stroke\", \"none\");\n\t\tbrushedTextureNoise.setAttribute(\"fill\", sideColor);\n\t\tbrushedTextureNoise.setAttribute(\"filter\", 'url(#brushedTextureNoise)');\n\t\tbrushedTextureNoise.setAttribute(\"opacity\", '0.2');\n\t\tshapePath.after(brushedTextureNoise);\n\t}\n\n\tsvgElement.prepend(defs);\n\n\t// Change shape color based of color or black appearance\n\tif(sideAppearance === \"black\") {\n\t\tshapePath.setAttribute(\"fill\", \"#333\");\n\t} else {\n\t\tshapePath.setAttribute(\"fill\", sideColor);\n\t}\n\n\tconst serializer = new XMLSerializer();\n\treturn serializer.serializeToString(svgElement);\n};\n\nexport const getColorMatrixValues = (\n\tsideColor: string,\n\tsideAppearance: string\n): string => {\n\tconst color = sideAppearance === \"copper\" ? \"#d1793b\" : sideColor;\n\tconst hex = color.replace(\"#\", \"\");\n\tconst r = (parseInt(hex.substring(0, 2), 16) / 255).toFixed(2);\n\tconst g = (parseInt(hex.substring(2, 4), 16) / 255).toFixed(2);\n\tconst b = (parseInt(hex.substring(4, 6), 16) / 255).toFixed(2);\n\n\treturn [r, 0, 0, 0, 0, 0, g, 0, 0, 0, 0, 0, b, 0, 0, 0, 0, 0, 1, 0].join(\" \");\n};\n\n/**\n * Use to reorder the SVG,\n * some paths are needed to rendered before others.\n */\nexport const reorderSVG = (svgString: string): string => {\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\tconst svgElement = doc.documentElement;\n\tconst dimensionLines = svgElement.querySelector(\"#dimension-lines\");\n\tconst captions = svgElement.querySelector(\"#captions\");\n\n\tif(dimensionLines === null || captions === null) {\n\t\treturn svgString;\n\t}\n\n\t// Place the dimension lines just before the captions\n\t// to ensure they are rendered on top of all the other elements\n\tcaptions.parentNode.insertBefore(dimensionLines, captions);\n\n\tconst serializer = new XMLSerializer();\n\treturn serializer.serializeToString(svgElement);\n};\n\nexport const addStyleToSVG = (\n\tsvgString: string\n):string => {\n\tconst parser = new DOMParser();\n\tconst doc = parser.parseFromString(svgString, \"image/svg+xml\");\n\tconst svgElement = doc.documentElement;\n\n\tconst activeCutout = svgElement.querySelector(\"#active-cutout\");\n\tif(activeCutout) {\n\t\tactiveCutout.setAttribute(\"stroke\", \"#7ed321\");\n\t\tactiveCutout.setAttribute(\"fill\", \"#f0faff\");\n\t}\n\n\tconst activeDrillhole = svgElement.querySelector(\"#active-drillhole\");\n\tif(activeDrillhole) {\n\t\tactiveDrillhole.setAttribute(\"stroke\", \"#7ed321\");\n\t\tactiveDrillhole.setAttribute(\"fill\", \"#f0faff\");\n\t}\n\n\tconst hiddenRectangle = svgElement.querySelector(\"#hidden-rectangle\");\n\tif(hiddenRectangle) {\n\t\thiddenRectangle.setAttribute(\"fill\", \"none\");\n\t\thiddenRectangle.setAttribute(\"stroke\", \"none\");\n\t}\n\n\tconst serializer = new XMLSerializer();\n\treturn serializer.serializeToString(svgElement);\n};\n","import { defineComponent as _defineComponent } from 'vue'\nimport { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-f084231a\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"id\", \"name\", \"value\", \"checked\"]\nconst _hoisted_2 = [\"for\"]\nconst _hoisted_3 = [\"innerHTML\"]\nconst _hoisted_4 = [\"src\"]\nconst _hoisted_5 = {\n  key: 2,\n  class: \"badge\"\n}\nconst _hoisted_6 = { class: \"text\" }\n\ninterface Props {\n\tisActive: boolean;\n\tvalue: string;\n\timage: string;\n\trawImage?: boolean;\n\tbadge?: string;\n\tlabel: string;\n\tname: string;\n\tonInput: Function;\n\tactiveValue: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'OptionSelector',\n  props: {\n    isActive: { type: Boolean },\n    value: {},\n    image: {},\n    rawImage: { type: Boolean },\n    badge: {},\n    label: {},\n    name: {},\n    onInput: { type: Function },\n    activeValue: {}\n  },\n  setup(__props: any) {\n\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", {\n    class: _normalizeClass({\n\t\t\t'option-selector': true,\n\t\t\t'option-selector--active': _ctx.isActive,\n\t\t})\n  }, [\n    _createElementVNode(\"input\", {\n      class: \"input\",\n      type: \"radio\",\n      id: _ctx.value,\n      name: _ctx.name,\n      value: _ctx.value,\n      onInput: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.onInput && _ctx.onInput(...args))),\n      checked: _ctx.activeValue === _ctx.value\n    }, null, 40, _hoisted_1),\n    _createElementVNode(\"label\", {\n      for: _ctx.value,\n      class: \"label\"\n    }, [\n      (_ctx.rawImage)\n        ? (_openBlock(), _createElementBlock(\"div\", {\n            key: 0,\n            class: \"image\",\n            innerHTML: _ctx.image\n          }, null, 8, _hoisted_3))\n        : (_openBlock(), _createElementBlock(\"img\", {\n            key: 1,\n            class: \"image\",\n            src: _ctx.image,\n            alt: \"\",\n            width: \"140\",\n            height: \"100\"\n          }, null, 8, _hoisted_4)),\n      (_ctx.badge)\n        ? (_openBlock(), _createElementBlock(\"span\", _hoisted_5, _toDisplayString(_ctx.badge), 1))\n        : _createCommentVNode(\"\", true),\n      _createElementVNode(\"span\", _hoisted_6, _toDisplayString(_ctx.label), 1)\n    ], 8, _hoisted_2)\n  ], 2))\n}\n}\n\n})","import script from \"./OptionSelector.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./OptionSelector.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./OptionSelector.vue?vue&type=style&index=0&id=f084231a&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-f084231a\"]])\n\nexport default __exports__","<template>\n\t<div class=\"option-selector-wrapper\">\n\t\t<slot></slot>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n\t.option-selector-wrapper {\n\t\tdisplay: flex;\n\t\tgap: 20px;\n\t}\n\n\t.option-selector-wrapper :deep(> *) {\n\t\twidth: 100%;\n\t\tmax-width: 50%;\n\t\tposition: relative;\n\t}\n</style>\n","import { render } from \"./OptionSelectorWrapper.vue?vue&type=template&id=541945d4&scoped=true\"\nconst script = {}\n\nimport \"./OptionSelectorWrapper.vue?vue&type=style&index=0&id=541945d4&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-541945d4\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nimport { computed } from \"vue\";\nimport { getTexturedSVG } from \"@/utilities/SVGPreview\";\nimport { makerjs } from \"../../../source/js/shared/rendering/makerjs\";\nimport OptionSelector from \"@/components/UI/OptionSelector.vue\";\nimport OptionSelectorWrapper from \"@/components/UI/OptionSelectorWrapper.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'SideToggle',\n  props: {\n    value: {},\n    name: {},\n    idPrefix: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst front = computed(() => {\n\treturn i18n.sideSelection.settings.topSide;\n});\nconst back = computed(() => {\n\treturn i18n.sideSelection.settings.backSide;\n});\n\nconst svgFront = computed(() => {\n\treturn getTexturedSVG(\n\t\tgetRectangle(),\n\t\tfront.value.color,\n\t\tfront.value.appearance,\n\t\t\"xMinYMin slice\"\n\t);\n});\n\nconst svgBack = computed(() => {\n\treturn getTexturedSVG(\n\t\tgetRectangle(),\n\t\tback.value.color,\n\t\tback.value.appearance,\n\t\t\"xMinYMin slice\"\n\t);\n});\n\nfunction getRectangle() {\n\tconst rectangle = new makerjs.models.Rectangle(170, 120);\n\n\t// @ts-expect-error rectangle is an instance of IModel\n\trectangle.layer = \"shape\";\n\treturn makerjs.exporter.toSVG(rectangle, {\n\t\tuseSvgPathOnly: true,\n\t\tstroke: \"none\",\n\t});\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(OptionSelectorWrapper, null, {\n    default: _withCtx(() => [\n      _createVNode(OptionSelector, {\n        \"is-active\": _ctx.value === 'topSide',\n        value: \"topSide\",\n        image: svgFront.value,\n        rawImage: true,\n        label: front.value.label,\n        onInput: () => _ctx.$emit('input', 'topSide'),\n        name: \"measurements[side_selection]\",\n        activeValue: _ctx.value\n      }, null, 8, [\"is-active\", \"image\", \"label\", \"onInput\", \"activeValue\"]),\n      _createVNode(OptionSelector, {\n        \"is-active\": _ctx.value === 'backSide',\n        value: \"backSide\",\n        image: svgBack.value,\n        rawImage: true,\n        label: back.value.label,\n        onInput: () => _ctx.$emit('input', 'backSide'),\n        name: \"measurements[side_selection]\",\n        activeValue: _ctx.value\n      }, null, 8, [\"is-active\", \"image\", \"label\", \"onInput\", \"activeValue\"])\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { getTexturedSVG } from \"@/utilities/SVGPreview\";\nimport { makerjs } from \"../../../source/js/shared/rendering/makerjs\";\nimport OptionSelector from \"@/components/UI/OptionSelector.vue\";\nimport OptionSelectorWrapper from \"@/components/UI/OptionSelectorWrapper.vue\";\n\nconst props = defineProps<{\n\tvalue: string;\n\tname: string;\n\tidPrefix: string;\n}>();\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst front = computed(() => {\n\treturn i18n.sideSelection.settings.topSide;\n});\nconst back = computed(() => {\n\treturn i18n.sideSelection.settings.backSide;\n});\n\nconst svgFront = computed(() => {\n\treturn getTexturedSVG(\n\t\tgetRectangle(),\n\t\tfront.value.color,\n\t\tfront.value.appearance,\n\t\t\"xMinYMin slice\"\n\t);\n});\n\nconst svgBack = computed(() => {\n\treturn getTexturedSVG(\n\t\tgetRectangle(),\n\t\tback.value.color,\n\t\tback.value.appearance,\n\t\t\"xMinYMin slice\"\n\t);\n});\n\nfunction getRectangle() {\n\tconst rectangle = new makerjs.models.Rectangle(170, 120);\n\n\t// @ts-expect-error rectangle is an instance of IModel\n\trectangle.layer = \"shape\";\n\treturn makerjs.exporter.toSVG(rectangle, {\n\t\tuseSvgPathOnly: true,\n\t\tstroke: \"none\",\n\t});\n}\n</script>\n<template>\n\t<option-selector-wrapper>\n\t\t<!-- front / side-a -->\n\t\t<option-selector\n\t\t\t:is-active=\"value === 'topSide'\"\n\t\t\tvalue=\"topSide\"\n\t\t\t:image=\"svgFront\"\n\t\t\t:rawImage=\"true\"\n\t\t\t:label=\"front.label\"\n\t\t\t:onInput=\"() => $emit('input', 'topSide')\"\n\t\t\tname=\"measurements[side_selection]\"\n\t\t\t:activeValue=\"value\"\n\t\t/>\n\t\t<!-- back / side-b -->\n\t\t<option-selector\n\t\t\t:is-active=\"value === 'backSide'\"\n\t\t\tvalue=\"backSide\"\n\t\t\t:image=\"svgBack\"\n\t\t\t:rawImage=\"true\"\n\t\t\t:label=\"back.label\"\n\t\t\t:onInput=\"() => $emit('input', 'backSide')\"\n\t\t\tname=\"measurements[side_selection]\"\n\t\t\t:activeValue=\"value\"\n\t\t/>\n\t</option-selector-wrapper>\n</template>\n","import script from \"./SideToggle.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./SideToggle.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./SideSelection.vue?vue&type=template&id=88360c9c\"\nimport script from \"./SideSelection.vue?vue&type=script&lang=js\"\nexport * from \"./SideSelection.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, unref as _unref, createBlock as _createBlock, withCtx as _withCtx } from \"vue\"\n\nimport { useStore } from \"vuex\";\nimport { watch, computed } from \"vue\";\nimport OptionSelector from \"@/components/UI/OptionSelector.vue\";\nimport OptionSelectorWrapper from \"@/components/UI/OptionSelectorWrapper.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'EdgeFinish',\n  setup(__props) {\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst kpsSettings = window.measurementSelectorVariables;\nconst store = useStore();\n\nconst exportShape = computed(() => store.getters.exportShape);\nconst activeEdgeFinish = computed(() => store.getters.activeEdgeFinish);\nconst getEdgeFinishMethods = computed(() => store.getters.getEdgeFinishMethods);\nconst getDefaultEdgeFinish = computed(() => store.getters.getDefaultEdgeFinish);\nconst usePriceFromServer = computed(() => store.getters.usePriceFromServer);\n\nwatch(activeEdgeFinish, async (newValue: string, oldValue: string) => {\n\tif (!usePriceFromServer.value) {\n\t\treturn;\n\t}\n\tif (newValue !== oldValue) {\n\t\tstore.dispatch(\"retrieveDxfDefinitionDebounced\");\n\t}\n});\n\nfunction updateEdgeFinish(e: InputEvent) {\n\tconst target = (e.target as HTMLInputElement);\n\tstore.commit(\"updateActiveEdgeFinish\", target.value);\n}\n\nfunction getBadge(value: string): string {\n\tif (getDefaultEdgeFinish.value === value && exportShape.value === 'rectangle') {\n\t\treturn i18n.edgeFinish.meta.free;\n\t} else if (getDefaultEdgeFinish.value !== value) {\n\t\treturn i18n.edgeFinish.meta.premium;\n\t}\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createBlock(OptionSelectorWrapper, null, {\n    default: _withCtx(() => [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(getEdgeFinishMethods.value, ({ value, label }) => {\n        return (_openBlock(), _createBlock(OptionSelector, {\n          name: \"edge-finish\",\n          key: value,\n          isActive: activeEdgeFinish.value === value,\n          activeValue: activeEdgeFinish.value,\n          value: value,\n          image: `${_unref(kpsSettings).assets}/images/${value}-light.png`,\n          badge: getBadge(value),\n          label: label,\n          onInput: updateEdgeFinish\n        }, null, 8, [\"isActive\", \"activeValue\", \"value\", \"image\", \"badge\", \"label\"]))\n      }), 128))\n    ]),\n    _: 1\n  }))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport { watch, computed } from \"vue\";\nimport OptionSelector from \"@/components/UI/OptionSelector.vue\";\nimport OptionSelectorWrapper from \"@/components/UI/OptionSelectorWrapper.vue\";\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst kpsSettings = window.measurementSelectorVariables;\nconst store = useStore();\n\nconst exportShape = computed(() => store.getters.exportShape);\nconst activeEdgeFinish = computed(() => store.getters.activeEdgeFinish);\nconst getEdgeFinishMethods = computed(() => store.getters.getEdgeFinishMethods);\nconst getDefaultEdgeFinish = computed(() => store.getters.getDefaultEdgeFinish);\nconst usePriceFromServer = computed(() => store.getters.usePriceFromServer);\n\nwatch(activeEdgeFinish, async (newValue: string, oldValue: string) => {\n\tif (!usePriceFromServer.value) {\n\t\treturn;\n\t}\n\tif (newValue !== oldValue) {\n\t\tstore.dispatch(\"retrieveDxfDefinitionDebounced\");\n\t}\n});\n\nfunction updateEdgeFinish(e: InputEvent) {\n\tconst target = (e.target as HTMLInputElement);\n\tstore.commit(\"updateActiveEdgeFinish\", target.value);\n}\n\nfunction getBadge(value: string): string {\n\tif (getDefaultEdgeFinish.value === value && exportShape.value === 'rectangle') {\n\t\treturn i18n.edgeFinish.meta.free;\n\t} else if (getDefaultEdgeFinish.value !== value) {\n\t\treturn i18n.edgeFinish.meta.premium;\n\t}\n}\n</script>\n\n<template>\n\t<option-selector-wrapper>\n\t\t<!-- name is hardcoded in app/Measuring/SizeValidator.php -> determine_sawing_method() -->\n\t\t<option-selector\n\t\t\tv-for=\"{ value, label } in getEdgeFinishMethods\"\n\t\t\tname=\"edge-finish\"\n\t\t\t:key=\"value\"\n\t\t\t:isActive=\"activeEdgeFinish === value\"\n\t\t\t:activeValue=\"activeEdgeFinish\"\n\t\t\t:value=\"value\"\n\t\t\t:image=\"`${kpsSettings.assets}/images/${value}-light.png`\"\n\t\t\t:badge=\"getBadge(value)\"\n\t\t\t:label=\"label\"\n\t\t\t:onInput=\"updateEdgeFinish\"\n\t\t/>\n\t</option-selector-wrapper>\n</template>\n","import script from \"./EdgeFinish.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./EdgeFinish.vue?vue&type=script&setup=true&lang=ts\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, withCtx as _withCtx, createVNode as _createVNode, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, withModifiers as _withModifiers, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-44aa26a7\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"thickness-selector\" }\nconst _hoisted_2 = { class: \"thickness-selector__options\" }\nconst _hoisted_3 = [\"href\", \"aria-label\"]\nconst _hoisted_4 = [\"aria-label\"]\n\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport sortBy from \"lodash/sortBy\";\nimport isEmpty from \"lodash/isEmpty\";\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'ThicknessSelector',\n  setup(__props) {\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst currentThickness = computed(() => store.getters.currentProductThickness);\nconst thicknesses = computed(() => sortBy( [ currentThickness.value, ...store.getters.alternateThicknesses ], [ 'thickness' ] ) );\nconst baseShapeInstanceModel = computed(() => store.getters.baseShapeInstance.model);\n\nfunction isActive( thickness: number ): boolean {\n\treturn currentThickness.value.thickness === thickness;\n}\nfunction getUrl( item: { thickness: number; permalink: string; } ): string {\n\tif ( isActive( item.thickness ) ) {\n\t\treturn '#';\n\t}\n\n\treturn item.permalink;\n}\nconst generateTemporaryLink = async ( $event: { target: { href: string; }; } ): Promise<string> => {\n\tif ( ! isEmpty( baseShapeInstanceModel.value ) ) {\n\t\tlocation.href = await store.dispatch( 'generateShareableLink', { url: $event.target.href, isTemporary: true } );\n\n\t\treturn;\n\t}\n\n\tlocation.href = $event.target.href;\n};\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    _createVNode(TextLabel, { class: \"subtitle\" }, {\n      default: _withCtx(() => [\n        _createTextVNode(_toDisplayString(_unref(i18n).thickness_in_mm), 1)\n      ]),\n      _: 1\n    }),\n    _createElementVNode(\"ul\", _hoisted_2, [\n      (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(thicknesses.value, (item, index) => {\n        return (_openBlock(), _createElementBlock(\"li\", {\n          class: _normalizeClass({\n\t\t\t\t'thickness-selector__item': true,\n\t\t\t\t'thickness-selector__item--active': isActive( item.thickness ),\n\t\t\t}),\n          key: index\n        }, [\n          (!isActive( item.thickness ))\n            ? (_openBlock(), _createElementBlock(\"a\", {\n                key: 0,\n                onClick: _withModifiers(generateTemporaryLink, [\"prevent\"]),\n                href: getUrl( item ),\n                class: \"thickness-selector__button\",\n                \"aria-label\": `${item.thickness}mm`\n              }, _toDisplayString(item.thickness), 9, _hoisted_3))\n            : (_openBlock(), _createElementBlock(\"a\", {\n                key: 1,\n                href: \"#\",\n                class: \"thickness-selector__button thickness-selector__button--active\",\n                \"aria-label\": `${item.thickness}mm`\n              }, _toDisplayString(item.thickness), 9, _hoisted_4))\n        ], 2))\n      }), 128))\n    ])\n  ]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport { useStore } from \"vuex\";\nimport sortBy from \"lodash/sortBy\";\nimport isEmpty from \"lodash/isEmpty\";\nimport TextLabel from \"@/components/UI/TextLabel.vue\";\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst currentThickness = computed(() => store.getters.currentProductThickness);\nconst thicknesses = computed(() => sortBy( [ currentThickness.value, ...store.getters.alternateThicknesses ], [ 'thickness' ] ) );\nconst baseShapeInstanceModel = computed(() => store.getters.baseShapeInstance.model);\n\nfunction isActive( thickness: number ): boolean {\n\treturn currentThickness.value.thickness === thickness;\n}\nfunction getUrl( item: { thickness: number; permalink: string; } ): string {\n\tif ( isActive( item.thickness ) ) {\n\t\treturn '#';\n\t}\n\n\treturn item.permalink;\n}\nconst generateTemporaryLink = async ( $event: { target: { href: string; }; } ): Promise<string> => {\n\tif ( ! isEmpty( baseShapeInstanceModel.value ) ) {\n\t\tlocation.href = await store.dispatch( 'generateShareableLink', { url: $event.target.href, isTemporary: true } );\n\n\t\treturn;\n\t}\n\n\tlocation.href = $event.target.href;\n};\n</script>\n<template>\n\t<div class=\"thickness-selector\">\n\t\t<text-label class=\"subtitle\">\n\t\t\t{{ i18n.thickness_in_mm }}\n\t\t</text-label>\n\t\t<ul class=\"thickness-selector__options\">\n\t\t\t<li :class=\"{\n\t\t\t\t'thickness-selector__item': true,\n\t\t\t\t'thickness-selector__item--active': isActive( item.thickness ),\n\t\t\t}\" v-for=\"(item, index) in thicknesses\" :key=\"index\">\n\t\t\t\t<a v-if=\"!isActive( item.thickness )\"\n\t\t\t\t\t@click.prevent=\"generateTemporaryLink\"\n\t\t\t\t\t:href=\"getUrl( item )\"\n\t\t\t\t\tclass=\"thickness-selector__button\"\n\t\t\t\t\t:aria-label=\"`${item.thickness}mm`\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.thickness }}\n\t\t\t\t</a>\n\t\t\t\t<a  v-else\n\t\t\t\t\thref=\"#\"\n\t\t\t\t\tclass=\"thickness-selector__button thickness-selector__button--active\"\n\t\t\t\t\t:aria-label=\"`${item.thickness}mm`\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.thickness }}\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.subtitle {\n\tcolor: $brand-blue-dark;\n\tmargin-bottom: 5px;\n}\n.thickness-selector__options {\n\tdisplay: grid;\n\tgrid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\n}\n.thickness-selector__item {\n\ttext-align: center;\n\tborder: 1px solid $border-color-blue;\n\tposition: relative;\n\tz-index: 1;\n\n\t+ * {\n\t\tmargin-inline-start: -1px;\n\t}\n\n\t&:first-child {\n\t\tborder-start-start-radius: 4px;\n\t\tborder-end-start-radius: 4px;\n\t}\n\n\t&:last-child {\n\t\tborder-start-end-radius: 4px;\n\t\tborder-end-end-radius: 4px;\n\t}\n\n\t&--active {\n\t\tbackground-color: $measurements-light-blue;\n\t\tborder-color: $measurements-preview-blue;\n\t\tz-index: 2;\n\t}\n\n\t&:hover, &:focus {\n\t\tborder-color: $measurements-preview-blue;\n\t\tz-index: 2;\n\t}\n}\n.thickness-selector__button {\n\tdisplay: block;\n\tline-height: 2rem;\n\theight: 2rem;\n\n\t&:hover, &:focus {\n\t\ttext-decoration: underline;\n\t}\n\n\t&--active {\n\t\tfont-weight: 700;\n\t\tcursor: default;\n\n\t\t&:hover, &:focus {\n\t\t\ttext-decoration: none;\n\t\t}\n\t}\n}\n</style>\n","import script from \"./ThicknessSelector.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./ThicknessSelector.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./ThicknessSelector.vue?vue&type=style&index=0&id=44aa26a7&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-44aa26a7\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, withCtx as _withCtx, createBlock as _createBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-676a897e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"material-selector-teaser\" }\nconst _hoisted_2 = { class: \"material-selector-teaser__thumbnail-container\" }\nconst _hoisted_3 = [\"src\"]\nconst _hoisted_4 = { class: \"material-selector-teaser__inner\" }\nconst _hoisted_5 = { class: \"material-selector-teaser__title\" }\nconst _hoisted_6 = [\"innerHTML\"]\nconst _hoisted_7 = { class: \"material-selector-teaser\" }\nconst _hoisted_8 = { class: \"material-selector-teaser__thumbnail-container\" }\nconst _hoisted_9 = [\"src\"]\nconst _hoisted_10 = { class: \"material-selector-teaser__inner\" }\nconst _hoisted_11 = { class: \"material-selector-teaser__title\" }\nconst _hoisted_12 = [\"innerHTML\"]\n\nimport { useStore } from \"vuex\";\nimport { isEmpty } from \"lodash\";\nimport { computed } from \"vue\";\nimport { materialProduct } from \"@/types/product\";\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'MaterialSelector',\n  setup(__props) {\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst store = useStore();\nconst currentProductMaterial = computed(() => store.getters.currentProductMaterial);\nconst alternateMaterials = computed(() => store.getters.alternateMaterials);\nconst baseShapeInstance = computed(() => store.getters.baseShapeInstance);\n\nfunction pricePerSquareMeter( option: materialProduct ): string {\n\treturn `${option.price} / ${option.unit} ${option.suffix}`;\n}\n\nasync function setMaterial( material: materialProduct ): Promise<void> {\n\tif ( material.id === currentProductMaterial.value.id ) {\n\t\treturn;\n\t}\n\n\tstore.commit('updateMaterial', material);\n\tconst url = await getUrl( material );\n\n\tif ( url === '' ) {\n\t\treturn;\n\t}\n\n\tlocation.href = url;\n}\n\nasync function getUrl( material: materialProduct ): Promise<string> {\n\tif ( isEmpty( baseShapeInstance.value ) ) {\n\t\treturn material.permalink;\n\t}\n\n\treturn await store.dispatch( 'generateShareableLink', {\n\t\turl: material.permalink,\n\t\tisTemporary: true\n\t} );\n}\n\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_v_select = _resolveComponent(\"v-select\")!\n\n  return (_openBlock(), _createBlock(_component_v_select, {\n    label: \"title\",\n    class: \"material-selector\",\n    inputId: \"measurements-selector-material-select\",\n    modelValue: currentProductMaterial.value,\n    \"onUpdate:modelValue\": [\n      _cache[0] || (_cache[0] = ($event: any) => ((currentProductMaterial).value = $event)),\n      setMaterial\n    ],\n    options: alternateMaterials.value,\n    clearable: false,\n    placeholder: _unref(i18n).material.selectMaterial\n  }, {\n    option: _withCtx((option) => [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", _hoisted_2, [\n          (option.image)\n            ? (_openBlock(), _createElementBlock(\"img\", {\n                key: 0,\n                class: \"material-selector-teaser__image\",\n                src: option.image,\n                alt: \"\",\n                width: \"60\",\n                height: \"60\",\n                loading: \"lazy\"\n              }, null, 8, _hoisted_3))\n            : _createCommentVNode(\"\", true)\n        ]),\n        _createElementVNode(\"div\", _hoisted_4, [\n          _createElementVNode(\"span\", _hoisted_5, _toDisplayString(option.title), 1),\n          (option.price)\n            ? (_openBlock(), _createElementBlock(\"span\", {\n                key: 0,\n                class: \"material-selector-teaser__subtitle\",\n                innerHTML: pricePerSquareMeter( option )\n              }, null, 8, _hoisted_6))\n            : _createCommentVNode(\"\", true)\n        ])\n      ])\n    ]),\n    \"selected-option\": _withCtx((option) => [\n      _createElementVNode(\"div\", _hoisted_7, [\n        _createElementVNode(\"div\", _hoisted_8, [\n          (option.image)\n            ? (_openBlock(), _createElementBlock(\"img\", {\n                key: 0,\n                class: \"material-selector-teaser__image\",\n                src: option.image,\n                alt: \"\",\n                width: \"60\",\n                height: \"60\",\n                loading: \"lazy\"\n              }, null, 8, _hoisted_9))\n            : _createCommentVNode(\"\", true)\n        ]),\n        _createElementVNode(\"div\", _hoisted_10, [\n          _createElementVNode(\"span\", _hoisted_11, _toDisplayString(option.title), 1),\n          (option.price)\n            ? (_openBlock(), _createElementBlock(\"span\", {\n                key: 0,\n                class: \"material-selector-teaser__subtitle\",\n                innerHTML: pricePerSquareMeter( option )\n              }, null, 8, _hoisted_12))\n            : _createCommentVNode(\"\", true)\n        ])\n      ])\n    ]),\n    _: 1\n  }, 8, [\"modelValue\", \"options\", \"placeholder\"]))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { useStore } from \"vuex\";\nimport { isEmpty } from \"lodash\";\nimport { computed } from \"vue\";\nimport { materialProduct } from \"@/types/product\";\n\nconst i18n = window.measurementSelectorVariables.i18n;\nconst store = useStore();\nconst currentProductMaterial = computed(() => store.getters.currentProductMaterial);\nconst alternateMaterials = computed(() => store.getters.alternateMaterials);\nconst baseShapeInstance = computed(() => store.getters.baseShapeInstance);\n\nfunction pricePerSquareMeter( option: materialProduct ): string {\n\treturn `${option.price} / ${option.unit} ${option.suffix}`;\n}\n\nasync function setMaterial( material: materialProduct ): Promise<void> {\n\tif ( material.id === currentProductMaterial.value.id ) {\n\t\treturn;\n\t}\n\n\tstore.commit('updateMaterial', material);\n\tconst url = await getUrl( material );\n\n\tif ( url === '' ) {\n\t\treturn;\n\t}\n\n\tlocation.href = url;\n}\n\nasync function getUrl( material: materialProduct ): Promise<string> {\n\tif ( isEmpty( baseShapeInstance.value ) ) {\n\t\treturn material.permalink;\n\t}\n\n\treturn await store.dispatch( 'generateShareableLink', {\n\t\turl: material.permalink,\n\t\tisTemporary: true\n\t} );\n}\n\n</script>\n<template>\n\t<v-select\n\t\tlabel=\"title\"\n\t\tclass=\"material-selector\"\n\t\tinputId=\"measurements-selector-material-select\"\n\t\tv-model=\"currentProductMaterial\"\n\t\t:options=\"alternateMaterials\"\n\t\t:clearable=\"false\"\n\t\t:placeholder=\"i18n.material.selectMaterial\"\n\t\t@update:modelValue=\"setMaterial\"\n\t>\n\t\t<template v-slot:option=\"option\">\n\t\t\t<div class=\"material-selector-teaser\">\n\t\t\t\t<div class=\"material-selector-teaser__thumbnail-container\">\n\t\t\t\t\t<img class=\"material-selector-teaser__image\" :src=\"option.image\" alt=\"\" width=\"60\" height=\"60\" loading=\"lazy\" v-if=\"option.image\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"material-selector-teaser__inner\">\n\t\t\t\t\t<span class=\"material-selector-teaser__title\">{{ option.title }}</span>\n\t\t\t\t\t<span class=\"material-selector-teaser__subtitle\" v-if=\"option.price\" v-html=\"pricePerSquareMeter( option )\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<template #selected-option=\"option\">\n\t\t\t<div class=\"material-selector-teaser\">\n\t\t\t\t<div class=\"material-selector-teaser__thumbnail-container\">\n\t\t\t\t\t<img class=\"material-selector-teaser__image\" :src=\"option.image\" alt=\"\" width=\"60\" height=\"60\" loading=\"lazy\" v-if=\"option.image\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"material-selector-teaser__inner\">\n\t\t\t\t\t<span class=\"material-selector-teaser__title\">{{ option.title }}</span>\n\t\t\t\t\t<span class=\"material-selector-teaser__subtitle\" v-if=\"option.price\" v-html=\"pricePerSquareMeter( option )\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t</v-select>\n</template>\n<style scoped lang=\"scss\">\n\n.material-selector {\n\twidth: 100%;\n}\n.material-selector-teaser {\n\tdisplay: flex;\n\talign-items: center;\n\n\t&__thumbnail-container {\n\t\tposition: relative;\n\t\tmargin-right: $default-padding * 0.5;\n\t\twidth: 60px;\n\t\theight: 60px;\n\t\tbackground: $brand-blue-background;\n\t}\n\n\t&__image {\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\ttransform: translateY(-50%);\n\t\tmix-blend-mode: multiply;\n\t}\n\n\t&__inner {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tmax-width: 70%;\n\t}\n\n\t&__title {\n\t\t@include font-size(16px, 18px);\n\t\tcolor: $brand-blue-dark;\n\t\tfont-weight: bold;\n\t\twhite-space: normal;\n\t}\n\n\t&__subtitle {\n\t\t@include font-size(14px, 16px);\n\t\tcolor: $brand-blue-dark;\n\t}\n}\n\n</style>\n","import script from \"./MaterialSelector.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./MaterialSelector.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./MaterialSelector.vue?vue&type=style&index=0&id=676a897e&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-676a897e\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { openBlock as _openBlock, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, createBlock as _createBlock, createElementVNode as _createElementVNode, unref as _unref, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, Teleport as _Teleport, createVNode as _createVNode, Fragment as _Fragment, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-73e6213e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"measurements-selector__product-price-total measurements-selector__product-price-total--left\" }\nconst _hoisted_2 = { class: \"measurements-selector__product-price measurements-selector__product-price--large\" }\nconst _hoisted_3 = {\n  key: 0,\n  class: \"icon icon-spinner2\"\n}\nconst _hoisted_4 = { class: \"measurements-selector__product-price measurements-selector__product-price--small\" }\nconst _hoisted_5 = {\n  key: 0,\n  class: \"icon icon-spinner2\"\n}\nconst _hoisted_6 = { class: \"measurements-selector__product-price-total measurements-selector__product-price-total--small\" }\nconst _hoisted_7 = {\n  key: 0,\n  class: \"icon icon-spinner2\"\n}\nconst _hoisted_8 = {\n  key: 1,\n  class: \"measurements-selector__product-price\"\n}\nconst _hoisted_9 = {\n  key: 2,\n  class: \"icon icon-spinner2\"\n}\n\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport FormattedPrice from './FormattedPrice.vue';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'HeaderPricingInformation',\n  setup(__props) {\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst shouldShowSpinner = computed(() => (store.getters.usePriceFromServer && store.getters.isRetrievingProperties) || store.getters.isRetrievingBulkPricing);\nconst totalPriceIncVat = computed(() => store.getters.getPriceIncVat);\nconst totalPriceExVat = computed(() => store.getters.getPriceExcVat);\n\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(_Fragment, null, [\n    (_openBlock(), _createBlock(_Teleport, { to: \"#measurements-selector-price-desktop\" }, [\n      _createElementVNode(\"div\", _hoisted_1, [\n        _createElementVNode(\"div\", _hoisted_2, [\n          (shouldShowSpinner.value)\n            ? (_openBlock(), _createElementBlock(\"i\", _hoisted_3))\n            : (_openBlock(), _createBlock(FormattedPrice, {\n                key: 1,\n                price: totalPriceIncVat.value\n              }, null, 8, [\"price\"]))\n        ]),\n        _createElementVNode(\"div\", _hoisted_4, [\n          (shouldShowSpinner.value)\n            ? (_openBlock(), _createElementBlock(\"i\", _hoisted_5))\n            : (_openBlock(), _createBlock(FormattedPrice, {\n                key: 1,\n                price: totalPriceExVat.value\n              }, null, 8, [\"price\"])),\n          _createTextVNode(\" \" + _toDisplayString(_unref(i18n).vatExcluded), 1)\n        ])\n      ])\n    ])),\n    (_openBlock(), _createBlock(_Teleport, { to: \"#measurements-selector-price-mobile\" }, [\n      _createElementVNode(\"div\", _hoisted_6, [\n        (shouldShowSpinner.value)\n          ? (_openBlock(), _createElementBlock(\"i\", _hoisted_7))\n          : (_openBlock(), _createElementBlock(\"span\", _hoisted_8, [\n              _createVNode(FormattedPrice, { price: totalPriceIncVat.value }, null, 8, [\"price\"])\n            ])),\n        _createTextVNode(\" \" + _toDisplayString(_unref(i18n).vatIncluded) + \" | \", 1),\n        (shouldShowSpinner.value)\n          ? (_openBlock(), _createElementBlock(\"i\", _hoisted_9))\n          : (_openBlock(), _createBlock(FormattedPrice, {\n              key: 3,\n              price: totalPriceExVat.value\n            }, null, 8, [\"price\"])),\n        _createTextVNode(\" \" + _toDisplayString(_unref(i18n).vatExcluded), 1)\n      ])\n    ]))\n  ], 64))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useStore } from 'vuex';\nimport FormattedPrice from './FormattedPrice.vue';\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\n\nconst shouldShowSpinner = computed(() => (store.getters.usePriceFromServer && store.getters.isRetrievingProperties) || store.getters.isRetrievingBulkPricing);\nconst totalPriceIncVat = computed(() => store.getters.getPriceIncVat);\nconst totalPriceExVat = computed(() => store.getters.getPriceExcVat);\n\n</script>\n\n<template>\n\t<Teleport to=\"#measurements-selector-price-desktop\">\n\t\t<div class=\"measurements-selector__product-price-total measurements-selector__product-price-total--left\">\n\t\t\t<div class=\"measurements-selector__product-price measurements-selector__product-price--large\">\n\t\t\t\t<i v-if=\"shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t\t<formatted-price v-else :price=\"totalPriceIncVat\" />\n\t\t\t</div>\n\t\t\t<div class=\"measurements-selector__product-price measurements-selector__product-price--small\">\n\t\t\t\t<i v-if=\"shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t\t<formatted-price v-else :price=\"totalPriceExVat\" /> {{ i18n.vatExcluded }}\n\t\t\t</div>\n\t\t</div>\n\t</Teleport>\n\t<Teleport to=\"#measurements-selector-price-mobile\">\n\t\t<div class=\"measurements-selector__product-price-total measurements-selector__product-price-total--small\">\n\t\t\t<i v-if=\"shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t<span v-else class=\"measurements-selector__product-price\"><formatted-price :price=\"totalPriceIncVat\" /></span> {{ i18n.vatIncluded }} |\n\t\t\t<i v-if=\"shouldShowSpinner\" class=\"icon icon-spinner2\"></i>\n\t\t\t<formatted-price v-else :price=\"totalPriceExVat\" /> {{ i18n.vatExcluded }}\n\t\t</div>\n\t</Teleport>\n</template>\n<style scoped lang=\"scss\">\n.price-information {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tmargin-bottom: $default-padding * 0.5;\n}\n\n.kps-price {\n\t@include font-size(18px, 21px);\n\tcolor: $headings-color-light;\n\n\t&:first-child {\n\t\tborder-right: 1px solid $border-color;\n\t\tmargin-right: 20px;\n\t\tpadding-right: 20px;\n\t}\n}\n\n.amount {\n\t@include font-size(18px, 24px);\n\tfont-weight: bold;\n\tcolor: $grey-dark;\n}\n</style>\n","import script from \"./HeaderPricingInformation.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./HeaderPricingInformation.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./HeaderPricingInformation.vue?vue&type=style&index=0&id=73e6213e&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-73e6213e\"]])\n\nexport default __exports__","<template>\n\t<svg\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tviewBox=\"0 0 16 16\"\n\t\twidth=\"16\"\n\t\theight=\"16\"\n\t\taria-hidden=\"true\">\n\t\t<path fill=\"none\" stroke=\"#00abef\" d=\"m14.2 5.8-8.4 8.4c-.7.7-1.7.7-2.3 0l-1.7-1.7c-.7-.7-.7-1.7 0-2.3l8.4-8.4c.7-.7 1.7-.7 2.3 0l1.7 1.7c.7.7.7 1.7 0 2.3h0ZM5 7l1.3 1.3M7 5l1.3 1.3M9 3l1.3 1.3M3 9l1.3 1.3\"/>\n\t</svg>\n</template>","import { render } from \"./RulerIcon.vue?vue&type=template&id=4bd5dce5\"\nconst script = {}\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1010dc3c\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"instructions-button__text\" }\n\nimport { useStore } from 'vuex';\nimport RulerIcon from \"../../icons/RulerIcon.vue\";\n\ninterface Props {\n\tmodalName: string;\n\tlabel: string;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'InstructionsButton',\n  props: {\n    modalName: {},\n    label: {}\n  },\n  setup(__props: any) {\n\nconst props = __props;\n\nconst store = useStore();\n\nfunction showInfoModal() {\n\tstore.commit('updateCurrentModalName', props.modalName);\n}\n\nreturn (_ctx: any,_cache: any) => {\n  return (_openBlock(), _createElementBlock(\"button\", {\n    class: \"instructions-button\",\n    type: \"button\",\n    onClick: showInfoModal\n  }, [\n    _createVNode(RulerIcon),\n    _createElementVNode(\"span\", _hoisted_1, _toDisplayString(_ctx.label), 1)\n  ]))\n}\n}\n\n})","<!-- A button that opens an Info Modal -->\n<script setup lang=\"ts\">\nimport { useStore } from 'vuex';\nimport RulerIcon from \"../../icons/RulerIcon.vue\";\n\ninterface Props {\n\tmodalName: string;\n\tlabel: string;\n}\nconst props = defineProps<Props>();\n\nconst store = useStore();\n\nfunction showInfoModal() {\n\tstore.commit('updateCurrentModalName', props.modalName);\n}\n</script>\n\n<template>\n\t<button class=\"instructions-button\" type=\"button\" v-on:click=\"showInfoModal\">\n\t\t<ruler-icon />\n\t\t<span class=\"instructions-button__text\">{{label}}</span>\n\t</button>\n</template>\n\n<style scoped lang=\"scss\">\n.instructions-button {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-weight: 700;\n\tdisplay: flex;\n\tgap:5px;\n\talign-items: center;\n\twhite-space: normal;\n\ttext-align: left;\n}\n.instructions-button > svg {\n\tflex-shrink: 0;\n\twidth: 100%;\n\theight: 100%;\n\tmax-width: 16px;\n\tmax-height: 16px;\n}\n.instructions-button__text {\n\tfont-size: 15px;\n}\n</style>\n","import script from \"./InstructionsButton.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./InstructionsButton.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./InstructionsButton.vue?vue&type=style&index=0&id=1010dc3c&scoped=true&lang=scss\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-1010dc3c\"]])\n\nexport default __exports__","import { defineComponent as _defineComponent } from 'vue'\nimport { createVNode as _createVNode, unref as _unref, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createElementBlock as _createElementBlock, createElementVNode as _createElementVNode, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-414c392d\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  key: 2,\n  class: \"accordion-item__info-button\"\n}\nconst _hoisted_2 = [\"value\"]\nconst _hoisted_3 = [\"value\"]\nconst _hoisted_4 = [\"value\"]\nconst _hoisted_5 = [\"value\"]\nconst _hoisted_6 = [\"value\"]\n\nimport { computed, onMounted, ref, Ref, watch } from 'vue';\nimport { useStore } from 'vuex';\nimport { loadFont } from './functions/makerjs';\nimport AccordionContainer from '@/components/accordion/AccordionContainer.vue';\nimport AccordionItem from '@/components/accordion/AccordionItem.vue';\nimport MountingShapePreview from '@/components/MountingShapePreview.vue';\nimport ShapeSelector from '@/components/ShapeSelector.vue';\nimport ShapeSettings from '@/components/ShapeSettings.vue';\nimport MetaInformation from '@/components/MetaInformation.vue';\nimport DrillHoles from '@/components/DrillHoles.vue';\nimport CutoutsConfiguration from '@/components/CutoutsConfiguration.vue';\nimport ShapeUpload from '@/components/ShapeUpload.vue';\nimport SideSelection from '@/components/SideSelection.vue';\nimport EdgeFinish from '@/components/EdgeFinish.vue';\nimport ThicknessSelector from '@/components/ThicknessSelector.vue';\nimport MaterialSelector from '@/components/MaterialSelector.vue';\nimport HeaderPricingInformation from '@/components/HeaderPricingInformation.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport InstructionsButton from '@/components/UI/InfoModal/InstructionsButton.vue';\nimport InfoModal from '@/components/UI/InfoModal/InfoModal.vue';\nimport { StepTypes } from '@/types/step';\n\nconst selectedUnit = 'cm';\n\n\nexport default /*#__PURE__*/_defineComponent({\n  __name: 'App',\n  setup(__props) {\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\nconst html = window.measurementSelectorVariables.html;\nconst shop = window.measurementSelectorVariables.shop;\nconst settings = window.measurementSelectorVariables.settings;\nconst measuringInstructions = window.measuringInstructions;\nconst containerRef = ref<HTMLElement | null>(null);\n\nconst shape = computed(() => store.getters.shape);\nconst isMediaMobileSize = computed(() => store.getters.isMediaMobileSize);\nconst primitives = computed(() => store.getters.primitives);\nconst currentStepName = computed(() => store.getters.currentStepName);\nconst isDrillHolesVisible = computed(() => store.getters.isDrillHolesVisible);\nconst drillHoleEdgeType = computed(() => store.getters.drillHoleEdgeType);\nconst alternateThicknesses = computed(() => store.getters.alternateThicknesses);\nconst measurements = computed(() => store.getters.measurements);\nconst stringifiedConfig = computed(() => store.getters.stringifiedConfig);\nconst exportCompositeDxf = computed(() => store.getters.exportCompositeDxf);\nconst dxfExport = computed(() => store.getters.dxfExport);\nconst exportShape = computed(() => store.getters.exportShape);\nconst isShapeComplete = computed(() => store.getters.isShapeComplete);\nconst isEdgeFinishVisible = computed(() => store.getters.isEdgeFinishVisible);\nconst isCutoutsVisible = computed(() => store.getters.isCutoutsVisible);\nconst alternateMaterials = computed(() => store.getters.alternateMaterials);\nconst showSideSelection = computed(() => store.getters.showSideSelection);\n\nfunction isPortalActive( stepName: StepTypes ): boolean {\n\treturn currentStepName.value === stepName;\n}\n\nfunction scrollTo(view: Ref<HTMLElement | null>) {\n\tview.value?.scrollIntoView({ behavior: 'smooth' });\n}\n\nonMounted(async () => {\n\n\t// Pre-load default font\n\tconst defaultFont = `${window.measurementSelectorVariables.fontDirUrl}Exo-Bold.ttf`;\n\tconst fontObj = await loadFont(defaultFont);\n\n\tstore.commit('addFont', { fontName: 'Exo-Bold', font: fontObj });\n\tstore.commit('setSelectedFontObject', fontObj );\n\n\twindow?.dataLayer?.push( {\n\t\tevent: 'measurements_selector',\n\t\teventCategory: 'Measurements Selector',\n\t\teventAction: 'Display',\n\t\teventLabel: document.title,\n\t} );\n});\n\nwatch(currentStepName, async (newValue: StepTypes, oldValue: StepTypes) => {\n\tif (newValue !== oldValue) {\n\t\tif (!isMediaMobileSize.value) {\n\t\t\tscrollTo(containerRef);\n\t\t}\n\t}\n});\n\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_portal = _resolveComponent(\"portal\")!\n  const _component_portal_target = _resolveComponent(\"portal-target\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", {\n    id: \"app-measurements-selector\",\n    class: \"measurements-selector\",\n    ref_key: \"containerRef\",\n    ref: containerRef\n  }, [\n    _createVNode(HeaderPricingInformation),\n    _createVNode(AccordionContainer, null, {\n      default: _withCtx(() => [\n        _createVNode(AccordionItem, {\n          \"step-name\": _unref(StepTypes).shapeSize\n        }, {\n          default: _withCtx(() => [\n            _createVNode(ShapeSelector),\n            _createVNode(_component_portal, {\n              to: \"mobile-accordion-preview\",\n              disabled: !isMediaMobileSize.value\n            }, {\n              default: _withCtx(() => [\n                _createVNode(MountingShapePreview, {\n                  primitives: primitives.value,\n                  unit: selectedUnit\n                }, null, 8, [\"primitives\"])\n              ]),\n              _: 1\n            }, 8, [\"disabled\"]),\n            (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).shapeSize ))\n              ? (_openBlock(), _createBlock(_component_portal_target, {\n                  key: 0,\n                  name: \"mobile-accordion-preview\"\n                }))\n              : _createCommentVNode(\"\", true),\n            (shape.value !== 'dxf')\n              ? (_openBlock(), _createBlock(ShapeSettings, { key: 1 }))\n              : _createCommentVNode(\"\", true),\n            _createVNode(MeasurementsHeightTransition, {\n              appear: \"\",\n              mode: \"out-in\"\n            }, {\n              default: _withCtx(() => [\n                (shape.value === 'dxf')\n                  ? (_openBlock(), _createBlock(ShapeUpload, { key: 0 }))\n                  : _createCommentVNode(\"\", true)\n              ]),\n              _: 1\n            }),\n            (_unref(measuringInstructions) && _unref(measuringInstructions).length > 0)\n              ? (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n                  _createVNode(InstructionsButton, {\n                    \"modal-name\": \"measuringInstrictions\",\n                    label: _unref(i18n).measuringInstructionsLabel\n                  }, {\n                    default: _withCtx(() => [\n                      _createTextVNode(_toDisplayString(_unref(i18n).measuringInstructionsLabel), 1)\n                    ]),\n                    _: 1\n                  }, 8, [\"label\"]),\n                  _createVNode(InfoModal, {\n                    \"modal-name\": \"measuringInstrictions\",\n                    content: _unref(measuringInstructions)\n                  }, null, 8, [\"content\"])\n                ]))\n              : _createCommentVNode(\"\", true)\n          ]),\n          _: 1\n        }, 8, [\"step-name\"]),\n        (shape.value !== '' && alternateThicknesses.value.length > 0)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 0,\n              \"step-name\": _unref(StepTypes).thickness\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).thickness ))\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(ThicknessSelector)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true),\n        (shape.value !== '' && alternateMaterials.value.length > 0)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 1,\n              \"step-name\": _unref(StepTypes).material\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).material ))\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(MaterialSelector)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true),\n        (isDrillHolesVisible.value)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 2,\n              \"step-name\": _unref(StepTypes).drillholes\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).drillholes ) && drillHoleEdgeType.value !== 'around')\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(DrillHoles)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true),\n        (isCutoutsVisible.value)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 3,\n              \"step-name\": _unref(StepTypes).cutouts\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).cutouts ))\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(CutoutsConfiguration)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true),\n        (showSideSelection.value)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 4,\n              \"step-name\": _unref(StepTypes).sideSelection\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).sideSelection ))\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(SideSelection)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true),\n        (isEdgeFinishVisible.value)\n          ? (_openBlock(), _createBlock(AccordionItem, {\n              key: 5,\n              \"step-name\": _unref(StepTypes).edgeFinish\n            }, {\n              default: _withCtx(() => [\n                (isMediaMobileSize.value && isPortalActive( _unref(StepTypes).edgeFinish ))\n                  ? (_openBlock(), _createBlock(_component_portal_target, {\n                      key: 0,\n                      name: \"mobile-accordion-preview\"\n                    }))\n                  : _createCommentVNode(\"\", true),\n                _createVNode(EdgeFinish)\n              ]),\n              _: 1\n            }, 8, [\"step-name\"]))\n          : _createCommentVNode(\"\", true)\n      ]),\n      _: 1\n    }),\n    _createVNode(MetaInformation, {\n      isShapeComplete: isShapeComplete.value,\n      availability: _unref(html).availability,\n      shape: measurements.value.shape,\n      primitives: primitives.value,\n      settings: _unref(settings),\n      currency: _unref(shop).currency,\n      locale: _unref(shop).locale,\n      dxfDefinition: measurements.value.dxfDefinition\n    }, null, 8, [\"isShapeComplete\", \"availability\", \"shape\", \"primitives\", \"settings\", \"currency\", \"locale\", \"dxfDefinition\"]),\n    (measurements.value.modifiers.font !== '')\n      ? (_openBlock(), _createElementBlock(\"input\", {\n          key: 0,\n          type: \"hidden\",\n          name: \"measurements[modifiers][font]\",\n          value: measurements.value.modifiers.font\n        }, null, 8, _hoisted_2))\n      : _createCommentVNode(\"\", true),\n    _createElementVNode(\"input\", {\n      type: \"hidden\",\n      name: \"measurements[shape]\",\n      value: measurements.value.shape\n    }, null, 8, _hoisted_3),\n    _createElementVNode(\"input\", {\n      type: \"hidden\",\n      name: \"measurements[export_shape]\",\n      value: exportShape.value\n    }, null, 8, _hoisted_4),\n    (exportCompositeDxf.value)\n      ? (_openBlock(), _createElementBlock(\"input\", {\n          key: 1,\n          type: \"hidden\",\n          name: \"measurements[dxf_export]\",\n          value: dxfExport.value\n        }, null, 8, _hoisted_5))\n      : _createCommentVNode(\"\", true),\n    _createElementVNode(\"input\", {\n      type: \"hidden\",\n      name: \"measurements_config\",\n      value: stringifiedConfig.value\n    }, null, 8, _hoisted_6)\n  ], 512))\n}\n}\n\n})","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, Ref, watch } from 'vue';\nimport { useStore } from 'vuex';\nimport { loadFont } from './functions/makerjs';\nimport AccordionContainer from '@/components/accordion/AccordionContainer.vue';\nimport AccordionItem from '@/components/accordion/AccordionItem.vue';\nimport MountingShapePreview from '@/components/MountingShapePreview.vue';\nimport ShapeSelector from '@/components/ShapeSelector.vue';\nimport ShapeSettings from '@/components/ShapeSettings.vue';\nimport MetaInformation from '@/components/MetaInformation.vue';\nimport DrillHoles from '@/components/DrillHoles.vue';\nimport CutoutsConfiguration from '@/components/CutoutsConfiguration.vue';\nimport ShapeUpload from '@/components/ShapeUpload.vue';\nimport SideSelection from '@/components/SideSelection.vue';\nimport EdgeFinish from '@/components/EdgeFinish.vue';\nimport ThicknessSelector from '@/components/ThicknessSelector.vue';\nimport MaterialSelector from '@/components/MaterialSelector.vue';\nimport HeaderPricingInformation from '@/components/HeaderPricingInformation.vue';\nimport MeasurementsHeightTransition from '@/components/UI/MeasurementsHeightTransition.vue';\nimport InstructionsButton from '@/components/UI/InfoModal/InstructionsButton.vue';\nimport InfoModal from '@/components/UI/InfoModal/InfoModal.vue';\nimport { StepTypes } from '@/types/step';\n\nconst store = useStore();\nconst i18n = window.measurementSelectorVariables.i18n;\nconst html = window.measurementSelectorVariables.html;\nconst shop = window.measurementSelectorVariables.shop;\nconst settings = window.measurementSelectorVariables.settings;\nconst measuringInstructions = window.measuringInstructions;\nconst containerRef = ref<HTMLElement | null>(null);\n\nconst selectedUnit = 'cm';\n\nconst shape = computed(() => store.getters.shape);\nconst isMediaMobileSize = computed(() => store.getters.isMediaMobileSize);\nconst primitives = computed(() => store.getters.primitives);\nconst currentStepName = computed(() => store.getters.currentStepName);\nconst isDrillHolesVisible = computed(() => store.getters.isDrillHolesVisible);\nconst drillHoleEdgeType = computed(() => store.getters.drillHoleEdgeType);\nconst alternateThicknesses = computed(() => store.getters.alternateThicknesses);\nconst measurements = computed(() => store.getters.measurements);\nconst stringifiedConfig = computed(() => store.getters.stringifiedConfig);\nconst exportCompositeDxf = computed(() => store.getters.exportCompositeDxf);\nconst dxfExport = computed(() => store.getters.dxfExport);\nconst exportShape = computed(() => store.getters.exportShape);\nconst isShapeComplete = computed(() => store.getters.isShapeComplete);\nconst isEdgeFinishVisible = computed(() => store.getters.isEdgeFinishVisible);\nconst isCutoutsVisible = computed(() => store.getters.isCutoutsVisible);\nconst alternateMaterials = computed(() => store.getters.alternateMaterials);\nconst showSideSelection = computed(() => store.getters.showSideSelection);\n\nfunction isPortalActive( stepName: StepTypes ): boolean {\n\treturn currentStepName.value === stepName;\n}\n\nfunction scrollTo(view: Ref<HTMLElement | null>) {\n\tview.value?.scrollIntoView({ behavior: 'smooth' });\n}\n\nonMounted(async () => {\n\n\t// Pre-load default font\n\tconst defaultFont = `${window.measurementSelectorVariables.fontDirUrl}Exo-Bold.ttf`;\n\tconst fontObj = await loadFont(defaultFont);\n\n\tstore.commit('addFont', { fontName: 'Exo-Bold', font: fontObj });\n\tstore.commit('setSelectedFontObject', fontObj );\n\n\twindow?.dataLayer?.push( {\n\t\tevent: 'measurements_selector',\n\t\teventCategory: 'Measurements Selector',\n\t\teventAction: 'Display',\n\t\teventLabel: document.title,\n\t} );\n});\n\nwatch(currentStepName, async (newValue: StepTypes, oldValue: StepTypes) => {\n\tif (newValue !== oldValue) {\n\t\tif (!isMediaMobileSize.value) {\n\t\t\tscrollTo(containerRef);\n\t\t}\n\t}\n});\n\n</script>\n<template>\n\t<div id=\"app-measurements-selector\" class=\"measurements-selector\" ref=\"containerRef\">\n\t\t<header-pricing-information></header-pricing-information>\n\t\t<accordion-container>\n\t\t\t<accordion-item\n\t\t\t\t:step-name=\"StepTypes.shapeSize\"\n\t\t\t>\n\t\t\t\t<shape-selector />\n\n\t\t\t\t<portal to=\"mobile-accordion-preview\" :disabled=\"!isMediaMobileSize\">\n\t\t\t\t\t<MountingShapePreview\n\t\t\t\t\t\t:primitives=\"primitives\"\n\t\t\t\t\t\t:unit=\"selectedUnit\"\n\t\t\t\t\t></MountingShapePreview>\n\t\t\t\t</portal>\n\n\t\t\t\t<portal-target name=\"mobile-accordion-preview\" v-if=\"isMediaMobileSize && isPortalActive( StepTypes.shapeSize )\"></portal-target>\n\n\t\t\t\t<shape-settings v-if=\"shape !== 'dxf'\"/>\n\n\t\t\t\t<measurements-height-transition appear mode=\"out-in\">\n\t\t\t\t\t<shape-upload\n\t\t\t\t\t\tv-if=\"shape === 'dxf'\"\n\t\t\t\t\t/>\n\t\t\t\t</measurements-height-transition>\n\n\t\t\t\t<div v-if=\"measuringInstructions && measuringInstructions.length > 0\" class=\"accordion-item__info-button\">\n\t\t\t\t\t<instructions-button\n\t\t\t\t\t\tmodal-name=\"measuringInstrictions\"\n\t\t\t\t\t\t:label=\"i18n.measuringInstructionsLabel\"\n\t\t\t\t\t>{{ i18n.measuringInstructionsLabel }}</instructions-button>\n\t\t\t\t\t<info-modal modal-name=\"measuringInstrictions\" :content=\"measuringInstructions\"></info-modal>\n\t\t\t\t</div>\n\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"shape !== '' && alternateThicknesses.length > 0\"\n\t\t\t\t:step-name=\"StepTypes.thickness\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.thickness )\" name=\"mobile-accordion-preview\"></portal-target>\n\n\t\t\t\t<ThicknessSelector />\n\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"shape !== '' && alternateMaterials.length > 0\"\n\t\t\t\t:step-name=\"StepTypes.material\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.material )\" name=\"mobile-accordion-preview\"></portal-target>\n\n\t\t\t\t<material-selector />\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"isDrillHolesVisible\"\n\t\t\t\t:step-name=\"StepTypes.drillholes\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.drillholes ) && drillHoleEdgeType !== 'around'\" name=\"mobile-accordion-preview\"></portal-target>\n\n\t\t\t\t<drill-holes />\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"isCutoutsVisible\"\n\t\t\t\t:step-name=\"StepTypes.cutouts\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.cutouts )\" name=\"mobile-accordion-preview\"></portal-target>\n\n\t\t\t\t<cutouts-configuration />\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"showSideSelection\"\n\t\t\t\t:step-name=\"StepTypes.sideSelection\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.sideSelection )\" name=\"mobile-accordion-preview\"></portal-target>\n\n\t\t\t\t<side-selection />\n\t\t\t</accordion-item>\n\n\t\t\t<accordion-item\n\t\t\t\tv-if=\"isEdgeFinishVisible\"\n\t\t\t\t:step-name=\"StepTypes.edgeFinish\"\n\t\t\t>\n\t\t\t\t<portal-target v-if=\"isMediaMobileSize && isPortalActive( StepTypes.edgeFinish )\" name=\"mobile-accordion-preview\"\n\t\t\t\t></portal-target>\n\t\t\t\t<edge-finish />\n\t\t\t</accordion-item>\n\t\t</accordion-container>\n\n\t\t<MetaInformation\n\t\t\t:isShapeComplete=\"isShapeComplete\"\n\t\t\t:availability=\"html.availability\"\n\t\t\t:shape=\"measurements.shape\"\n\t\t\t:primitives=\"primitives\"\n\t\t\t:settings=\"settings\"\n\t\t\t:currency=\"shop.currency\"\n\t\t\t:locale=\"shop.locale\"\n\t\t\t:dxfDefinition=\"measurements.dxfDefinition\"\n\t\t/>\n\n\t\t<input\n\t\t\tv-if=\"measurements.modifiers.font !== ''\"\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements[modifiers][font]\"\n\t\t\t:value=\"measurements.modifiers.font\">\n\t\t<input\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements[shape]\"\n\t\t\tv-bind:value=\"measurements.shape\"\n\t\t/>\n\t\t<input\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements[export_shape]\"\n\t\t\tv-bind:value=\"exportShape\"\n\t\t/>\n\n\t\t<input\n\t\t\tv-if=\"exportCompositeDxf\"\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements[dxf_export]\"\n\t\t\t:value=\"dxfExport\"\n\t\t/>\n\n\t\t<input\n\t\t\ttype=\"hidden\"\n\t\t\tname=\"measurements_config\"\n\t\t\t:value=\"stringifiedConfig\"\n\t\t/>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.measurements-selector {\n\tscroll-margin-block-start: calc(var(--header-height) + 70px);\n}\n</style>\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=414c392d&scoped=true&lang=scss\"\n\nimport exportComponent from \"../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-414c392d\"]])\n\nexport default __exports__","import {IMeasureWithCenter, IModel} from \"makerjs\";\nimport {makerjs} from \"../../../source/js/shared/rendering/makerjs\";\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport Area from \"../../../source/js/shared/models/Geometry/Area\";\n\nexport enum Units {\n\tMM = 'mm',\n\tCM = 'cm',\n\tM = 'm',\n}\n\nexport default class EnclosedShape {\n\tprivate enclosedShape: IMeasureWithCenter;\n\n\tconstructor( shapeModel: IModel ) {\n\n\t\t// Add fallback model if no valid model is provided.\n\t\tif ( ! shapeModel ) {\n\t\t\tshapeModel = new makerjs.models.Rectangle( 0, 0 );\n\t\t}\n\t\tthis.enclosedShape = makerjs.measure.modelExtents( shapeModel );\n\t}\n\n\tcenter(): Length[] {\n\t\treturn [\n\t\t\tLength.from_cm( this.enclosedShape.center[ 0 ] ),\n\t\t\tLength.from_cm( this.enclosedShape.center[ 1 ] ),\n\t\t];\n\t}\n\n\thigh(): Length[] {\n\t\treturn [\n\t\t\tLength.from_cm( this.enclosedShape.high[ 0 ] ),\n\t\t\tLength.from_cm( this.enclosedShape.high[ 1 ] ),\n\t\t];\n\t}\n\n\tlow(): Length[] {\n\t\treturn [\n\t\t\tLength.from_cm( this.enclosedShape.low[ 0 ] ),\n\t\t\tLength.from_cm( this.enclosedShape.low[ 1 ] ),\n\t\t];\n\t}\n\n\theight(): Length {\n\t\treturn Length.from_cm( this.enclosedShape.height );\n\t}\n\n\twidth(): Length {\n\t\treturn Length.from_cm( this.enclosedShape.width );\n\t}\n\n\tmapToUnits( items: Length[], unit: Units ): number[] {\n\t\treturn items.map( item => item[ `in_${unit}` ]() );\n\t}\n\n\tarea(): Area {\n\t\treturn Area.fromDimensions( this.height(), this.width() );\n\t}\n}\n","import {IModel, IPoint} from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\n\nexport enum DimensionLineType{\n\tprimary = 'primary',\n\tsecondary = 'secondary',\n\tdefault = 'default',\n}\nexport default class DimensionLine {\n\tprivate readonly startPoint: IPoint;\n\tprivate readonly endPoint: IPoint;\n\tprivate readonly label: string;\n\tprivate readonly unit: string;\n\tprivate offset: IPoint;\n\tprivate ratio: number;\n\tprivate readonly type: DimensionLineType;\n\n\tconstructor( startPoint: IPoint, endPoint: IPoint, label: string, offset: IPoint, ratio = 1, type = DimensionLineType.default, unit = 'cm' ) {\n\t\tthis.startPoint = startPoint;\n\t\tthis.endPoint = endPoint;\n\t\tthis.label = label;\n\t\tthis.unit = unit;\n\t\tthis.offset = offset;\n\t\tthis.ratio = ratio;\n\t\tthis.type = type;\n\t}\n\n\tshiftOffset(shift: number): void {\n\t\tthis.offset = [this.offset[0]*shift, this.offset[1]*shift];\n\t}\n\n\tgetModel(): IModel {\n\t\tconst model = {} as IModel;\n\t\tconst subModel = {} as IModel;\n\n\t\tconst baseLine = new makerjs.paths.Line(this.startPoint, this.endPoint);\n\t\tconst angle = makerjs.angle.ofLineInDegrees(baseLine);\n\n\t\t// Add arrow to start of line\n\t\tconst arrowStartLeft = new makerjs.paths.Line([this.startPoint[0], this.startPoint[1]], [this.startPoint[0] + (8 * this.ratio), this.startPoint[1]]);\n\t\tmakerjs.path.rotate(arrowStartLeft, angle + 45, this.startPoint);\n\t\tconst arrowStartRight = new makerjs.paths.Line([this.startPoint[0], this.startPoint[1]], [this.startPoint[0] + (8 * this.ratio), this.startPoint[1]]);\n\t\tmakerjs.path.rotate(arrowStartRight, angle - 45, this.startPoint);\n\n\t\t// Add arrow to end of line\n\t\tconst arrowEndLeft = new makerjs.paths.Line([this.endPoint[0], this.endPoint[1]], [this.endPoint[0] - (8 * this.ratio), this.endPoint[1]]);\n\t\tmakerjs.path.rotate(arrowEndLeft, angle - 45, this.endPoint);\n\t\tconst arrowEndRight = new makerjs.paths.Line([this.endPoint[0], this.endPoint[1]], [this.endPoint[0] - (8 * this.ratio), this.endPoint[1]]);\n\t\tmakerjs.path.rotate(arrowEndRight, angle + 45, this.endPoint);\n\n\t\t// Create the base line with top and end arrows\n\t\tmakerjs.model.addPath(model, baseLine, 'base-line');\n\t\tmakerjs.model.addPath(model, arrowStartLeft, 'arrow-start-left');\n\t\tmakerjs.model.addPath(model, arrowStartRight, 'arrow-start-right');\n\t\tmakerjs.model.addPath(model, arrowEndLeft, 'arrow-end-left');\n\t\tmakerjs.model.addPath(model, arrowEndRight, 'arrow-end-right');\n\n\t\tmakerjs.model.addCaption(subModel, this.label, this.startPoint, this.endPoint);\n\n\t\t// Used to set an active state for the dimension line caption\n\t\tif (this.type === 'primary') {\n\t\t\tsubModel.layer = 'white';\n\t\t}\n\n\t\tmakerjs.model.addModel(model, subModel, 'cap');\n\t\tmakerjs.model.moveRelative(model, [this.offset[0] * this.ratio, this.offset[1] * this.ratio]);\n\n\t\treturn model;\n\t}\n\n\tgetLength(): number {\n\t\treturn makerjs.measure.pointDistance(this.startPoint, this.endPoint);\n\t}\n}\n","export default class Area {\n\tconstructor( area ) {\n\t\tthis.area = area;\n\t}\n\n\tstatic from_mm2( area ) {\n\t\treturn new Area( area );\n\t}\n\n\tstatic from_cm2( centimeters_squared ) {\n\t\treturn new Area( centimeters_squared * 100 );\n\t}\n\n\tstatic from_m2( meters_squared ) {\n\t\treturn new Area( meters_squared * 1000000 );\n\t}\n\n\tstatic fromDimensions( length, width ) {\n\t\treturn new Area( length.in_mm() * width.in_mm() );\n\t}\n\n\tin_m2() {\n\t\treturn this.area / 1000000;\n\t}\n\n\tin_cm2() {\n\t\treturn this.area / 100;\n\t}\n\n\tin_mm2() {\n\t\treturn this.area;\n\t}\n\n\tadd( area ) {\n\t\treturn new Area( this.in_mm2() + area.in_mm2() );\n\t}\n\n}\n","import makerjs, {IModel, IPoint} from \"makerjs\";\nimport {createModelFromShape} from \"../../../../source/js/shared/rendering/makerjs\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport mapValues from \"lodash/mapValues\";\nimport isEmpty from \"lodash/isEmpty\";\nimport invert from \"lodash/invert\";\nimport EnclosedShape, {Units} from \"./../EnclosedShape\";\nimport {renderLength} from \"./../../functions/lengths\";\nimport {centroid} from \"./../../functions/makerjs\";\nimport DimensionLine, { DimensionLineType } from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine, { OffsetLineType } from \"../Lines/OffsetLine\";\nimport GuideLine from \"../Lines/GuideLine\";\n\nexport interface Dimensions {\n\theight?: number;\n\tlength?: number;\n\twidth?: number;\n\tdiameter?: number;\n\tinner_radius?: number;\n\touter_radius?: number;\n\tside_length?: number;\n\tside_amount?: string;\n\tside_height?: number;\n\tbase?: number;\n\tradius?: number;\n\t'top_right_radius'?: number;\n\t'bottom_right_radius'?: number;\n\t'bottom_left_radius'?: number;\n\t'top_left_radius'?: number;\n\theight_left?: number;\n\theight_right?: number;\n\twidth_top?: number;\n\twidth_bottom?: number;\n\theight_top?: number;\n\theight_bottom?: number;\n\toffset_left?: number;\n\thead_length?: number;\n\thead_width?: number;\n\tstem_length?: number;\n\tstem_width?: number;\n\tnumber_of_points?: string;\n\tuse_individual_corners?: boolean;\n\tdesired_length?: number;\n\tdesired_dimension?: string;\n}\n\ninterface LengthDimensions {\n\theight?: Length;\n\tlength?: Length;\n\twidth?: Length;\n\tdiameter?: Length;\n\tinner_radius?: Length;\n\touter_radius?: Length;\n\tside_length?: Length;\n\tside_height?: Length;\n\tside_amount?: string;\n\tbase?: Length;\n\tradius?: Length;\n\t'top_right_radius'?: Length;\n\t'bottom_right_radius'?: Length;\n\t'bottom_left_radius'?: Length;\n\t'top_left_radius'?: Length;\n\theight_left?: Length;\n\theight_right?: Length;\n\twidth_top?: Length;\n\twidth_bottom?: Length;\n\theight_top?: Length;\n\theight_bottom?: Length;\n\toffset_left?: Length;\n\thead_length?: Length;\n\thead_width?: Length;\n\tstem_length?: Length;\n\tstem_width?: Length;\n\tnumber_of_points?: string;\n\tuse_individual_corners?: boolean;\n\tdesired_length?: Length;\n\tdesired_dimension?: string;\n\n}\n\nexport interface DimensionProperties {\n\tprimary: keyof Dimensions;\n\tsecondary?: keyof Dimensions;\n\ttertiary?: keyof Dimensions;\n\tquaternary?: keyof Dimensions;\n}\n\n/**\n * The AbstractShape class.\n */\nexport default abstract class AbstractShape {\n\tpublic model: IModel;\n\n\tpublic readonly shape: string;\n\tprotected cleanedPrimitives: LengthDimensions = {};\n\tprotected labelMappings: Record<string, string> = {};\n\n\tprivate irregularShapes = [\n\t\t'arrow',\n\t\t'half-circle',\n\t\t'isosceles-triangle',\n\t\t'quarter-circle',\n\t\t'right-angled-triangle',\n\t\t'right-angled-triangle-mirrored',\n\t\t'sloped-rectangle',\n\t\t'sloped-right-rectangle',\n\t\t'star',\n\t];\n\n\t/**\n\t * Constructs the shape.\n\t *\n\t * @param {string} shape The shape name.\n\t * @param {Dimensions} dimensions The dimensions of the shape.\n\t * @param {Object} modifiers The modifiers to use for the shape.\n\t * @protected\n\t */\n\tprotected constructor( shape: string, dimensions?: object, modifiers?: object ) {\n\t\tthis.shape = shape;\n\n\t\tif ( dimensions ) {\n\t\t\tthis.parseDimensions( dimensions );\n\t\t\tthis.parseModifiers( modifiers );\n\t\t}\n\t}\n\n\t/**\n\t * Gets the shape.\n\t */\n\tgetShape(): string {\n\t\treturn this.shape;\n\t}\n\n\t/**\n\t * Gets the enclosing rectangle of the shape's model.\n\t */\n\tgetEnclosingRectangle(): EnclosedShape {\n\t\treturn new EnclosedShape( this.model );\n\t}\n\n\t/**\n\t * Gets the midpoint of the model.\n\t */\n\tgetMidPoint(): Length[] {\n\t\tif ( this.irregularShapes.includes( this.shape ) ) {\n\t\t\treturn centroid( this.model );\n\t\t}\n\n\t\treturn this.getOriginalEnclosedShape().center();\n\t}\n\n\t/**\n\t * Creates a midpoint model.\n\t */\n\tcreateMidPoint(): IModel {\n\t\tconst centerDot = createModelFromShape( 'circle', { diameter: 0.05 } );\n\n\t\tmakerjs.model.move( centerDot, this.getOriginalEnclosedShape().mapToUnits( this.getMidPoint(), Units.CM ) );\n\n\t\treturn centerDot;\n\t}\n\n\t/**\n\t * Rotates the model.\n\t *\n\t * @param {number} degrees The amount of degrees to rotate the model.\n\t */\n\trotate( degrees: number ): void {\n\t\tmakerjs.model.rotate( this.model, degrees, this.getOriginalEnclosedShape().mapToUnits( this.getMidPoint(), Units.CM ) );\n\t}\n\n\t/**\n\t * Renders the model.\n\t *\n\t * @param {boolean} withMidPoint Whether to add the midpoint model.\n\t */\n\trender( withMidPoint = false ): IModel {\n\t\tif ( withMidPoint ) {\n\t\t\tmakerjs.model.addModel( this.model, this.createMidPoint(), 'modelMidPoint' );\n\t\t}\n\n\t\treturn this.model;\n\t}\n\n\t/**\n\t * Renders the dimension label.\n\t *\n\t * @param {string} dimension The dimension to render.\n\t * @param {number} value The value to add to the label.\n\t */\n\trenderDimensionLabel( dimension: string, value = undefined ): string {\n\t\tif ( value === undefined ) {\n\t\t\tvalue = this.cleanedPrimitives[ this.getDimensionLabel( dimension ) ];\n\t\t}\n\n\t\tvalue = ( value instanceof Length ) ? value.in_cm() : value;\n\n\t\treturn window.measurementSelectorVariables.i18n.dimensionNames[ dimension ] + ' - ' + renderLength( value );\n\t}\n\n\t/**\n\t * Determines if the model has defined paths.\n\t */\n\thasPaths(): boolean {\n\t\treturn Object.keys( this.model.paths ).length > 0;\n\t}\n\n\t/**\n\t * Parses the dimensions.\n\t *\n\t * @param {Object} dimensions The dimensions.\n\t * @protected\n\t */\n\tprotected parseDimensions( dimensions ): void {\n\t\tfor ( const property in dimensions[ this.shape ] ) {\n\t\t\tif ( property === 'number_of_points' || property === 'side_amount' ) {\n\t\t\t\tthis.cleanedPrimitives[ property ] = dimensions[ this.shape ][ property ];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.cleanedPrimitives[ property ] = Length.from_cm( parseFloat( dimensions[ this.shape ][ property ] ) );\n\t\t}\n\t}\n\n\t/**\n\t * Parses the modifiers.\n\t *\n\t * @param {Object} modifiers The modifiers.\n\t * @protected\n\t */\n\tprotected parseModifiers( modifiers ): void {\n\t\tfor ( const property in modifiers ) {\n\t\t\tif ( [ 'desired_dimension', 'font', 'text' ].includes( property ) ) {\n\t\t\t\tthis.cleanedPrimitives[ property ] = modifiers[ property ];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( property === 'use_individual_corners' ) {\n\t\t\t\tthis.cleanedPrimitives[ property ] = modifiers[ property ] === true || modifiers[ property ] === 'true';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.cleanedPrimitives[ property ] = parseFloat( modifiers[ property ] );\n\t\t}\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tconst primitives = mapValues( this.cleanedPrimitives, ( primitive ) => primitive instanceof Length ? primitive.in_cm() : primitive );\n\n\t\tif ( isEmpty( primitives ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model = createModelFromShape( this.shape, primitives );\n\t\tthis.model.type = this.shape;\n\t}\n\n\tgetOriginalEnclosedShape(): EnclosedShape {\n\t\treturn new EnclosedShape( this.model );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'length' };\n\t}\n\n\tgetRatios(): Ratio[] {\n\t\treturn [];\n\t}\n\n\t/**\n\t * Gets the width of the model.\n\t */\n\tabstract getWidth(): Length;\n\n\t/**\n\t * Gets the lenght of the model.\n\t */\n\tabstract getLength(): Length;\n\n\tabstract getDimensionLines(ratio: number, focusedElement: string, forceRender: boolean): DimensionLine[];\n\n\tgetOffsetLines(offsets: Length[], center: IPoint, focusedElement = ''): OffsetLine[] {\n\t\tconst centerX = center[0];\n\t\tconst centerY = center[1];\n\n\t\treturn [\n\t\t\tnew OffsetLine([centerX - offsets[0].in_mm(), centerY], [centerX, centerY], renderLength(offsets[0].in_cm()), [0, 0], 'cutoutOffsetLeft' === focusedElement ? OffsetLineType.primary : OffsetLineType.default), // Horizontal line\n\t\t\tnew OffsetLine([centerX, centerY - offsets[1].in_mm() ], [centerX, centerY], renderLength(offsets[1].in_cm()), [0, 0], 'cutoutOffsetBottom' === focusedElement ? OffsetLineType.primary : OffsetLineType.default), // Vertical line\n\t\t];\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\treturn [];\n\t}\n\n\tgetDimensionLineType(id: string, focusedElement: string, forceRender = false): DimensionLineType {\n\t\tconst prefix = focusedElement.includes(\"cutout_measurement\") && !forceRender ? 'cutout_' : '';\n\t\treturn focusedElement === `${prefix}${id}` ? DimensionLineType.primary : DimensionLineType.default;\n\t}\n\n\tabstract getDefaultDimensions(): Dimensions;\n\tabstract getDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions;\n\n\tgetDefaultModifiers(): object {\n\t\treturn {};\n\t}\n\n\tgetDefaultCutoutModifiers(): object {\n\t\treturn {};\n\t}\n\n\tgetHiddenDimensions(): string[] {\n\t\treturn [];\n\t}\n\n\tgetDimensionLabel( dimension: string ): string {\n\n\t\t// Get the mappings if they exist.\n\t\tif ( ! isEmpty( this.getLabelMappings() ) ) {\n\n\t\t\t/**\n\t\t\t * Invert the mappings to get the proper 'old' label.\n\t\t\t *\n\t\t\t * @see https://app.asana.com/0/1130583511922775/1206582884714035/f\n\t\t\t */\n\t\t\tconst invertedMappings = invert( this.getLabelMappings() );\n\n\t\t\treturn invertedMappings[ dimension ] ?? dimension;\n\t\t}\n\n\t\treturn dimension;\n\t}\n\n\tgetLabelMappings(): Record<string, string> {\n\n\t\t/**\n\t\t * Holds mapping of labels to ensure proper retrieval.\n\t\t *\n\t\t * @see https://app.asana.com/0/1130583511922775/1206582884714035/f\n\t\t */\n\t\treturn this.labelMappings;\n\t}\n}\n","import AbstractShape, {Dimensions} from \"./AbstractShape\";\nimport Length from \"./../../../../source/js/shared/models/Geometry/Length\";\nimport EnclosedShape from \"./../EnclosedShape\";\n\nimport makerjs from \"makerjs\";\nimport {Font} from \"opentype.js\";\nimport computeLayout from \"opentype-layout\";\n\nimport mapValues from \"lodash/mapValues\";\nimport trim from \"lodash/trim\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEmpty from \"lodash/isEmpty\";\nimport DimensionLine from \"../Lines/DimensionLine\";\n\nexport class Text extends AbstractShape {\n\tprivate readonly fonts: object;\n\n\tconstructor( dimensions?: object, fonts?: object, modifiers?: object ) {\n\t\tsuper( 'text', dimensions, modifiers );\n\n\t\tthis.fonts = fonts;\n\t}\n\n\tcreateModel(): void {\n\t\tconst primitives = mapValues( this.cleanedPrimitives, ( primitive ) => primitive instanceof Length ? primitive.in_cm() : primitive );\n\n\t\tif ( ! this.fonts || ! primitives.text || ! primitives.desired_length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this.createTextModel( this.fonts, primitives );\n\n\t\tif ( isEmpty( model ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model = this.calculateLetterEnclosing( model );\n\t\tthis.model.type = 'text';\n\t}\n\n\tcreateTextModel( fonts, { text, font, desired_dimension: desiredDimension, desired_length: desiredLength } ): MakerJs.models.Text {\n\t\tif ( ! fonts || isEmpty( fonts ) || isUndefined( font ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst fontObject = fonts.find( fontObj => fontObj.fontName === font );\n\t\tconst ratio = this.calculateRatio( fontObject.font, text, desiredLength, desiredDimension );\n\t\tconst fontSize = Length.from_cm( desiredLength / ratio );\n\n\t\tif ( desiredDimension === 'height' ) {\n\t\t\treturn this.createFixedHeightText( fontObject.font, text, fontSize );\n\t\t}\n\n\t\treturn new makerjs.models.Text(\tfontObject.font, trim( text ), fontSize.in_mm() );\n\t}\n\n\tprotected calculateRatio( font: Font, text: string, desiredLength: number, desiredDimension: string ): number {\n\t\tconst firstRender = new makerjs.models.Text( font, text, Length.from_cm( desiredLength ).in_mm() );\n\t\tconst enclosingRectangle = makerjs.measure.modelExtents( firstRender );\n\n\t\tconst actualLength = desiredDimension === 'height' ?\n\t\t\tLength.from_cm( enclosingRectangle.height ).in_cm() :\n\t\t\tLength.from_cm( enclosingRectangle.width ).in_cm();\n\n\t\treturn actualLength / desiredLength;\n\t}\n\n\t/**\n\t * Wraps longer texts to ensure it fits on the desired sheet.\n\t * @see https://app.asana.com/0/0/1203855198149975/f\n\t *\n\t * @param {Font} font The font to use.\n\t * @param {string} text The text to render.\n\t * @param {Length} fontSize The desired size/height of the font.\n\t */\n\tcreateFixedHeightText( font: Font, text: string, fontSize: Length ): MakerJs.models.Text {\n\t\tconst { shapeSettings } = window.measurementSelectorVariables;\n\t\tconst textModel = { models: {} };\n\t\tconst scale = 1 / font.unitsPerEm * fontSize.in_mm();\n\n\t\tconst layout = computeLayout( font, trim( text ), {\n\t\t\talign: 'left',\n\t\t\tlineHeight: font.unitsPerEm,\n\t\t\twidth: new Length( shapeSettings.maximumLength ).in_cm() / scale,\n\t\t} );\n\n\t\tlayout.glyphs.forEach( ( glyph, i ) => {\n\t\t\tconst character = makerjs.models.Text.glyphToModel( glyph.data, fontSize.in_mm() );\n\t\t\tcharacter.origin = makerjs.point.scale( glyph.position, scale );\n\n\t\t\tmakerjs.model.addModel( textModel, character, i );\n\t\t} );\n\t\tmakerjs.model.zero( textModel );\n\t\tmakerjs.model.originate( textModel );\n\n\t\treturn textModel;\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.getLength();\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.getEnclosingRectangle().high()[ 1 ].subtract( this.getEnclosingRectangle().low()[ 1 ] ).round();\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.getEnclosingRectangle().high()[ 0 ].subtract( this.getEnclosingRectangle().low()[ 0 ] ).round();\n\t}\n\n\tgetDesiredLength(): Length {\n\t\treturn this.cleanedPrimitives.desired_length;\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif ( ! this.model ) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn [\n\t\t\tnew DimensionLine( [0, 0], [ 0, this.getLength().in_mm() ], this.renderDimensionLabel( 'height', this.getLength().in_cm() ), [-40, 0], ratio ), // Vertical line\n\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width', this.getWidth().in_cm() ), [0, -40], ratio ), // Horizontal line\n\t\t];\n\t}\n\n\tcalculateLetterEnclosing( textModel: MakerJs.models.Text ): MakerJs.models.Text {\n\t\tfor ( const [, model] of Object.entries( textModel.models ) ) {\n\t\t\tmodel[ 'enclosed' ] = new EnclosedShape( model );\n\t\t}\n\n\t\treturn textModel;\n\t}\n\n\tgetDesiredDimension(): string {\n\t\treturn this.cleanedPrimitives.desired_dimension;\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { desired_length: 20 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\n\t\t// The default cutout is based on the width so we can properly scale based on the parent shape.\n\t\treturn { desired_length: parentShape.getWidth().multiply( 0.8 ).in_cm() };\n\t}\n\n\tgetDefaultCutoutModifiers(): object {\n\t\tconst defaultModifiers = this.getDefaultModifiers();\n\n\t\treturn { ...defaultModifiers, desired_dimension: 'width' };\n\t}\n\n\tgetDefaultModifiers(): object {\n\t\tconst { loggedInUser, i18n } = window.measurementSelectorVariables;\n\t\tconst defaultText = ! isEmpty( loggedInUser ) ? `${i18n.text.default} ${loggedInUser}`: i18n.text.default;\n\n\t\treturn {\n\t\t\tfont: 'Exo-Bold',\n\t\t\ttext: defaultText,\n\t\t\tdesired_dimension: 'height',\n\t\t};\n\t}\n}\n","export function capitalize( [ firstLetter, ...restOfWord ]: string ): string {\n\treturn firstLetter.toUpperCase() + restOfWord.join( '' );\n}\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { Text } from \"@/Models/Shapes/Text\";\nimport { capitalize } from \"@/functions/strings\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport isEmpty from \"lodash/isEmpty\";\nimport isUndefined from \"lodash/isUndefined\";\n\nexport interface ValidatorObject {\n\tfield: string;\n\tdimension: string;\n\tinstance?: AbstractShape;\n\tcustomMessage?: string;\n\tminimum?: number;\n\tminimums?: object;\n\tmaximum?: number;\n\tmaximums?: object;\n\tisCutout?: boolean;\n\tvalue?: unknown;\n}\n\n/**\n * Abstract validator class.\n */\nexport abstract class AbstractValidator {\n\tfield: string;\n\tdimension: string;\n\tinstance?: AbstractShape;\n\tcustomMessage?: string;\n\tminimum?: number;\n\tminimums?: object;\n\tmaximum?: number;\n\tmaximums: object;\n\tisCutout?: boolean;\n\tvalue?: unknown;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @protected\n\t * @param {ValidatorObject} options\n\t */\n\tprotected constructor( options: ValidatorObject ) {\n\t\tObject.assign( this, options );\n\t}\n\n\t/**\n\t * Gets the field the validator applies to.\n\t *\n\t * @returns {string} The field.\n\t */\n\tgetField(): string {\n\t\treturn this.getPrefix() + this.field;\n\t}\n\n\t/**\n\t * Gets the custom message, if set.\n\t *\n\t * @returns {string} The custom message.\n\t */\n\tgetCustomMessage(): string {\n\t\tif ( this.customMessage ) {\n\t\t\treturn this.customMessage;\n\t\t}\n\t}\n\n\tgetPrefix(): string {\n\t\treturn this.isCutout ? 'cutout_' : '';\n\t}\n\n\tgetDimension(): string {\n\n\t\t// Get the mappings if they exist.\n\t\tif ( ! isUndefined( this.instance ) && ! isEmpty( this.instance.getLabelMappings() ) ) {\n\t\t\treturn this.instance.getLabelMappings()[ this.dimension ] ?? this.dimension;\n\t\t}\n\n\t\treturn ( this.dimension === 'desired_length' && this.instance instanceof Text ) ? this.instance.getDesiredDimension() : this.dimension;\n\t}\n\n\tgetDimensionMethodKey(): string {\n\t\treturn this.dimension.split( '_' ).map( dimension_part => capitalize( dimension_part ) ).join( '' );\n\t}\n\n\tgetDimensionValue(): number {\n\t\tconst value = this.instance[ `get${ this.getDimensionMethodKey() }` ]() ?? null;\n\n\t\tif ( ( this.getDimension() === 'number_of_points' && value ) || this.getDimension() === 'side_amount' && value ) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn ( value instanceof Length ) ? value.in_cm() : 0;\n\t}\n\n\tgetDimensionLabel(): string {\n\t\treturn this.getValidatorTranslationStrings().dimensions.labels[ this.getDimension() ];\n\t}\n\n\tgetValidatorTranslationStrings(): Window['measurementSelectorVariables']['i18n']['validators'] {\n\t\treturn window.measurementSelectorVariables.i18n.validators;\n\t}\n\n\tgetIsCutout(): boolean {\n\t\treturn this.isCutout;\n\t}\n}\n","import { ValidatorInterface } from \"./ValidatorInterface\";\nimport { AbstractValidator, ValidatorObject } from \"./AbstractValidator\";\nimport { countDecimals } from \"@/functions/numbers\";\nimport {sprintf} from 'sprintf-js';\n\ninterface DecimalPointsValidatorObject extends ValidatorObject {\n\tdecimalPoints?: number;\n\tvalue?: number|string;\n}\n\n/**\n * Validator that checks for decimal points\n */\nexport class MaximumDecimalPoints extends AbstractValidator implements ValidatorInterface {\n\tdeclare readonly value: number;\n\tprivate readonly decimalPoints: number;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {DecimalPointsValidatorObject} options\n\t */\n\tconstructor( options: DecimalPointsValidatorObject ) {\n\t\tsuper( options );\n\n\t\tconst value = options.value ?? this.getDimensionValue();\n\n\t\tif ( typeof value !== 'number' ) {\n\t\t\tthrow new Error( 'The MaximumDecimalPoints validator can only be used on numbers.' );\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.decimalPoints = options.decimalPoints ?? 1;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tif ( super.getCustomMessage() ) {\n\t\t\treturn super.getCustomMessage();\n\t\t}\n\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\treturn sprintf( dimensions.decimals, this.getDimensionLabel(), this.decimalPoints, 'cm' );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\treturn countDecimals( this.value ) <= this.decimalPoints;\n\t}\n}\n","import { ValidatorInterface } from './ValidatorInterface';\nimport { AbstractValidator, ValidatorObject } from './AbstractValidator';\nimport { sprintf } from 'sprintf-js';\nimport Length from '../../../../source/js/shared/models/Geometry/Length';\n\n/**\n * Validator that checks if the value is equal to or larger than the set minimum amount.\n */\nexport class MinimumValue extends AbstractValidator implements ValidatorInterface {\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ValidatorObject} options\n\t */\n\tconstructor(options: ValidatorObject) {\n\t\tsuper(options);\n\n\t\tconst value = options.value ?? this.getDimensionValue();\n\n\t\tif (typeof value !== 'number') {\n\t\t\tthrow new Error('The MinimumValue validator can only be used on numbers.');\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.minimum = this.minimum ?? this.getMinimum();\n\t}\n\n\tgetMinimum(): number {\n\t\treturn this.minimums[this.dimension] instanceof Length ? this.minimums[this.dimension].in_cm() : this.minimums[this.dimension];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tif (super.getCustomMessage()) {\n\t\t\treturn super.getCustomMessage();\n\t\t}\n\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\tif (this.getDimension() === 'number_of_points' || this.getDimension() === 'side_amount') {\n\t\t\treturn sprintf(dimensions.min, this.getDimensionLabel(), this.minimum, '');\n\t\t}\n\n\t\treturn sprintf(dimensions.min, this.getDimensionLabel(), this.minimum, 'cm');\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\tconst value = +this.value;\n\t\tif (isNaN(value)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn value >= this.minimum;\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class ArrowConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'stem_length',\n\t\t\t'stem_width',\n\t\t\t'head_length',\n\t\t\t'head_width',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions(): Record<string, Length> {\n\t\treturn {\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { stem_height, stem_width, head_height, head_width } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tstem_height,\n\t\t\tstem_width,\n\t\t\thead_height,\n\t\t\thead_width,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tstem_length: [ MaximumDecimalPoints, MinimumValue ],\n\t\t\tstem_width: [ MaximumDecimalPoints, MinimumValue ],\n\t\t\thead_length: [ MaximumDecimalPoints, MinimumValue ],\n\t\t\thead_width: [ MaximumDecimalPoints, MinimumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import { ValidatorInterface } from './ValidatorInterface';\nimport { AbstractValidator, ValidatorObject } from './AbstractValidator';\nimport { sprintf } from 'sprintf-js';\nimport Length from '../../../../source/js/shared/models/Geometry/Length';\n\n/**\n * Validator that checks if the value is equal to or lower than the set maximum amount.\n */\nexport class MaximumValue extends AbstractValidator implements ValidatorInterface {\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ValidatorObject} options\n\t */\n\tconstructor(options: ValidatorObject) {\n\t\tsuper(options);\n\n\t\tconst value = options.value ?? this.getDimensionValue();\n\n\t\tif (typeof value !== 'number') {\n\t\t\tthrow new Error('The MaximumValue validator can only be used on numbers.');\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.maximum = this.maximum ?? this.getMaximum();\n\t}\n\n\tgetMaximum(): number {\n\t\treturn this.maximums[this.dimension] instanceof Length ? this.maximums[this.dimension].in_cm() : this.maximums[this.dimension];\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tif (super.getCustomMessage()) {\n\t\t\treturn super.getCustomMessage();\n\t\t}\n\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\tif (this.getDimension() === 'number_of_points' || this.getDimension() === 'side_amount') {\n\t\t\treturn sprintf(dimensions.max, this.getDimensionLabel(), this.maximum, '');\n\t\t}\n\n\t\treturn sprintf(dimensions.max, this.getDimensionLabel(), this.maximum, 'cm');\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\n\t\t// Maximum sizes don't apply to cutouts.\n\t\tif ( this.getIsCutout() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst value = +this.value;\n\t\tif (isNaN(value)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn value <= this.maximum;\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class CircleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'diameter',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\tdiameter: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { diameter } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tdiameter,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tdiameter: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class EllipseConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { height, width } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\theight,\n\t\t\twidth,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\nimport AbstractShape from '../Shapes/AbstractShape';\n\nexport default class HalfCircleConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'diameter',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side();\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\n\t\t// Get the minimum of the longest side and the shortest side multiplied by 2\n\t\treturn {\n\t\t\tdiameter: new Length(Math.min(longest_side.in_mm(), shortest_side.multiply(2).in_mm())),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number ): Record<string, Length>|null {\n\t\treturn {\n\t\t\tdiameter: Length.from_cm(minimum),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tdiameter: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length> ): ValidatorInterface[] {\n\t\treturn [\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'half-circle-diameter',\n\t\t\t\tdimension: 'diameter',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'half-circle-diameter',\n\t\t\t\tdimension: 'diameter',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'half-circle-diameter',\n\t\t\t\tdimension: 'diameter',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_cutout_validators(): ValidatorInterface[] {\n\t\treturn [];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class HeartConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side().in_mm();\n\t\tconst longest_side = maximum_rectangle.get_longest_side().in_mm();\n\n\t\tconst formula1 = (3 / 4 * Math.sqrt( 2 ) + 1 / 2);\n\t\tconst formula2 = (Math.sqrt( 2 ) / 2 + 1);\n\n\t\t// Calculate based on the shortest side\n\t\tconst min_width = ( shortest_side / formula1 ) * formula2;\n\n\t\t// If the width is too large for the max width of the rectangle, we need to recalculate.\n\t\tif ( longest_side < min_width ) {\n\t\t\treturn {\n\t\t\t\theight: new Length( ( longest_side / formula2 ) * formula1 ),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\theight: new Length( shortest_side ),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { height } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class HexagonConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'side_length',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\n\t\t// See https://en.wikipedia.org/wiki/Hexagon#Parameters\n\t\t// The shortest side is the d, now we need to calculate R.\n\t\t// r = 0.5d\n\t\t// r = ( sqrt(3) / 2 ) * R\n\t\t// r / ( sqrt(3) / 2 ) = R\n\t\t// R = r / ( sqrt(3) / 2 )\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side().in_mm() / 2;\n\n\t\tconst maximum_side_length = shortest_side / (\n\t\t\tMath.sqrt( 3 ) / 2\n\t\t);\n\n\t\treturn {\n\t\t\tside_length: new Length( maximum_side_length )\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { side_length } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tside_length,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tside_length: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class IsoscelesTriangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'base',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\tbase: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_longest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width, height } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tbase: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import { ShapeCategory } from '@/types/shapeCategories';\nimport Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\n\nexport default class NullConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions(): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: new Length( 0 ),\n\t\t\tlength: new Length( 0 ),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\treturn {};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn '';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class QuarterCircleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'radius',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\n\t\t// Because a quarter circle only uses half of a plate a circle uses we should double the maximum diameter.\n\t\treturn {\n\t\t\tradius: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { radius } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tradius\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tradius: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class RectangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'length',\n\t\t\t'width',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\tlength: maximum_rectangle.get_length(),\n\t\t\twidth: maximum_rectangle.get_width()\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { length, width, height } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tlength,\n\t\t\twidth,\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tlength: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class RightAngledTriangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'base',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\tbase: maximum_rectangle.get_length(),\n\t\t\theight: maximum_rectangle.get_width(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width, height } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tbase: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class RoundedRectangleConfiguration implements ShapeConfigurationInterface {\n\tuse_individual_corners(): boolean {\n\t\tconst { pricingGroup } = window.measurementSelectorVariables;\n\n\t\treturn pricingGroup.shape_settings[ 'rounded-rectangle' ][ 'use_individual_corners' ] ?? false;\n\t}\n\n\tget_dimension_keys(): string[] {\n\t\tif ( this.use_individual_corners() ) {\n\t\t\treturn [\n\t\t\t\t'length',\n\t\t\t\t'width',\n\t\t\t\t'top_left_radius',\n\t\t\t\t'top_right_radius',\n\t\t\t\t'bottom_left_radius',\n\t\t\t\t'bottom_right_radius',\n\t\t\t];\n\t\t}\n\n\t\treturn [\n\t\t\t'length',\n\t\t\t'width',\n\t\t\t'radius',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle, dimensions ): Record<string, Length> {\n\t\tconst maxRadius = Length.from_cm( dimensions.width ).min( Length.from_cm( dimensions.length ) ).divide( 2 );\n\n\t\treturn {\n\t\t\tlength: maximum_rectangle.get_length(),\n\t\t\twidth: maximum_rectangle.get_width(),\n\t\t\tradius: maxRadius,\n\t\t\t'top_right_radius': maxRadius,\n\t\t\t'bottom_right_radius': maxRadius,\n\t\t\t'bottom_left_radius': maxRadius,\n\t\t\t'top_left_radius': maxRadius,\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { length, width, radius, top_right_radius, bottom_right_radius, bottom_left_radius, top_left_radius, height } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tlength,\n\t\t\twidth,\n\t\t\tradius,\n\t\t\ttop_right_radius,\n\t\t\tbottom_right_radius,\n\t\t\tbottom_left_radius,\n\t\t\ttop_left_radius,\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tlength: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\tradius: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\t'top_right_radius': [ MaximumDecimalPoints, MaximumValue ],\n\t\t\t'bottom_right_radius': [ MaximumDecimalPoints, MaximumValue ],\n\t\t\t'bottom_left_radius': [ MaximumDecimalPoints, MaximumValue ],\n\t\t\t'top_left_radius': [ MaximumDecimalPoints, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","export default class GroupedValidator {\n\tprivate readonly validator: Function;\n\tprivate readonly group: string;\n\tprivate readonly message: string = '';\n\tprivate readonly fields: string[];\n\n\t/**\n\t * Constructs the class\n\t *\n\t * @param {Function} validator The validator being grouped.\n\t * @param {string[]} fields The fields the validator is being applied to.\n\t * @param {string} group The group's name.\n\t * @param {string} message The validation message to throw if the group is invalid.\n\t */\n\tconstructor( validator: Function, fields: string[], group: string, message?: string ) {\n\t\tthis.fields = fields;\n\t\tthis.validator = validator;\n\t\tthis.group = group;\n\t\tthis.message = message;\n\t}\n\n\t/**\n\t * Gets the validator function.\n\t *\n\t * @returns {Function} The validator.\n\t */\n\tgetValidator(): Function {\n\t\treturn this.validator;\n\t}\n\n\t/**\n\t * Gets the group name.\n\t *\n\t * @returns {string} The group's name.\n\t */\n\tgetGroup(): string {\n\t\treturn this.group;\n\t}\n\n\t/**\n\t * Gets group's message.\n\t *\n\t * @returns {string} The message to throw.\n\t */\n\tgetMessage(): string {\n\t\treturn this.message;\n\t}\n\n\t/**\n\t * Gets the fields to apply the validator to.\n\t *\n\t * @returns {string[]} The fields the validator needs to be applied to.\n\t */\n\tgetFields(): string[] {\n\t\treturn this.fields;\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport GroupedValidator from '../Validators/GroupedValidator';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class SlopedRectangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'height_left',\n\t\t\t'width',\n\t\t\t'height_right',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_width(),\n\t\t\theight_left: maximum_rectangle.get_longest_side(),\n\t\t\theight_right: maximum_rectangle.get_longest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width, height_left, height_right } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight_left,\n\t\t\theight_right,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\tconst { at_least_one } = window.measurementSelectorVariables.i18n.validators.dimensions;\n\n\t\treturn {\n\t\t\theight_left: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\theight_right: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\tgrouped: [\n\t\t\t\tnew GroupedValidator(\n\t\t\t\t\tMinimumValue,\n\t\t\t\t\t[ 'height_left', 'height_right', 'width' ],\n\t\t\t\t\t'sloped-rectangle_minimum',\n\t\t\t\t\tat_least_one.min\n\t\t\t\t)\n\t\t\t]\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import {ValidatorInterface} from './ValidatorInterface';\nimport { AbstractValidator, ValidatorObject } from './AbstractValidator';\nimport { capitalize } from \"@/functions/strings\";\nimport {sprintf} from 'sprintf-js';\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\n\n/**\n * Validator that checks if the ratio between two dimensions meets the minimum.\n */\nexport class MinimumRatio extends AbstractValidator implements ValidatorInterface {\n\tratios: Ratio[];\n\tdeclare value: number;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ValidatorObject} options\n\t */\n\tconstructor( options: ValidatorObject ) {\n\t\tsuper( options );\n\n\t\tconst ratios = this.instance.getRatios();\n\n\t\tif ( ! ratios.length ) {\n\t\t\tthrow new Error( 'The MinimumRatio validator can only be used on shapes that have ratios.' );\n\t\t}\n\n\t\tconst value = options.value ?? this.getDimensionValue();\n\n\t\tif ( typeof value !== 'number' ) {\n\t\t\tthrow new Error( 'The MinimumValue validator can only be used on numbers.' );\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.ratios = ratios;\n\t}\n\n\tgetInvalidRatios(): Ratio[] {\n\t\tconst applicableRatios = this.ratios.filter( ratio => ratio.firstDimension === this.getDimension() );\n\n\t\tconst invalidRatios = applicableRatios.filter( ratio => {\n\t\t\tconst secondValue = this.instance[ `get${ ratio.secondDimension.split( '_' ).map( dimension_part => capitalize( dimension_part ) ).join( '' ) }` ]() ?? null;\n\n\t\t\tif ( ! ( secondValue instanceof Length ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst calculatedRatio = this.value / secondValue.in_cm();\n\n\t\t\treturn calculatedRatio < ratio.ratio;\n\t\t} );\n\n\t\treturn invalidRatios;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tif ( super.getCustomMessage() ) {\n\t\t\treturn super.getCustomMessage();\n\t\t}\n\n\t\tconst invalidRatio = this.getInvalidRatios()[ 0 ];\n\n\t\tif ( ! invalidRatio ) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\tif ( invalidRatio.firstDimension === this.getDimension() && invalidRatio.ratio === 0.5 ) {\n\t\t\treturn sprintf( dimensions.ratio.half, dimensions.labels[ invalidRatio.firstDimension ], dimensions.labels[ invalidRatio.secondDimension ].toLowerCase() );\n\t\t}\n\n\t\treturn sprintf( dimensions.ratio.min, dimensions.labels[ invalidRatio.firstDimension ].toLowerCase(), dimensions.labels[ invalidRatio.secondDimension ].toLowerCase(), invalidRatio.ratio );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\treturn ! this.getInvalidRatios().length;\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { MinimumRatio } from '../Validators/MinimumRatio';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class ArchedRectangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_shortest_side(),\n\t\t\theight: maximum_rectangle.get_longest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { height, width } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth,\n\t\t\theight,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue, MinimumRatio ],\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue, MinimumRatio ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class StarConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'inner_radius',\n\t\t\t'outer_radius',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [\n\t\t\t'number_of_points',\n\t\t];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length|number> {\n\t\tconst maximum_radius = maximum_rectangle.get_shortest_side().divide( 2 );\n\n\t\treturn {\n\t\t\tinner_radius:maximum_radius,\n\t\t\touter_radius:maximum_radius,\n\t\t\tnumber_of_points: 15,\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { inner_radius, outer_radius, number_of_points } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tinner_radius,\n\t\t\touter_radius,\n\t\t\tnumber_of_points,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tinner_radius: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\touter_radius: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\tnumber_of_points: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import {ValidatorInterface} from './ValidatorInterface';\nimport {AbstractValidator, ValidatorObject} from './AbstractValidator';\nimport { Text } from \"@/Models/Shapes/Text\";\n\n/**\n * Validator that checks if the value is equal to or lower than the set maximum amount for texts.\n */\nexport class MaximumTextValue extends AbstractValidator implements ValidatorInterface {\n\tdeclare instance: Text;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ValidatorObject} options\n\t */\n\tconstructor( options: ValidatorObject ) {\n\t\tsuper( options );\n\n\t\tif ( this.dimension !== 'text' ) {\n\t\t\tthrow new Error( 'The MaximumTextValue validator can only be used on the text dimension.' );\n\t\t}\n\n\t\tif ( ! ( this.instance instanceof Text ) ) {\n\t\t\tthrow new Error( 'The MaximumTextValue validator can only be used on instances of Text shapes.' );\n\t\t}\n\n\t\tthis.dimension = this.getDimension();\n\t\tconst value = this.getDimensionValue();\n\n\t\tif ( typeof value !== 'number' ) {\n\t\t\tthrow new Error( 'The MaximumTextValue validator can only be used on numbers.' );\n\t\t}\n\n\t\tthis.value = value;\n\t\tthis.maximum = this.maximums[ this.getDimension() ].in_cm();\n\t}\n\n\tgetDimension(): string {\n\t\treturn this.instance.getDesiredDimension();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\treturn dimensions.text.sheet.max;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\tif ( typeof this.value !== 'number' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.value <= this.maximum;\n\t}\n}\n","import {ValidatorInterface} from './ValidatorInterface';\nimport {AbstractValidator, ValidatorObject} from './AbstractValidator';\nimport {sprintf} from 'sprintf-js';\nimport { Text } from \"@/Models/Shapes/Text\";\n\n/**\n * Validator that checks if the value is equal to or lower than the set maximum amount for texts.\n */\nexport class MinimumTextValue extends AbstractValidator implements ValidatorInterface {\n\tdeclare instance: Text;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ValidatorObject} options\n\t */\n\tconstructor( options: ValidatorObject ) {\n\t\tsuper( options );\n\n\t\tif ( this.dimension !== 'text' ) {\n\t\t\tthrow new Error( 'The MinimumTextValue validator can only be used on the text dimension.' );\n\t\t}\n\n\t\tif ( ! ( this.instance instanceof Text ) ) {\n\t\t\tthrow new Error( 'The MinimumTextValue validator can only be used on instances of Text shapes.' );\n\t\t}\n\n\t\tthis.dimension = this.getDimension();\n\t\tconst value = this.getDimensionValue();\n\n\t\tif ( typeof value !== 'number' ) {\n\t\t\tthrow new Error( 'The MinimumTextValue validator can only be used on numbers.' );\n\t\t}\n\n\t\tthis.value = value;\n\t}\n\n\tgetDimension(): string {\n\t\treturn this.instance.getDesiredDimension() === 'width' ? 'height' : 'width';\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\tconst { dimensions } = this.getValidatorTranslationStrings();\n\n\t\treturn sprintf( dimensions.text.sheet.min, this.minimum, 'cm' );\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\tif ( typeof this.value !== 'number' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn this.value >= this.minimum;\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumTextValue } from \"@/Models/Validators/MaximumTextValue\";\nimport { MinimumTextValue } from \"@/Models/Validators/MinimumTextValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class TextConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'desired_length',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [\n\t\t\t'font',\n\t\t\t'text',\n\t\t\t'desired_dimension',\n\t\t];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_length(),\n\t\t\theight: maximum_rectangle.get_width()\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { font, text, desiredDimension } = window.measurementSelectorVariables.i18n.text;\n\t\tconst { height, width } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tfont,\n\t\t\ttext,\n\t\t\theight,\n\t\t\twidth,\n\t\t\tdesired_dimension: desiredDimension,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\ttext: [ MinimumTextValue, MaximumTextValue ],\n\t\t\tdesired_length: [ MaximumDecimalPoints, MinimumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn '';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class TrapezoidConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width_top',\n\t\t\t'width_bottom',\n\t\t\t'height',\n\t\t\t'offset_left',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth_top: maximum_rectangle.get_longest_side(),\n\t\t\twidth_bottom: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_longest_side(),\n\t\t\toffset_left: maximum_rectangle.get_longest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width_top, width_bottom, height, offset_left } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth_top,\n\t\t\twidth_bottom,\n\t\t\theight,\n\t\t\toffset_left,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth_top: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth_bottom: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import { ValidatorInterface } from \"./ValidatorInterface\";\n\nexport class OrValidator {\n\tprivate readonly validators: ValidatorInterface[];\n\n\tconstructor( validators: ValidatorInterface[] ) {\n\t\tthis.validators = validators;\n\t}\n\n\tgetMessage(): string {\n\t\treturn this.validators.map( ( validator: ValidatorInterface ) => validator.getMessage() ).join( ` ${window.measurementSelectorVariables.i18n.or} ` );\n\t}\n\n\tisValid(): boolean {\n\t\treturn this.validators.some( ( validator: ValidatorInterface ) => validator.isValid() );\n\t}\n\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport AbstractShape, { Dimensions } from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\nimport Rectangle from '../../../../source/js/shared/models/Geometry/Rectangle';\nimport { OrValidator } from '../Validators/OrValidator';\n\nexport default class FlatOvalConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'radius',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\tradius: maximum_rectangle.get_longest_side().divide(2),\n\t\t};\n\t}\n\n\t// Maximum dimensions based on other dimensions\n\tget_maximum_variable_dimensions( dimensions: Dimensions ): Record<string, Length> {\n\t\tconst maxRadius = dimensions.width / 2;\n\t\treturn {\n\t\t\tradius: Length.from_cm(maxRadius),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number, dimensions: Dimensions ): Record<string, Length>|null {\n\t\tconst minWidth = dimensions.radius * 2;\n\t\treturn {\n\t\t\twidth: Length.from_cm(minWidth),\n\t\t\tradius: Length.from_cm(minimum),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tradius: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length>, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxRadius = dimensions.width / 2;\n\t\tconst minWidth = dimensions.radius * 2;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'flat-oval-radius',\n\t\t\t\t\tdimension: 'radius',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\twidth: maximums.width,\n\t\t\t\t\t\tradius: Length.from_cm( maxRadius ),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'flat-oval-width',\n\t\t\t\t\tdimension: 'width',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\tradius: Length.from_cm(minimum),\n\t\t\t\t\t\twidth: Length.from_cm(minWidth),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'flat-oval-radius',\n\t\t\t\tdimension: 'radius',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'flat-oval-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'flat-oval-radius',\n\t\t\t\tdimension: 'radius',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'flat-oval-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'flat-oval-radius',\n\t\t\t\tdimension: 'radius',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'flat-oval-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} )\n\t\t];\n\t}\n\n\tget_cutout_validators( instance: AbstractShape, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxRadius = dimensions.width / 2;\n\t\tconst minWidth = dimensions.radius * 2;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'flat-oval-radius',\n\t\t\t\t\tdimension: 'radius',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\tradius: Length.from_cm( maxRadius ),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'flat-oval-width',\n\t\t\t\t\tdimension: 'width',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\twidth: Length.from_cm(minWidth),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport GroupedValidator from '../Validators/GroupedValidator';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class SlopedRightRectangleConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'height',\n\t\t\t'width_top',\n\t\t\t'width_bottom',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\theight: maximum_rectangle.get_width(),\n\t\t\twidth_top: maximum_rectangle.get_longest_side(),\n\t\t\twidth_bottom: maximum_rectangle.get_longest_side(),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { height, width_top, width_bottom } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\theight,\n\t\t\twidth_top,\n\t\t\twidth_bottom,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\tconst { at_least_one } = window.measurementSelectorVariables.i18n.validators.dimensions;\n\n\t\treturn {\n\t\t\twidth_top: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\twidth_bottom: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\theight: [ MaximumDecimalPoints, MaximumValue ],\n\t\t\tgrouped: [\n\t\t\t\tnew GroupedValidator(\n\t\t\t\t\tMinimumValue,\n\t\t\t\t\t[ 'width_top', 'width_bottom', 'height' ],\n\t\t\t\t\t'sloped-right-rectangle_minimum',\n\t\t\t\t\tat_least_one.min\n\t\t\t\t)\n\t\t\t]\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport Rectangle from '../../../../source/js/shared/models/Geometry/Rectangle';\n\nexport default class OctagonConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'side_length',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst diagonalFactor = 1 + Math.sqrt(2);\n\t\tconst maximum_side_length = maximum_rectangle.get_shortest_side().in_mm() / diagonalFactor;\n\n\t\treturn {\n\t\t\tside_length: new Length( maximum_side_length )\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { side_length } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\tside_length,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\tside_length: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport AbstractShape, { Dimensions } from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\nimport { OrValidator } from '../Validators/OrValidator';\n\nexport default class DropletConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'height',\n\t\t\t'width',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\theight: maximum_rectangle.get_longest_side(),\n\t\t\twidth: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_maximum_variable_dimensions( dimensions: Dimensions ): Record<string, Length> {\n\t\tconst maxWidth = dimensions.height - 1;\n\t\treturn {\n\t\t\twidth: Length.from_cm(maxWidth),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number, dimensions: Dimensions ): Record<string, Length>|null {\n\t\treturn {\n\t\t\theight: Length.from_cm(dimensions.width + 1),\n\t\t\twidth: Length.from_cm(minimum),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length>, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst minHeight = dimensions.width + 1;\n\t\tconst maxWidth = dimensions.height - 1;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'droplet-width',\n\t\t\t\t\tdimension: 'width',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\twidth: Length.from_cm(maxWidth),\n\t\t\t\t\t\theight: maximums.height\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'droplet-height',\n\t\t\t\t\tdimension: 'height',\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\theight: Length.from_cm(minHeight),\n\t\t\t\t\t},\n\t\t\t\t\tinstance,\n\t\t\t\t} ),\n\t\t\t]),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'droplet-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'droplet-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'droplet-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'droplet-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'droplet-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'droplet-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} )\n\t\t];\n\t}\n\n\tget_cutout_validators( instance: AbstractShape, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst minHeight = dimensions.width + 1;\n\t\tconst maxWidth = dimensions.height - 1;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'droplet-width',\n\t\t\t\t\tdimension: 'width',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\twidth: Length.from_cm(maxWidth),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'droplet-height',\n\t\t\t\t\tdimension: 'height',\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\theight: Length.from_cm(minHeight),\n\t\t\t\t\t},\n\t\t\t\t\tinstance,\n\t\t\t\t} ),\n\t\t\t]),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'droplet-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums: {\n\t\t\t\t\twidth: Length.from_cm(maxWidth),\n\t\t\t\t},\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class PolygonConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [\n\t\t\t'side_amount',\n\t\t];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ): Record<string, Length|number> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_shortest_side(),\n\t\t\tside_amount: 15,\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width, side_amount } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\twidth,\n\t\t\tside_amount,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\tside_amount: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport Rectangle from '../../../../source/js/shared/models/Geometry/Rectangle';\nimport AbstractShape from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\n\nexport default class EggConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number ): Record<string, Length>|null {\n\t\treturn {\n\t\t\twidth: Length.from_cm( minimum ),\n\t\t\theight: Length.from_cm( minimum ),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length> ): ValidatorInterface[] {\n\t\treturn [\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'egg-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tdecimalPoints: 1,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'egg-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tminimum,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'egg-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'egg-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tdecimalPoints: 1,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'egg-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tminimum,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'egg-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_cutout_validators(): ValidatorInterface[] {\n\t\treturn [];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\n\nexport default class KiteConfiguration implements ShapeConfigurationInterface {\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height_top',\n\t\t\t'height_bottom',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\t\tconst height_top = longest_side.divide(3).in_mm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_shortest_side(),\n\t\t\theight_top: new Length(height_top),\n\t\t\theight_bottom: new Length(height_bottom),\n\t\t};\n\t}\n\n\tget_labels(): Record<string, string> {\n\t\tconst { width, height_top, height_bottom } = window.measurementSelectorVariables.i18n.dimensionNames;\n\n\t\treturn {\n\t\t\theight_top,\n\t\t\theight_bottom,\n\t\t\twidth,\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight_top: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight_bottom: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport AbstractShape, { Dimensions } from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\nimport { OrValidator } from '../Validators/OrValidator';\n\nexport default class BarrelConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height',\n\t\t\t'side_height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst shortestSide = maximum_rectangle.get_shortest_side();\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: shortestSide,\n\t\t\tside_height: shortestSide,\n\t\t};\n\t}\n\n\tget_maximum_variable_dimensions( dimensions: Dimensions ): Record<string, Length> {\n\t\tconst maxSideHeight = dimensions.height - 1;\n\t\treturn {\n\t\t\tside_height: Length.from_cm(maxSideHeight),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number, dimensions: Dimensions ): Record<string, Length>|null {\n\t\treturn {\n\t\t\twidth: Length.from_cm(minimum),\n\t\t\theight: Length.from_cm(+dimensions.side_height + 1),\n\t\t\tside_height: Length.from_cm(minimum),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\tside_height: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length>, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxSideHeight = dimensions.height - 1;\n\t\tconst minHeight = dimensions.side_height + 1;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'barrel-side_height',\n\t\t\t\t\tdimension: 'side_height',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\tside_height: Length.from_cm(maxSideHeight),\n\t\t\t\t\t\theight: maximums.height\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'barrel-height',\n\t\t\t\t\tdimension: 'height',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\theight: Length.from_cm(minHeight),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'barrel-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'barrel-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'barrel-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'barrel-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'barrel-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'barrel-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'barrel-side_height',\n\t\t\t\tdimension: 'side_height',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'barrel-side_height',\n\t\t\t\tdimension: 'side_height',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'barrel-side_height',\n\t\t\t\tdimension: 'side_height',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_cutout_validators( instance: AbstractShape, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxSideHeight = dimensions.height - 1;\n\t\tconst minHeight = dimensions.side_height + 1;\n\n\t\treturn [\n\t\t\tnew OrValidator([\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'barrel-side_height',\n\t\t\t\t\tdimension: 'side_height',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\tside_height: Length.from_cm(maxSideHeight),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'barrel-height',\n\t\t\t\t\tdimension: 'height',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\theight: Length.from_cm(minHeight),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'circular';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport AbstractShape, { Dimensions } from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\nimport { OrValidator } from '../Validators/OrValidator';\n\nexport default class JewelConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width_top',\n\t\t\t'width_bottom',\n\t\t\t'height_top',\n\t\t\t'height_bottom',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\t\tconst height_top = longest_side.divide(3).in_mm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\tconst width_top = maximum_rectangle.get_shortest_side().in_mm() - 1;\n\n\t\treturn {\n\t\t\twidth_top: new Length(width_top),\n\t\t\twidth_bottom: maximum_rectangle.get_shortest_side(),\n\t\t\theight_top: new Length(height_top),\n\t\t\theight_bottom: new Length(height_bottom),\n\t\t};\n\t}\n\n\t// Maximum dimensions based on other dimensions\n\tget_maximum_variable_dimensions( dimensions: Dimensions ): Record<string, Length> {\n\t\tconst maxWidthTop = dimensions.width_bottom - 1;\n\t\treturn {\n\t\t\twidth_top: Length.from_cm(maxWidthTop),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number, dimensions: Dimensions ): Record<string, Length>|null {\n\t\treturn {\n\t\t\twidth_top: Length.from_cm(minimum),\n\t\t\twidth_bottom: Length.from_cm(dimensions.width_top),\n\t\t\theight_top: Length.from_cm(minimum),\n\t\t\theight_bottom: Length.from_cm(minimum),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\twidth_top: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth_bottom: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight_top: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\theight_bottom: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length>, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxWidthTop = dimensions.width_bottom - 1;\n\t\tconst minWidthBottom = dimensions.width_top + 1;\n\n\t\treturn [\n\t\t\tnew OrValidator( [\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'jewel-width_top',\n\t\t\t\t\tdimension: 'width_top',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\twidth_top: Length.from_cm(maxWidthTop),\n\t\t\t\t\t\twidth_bottom: maximums.width_bottom,\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'jewel-width_bottom',\n\t\t\t\t\tdimension: 'width_bottom',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\twidth_bottom: Length.from_cm(minWidthBottom),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'jewel-width_top',\n\t\t\t\tdimension: 'width_top',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'jewel-width_bottom',\n\t\t\t\tdimension: 'width_bottom',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'jewel-height_top',\n\t\t\t\tdimension: 'height_top',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'jewel-height_bottom',\n\t\t\t\tdimension: 'height_bottom',\n\t\t\t\tminimum,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'jewel-width_top',\n\t\t\t\tdimension: 'width_top',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'jewel-width_bottom',\n\t\t\t\tdimension: 'width_bottom',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'jewel-height_top',\n\t\t\t\tdimension: 'height_top',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'jewel-height_bottom',\n\t\t\t\tdimension: 'height_bottom',\n\t\t\t\tdecimalPoints: 1,\n\t\t\t\tinstance,\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_cutout_validators( instance: AbstractShape, dimensions: Dimensions ): ValidatorInterface[] {\n\t\tconst maxWidthTop = dimensions.width_bottom - 1;\n\t\tconst minWidthBottom = dimensions.width_top + 1;\n\n\t\treturn [\n\t\t\tnew OrValidator( [\n\t\t\t\tnew MaximumValue( {\n\t\t\t\t\tfield: 'jewel-width_top',\n\t\t\t\t\tdimension: 'width_top',\n\t\t\t\t\tinstance,\n\t\t\t\t\tmaximums: {\n\t\t\t\t\t\twidth_top: Length.from_cm(maxWidthTop),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: 'jewel-width_bottom',\n\t\t\t\t\tdimension: 'width_bottom',\n\t\t\t\t\tinstance,\n\t\t\t\t\tminimums: {\n\t\t\t\t\t\twidth_bottom: Length.from_cm(minWidthBottom),\n\t\t\t\t\t},\n\t\t\t\t} ),\n\t\t\t]),\n\t\t];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'complex';\n\t}\n}\n","import Length from '../../../../source/js/shared/models/Geometry/Length';\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { MinimumValue } from \"@/Models/Validators/MinimumValue\";\nimport { MaximumValue } from \"@/Models/Validators/MaximumValue\";\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport { ShapeCategory } from '@/types/shapeCategories';\nimport Rectangle from '../../../../source/js/shared/models/Geometry/Rectangle';\nimport AbstractShape from '../Shapes/AbstractShape';\nimport { ValidatorInterface } from '../Validators/ValidatorInterface';\n\nexport default class ParallogramConfiguration implements ShapeConfigurationInterface {\n\tpublic hasNewValidators = true;\n\n\tget_dimension_keys(): string[] {\n\t\treturn [\n\t\t\t'width',\n\t\t\t'height',\n\t\t];\n\t}\n\n\tget_modifier_keys(): string[] {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle: Rectangle ): Record<string, Length> {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_minimum_dimensions( minimum: number ): Record<string, Length>|null {\n\t\treturn {\n\t\t\twidth: Length.from_cm( minimum ),\n\t\t\theight: Length.from_cm( minimum ),\n\t\t};\n\t}\n\n\tget_validators(): Record<string, Array<unknown>> {\n\t\treturn {\n\t\t\theight: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t\twidth: [ MaximumDecimalPoints, MinimumValue, MaximumValue ],\n\t\t};\n\t}\n\n\tget_new_validators( instance: AbstractShape, minimum: number, maximums: Record<string, Length> ): ValidatorInterface[] {\n\t\treturn [\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'parallelogram-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tdecimalPoints: 1,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'parallelogram-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tminimum,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'parallelogram-height',\n\t\t\t\tdimension: 'height',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'parallelogram-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tdecimalPoints: 1,\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'parallelogram-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tminimum,\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'parallelogram-width',\n\t\t\t\tdimension: 'width',\n\t\t\t\tinstance,\n\t\t\t\tmaximums,\n\t\t\t} ),\n\t\t];\n\t}\n\n\tget_cutout_validators(): ValidatorInterface[] {\n\t\treturn [];\n\t}\n\n\tget_category(): ShapeCategory {\n\t\treturn 'straight';\n\t}\n}\n","import ArrowConfiguration from './ArrowConfiguration';\nimport CircleConfiguration from './CircleConfiguration';\nimport EllipseConfiguration from './EllipseConfiguration';\nimport HalfCircleConfiguration from './HalfCircleConfiguration';\nimport HeartConfiguration from './HeartConfiguration';\nimport HexagonConfiguration from './HexagonConfiguration';\nimport IsoscelesTriangleConfiguration from './IsoscelesTriangleConfiguration';\nimport NullConfiguration from './NullConfiguration';\nimport QuarterCircleConfiguration from './QuarterCircleConfiguration';\nimport RectangleConfiguration from './RectangleConfiguration';\nimport RightAngledTriangleConfiguration from './RightAngledTriangleConfiguration';\nimport RoundedRectangleConfiguration from './RoundedRectangleConfiguration';\nimport SlopedRectangleConfiguration from './SlopedRectangleConfiguration';\nimport ArchedRectangleConfiguration from './ArchedRectangleConfiguration';\nimport StarConfiguration from './StarConfiguration';\nimport TextConfiguration from './TextConfiguration';\nimport TrapezoidConfiguration from './TrapezoidConfiguration';\nimport { ShapeConfigurationInterface } from './ShapeConfigurationInterface';\nimport FlatOvalConfiguration from './FlatOvalConfiguration';\nimport SlopedRightRectangleConfiguration from './SlopedRightRectangleConfiguration';\nimport OctagonConfiguration from './OctagonConfiguration';\nimport DropletConfiguration from './DropletConfiguration';\nimport PolygonConfiguration from './PolygonConfiguration';\nimport EggConfiguration from './EggConfiguration';\nimport KiteConfiguration from './KiteConfiguration';\nimport BarrelConfiguration from './BarrelConfiguration';\nimport JewelConfiguration from './JewelConfiguration';\nimport ParallogramConfiguration from './ParallelogramConfiguration';\n\nexport default class ShapeConfigurationFactory {\n\tget_configuration( shape ): ShapeConfigurationInterface {\n\t\tswitch( shape ) {\n\t\t\tcase 'arrow':\n\t\t\t\treturn new ArrowConfiguration();\n\t\t\tcase 'circle':\n\t\t\t\treturn new CircleConfiguration();\n\t\t\tcase 'egg':\n\t\t\t\treturn new EggConfiguration();\n\t\t\tcase 'ellipse':\n\t\t\t\treturn new EllipseConfiguration();\n\t\t\tcase 'flat-oval':\n\t\t\t\treturn new FlatOvalConfiguration();\n\t\t\tcase 'half-circle':\n\t\t\t\treturn new HalfCircleConfiguration();\n\t\t\tcase 'heart':\n\t\t\t\treturn new HeartConfiguration();\n\t\t\tcase 'hexagon':\n\t\t\t\treturn new HexagonConfiguration();\n\t\t\tcase 'octagon':\n\t\t\t\treturn new OctagonConfiguration();\n\t\t\tcase 'polygon':\n\t\t\t\treturn new PolygonConfiguration();\n\t\t\tcase 'isosceles-triangle':\n\t\t\t\treturn new IsoscelesTriangleConfiguration();\n\t\t\tcase 'quarter-circle':\n\t\t\t\treturn new QuarterCircleConfiguration();\n\t\t\tcase 'rectangle':\n\t\t\t\treturn new RectangleConfiguration();\n\t\t\tcase 'right-angled-triangle':\n\t\t\tcase 'right-angled-triangle-mirrored':\n\t\t\t\treturn new RightAngledTriangleConfiguration();\n\t\t\tcase 'rounded-rectangle':\n\t\t\t\treturn new RoundedRectangleConfiguration();\n\t\t\tcase 'sloped-rectangle':\n\t\t\t\treturn new SlopedRectangleConfiguration();\n\t\t\tcase 'sloped-right-rectangle':\n\t\t\t\treturn new SlopedRightRectangleConfiguration();\n\t\t\tcase 'arched-rectangle':\n\t\t\t\treturn new ArchedRectangleConfiguration();\n\t\t\tcase 'star':\n\t\t\t\treturn new StarConfiguration();\n\t\t\tcase 'text':\n\t\t\t\treturn new TextConfiguration();\n\t\t\tcase 'trapezoid':\n\t\t\t\treturn new TrapezoidConfiguration();\n\t\t\tcase 'kite':\n\t\t\t\treturn new KiteConfiguration();\n\t\t\tcase 'barrel':\n\t\t\t\treturn new BarrelConfiguration();\n\t\t\tcase 'jewel':\n\t\t\t\treturn new JewelConfiguration();\n\t\t\tcase 'droplet':\n\t\t\t\treturn new DropletConfiguration();\n\t\t\tcase 'parallelogram':\n\t\t\t\treturn new ParallogramConfiguration();\n\t\t\tdefault:\n\t\t\t\treturn new NullConfiguration();\n\t\t}\n\t}\n}\n","import ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\n\nexport default class ShapeValidator {\n\tisShapeComplete ( shape: string, measurements, uploadAsModel = null ): boolean {\n\t\tif ( shape === 'dxf') {\n\t\t\treturn uploadAsModel !== null;\n\t\t}\n\n\t\tif (!measurements.dimensions[shape]) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst hasRequiredDimensions = this.requiredDimensions( shape ).reduce( ( canPreview, requiredDimension ) => {\n\t\t\tconst dimensionValue = measurements.dimensions[ shape ][ requiredDimension ];\n\n\t\t\treturn canPreview && ! isNaN( dimensionValue );\n\t\t}, shape !== '' );\n\n\t\treturn this.requiredModifiers( shape ).reduce( ( canPreview, requiredPrimitive ) => {\n\t\t\tconst dimensionValue = measurements.modifiers[ requiredPrimitive ];\n\n\t\t\treturn canPreview && !! dimensionValue;\n\t\t}, hasRequiredDimensions );\n\t}\n\n\trequiredDimensions ( shape: string ): string[] {\n\t\treturn ( new ShapeConfigurationFactory() ).get_configuration( shape ).get_dimension_keys();\n\t}\n\n\trequiredModifiers( shape: string ): string[] {\n\t\treturn new ShapeConfigurationFactory().get_configuration(shape).get_modifier_keys();\n\t}\n}\n","import Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport AbstractShape from \"./../Models/Shapes/AbstractShape\";\n\ninterface CutoutAttributes {\n\tcutoutOffsetLeft: number;\n\tcutoutOffsetBottom: number;\n\trotation?: number;\n}\n\n/**\n * The Cutout model.\n */\nexport default class Cutout {\n\tpublic readonly shape: string;\n\tpublic readonly offsets: Length[];\n\tpublic readonly attributes: CutoutAttributes;\n\tpublic readonly dimensions: object;\n\tpublic readonly modifiers: object;\n\tpublic readonly instance: AbstractShape;\n\n\t/**\n\t * Constructs the model.\n\t *\n\t * @param {string} shape The shape to cut out.\n\t * @param {Object} dimensions The dimensions of the cutout shape.\n\t * @param {Object} modifiers The modifiers applied to the shape.\n\t * @param {CutoutAttributes} attributes The cutout attributes.\n\t * @param {AbstractShape|null} instance The shape instance.\n\t */\n\tconstructor( shape: string, dimensions: object, modifiers: object, attributes: CutoutAttributes, instance: AbstractShape = null ) {\n\t\tthis.shape = shape;\n\t\tthis.dimensions = dimensions[shape];\n\t\tthis.modifiers = modifiers;\n\t\tthis.attributes = attributes;\n\t\tthis.instance = instance;\n\t\tthis.offsets = [\n\t\t\tnew Length( attributes.cutoutOffsetLeft ),\n\t\t\tnew Length( attributes.cutoutOffsetBottom ),\n\t\t];\n\t}\n\n\tpublic getShapeObject(): AbstractShape|null {\n\t\treturn this.instance;\n\t}\n\n\tgetLabelMappings(): Record<string, string> {\n\t\treturn this.getShapeObject().getLabelMappings();\n\t}\n}\n","import isEmpty from \"lodash/isEmpty\";\nimport isNil from \"lodash/isNil\";\nimport mapValues from \"lodash/mapValues\";\nimport isUndefined from \"lodash/isUndefined\";\nimport reduce from \"lodash/reduce\";\n\nimport Length from \"./../../../../source/js/shared/models/Geometry/Length\";\n\nimport {isModelInsideParent} from \"@/functions/makerjs\";\nimport ShapeValidator from \"@/utilities/ShapeValidator\";\nimport {CutoutTypes} from \"@/Models/CutoutTypes\";\nimport Cutout from \"@/Models/Cutout\";\nimport {convertUnits, endsWithSeparator} from \"@/functions/numbers\";\n\nfunction getInitialDimensions(): object {\n\tconst enabledShapes = window.measurementSelectorVariables.enabledShapes;\n\tconst dimensions = {};\n\n\tenabledShapes.forEach( ( enabledShape ) => {\n\t\tdimensions[ enabledShape ] = {};\n\t} );\n\n\treturn dimensions;\n}\n\nexport default {\n\tstate: (): object => ( {\n\t\tcutoutType: CutoutTypes.none,\n\t\tcutoutShape: '',\n\t\tcutoutOffsetLeft: 0,\n\t\tcutoutOffsetBottom: 0,\n\t\tcutoutRotation: 0,\n\t\tcutoutMeasurements: {\n\t\t\tdimensions: getInitialDimensions(),\n\t\t\tmodifiers: {}\n\t\t},\n\t\tdefaultCutoutDimensions: true,\n\t\tcutouts: [],\n\t\tcurrentCutoutIndex: 0,\n\t} ),\n\tmutations: {\n\t\tupdateCutoutType( state, cutoutType: CutoutTypes ): void {\n\t\t\tstate.cutoutType = cutoutType;\n\t\t},\n\t\tupdateCutoutOffsetLeft( state, cutoutOffsetLeft: number ): void {\n\t\t\tif ( state.currentCutoutIndex !== -1 && ! isUndefined( state.cutouts[state.currentCutoutIndex] ) ) {\n\t\t\t\tstate.cutouts[state.currentCutoutIndex].cutoutOffsetLeft = cutoutOffsetLeft;\n\t\t\t}\n\n\t\t\tstate.cutoutOffsetLeft = cutoutOffsetLeft;\n\t\t},\n\t\tupdateCutoutOffsetBottom( state, cutoutOffsetBottom: number ): void {\n\t\t\tif ( state.currentCutoutIndex !== -1 && ! isUndefined( state.cutouts[state.currentCutoutIndex] ) ) {\n\t\t\t\tstate.cutouts[state.currentCutoutIndex].cutoutOffsetBottom = cutoutOffsetBottom;\n\t\t\t}\n\n\t\t\tstate.cutoutOffsetBottom = cutoutOffsetBottom;\n\t\t},\n\t\tupdateCutoutRotation( state, cutoutRotation: number ): void {\n\t\t\tif ( state.currentCutoutIndex !== -1 && ! isUndefined( state.cutouts[state.currentCutoutIndex] ) ) {\n\t\t\t\tstate.cutouts[state.currentCutoutIndex].cutoutRotation = cutoutRotation;\n\t\t\t}\n\n\t\t\tstate.cutoutRotation = cutoutRotation;\n\t\t},\n\t\tupdateCutoutShape( state, cutoutShape: string ): void {\n\t\t\tstate.cutoutShape = cutoutShape;\n\n\t\t\t// Remove any modifiers that may have been set\n\t\t\tstate.cutoutMeasurements.modifiers = {};\n\t\t},\n\t\tupdateCutoutDimension( state, { dimension, value } ): void {\n\n\t\t\t// When switching from Text back to a shape, cutout fails. Setting it to a default shape fixes this.\n\t\t\tif ( state.cutoutShape === 'none' ) {\n\t\t\t\tstate.cutoutShape = 'rectangle';\n\t\t\t}\n\n\t\t\tif ( typeof value === 'string' ) {\n\t\t\t\tvalue = value.replace( ',', '.' );\n\t\t\t}\n\n\t\t\t// Using reduce is much more performant than using the spread operation on large objects (in some cases 5+ seconds).\n\t\t\tstate.cutoutMeasurements.dimensions = reduce(state.cutoutMeasurements.dimensions, (result: object, currentValue: object, shape: string) => {\n\n\t\t\t\t// Create a shallow copy of the accumulator to avoid modifying the original object\n\t\t\t\tconst newResult = { ...result };\n\n\t\t\t\tif (shape === state.cutoutShape) {\n\n\t\t\t\t\t// Create a shallow copy of currentValue to avoid modifying the original object\n\t\t\t\t\tconst newValue = { ...currentValue };\n\t\t\t\t\tnewValue[dimension] = Math.round(value * 10) / 10;\n\t\t\t\t\tnewResult[shape] = newValue;\n\t\t\t\t} else {\n\n\t\t\t\t\t// If the shape doesn't match, keep the original currentValue\n\t\t\t\t\tnewResult[shape] = currentValue;\n\t\t\t\t}\n\n\t\t\t\treturn newResult;\n\t\t\t}, {});\n\t\t},\n\t\tsetCutoutDimensionsForShape( state, { shape, dimensions } ): void {\n\t\t\tstate.cutoutMeasurements.dimensions = { ...state.cutoutMeasurements.dimensions, ...{\n\t\t\t\t[shape]: dimensions\n\t\t\t} };\n\t\t},\n\t\tsetCutoutModifiers( state, { modifiers } ): void {\n\t\t\tstate.cutoutMeasurements.modifiers = { ...state.cutoutMeasurements.modifiers, ...modifiers };\n\t\t},\n\t\tresetCutoutDimension( state, shape: string ): void {\n\t\t\tstate.cutoutMeasurements.dimensions[ shape ] = {};\n\t\t},\n\t\tupdateCutoutModifier( state, { modifier, value } ): void {\n\t\t\tstate.cutoutMeasurements.modifiers[modifier] = value;\n\t\t},\n\t\tupdateUsingDefaultCutoutDimensions: ( state, usesDefaults ): void => state.defaultCutoutDimensions = usesDefaults,\n\t\taddCutout( state, cutout: Cutout ): void {\n\t\t\tstate.cutouts = [...state.cutouts, cutout];\n\t\t},\n\t\tupdateCutouts( state, cutouts ): void {\n\t\t\tstate.cutouts = cutouts;\n\t\t},\n\t\tupdateCutoutIndex( state, index ): void {\n\t\t\tstate.currentCutoutIndex = index;\n\t\t},\n\t\tupdateCutoutByIndex( state, { index, cutout }: { index: number, cutout: Cutout } ): void {\n\n\t\t\t// Remove the cutout at the index and\n\t\t\t// replace it with the new cutout to trigger a 'change' in the cutouts array\n\t\t\tstate.cutouts = [\n\t\t\t\t...state.cutouts.slice(0, index),\n\t\t\t\tcutout,\n\t\t\t\t...state.cutouts.slice(index + 1)\n\t\t\t];\n\t\t},\n\t\tremoveCutoutByIndex( state, index ): void {\n\n\t\t\t// Remove the cutout at the index and replace the cutouts array to trigger a 'change'\n\t\t\tstate.cutouts = [\n\t\t\t\t...state.cutouts.slice(0, index),\n\t\t\t\t...state.cutouts.slice(index + 1)\n\t\t\t];\n\t\t}\n\t},\n\tgetters: {\n\t\tcutoutByIndex: ( state ): Function => ( index: number ) => state.cutouts[ index ],\n\t\tcurrentCutout: ( state, getters ): Cutout => getters.cutoutByIndex( state.currentCutoutIndex ),\n\t\tcutoutOffsetLeft: ( state ): number => state.cutoutOffsetLeft,\n\t\tcutoutOffsetBottom: ( state ): number => state.cutoutOffsetBottom,\n\t\tcutoutRotation: ( state ): number => state.cutoutRotation,\n\t\tcutouts: ( state ): Cutout[] => state.cutouts,\n\t\tcurrentCutoutIndex: ( state ): number => state.currentCutoutIndex,\n\t\tcutoutType: ( state ): CutoutTypes => state.cutoutType,\n\t\tcutoutShape: ( state ): string => state.cutoutShape,\n\t\tcutoutMeasurements: ( state ): object => state.cutoutMeasurements,\n\t\tcutoutModifiers: ( state ): object => state.cutoutMeasurements.modifiers,\n\t\tcutoutDimensions: ( state, { cutoutShape } ): object => state.cutoutMeasurements.dimensions[ cutoutShape ],\n\t\tcutoutPrimitives: ( state, getters, rootState ): object => {\n\t\t\tif ( getters.cutoutShape in rootState.shapeState ) {\n\t\t\t\treturn getters[ `${getters.cutoutShape}/cutoutPrimitives` ];\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...convertUnits( getters.cutoutMeasurements.dimensions[ getters.cutoutShape ] ),\n\t\t\t\t...getters.cutoutMeasurements.modifiers,\n\t\t\t};\n\t\t},\n\t\tselectedCutoutsPreview: ( state, getters ): string => {\n\t\t\tconst cutouts = getters.cutouts;\n\t\t\tconst shapes = [];\n\t\t\tconst i18n = window.measurementSelectorVariables.i18n;\n\n\t\t\tfor ( const cutout of cutouts ) {\n\t\t\t\tshapes.push(i18n.shapeNames[cutout.shape]);\n\t\t\t}\n\t\t\treturn shapes.join(', ');\n\t\t},\n\t\tshapeSupportCutoutRotation: ( state, getters ): boolean => {\n\t\t\treturn !['circle'].includes( getters.cutoutShape );\n\t\t},\n\t\tcutout: ( { cutoutType }, getters ): any => {\n\t\t\tif ( cutoutType === CutoutTypes.none ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst { cutoutShape, cutoutMeasurements, shapeInstance, cutoutOffsetLeft, cutoutOffsetBottom, cutoutRotation} = getters;\n\n\t\t\tconst shapeValidator = new ShapeValidator();\n\n\t\t\tif ( !shapeValidator.isShapeComplete( cutoutShape, cutoutMeasurements ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst instance = shapeInstance( cutoutShape, cutoutMeasurements );\n\n\t\t\tif ( isUndefined( instance ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst { dimensions, modifiers } = cutoutMeasurements;\n\n\t\t\tconst cutoutInstance = new Cutout( cutoutShape, dimensions, modifiers, {\n\t\t\t\tcutoutOffsetLeft,\n\t\t\t\tcutoutOffsetBottom,\n\t\t\t\trotation: cutoutRotation,\n\t\t\t}, instance );\n\n\t\t\treturn { ...cutoutInstance };\n\t\t},\n\t\tshouldApplyFillet(): boolean {\n\t\t\tconst filletSharpEdges = window.measurementSelectorVariables.pricingGroup.other_settings.fillet_sharp_edges;\n\n\t\t\treturn ! isNil( filletSharpEdges ) && !!filletSharpEdges;\n\t\t},\n\t\tfilletSize(state, getters, rootState, rootGetters): Length {\n\t\t\tif (rootGetters.activeEdgeFinish === 'lasering') {\n\t\t\t\treturn new Length(1);\n\t\t\t}\n\t\t\treturn rootGetters.minimumDrillHoleDiameterLength;\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState ): number => {\n\t\t\tif ( getters.cutoutShape in rootState.shapeState ) {\n\t\t\t\treturn getters[ `${getters.cutoutShape}/getCutoutArea` ];\n\t\t\t}\n\n\t\t\tif ( isEmpty( getters.cutoutPrimitives ) ) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn getters.getArea(\n\t\t\t\tgetters.cutoutShape,\n\t\t\t\tgetters.cutoutMeasurements.dimensions[ getters.cutoutShape ],\n\t\t\t\tgetters.cutoutMeasurements.modifiers\n\t\t\t);\n\t\t},\n\t\tcutoutsConfig: ( state, getters ) :{\n\t\t\ttype: string;\n\t\t\tshape: string;\n\t\t\tprimitives: {};\n\t\t\tposition: {};\n\t\t\tmodifiers: {};\n\t\t}[] => {\n\t\t\tconst cutouts = getters.cutouts;\n\n\t\t\tif ( cutouts.length === 0 ) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tif( cutouts[0] === null ) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\t// Possible to add more cutouts with a different type\n\t\t\treturn cutouts.map((cutout: Cutout) => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: 'shape',\n\t\t\t\t\tshape: cutout.shape,\n\t\t\t\t\tprimitives: cutout.dimensions,\n\t\t\t\t\tmodifiers: cutout.modifiers,\n\t\t\t\t\tposition: {\n\t\t\t\t\t\tleft: cutout.offsets[0].in_mm(),\n\t\t\t\t\t\tbottom: cutout.offsets[1].in_mm(),\n\t\t\t\t\t\trotation: cutout.attributes.rotation,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tcutoutConfig: ( state, getters ): object => {\n\t\t\tconst data = {\n\t\t\t\ttype: getters.cutoutType\n\t\t\t};\n\n\t\t\tif( getters.cutoutType !== CutoutTypes.none ) {\n\t\t\t\tdata[ 'shape' ] = getters.cutoutShape;\n\t\t\t\tdata[ 'primitives' ] = getters.cutoutPrimitives;\n\t\t\t\tdata[ 'position' ] = {\n\t\t\t\t\tleft: state.cutoutOffsetLeft,\n\t\t\t\t\tbottom: state.cutoutOffsetBottom,\n\t\t\t\t\trotation: state.cutoutRotation,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn data;\n\t\t},\n\t\tcutoutCenterPosition: ( { cutoutType }, { cutoutPrimitives, cutout, getCenter } ): { x: number, y: number } => {\n\t\t\tif ( cutoutType === CutoutTypes.none || isEmpty( cutoutPrimitives ) || isEmpty( cutout ) ) {\n\t\t\t\treturn { x: 0, y: 0 };\n\t\t\t}\n\n\t\t\treturn getCenter();\n\t\t},\n\t\tgetEnabledCutoutShapesForPricingGroup(): string[] {\n\t\t\treturn window.measurementSelectorVariables.pricingGroup.enabled_shapes;\n\t\t},\n\t\tusesDefaultCutoutDimensions: ( state ): boolean => state.defaultCutoutDimensions,\n\n\t\t/**\n\t\t * @deprecated\n\t\t */\n\t\tcutoutOutsideModel: ( state, getters ): boolean => {\n\t\t\tconst completeModel = getters.getExportableModel;\n\t\t\treturn ! isUndefined( completeModel ) && ! isUndefined( completeModel.models.cutout ) && ! isModelInsideParent( completeModel.models.cutout, completeModel.models.baseModel, true );\n\t\t},\n\t\tisCutoutsVisible: ( state, getters ): boolean => {\n\t\t\tif(!getters.shape) return false;\n\n\t\t\treturn getters.isCutoutsEnabled && getters.shape !== 'dxf' && getters.shape !== 'text';\n\t\t},\n\t},\n\tactions: {\n\t\tupdateCurrentCutout( { commit, getters } ): void {\n\t\t\tconst cutout = getters.currentCutout;\n\n\t\t\tcommit( 'updateCutoutShape', cutout.shape );\n\t\t\tcommit( 'updateCutoutOffsetLeft', cutout.offsets[0].in_mm() );\n\t\t\tcommit( 'updateCutoutOffsetBottom', cutout.offsets[1].in_mm() );\n\t\t\tcommit( 'updateCutoutRotation', cutout.attributes.rotation );\n\t\t\tcommit( 'setCutoutDimensionsForShape', { shape: cutout.shape, dimensions: cutout.dimensions } );\n\t\t\tcommit( 'setCutoutModifiers', { modifiers: cutout.modifiers } );\n\t\t},\n\t\tasync removeCutout({ commit, getters, dispatch }, index: number): Promise<void> {\n\t\t\tawait commit('removeCutoutByIndex', index);\n\t\t\tawait commit('updateCutoutIndex', getters.cutouts.length - 1);\n\n\t\t\tif(getters.cutouts.length === 0) {\n\t\t\t\tcommit( 'updateCutoutType', 'none' );\n\t\t\t} else {\n\t\t\t\tdispatch( 'updateCurrentCutout' );\n\t\t\t}\n\t\t},\n\t\tasync resetCutoutShapeAndDimension( {dispatch, commit, getters}, shape ): Promise<void> {\n\t\t\tcommit( 'updateCutoutShape', shape );\n\t\t\tawait dispatch('updateDefaultCutoutMeasurements');\n\n\t\t\tif ( shape === 'rounded-rectangle' ) {\n\t\t\t\tcommit( 'updateCutoutModifier', { modifier: 'use_individual_corners', value: getters[ 'rounded-rectangle/useIndividualCorners' ] ?? false } );\n\t\t\t}\n\n\t\t\tawait dispatch( 'updateCutoutPosition' );\n\n\t\t\tcommit( 'updateUsingDefaultCutoutDimensions', true );\n\t\t},\n\t\tasync updateCutoutPosition( { commit, getters } ): Promise<void> {\n\t\t\tconst position = getters.cutoutCenterPosition;\n\n\t\t\tcommit( 'updateCutoutOffsetLeft', position.x );\n\t\t\tcommit( 'updateCutoutOffsetBottom', position.y );\n\t\t},\n\t\tasync updateCutoutDimension( { commit }, { dimension, value } ): Promise<void> {\n\t\t\tif ( endsWithSeparator( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcommit( 'updateCutoutDimension', { dimension, value });\n\t\t},\n\t\tasync updateCutoutFromConfig( { commit }, { type, shape, primitives, position } ): Promise<void> {\n\t\t\tconst dimensionsInCm = mapValues( primitives, ( ( dimension, key ) => {\n\t\t\t\tif ( key === 'number_of_points' || key === 'side_amount' ) {\n\t\t\t\t\treturn dimension;\n\t\t\t\t}\n\n\t\t\t\treturn new Length( dimension ).in_cm();\n\t\t\t} ) );\n\n\t\t\tcommit( 'updateCutoutType', type );\n\t\t\tcommit( 'updateCutoutShape', shape );\n\t\t\tcommit( 'setCutoutDimensionsForShape', { shape: shape, dimensions: dimensionsInCm } );\n\n\t\t\tif ( shape === 'star' ) {\n\t\t\t\tcommit( 'updateCutoutModifier', { modifier: 'number_of_points', value: primitives.number_of_points } );\n\t\t\t}\n\n\t\t\tif ( shape === 'polygon' ) {\n\t\t\t\tcommit( 'updateCutoutModifier', { modifier: 'side_amount', value: primitives.side_amount } );\n\t\t\t}\n\n\t\t\tcommit( 'updateCutoutOffsetLeft', position.left );\n\t\t\tcommit( 'updateCutoutOffsetBottom', position.bottom );\n\t\t\tcommit( 'updateCutoutRotation', position.rotation );\n\t\t},\n\t\tasync updateCutoutsFromConfig( { commit, getters, dispatch }, cutouts ): Promise<void> {\n\t\t\tcommit('updateCutouts', []);\n\n\t\t\tfor ( const cutout of cutouts ) {\n\n\t\t\t\tcommit( 'updateCutoutType', cutout.type );\n\n\t\t\t\t// If text, collect the fonts\n\t\t\t\tif ( cutout.shape === 'text' ) {\n\t\t\t\t\tawait dispatch('loadFont', cutout.modifiers.font );\n\t\t\t\t}\n\n\t\t\t\tconst instance = getters.shapeInstance(cutout.shape, {\n\t\t\t\t\tdimensions: { [cutout.shape] : cutout.primitives },\n\t\t\t\t\tmodifiers: cutout.modifiers,\n\t\t\t\t} );\n\n\t\t\t\tcommit('addCutout', new Cutout(\n\t\t\t\t\tcutout.shape,\n\t\t\t\t\t{ [cutout.shape] : cutout.primitives },\n\t\t\t\t\tcutout.modifiers,\n\t\t\t\t\t{\n\t\t\t\t\t\tcutoutOffsetLeft: new Length(cutout.position.left).round().in_mm(),\n\t\t\t\t\t\tcutoutOffsetBottom: new Length(cutout.position.bottom).round().in_mm(),\n\t\t\t\t\t\trotation: cutout.position.rotation,\n\t\t\t\t\t}, instance\n\t\t\t\t));\n\t\t\t}\n\n\t\t\tcommit('updateCutoutIndex', getters.cutouts.length - 1);\n\t\t\tdispatch('updateCurrentCutout');\n\t\t},\n\t\tupdateDefaultCutoutMeasurements( { commit, getters, dispatch } ): void {\n\t\t\tconst parentShape = getters.shape;\n\t\t\tconst cutoutShape = getters.cutoutShape;\n\t\t\tconst cutoutMeasurements = getters.cutoutMeasurements.dimensions[cutoutShape];\n\n\t\t\tif ( ! parentShape || ! cutoutShape ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst parentShapeObject = getters.shapeInstance( parentShape, {\n\t\t\t\tdimensions: getters.measurements.dimensions,\n\t\t\t\tmodifiers: getters.modifiers,\n\t\t\t} );\n\n\t\t\tconst cutoutShapeObject = getters.shapeInstance( cutoutShape, {\n\t\t\t\tdimensions: cutoutMeasurements.dimensions,\n\t\t\t\tmodifiers: cutoutMeasurements.modifiers,\n\t\t\t} );\n\n\t\t\tcommit( 'setCutoutModifiers', {\n\t\t\t\tshape: cutoutShape,\n\t\t\t\tmodifiers: cutoutShapeObject.getDefaultCutoutModifiers()\n\t\t\t} );\n\n\t\t\tconst cutoutDimensions = cutoutShapeObject.getDefaultCutoutDimensions(parentShapeObject);\n\n\t\t\t// Map the values to ensure we always have valid numbers.\n\t\t\tmapValues( cutoutDimensions, ( val: number, key: string ) => {\n\t\t\t\tcutoutDimensions[key] = Math.round( val * 10 ) / 10;\n\t\t\t} );\n\n\t\t\tcommit('setCutoutDimensionsForShape', {\n\t\t\t\tshape: cutoutShape,\n\t\t\t\tdimensions: cutoutDimensions,\n\t\t\t});\n\n\t\t\tdispatch('updateCutoutPosition');\n\t\t},\n\t\tasync resetCutouts( { commit, dispatch } ): Promise<void> {\n\t\t\tcommit( 'updateCutoutType', CutoutTypes.none );\n\t\t\tcommit( 'updateCutouts', [] );\n\t\t\tcommit( 'updateCutoutIndex', 0 );\n\n\t\t\tawait dispatch( 'resetCutoutShapeAndDimension', '' );\n\t\t}\n\t}\n};\n","import {IModel} from 'makerjs';\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DrillHole from \"./DrillHole\";\nimport ShapeDrillHoleGeneratorFactory from \"./ShapeDrillHoleGeneratorFactory\";\nimport isEmpty from \"lodash/isEmpty\";\nimport OffsetLine from './Lines/OffsetLine';\nimport { renderLength } from '@/functions/lengths';\n\nexport enum EdgeDrillHoleType {\n\tCORNERS = 'corners',\n\tAROUND = 'around',\n}\n\nexport default class EdgeDrillHoles {\n\tshape: string;\n\tprimitives: {\n\t\twidth: number;\n\t\tlength: number;\n\t};\n\tdiameter: Length;\n\toffset: Length;\n\ttype: string;\n\tdrillHoles: number[];\n\tprivate parentModel: MakerJs.IModel;\n\n\tconstructor( shape: string, parentModel: IModel, diameter: Length, offset: Length, type: EdgeDrillHoleType, drillHoles?: number[] ) {\n\t\tthis.shape = shape;\n\t\tthis.diameter = diameter;\n\t\tthis.offset = offset;\n\t\tthis.type = type;\n\t\tthis.drillHoles = drillHoles;\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetId(): string {\n\t\treturn `edge-drillHoles-${this.type}`;\n\t}\n\n\tgetPath(): DrillHole[] {\n\t\tconst shapeDrillHoleGeneratorFactory = new ShapeDrillHoleGeneratorFactory();\n\t\tconst shapeDrillHoleGenerator = shapeDrillHoleGeneratorFactory.getShapeDrillHoleGenerator( this.shape, this.parentModel );\n\n\t\tlet drillHoles = [];\n\n\t\tif ( this.type === EdgeDrillHoleType.CORNERS && 'getCorners' in shapeDrillHoleGenerator ) {\n\t\t\tdrillHoles = shapeDrillHoleGenerator.getCorners( this.offset, this.diameter );\n\t\t}\n\n\t\tif ( ( this.type === EdgeDrillHoleType.AROUND && 'getAround' in shapeDrillHoleGenerator ) && ! isEmpty( this.drillHoles ) ) {\n\t\t\tdrillHoles = shapeDrillHoleGenerator.getAround( this.drillHoles, this.offset, this.diameter );\n\t\t}\n\n\t\treturn drillHoles;\n\t}\n\n\tgetAsModel(): IModel {\n\t\tconst drillHoles = this.getPath();\n\t\tconst drillHolesModel = { paths: {}, type: 'edge-drillHole' };\n\n\t\tdrillHoles.forEach( ( drillHole ) => {\n\t\t\tdrillHolesModel.paths = Object.assign( drillHolesModel.paths, drillHole.getAsModel().paths );\n\t\t} );\n\n\t\treturn drillHolesModel;\n\t}\n\n\t// Search for de closest drill hole to the [0,0] point\n\tfindClosestDrillHole(): DrillHole | null {\n\t\tconst drillHoles = this.getPath();\n\t\tif (drillHoles.length === 0) return null;\n\n\t\tlet closestDrillHole = drillHoles[0];\n\t\tlet minDistance = Math.sqrt(Math.pow(closestDrillHole.x.in_mm(), 2) + Math.pow(closestDrillHole.y.in_mm(), 2));\n\n\t\tdrillHoles.forEach(drillHole => {\n\t\t\tconst distance = Math.sqrt(Math.pow(drillHole.x.in_mm(), 2) + Math.pow(drillHole.y.in_mm(), 2));\n\t\t\tif (distance < minDistance) {\n\t\t\t\tclosestDrillHole = drillHole;\n\t\t\t\tminDistance = distance;\n\t\t\t}\n\t\t});\n\n\t\treturn closestDrillHole;\n\t}\n\n\tgetOffsetLines(focusedElement = ''): OffsetLine[] {\n\t\tif(focusedElement.includes('drillHoleOffset')) {\n\t\t\tconst drillHole = this.findClosestDrillHole();\n\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[ drillHole.x.in_mm(), 0 ],\n\t\t\t\t\t[ drillHole.x.in_mm(), drillHole.y.in_mm() ],\n\t\t\t\t\trenderLength(this.offset.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetCurrentEdgeDrillHoles(focusedElement = ''): IModel {\n\t\tconst drillHoleModel = this.getAsModel();\n\n\t\tif(this.type !== EdgeDrillHoleType.AROUND && focusedElement.startsWith('drillHoleEdgeCount')) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst edge = +focusedElement.split('_')[1];\n\n\t\tconst filteredDrillHoles = Object.keys(drillHoleModel.paths)\n\t\t\t.filter(key => key.endsWith(`-${edge + 1}`))\n\t\t\t.reduce((obj, key) => {\n\t\t\t\tobj[key] = drillHoleModel.paths[key];\n\t\t\t\treturn obj;\n\t\t\t}, {});\n\n\t\tdrillHoleModel.paths = filteredDrillHoles;\n\n\t\treturn drillHoleModel;\n\t}\n}\n","export default abstract class AbstractValidatorSet {\n\tpublic abstract getValidators(): object[];\n\n\tpublic getValidatorTranslationStrings(): Window['measurementSelectorVariables']['i18n']['validators'] {\n\t\treturn window.measurementSelectorVariables.i18n.validators;\n\t}\n}\n","import {MinimumValue} from \"../MinimumValue\";\nimport {sprintf} from 'sprintf-js';\nimport {ValidatorInterface} from \"../ValidatorInterface\";\nimport {IModel} from \"makerjs\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport Length from \"../../../../../source/js/shared/models/Geometry/Length\";\n\nexport default class RadialDrillHoleValidatorSet extends AbstractValidatorSet {\n\tprivate readonly minHoleDiameter: Length;\n\tprivate readonly state;\n\tprivate readonly shape: string;\n\tprivate readonly parsedDimensions: object;\n\tprivate readonly drillHoles: IModel;\n\tprivate readonly parentModel: IModel;\n\n\tconstructor( minHoleDiameter: Length, state, shape: string, parsedDimensions: object, drillHoles: IModel, parentModel: IModel ) {\n\t\tsuper();\n\n\t\tthis.minHoleDiameter = minHoleDiameter;\n\t\tthis.state = state;\n\t\tthis.shape = shape;\n\t\tthis.parsedDimensions = parsedDimensions;\n\t\tthis.drillHoles = drillHoles;\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetValidators(): ValidatorInterface[] {\n\t\tconst { drillHole } = this.getValidatorTranslationStrings();\n\n\t\treturn [\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: this.state.drillHoleDiameter,\n\t\t\t\tminimum: this.minHoleDiameter.in_mm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.min, this.minHoleDiameter.in_cm_i18n() )\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleRadialAmount',\n\t\t\t\tdimension: 'drillHoleRadialAmount',\n\t\t\t\tvalue: this.state.drillHoleRadialAmount,\n\t\t\t\tminimum: 3,\n\t\t\t\tcustomMessage: sprintf( drillHole.amount.min, 3 )\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleRadialDiameter',\n\t\t\t\tdimension: 'drillHoleRadialDiameter',\n\t\t\t\tvalue: this.state.drillHoleRadialDiameter,\n\t\t\t\tminimum: 3,\n\t\t\t\tcustomMessage: sprintf( drillHole.radial.diameter, 3 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: new Length( this.state.drillHoleDiameter ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.decimals, 1 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleRadialDiameter',\n\t\t\t\tdimension: 'drillHoleRadialDiameter',\n\t\t\t\tvalue: new Length( this.state.drillHoleRadialDiameter ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.radial.decimals.diameter, 1 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleRadialOffsetX',\n\t\t\t\tdimension: 'drillHoleRadialOffsetX',\n\t\t\t\tvalue: new Length( this.state.drillHoleRadialOffsetX ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.radial.decimals.offsetX, 1 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleRadialOffsetY',\n\t\t\t\tdimension: 'drillHoleRadialOffsetY',\n\t\t\t\tvalue: new Length( this.state.drillHoleRadialOffsetY ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.radial.decimals.offsetY, 1 )\n\t\t\t} ),\n\t\t];\n\t}\n}\n","import {MinimumValue} from \"../MinimumValue\";\nimport {sprintf} from 'sprintf-js';\nimport {ValidatorInterface} from \"../ValidatorInterface\";\nimport {IModel} from \"makerjs\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\nimport Length from \"../../../../../source/js/shared/models/Geometry/Length\";\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\n\nexport default class GridDrillHoleValidatorSet extends AbstractValidatorSet {\n\tprivate readonly minHoleDiameter: Length;\n\tprivate readonly state;\n\tprivate readonly drillHoles: IModel;\n\tprivate readonly parentModel: IModel;\n\n\tconstructor( minHoleDiameter: Length, state, drillHoles: IModel, parentModel: IModel ) {\n\t\tsuper();\n\n\t\tthis.minHoleDiameter = minHoleDiameter;\n\t\tthis.state = state;\n\t\tthis.drillHoles = drillHoles;\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetValidators(): ValidatorInterface[] {\n\t\tconst { drillHole } = window.measurementSelectorVariables.i18n.validators;\n\n\t\treturn [\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: this.state.drillHoleDiameter,\n\t\t\t\tminimum: this.minHoleDiameter.in_mm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.min, this.minHoleDiameter.in_cm_i18n() )\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleHorizontalAmount',\n\t\t\t\tdimension: 'drillHoleHorizontalAmount',\n\t\t\t\tvalue: this.state.drillHoleHorizontalAmount,\n\t\t\t\tminimum: 1,\n\t\t\t\tcustomMessage: sprintf( drillHole.grid.amount.horizontal, 1 )\n\t\t\t} ),\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleVerticalAmount',\n\t\t\t\tdimension: 'drillHoleVerticalAmount',\n\t\t\t\tvalue: this.state.drillHoleVerticalAmount,\n\t\t\t\tminimum: 1,\n\t\t\t\tcustomMessage: sprintf( drillHole.grid.amount.vertical, 1 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleOffset',\n\t\t\t\tdimension: 'drillHoleOffset',\n\t\t\t\tvalue: new Length( this.state.drillHoleOffset ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.offset.decimals, 1 )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: new Length( this.state.drillHoleDiameter ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.decimals, 1 )\n\t\t\t} ),\n\t\t];\n\t}\n}\n","import {ValidatorInterface} from \"./ValidatorInterface\";\nimport { AbstractValidator, ValidatorObject } from \"./AbstractValidator\";\nimport isEmpty from \"lodash/isEmpty\";\n\ninterface UniqueValidatorObject extends ValidatorObject {\n\tvalues: string[];\n}\n\n/**\n * Validator that checks if the value is unique.\n */\nexport class IsUnique extends AbstractValidator implements ValidatorInterface {\n\tdeclare readonly value: string;\n\tprivate readonly values: string[];\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {UniqueValidatorObject} options\n\t */\n\tconstructor( options: UniqueValidatorObject ) {\n\t\tsuper( options );\n\n\t\tthis.values = options.values;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\treturn super.getCustomMessage() ?? `This must be unique.`;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\tif ( isEmpty( this.values ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn ! this.values.includes( this.value );\n\t}\n}\n","import { IModel } from \"makerjs\";\nimport { AbstractValidator, ValidatorObject } from \"./AbstractValidator\";\n\nimport { ValidatorInterface } from \"./ValidatorInterface\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { sprintf } from 'sprintf-js';\n\nexport class CustomDrillHoleMissingValidator extends AbstractValidator implements ValidatorInterface {\n\n\tconstructor(\n\t\tprivate baseModel: IModel,\n\t\tprivate combinedModel: IModel,\n\t\tprivate drillHoleId: string,\n\t\toptions: ValidatorObject\n\t) {\n\t\tsuper(options);\n\t}\n\n\tgetMessage(): string {\n\t\tconst { drillHole: drillHoleMessages } = window.measurementSelectorVariables.i18n.validators;\n\t\treturn sprintf( drillHoleMessages.custom.incorrect, 1 ) ?? 'Drillhole is incorrect. Please check the offsets';\n\t}\n\n\tisValid(): boolean {\n\t\tlet isValid = true;\n\n\t\tconst options = {\n\t\t\tcontain: true,\n\t\t};\n\n\t\tconst cutoutModel = this.combinedModel.models.cutoutModel;\n\n\t\tconst baseModelChains = makerjs.model.findChains(this.baseModel, options);\n\t\tmakerjs.model.simplify(this.combinedModel); // Removes duplicate link paths\n\t\tconst combinedShapeChains = makerjs.model.findChains(this.combinedModel, options);\n\n\t\tif (!Array.isArray(baseModelChains) || !Array.isArray(combinedShapeChains)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if the drill hole exists in the base model, if not, the drill hole is missing\n\t\tif(!this.checkPathIdExists(cutoutModel.models.baseModel.models, this.drillHoleId) ) {\n\t\t\tisValid = false;\n\t\t}\n\n\t\t// Check if the combined shape has a longer path than the base model\n\t\t// If it does, it means that the drill hole is on the edge of the base model\n\t\tcombinedShapeChains.forEach((chain: makerjs.IChain, index) => {\n\t\t\tif(chain.pathLength > baseModelChains[index].pathLength) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\t\t});\n\n\t\treturn isValid;\n\t}\n\n\tcheckPathIdExists(models, pathId: string): boolean {\n\t\tfor (const modelKey in models) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(models, modelKey)) {\n\t\t\t\tconst paths = models[modelKey].paths;\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(paths, pathId)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n}\n","import {MinimumValue} from \"../MinimumValue\";\nimport {IsUnique} from \"../IsUnique\";\nimport {sprintf} from 'sprintf-js';\nimport {ValidatorInterface} from \"../ValidatorInterface\";\nimport {IModel} from \"makerjs\";\nimport CustomDrillHole from \"../../CustomDrillHole\";\nimport DrillHole from \"../../../Models/DrillHole\";\nimport Length from \"../../../../../source/js/shared/models/Geometry/Length\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\nimport { CustomDrillHoleMissingValidator } from \"../CustomDrillHoleMissingValidator\";\n\nexport default class CustomDrillHoleValidatorSet extends AbstractValidatorSet {\n\tprivate readonly minHoleDiameter: Length;\n\tprivate readonly state;\n\tprivate readonly customDrillHoles: DrillHole[];\n\tprivate readonly parentModel: IModel;\n\tprivate readonly combinedShape: IModel;\n\tprivate readonly parsed: DrillHole[];\n\n\tconstructor( minHoleDiameter: Length, state, customDrillHoles: CustomDrillHole[], parentModel: IModel, combinedShape: IModel = null) {\n\t\tsuper();\n\n\t\tthis.minHoleDiameter = minHoleDiameter;\n\t\tthis.state = state;\n\t\tthis.customDrillHoles = this.mapToInstances( customDrillHoles );\n\t\tthis.parentModel = parentModel;\n\t\tthis.combinedShape = combinedShape;\n\n\t\tthis.parsed = [];\n\t}\n\n\tmapToInstances( drillHoles ): DrillHole[] {\n\t\treturn drillHoles.map( hole => {\n\t\t\treturn new DrillHole( new Length( hole.x ), new Length( hole.y ), new Length( hole.diameter ) );\n\t\t} );\n\t}\n\n\tgetValidators(): ValidatorInterface[] {\n\t\tconst rules = [];\n\t\tconst { drillHole: drillHoleMessages } = window.measurementSelectorVariables.i18n.validators;\n\n\t\t// Create validation rule for every custom drillhole.\n\t\tthis.customDrillHoles.forEach( ( hole, index ) => {\n\t\t\tconst invalidHole = sprintf( drillHoleMessages.custom.invalid_hole, index + 1 );\n\t\t\tconst parsedIds = this.parsed.map( hole => hole.getId() );\n\n\t\t\tconst holeRules = [\n\n\t\t\t\tnew MinimumValue( {\n\t\t\t\t\tfield: `drillHoleDiameter_${index + 1}`,\n\t\t\t\t\tdimension: `drillHoleDiameter_${index + 1}`,\n\t\t\t\t\tvalue: hole.diameter.in_mm(),\n\t\t\t\t\tminimum: this.minHoleDiameter.in_mm(),\n\t\t\t\t\tcustomMessage: `${invalidHole} ${sprintf( drillHoleMessages.diameter.min, this.minHoleDiameter.in_cm_i18n() )}`\n\t\t\t\t} ),\n\t\t\t\tnew IsUnique( {\n\t\t\t\t\tfield: `drillHoleUnique_${index + 1}`,\n\t\t\t\t\tdimension: `drillHoleUnique_${index + 1}`,\n\t\t\t\t\tvalue: hole.getId(),\n\t\t\t\t\tvalues: parsedIds,\n\t\t\t\t\tcustomMessage: `${invalidHole} ${drillHoleMessages.custom.unique}`\n\t\t\t\t} ),\n\t\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\t\tfield: `drillHoleDiameter_${index + 1}`,\n\t\t\t\t\tdimension: `drillHoleDiameter_${index + 1}`,\n\t\t\t\t\tvalue: hole.diameter.in_cm(),\n\t\t\t\t\tcustomMessage: sprintf( drillHoleMessages.diameter.decimals, 1 ) } ),\n\t\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\t\tfield: `drillHoleOffsetX_${index + 1}`,\n\t\t\t\t\tdimension: `drillHoleOffsetX_${index + 1}`,\n\t\t\t\t\tvalue: hole.x.in_cm(),\n\t\t\t\t\tcustomMessage: sprintf( drillHoleMessages.custom.decimals.left, 1 ) } ),\n\t\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\t\tfield: `drillHoleOffsetY_${index + 1}`,\n\t\t\t\t\tdimension: `drillHoleOffsetY_${index + 1}`,\n\t\t\t\t\tvalue: hole.y.in_cm(),\n\t\t\t\t\tcustomMessage: sprintf( drillHoleMessages.custom.decimals.bottom, 1 ) } ),\n\t\t\t\tnew CustomDrillHoleMissingValidator(\n\t\t\t\t\tthis.parentModel,\n\t\t\t\t\tthis.combinedShape,\n\t\t\t\t\thole.getId(),\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: hole.getId(),\n\t\t\t\t\t\tfield: `drillHoleMissing_${index + 1}`,\n\t\t\t\t\t\tdimension: `drillHoleMissing_${index + 1}`,\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t];\n\n\t\t\trules.push( ...holeRules );\n\n\t\t\tthis.parsed.push( hole );\n\t\t} );\n\n\t\treturn rules;\n\t}\n}\n","import {ValidatorInterface} from './ValidatorInterface';\nimport { AbstractValidator, ValidatorObject } from './AbstractValidator';\n\ninterface ArrayContainsValidatorObject extends ValidatorObject {\n\titems?: unknown[];\n\tcondition?: ( item ) => boolean;\n\tinvert?: boolean;\n}\n\n/**\n * Validator that checks if the passed array passes the check.\n */\nexport class ArrayContains extends AbstractValidator implements ValidatorInterface {\n\tprivate readonly items;\n\tprivate readonly condition: ( item ) => boolean;\n\tprivate readonly invert: boolean;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param {ArrayContainsValidatorObject} options\n\t */\n\tconstructor( options: ArrayContainsValidatorObject ) {\n\t\tsuper( options );\n\n\t\tthis.items = options.items;\n\t\tthis.condition = options.condition;\n\t\tthis.invert = options.invert;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tgetMessage(): string {\n\t\treturn super.getCustomMessage() ?? `Not all items match the expected value`;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tisValid(): boolean {\n\t\tconst checkedItems = this.items.every( this.condition );\n\n\t\treturn this.invert === false ? checkedItems : checkedItems === false;\n\t}\n}\n","import {MinimumValue} from \"../MinimumValue\";\nimport {sprintf} from 'sprintf-js';\nimport {ValidatorInterface} from \"../ValidatorInterface\";\nimport {ArrayContains} from \"../ArrayContains\";\nimport {IModel} from \"makerjs\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\nimport Length from \"../../../../../source/js/shared/models/Geometry/Length\";\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\n\nexport default class EdgeDrillHoleValidatorSet extends AbstractValidatorSet {\n\tprivate readonly minHoleDiameter: Length;\n\tprivate readonly state;\n\tprivate readonly drillHoleConfig;\n\tprivate readonly drillHoles: IModel;\n\tprivate readonly parentModel: IModel;\n\n\tconstructor( minHoleDiameter: Length, state, drillHoleConfig: object, drillHoles: IModel, parentModel: IModel ) {\n\t\tsuper();\n\n\t\tthis.minHoleDiameter = minHoleDiameter;\n\t\tthis.state = state;\n\t\tthis.drillHoleConfig = drillHoleConfig;\n\t\tthis.drillHoles = drillHoles;\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetValidators(): ValidatorInterface[] {\n\t\tconst { drillHole } = window.measurementSelectorVariables.i18n.validators;\n\t\tconst additionalValidators = [];\n\n\t\tif ( this.drillHoleConfig.edgeType === 'around' ) {\n\t\t\tadditionalValidators.push(\n\t\t\t\tnew ArrayContains( {\n\t\t\t\t\tfield: 'edges',\n\t\t\t\t\tdimension: 'edges',\n\t\t\t\t\titems: this.drillHoleConfig.edges,\n\t\t\t\t\tcondition: function ( edge ): boolean {\n\t\t\t\t\t\treturn edge === 0;\n\t\t\t\t\t},\n\t\t\t\t\tcustomMessage: drillHole.edges.undefined_around_edges,\n\t\t\t\t\tinvert: true\n\t\t\t\t} )\n\t\t\t);\n\t\t}\n\n\t\treturn [\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: this.state.drillHoleDiameter,\n\t\t\t\tminimum: this.minHoleDiameter.in_mm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.min, this.minHoleDiameter.in_cm_i18n() )\n\t\t\t} ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleOffset',\n\t\t\t\tdimension: 'drillHoleOffset',\n\t\t\t\tvalue: new Length( this.state.drillHoleOffset ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.offset.decimals, 1 ) } ),\n\t\t\tnew MaximumDecimalPoints( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: new Length( this.state.drillHoleDiameter ).in_cm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.decimals, 1 ) } ),\n\t\t\t...additionalValidators,\n\t\t];\n\t}\n}\n","import {ValidatorInterface} from \"./../ValidatorInterface\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\n\nexport default class NullValidatorSet extends AbstractValidatorSet {\n\tgetValidators(): ValidatorInterface[] {\n\t\treturn [];\n\t}\n}\n","import makerjs, {IMeasureWithCenter, IModel} from 'makerjs';\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DrillHole from \"./DrillHole\";\nimport OffsetLine from './Lines/OffsetLine';\nimport { renderLength } from '@/functions/lengths';\n\nexport default class RadialDrillHoles {\n\tx: Length;\n\ty: Length;\n\tdiameter: Length;\n\tradialDiameter: Length;\n\tamount: number;\n\tenclosingRectangle: IMeasureWithCenter;\n\n\tconstructor( x: Length, y: Length, diameter: Length, radialDiameter: Length, amount: number, enclosingRectangle: IMeasureWithCenter ) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.diameter = diameter;\n\t\tthis.radialDiameter = radialDiameter;\n\t\tthis.amount = amount;\n\t\tthis.enclosingRectangle = enclosingRectangle;\n\t}\n\n\tgetId(): string {\n\t\treturn 'radial-drillHoles';\n\t}\n\n\tgetPath(): MakerJs.paths.Circle {\n\t\treturn new DrillHole( this.radialDiameter.divide( 2 ), new Length( 0 ), this.diameter ).getPath();\n\t}\n\n\tcloneToRadial(): IModel {\n\t\treturn makerjs.layout.cloneToRadial( this.getPath(), this.amount, 360 / this.amount );\n\t}\n\n\tgetAsModel(): IModel {\n\t\tconst radial =this.cloneToRadial();\n\t\tradial.type = 'radial-drillHole';\n\n\t\tmakerjs.model.zero(radial);\n\t\tmakerjs.model.move(radial, [ this.x.in_cm(), this.y.in_cm() ]);\n\t\tmakerjs.model.moveRelative(radial, [ this.enclosingRectangle.low[ 0 ], this.enclosingRectangle.low[ 1 ] ]);\n\n\t\treturn radial;\n\t}\n\n\tgetOffsetLines(focusedElement = ''): OffsetLine[] {\n\t\tif(focusedElement.includes(\"drillHoleRadialDiameter\")) {\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[ this.x.subtract(this.radialDiameter.divide(2)).in_mm(), this.y.in_mm() ],\n\t\t\t\t\t[ this.x.add(this.radialDiameter.divide(2)).in_mm(), this.y.in_mm() ],\n\t\t\t\t\trenderLength(this.radialDiameter.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"drillHoleRadialOffset\")) {\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[0, this.y.in_mm()],\n\t\t\t\t\t[this.x.in_mm(), this.y.in_mm()],\n\t\t\t\t\trenderLength(this.x.in_cm())\n\t\t\t\t),\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[this.x.in_mm(), this.y.in_mm()],\n\t\t\t\t\t[this.x.in_mm(), 0],\n\t\t\t\t\trenderLength(this.y.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n}\n","import makerjs, {IMeasureWithCenter, IModel} from 'makerjs';\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport DrillHole from \"./DrillHole\";\nimport OffsetLine from './Lines/OffsetLine';\nimport { renderLength } from '@/functions/lengths';\n\nexport default class GridDrillHoles {\n\tdiameter: Length;\n\toffset: Length;\n\thorizontalAmount: number;\n\tverticalAmount: number;\n\tenclosingRectangle: IMeasureWithCenter;\n\n\tconstructor( diameter: Length, offset: Length, horizontalAmount: number, verticalAmount: number, enclosingRectangle: IMeasureWithCenter ) {\n\t\tthis.diameter = diameter;\n\t\tthis.offset = offset;\n\t\tthis.horizontalAmount = horizontalAmount;\n\t\tthis.verticalAmount = verticalAmount;\n\t\tthis.enclosingRectangle = enclosingRectangle;\n\t}\n\n\tgetId(): string {\n\t\treturn 'grid-drillHoles';\n\t}\n\n\tgetPath(): MakerJs.paths.Circle {\n\t\treturn new DrillHole( this.offset, this.offset, this.diameter ).getPath();\n\t}\n\n\tcloneToGrid(): IModel {\n\t\tconst { width, height } = this.enclosingRectangle;\n\n\t\treturn makerjs.layout.cloneToGrid(\n\t\t\tthis.getPath(),\n\t\t\tthis.horizontalAmount,\n\t\t\tthis.verticalAmount,\n\t\t\t[\n\t\t\t\tthis.calculateGridSpacing( width, this.offset.in_cm(), this.diameter.in_cm(), this.horizontalAmount ),\n\t\t\t\tthis.calculateGridSpacing( height, this.offset.in_cm(), this.diameter.in_cm(), this.verticalAmount ),\n\t\t\t]\n\t\t);\n\t}\n\n\tcalculateGridSpacing( size: number, offset: number, diameter: number, length: number ): number {\n\t\tconst workArea = ( size - ( offset * 2 ) ) + this.diameter.in_cm();\n\t\tconst spaceToUse = ( length > 1 ) ? length - 1 : 1;\n\n\t\treturn ( workArea - ( length * diameter ) ) / spaceToUse;\n\t}\n\n\tgetAsModel(): IModel {\n\t\tlet grid = {};\n\n\t\tif ( this.horizontalAmount > 0 && this.verticalAmount > 0 ) {\n\t\t\tgrid = this.cloneToGrid();\n\t\t}\n\n\t\tgrid[ 'type' ] = 'grid-drillHole';\n\n\t\tmakerjs.model.zero(grid);\n\t\tmakerjs.model.move(grid, [ this.offset.in_cm(), this.offset.in_cm() ]);\n\t\tmakerjs.model.moveRelative(grid, [ this.enclosingRectangle.low[ 0 ], this.enclosingRectangle.low[ 1 ] ]);\n\n\t\treturn grid;\n\t}\n\n\tgetOffsetLines(focusedElement = ''): OffsetLine[] {\n\t\tif(focusedElement.includes('drillHoleOffset')) {\n\t\t\treturn [\n\t\t\t\tnew OffsetLine(\n\t\t\t\t\t[ this.offset.in_mm(), 0 ],\n\t\t\t\t\t[ this.offset.in_mm(), this.offset.in_mm() ],\n\t\t\t\t\trenderLength(this.offset.in_cm())\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n}\n","import { IModel } from 'makerjs';\nimport isUndefined from \"lodash/isUndefined\";\n\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ShapeDrillHoleGeneratorFactory from \"./ShapeDrillHoleGeneratorFactory\";\nimport DrillHole from \"./DrillHole\";\nimport Invalid from './DrillHoleGenerators/Invalid';\n\nexport default class PresetDrillHoles {\n\tprivate readonly shape: string;\n\tprivate readonly parentModel: MakerJs.IModel;\n\tprivate readonly primitives: Record<string, number>;\n\tprivate readonly diameter: Length;\n\tprivate readonly topBottom: Length;\n\tprivate readonly leftRight: Length;\n\tprivate readonly startingPoint: Length;\n\n\tprivate maxDistance: Length;\n\n\tconstructor( shape: string, parentModel: IModel, primitives: Record<string, number>, diameter: Length, maxDistance: Length, topBottom: Length, leftRight: Length, startingPoint: Length ) {\n\t\tthis.shape = shape;\n\t\tthis.diameter = diameter;\n\t\tthis.primitives = primitives;\n\t\tthis.maxDistance = maxDistance;\n\t\tthis.topBottom = topBottom;\n\t\tthis.leftRight = leftRight;\n\t\tthis.startingPoint = startingPoint;\n\t\tthis.parentModel = parentModel;\n\t}\n\n\tgetId(): string {\n\t\treturn `preset-drillHoles`;\n\t}\n\n\tgetPath(): DrillHole[] {\n\t\tlet drillHoles = [];\n\n\t\t// Check shape\n\t\tif ( this.shape === 'rectangle' ) {\n\t\t\tdrillHoles = this.generatePresetHoles();\n\t\t}\n\n\t\treturn drillHoles;\n\t}\n\n\tgetAsModel(): IModel {\n\t\tconst drillHoles = this.getPath();\n\t\tconst drillHolesModel = { paths: {}, type: 'preset-drillHole' };\n\n\t\tdrillHoles.forEach( ( drillHole ) => {\n\t\t\tdrillHolesModel.paths = Object.assign( drillHolesModel.paths, drillHole.getAsModel().paths );\n\t\t} );\n\n\t\treturn drillHolesModel;\n\t}\n\n\tgeneratePresetHoles(): DrillHole[] {\n\t\tconst shapeDrillHoleGenerator = new ShapeDrillHoleGeneratorFactory().getShapeDrillHoleGenerator( this.shape, this.parentModel );\n\n\t\tif ( shapeDrillHoleGenerator instanceof Invalid ) { return []; }\n\n\t\t// Map each dimension\n\t\tconst entries = this.calculateForLengthAndWidth();\n\n\t\treturn shapeDrillHoleGenerator.fromEdge( [ entries.length, entries.width, entries.length, entries.width ], this.topBottom, this.leftRight, this.diameter, this.startingPoint );\n\t}\n\n\tcalculateForLengthAndWidth(): Record<string, number> {\n\t\treturn {\n\t\t\tlength: this.calculateDrillHolesForEdge( Length.from_cm( this.primitives.length ) ),\n\t\t\twidth: this.calculateDrillHolesForEdge( Length.from_cm( this.primitives.width ) ),\n\t\t};\n\t}\n\n\tcalculateDrillHolesForEdge( value: Length ): number {\n\t\tif ( isUndefined( value ) || value.in_mm() === 0 || this.maxDistance.in_cm() === 0 ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst length = value.subtract( this.startingPoint.multiply( 2 ) );\n\t\tconst distanceBetweenHoles = Math.ceil( length.divide( this.maxDistance.in_cm() ).in_cm() );\n\t\tconst realDistance = length.divide( distanceBetweenHoles );\n\n\t\treturn Math.ceil( value.divide( realDistance.in_cm() ).in_cm() );\n\t}\n\n\tgetOffsetLines(): [] {\n\t\treturn [];\n\t}\n}\n","import filter from \"lodash/filter\";\nimport find from \"lodash/find\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEmpty from \"lodash/isEmpty\";\nimport { ValidatorInterface } from \"@/Models/Validators/ValidatorInterface\";\n\nexport enum Axis {\n\tX = 'x',\n\tY = 'y',\n}\n\nexport function createValidatorInstance( validator: Function, options: object ): ValidatorInterface {\n\n\t// Return early if fields are missing.\n\tconst requiredProperties = [ 'instance', 'dimension', 'field' ];\n\tif ( !requiredProperties.every( property => property in options ) ) {\n\t\treturn null;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n\t// @ts-ignore\n\treturn new validator( options );\n}\n\nexport function getValidationErrors( validators: ValidatorInterface[], field?: string, shouldAllFail = false ): ValidatorInterface[] {\n\tif ( isUndefined( validators ) ) {\n\t\treturn [];\n\t}\n\n\tconst filtered = filter( validators, function ( validator: ValidatorInterface ) {\n\t\treturn !validator.isValid();\n\t} );\n\n\tif ( shouldAllFail ) {\n\t\treturn ( validators.length > 0 && filtered.length > 0 ) && filtered.length === validators.length ? filtered : [];\n\t}\n\n\tif ( field ) {\n\t\tconst fieldSpecific = find( filtered, { field } );\n\n\t\treturn !isUndefined( fieldSpecific ) ? [ fieldSpecific ] : [];\n\t}\n\n\treturn filtered;\n}\n\nexport function hasValidationErrors( validators: ValidatorInterface[], field?: string, shouldAllFail = false ): boolean {\n\tconst errors = getValidationErrors( validators, field, shouldAllFail );\n\n\treturn !isEmpty( errors );\n}\n\nexport function getValidationMessageForField( validators: ValidatorInterface[], field: string ): string {\n\tconst errors = getValidationErrors( validators, field );\n\n\tif ( isEmpty( errors ) ) {\n\t\treturn;\n\t}\n\n\treturn errors[ 0 ].getMessage();\n}\n","import {MinimumValue} from \"../MinimumValue\";\nimport {sprintf} from 'sprintf-js';\nimport {ValidatorInterface} from \"../ValidatorInterface\";\nimport AbstractValidatorSet from \"./AbstractValidatorSet\";\nimport Length from \"../../../../../source/js/shared/models/Geometry/Length\";\nimport { MaximumValue } from \"../MaximumValue\";\n\nexport default class PresetDrillHoleValidatorSet extends AbstractValidatorSet {\n\tprivate readonly minHoleDiameter: Length;\n\tprivate readonly state;\n\n\tconstructor( minHoleDiameter: Length, state ) {\n\t\tsuper();\n\n\t\tthis.minHoleDiameter = minHoleDiameter;\n\t\tthis.state = state;\n\t}\n\n\tgetValidators(): ValidatorInterface[] {\n\t\tconst { drillHole } = window.measurementSelectorVariables.i18n.validators;\n\n\t\tconst drillHoleDiameter = ( this.state.drillHoleDiameter instanceof Length ) ? this.state.drillHoleDiameter.in_cm() : this.state.drillHoleDiameter;\n\n\t\treturn [\n\t\t\tnew MinimumValue( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: drillHoleDiameter,\n\t\t\t\tminimum: this.minHoleDiameter.in_mm(),\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.min, this.minHoleDiameter.in_cm_i18n() )\n\t\t\t} ),\n\t\t\tnew MaximumValue( {\n\t\t\t\tfield: 'drillHoleDiameter',\n\t\t\t\tdimension: 'drillHoleDiameter',\n\t\t\t\tvalue: drillHoleDiameter,\n\t\t\t\tmaximum: this.state.drillHoleEdgeMaxDistance,\n\t\t\t\tcustomMessage: sprintf( drillHole.diameter.max, new Length( this.state.drillHoleEdgeMaxDistance ).in_cm_i18n() )\n\t\t\t} ),\n\t\t];\n\t}\n}\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { InterfaceModelDecorator } from \"./PreviewModelDecorator\";\nimport { IModel } from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { chainModel, filletModel } from \"@/functions/makerjs\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\n\nexport default class ShapeModelDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate baseShapeInstance: AbstractShape\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst shapeModel = makerjs.cloneObject(this.baseShapeInstance.render());\n\t\tif(shapeModel === undefined) {\n\t\t\treturn model;\n\t\t}\n\n\t\tif (this.baseShapeInstance.shape !== \"dxf\") {\n\t\t\tmakerjs.model.scale(shapeModel, 10, true); // Convert shapeModel to mm\n\t\t}\n\n\t\tmakerjs.model.addModel(model, { models: { baseModel: shapeModel } }, \"shapeModel\");\n\t\treturn model;\n\t}\n}\n\nexport class ShapeModelCombineDecorator implements InterfaceModelDecorator {\n\tprivate cachedModel: IModel;\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null\n\t) {}\n\n\tgetModel(): IModel {\n\t\tif (this.cachedModel) {\n\t\t\treturn makerjs.cloneObject(this.cachedModel);\n\t\t}\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tlet combinedModel = makerjs.model.combineSubtraction(\n\t\t\tmodel.models.shapeModel,\n\t\t\tmakerjs.model.combineUnion( model.models.cutoutModel, model.models.drillHoleModel )\n\t\t);\n\n\t\tcombinedModel = chainModel({\n\t\t\tmodels: {\n\t\t\t\tshapeModel: combinedModel.models.a,\n\t\t\t\tcutoutModel: combinedModel.models.b,\n\t\t\t}\n\t\t});\n\t\tcombinedModel.layer = \"shape\";\n\n\t\tthis.cachedModel = combinedModel;\n\t\treturn makerjs.cloneObject(combinedModel);\n\t}\n}\n\nexport class FilletModelDecorator implements InterfaceModelDecorator {\n\tprivate cachedModel: IModel;\n\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate fillet: Length,\n\t\tprivate reverse: boolean = false\n\t) {}\n\n\tgetModel(): IModel {\n\t\tif (this.cachedModel) {\n\t\t\treturn makerjs.cloneObject(this.cachedModel);\n\t\t}\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tmodel = filletModel(model, this.fillet, this.reverse);\n\t\tthis.cachedModel = model;\n\t\treturn makerjs.cloneObject(model);\n\t}\n}\n\nexport class CurrentCutoutFilletModelDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate fillet: Length,\n\t\tprivate reverse: boolean = false\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif ( typeof model.models.shapeModel === 'undefined' ) {\n\t\t\treturn model;\n\t\t}\n\n\t\tmodel.models.shapeModel.models.baseModel = filletModel(model.models.shapeModel.models.baseModel, this.fillet, this.reverse);\n\n\t\treturn model;\n\t}\n}\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { InterfaceModelDecorator, ShapeModelDecorator } from \"./PreviewModelDecorator\";\nimport { IModel } from \"makerjs\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport OffsetLine from \"@/Models/Lines/OffsetLine\";\nimport GuideLine from \"@/Models/Lines/GuideLine\";\nimport Cutout from \"@/Models/Cutout\";\nimport { getShapeModelCenter } from \"@/functions/makerjs\";\n\nexport default class DimensionLineDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate baseShapeInstance: AbstractShape,\n\t\tprivate ratio = 1,\n\t\tprivate focusedElement?: string,\n\t\tprivate forceRender: boolean = false\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst dimensionLines = this.baseShapeInstance.getDimensionLines(this.ratio, this.focusedElement, this.forceRender);\n\n\t\tdimensionLines.forEach((dimensionLine: DimensionLine, index: number) => {\n\t\t\tconst dimensionLineModel = dimensionLine.getModel();\n\t\t\tdimensionLineModel.layer = \"dimension-lines\";\n\t\t\tmakerjs.model.addModel(model.models.shapeModel, dimensionLineModel, `dimensionLine_${index}`);\n\t\t});\n\n\t\treturn model;\n\t}\n}\n\nexport class OffsetLineDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate baseShapeInstance: AbstractShape,\n\t\tprivate cutout: Cutout,\n\t\tprivate focusedElement: string\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst originalModel = this.cutout.instance;\n\t\tconst originalModelDecorator = new ShapeModelDecorator(null, originalModel).getModel();\n\t\tconst center = getShapeModelCenter(originalModelDecorator.models.shapeModel.models.baseModel);\n\t\tconst offsetLines = this.baseShapeInstance.getOffsetLines(this.cutout.offsets, center, this.focusedElement);\n\n\t\toffsetLines.forEach((offsetLine: OffsetLine, index: number) => {\n\t\t\tconst offsetLineModel = offsetLine.getModel();\n\t\t\toffsetLineModel.layer = \"offset-lines\";\n\t\t\tmakerjs.model.addModel(model.models.shapeModel, offsetLineModel, `offsetLine_${index}`);\n\t\t});\n\n\t\treturn model;\n\t}\n}\n\nexport class GuideLineDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate baseShapeInstance: AbstractShape,\n\t\tprivate focusedElement: string\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst guideLines = this.baseShapeInstance.getGuideLines(this.focusedElement);\n\n\t\tguideLines.forEach((guideLine: GuideLine, index: number) => {\n\t\t\tconst guideLineModel = guideLine.getModel();\n\t\t\tguideLineModel.layer = \"guide-lines\";\n\t\t\tmakerjs.model.addModel(model.models.shapeModel, guideLineModel, `guideLine_${index}`);\n\t\t});\n\n\t\treturn model;\n\t}\n}\n","import { IModel } from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { InterfaceModelDecorator } from \"./PreviewModelDecorator\";\nimport Cutout from \"@/Models/Cutout\";\nimport {getShapeModelCenter} from \"@/functions/makerjs\";\n\nexport default class CutoutMoveDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate cutout: Cutout,\n\t\tprivate baseShapeModel: IModel\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif ( typeof model.models.shapeModel === 'undefined' ) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst measure = makerjs.measure.modelExtents(model);\n\t\tconst baseShapeMeasure = makerjs.measure.modelExtents(this.baseShapeModel.models.shapeModel.models.baseModel);\n\n\t\tconst center = getShapeModelCenter(model.models.shapeModel.models.baseModel);\n\n\t\t// Add exception for text as these can have low values that are less than zero.\n\t\tif ( ( measure['low'][0] === 0 && measure['low'][1] === 0 ) || ( this.cutout.shape === 'text' ) ) {\n\t\t\tconst centerX = center[0];\n\t\t\tconst centerY = center[1];\n\n\t\t\tmakerjs.model.move(model, [-centerX, -centerY]);\n\t\t}\n\n\t\tconst offsets = this.cutout.offsets;\n\n\t\tmakerjs.model.moveRelative(model, [offsets[0].in_mm(), offsets[1].in_mm()]);\n\t\tmakerjs.model.moveRelative(model, [baseShapeMeasure['low'][0], baseShapeMeasure['low'][1]]);\n\n\t\t// Push the cutout a little bit outside edge of the base shape, for every corner.\n\t\t// This fixes this know issue in makerjs, see https://github.com/microsoft/maker.js/issues/377\n\t\tconst cutoutMeasure = makerjs.measure.modelExtents(model);\n\t\tif(cutoutMeasure['low'][0] === baseShapeMeasure['low'][0]) {\n\t\t\tmakerjs.model.moveRelative(model, [-0.1, 0]);\n\t\t}\n\n\t\tif(cutoutMeasure['low'][1] === baseShapeMeasure['low'][1]) {\n\t\t\tmakerjs.model.moveRelative(model, [0, -0.1]);\n\t\t}\n\n\t\tif(cutoutMeasure['high'][0] === baseShapeMeasure['high'][0]) {\n\t\t\tmakerjs.model.moveRelative(model, [0.1, 0]);\n\t\t}\n\n\t\tif(cutoutMeasure['high'][1] === baseShapeMeasure['high'][1]) {\n\t\t\tmakerjs.model.moveRelative(model, [0, 0.1]);\n\t\t}\n\n\t\treturn model;\n\t}\n}\n","import { InterfaceModelDecorator } from \"./PreviewModelDecorator\";\nimport { IModel } from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport EdgeDrillHoles from \"@/Models/EdgeDrillHoles\";\nimport GridDrillHoles from \"@/Models/GridDrillHoles\";\nimport RadialDrillHoles from \"@/Models/RadialDrillHoles\";\nimport PresetDrillHoles from \"@/Models/PresetDrillHoles\";\nimport DrillHole from \"@/Models/DrillHole\";\nimport { chainModel } from \"@/functions/makerjs\";\nimport OffsetLine from \"@/Models/Lines/OffsetLine\";\n\nexport class GeneratedDrillHoleDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate drillHoleInstance: EdgeDrillHoles | GridDrillHoles | RadialDrillHoles | PresetDrillHoles | null\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (this.drillHoleInstance === null) {\n\t\t\treturn model;\n\t\t}\n\n\t\tlet drillHoleModel = this.drillHoleInstance.getAsModel();\n\t\tdrillHoleModel = makerjs.cloneObject(drillHoleModel);\n\n\t\tmakerjs.model.scale(drillHoleModel, 10, true); // Convert to mm\n\t\tmakerjs.model.addModel(model, drillHoleModel, \"drillHoleModel\");\n\n\t\treturn model;\n\t}\n}\n\nexport class CustomDrillHoleDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate drillHoles: DrillHole[]\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst drillHolesModel = { models: {} } as IModel;\n\t\tconst measure = makerjs.measure.modelExtents(model.models.shapeModel.models.baseModel);\n\n\t\tthis.drillHoles.forEach( ( drillHole, index ) => {\n\t\t\tlet drillHoleModel = drillHole.getAsModel();\n\n\t\t\tdrillHoleModel = makerjs.cloneObject(drillHoleModel);\n\t\t\tmakerjs.model.scale(drillHoleModel, 10, true); // Convert to mm\n\t\t\tmakerjs.model.addModel(drillHolesModel, drillHoleModel, `drillHole_${index}`);\n\t\t\tmakerjs.model.moveRelative(drillHoleModel, [measure.low[0], measure.low[1]]);\n\t\t} );\n\n\t\tlet combinedModel = { models: {} } as IModel;\n\n\t\tObject.values(drillHolesModel.models).forEach((model: IModel) => {\n\t\t\tcombinedModel = makerjs.model.combineUnion(combinedModel, model);\n\t\t});\n\n\t\tcombinedModel = chainModel(combinedModel);\n\t\tmakerjs.model.addModel(model, combinedModel, \"drillHoleModel\");\n\n\t\treturn model;\n\t}\n}\n\n/**\n * This decorator is used to show and add the current drillHole in the preview.\n * So we can highlight this drillHole seperated from the combined drillHoles model.\n */\nexport class CurrentCustomDrillHoleDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate drillHole: DrillHole | null,\n\t\tprivate focusedElement: string\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (!this.drillHole) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst measure = makerjs.measure.modelExtents(model.models.shapeModel.models.baseModel);\n\n\t\tlet drillHoleModel = this.drillHole.getAsModel();\n\t\tdrillHoleModel.layer = 'active-drillhole';\n\t\tmakerjs.model.scale(drillHoleModel, 10, true); // Convert to mm\n\t\tdrillHoleModel = makerjs.cloneObject(drillHoleModel);\n\n\t\tconst offsetLines = this.drillHole.getOffsetLines(this.focusedElement);\n\n\t\toffsetLines.forEach((offsetLine: OffsetLine, index: number) => {\n\t\t\tconst offsetLineModel = offsetLine.getModel();\n\t\t\toffsetLineModel.layer = \"offset-lines\";\n\t\t\tmakerjs.model.addModel(drillHoleModel, offsetLineModel, `offsetLine_${index}`);\n\t\t});\n\n\t\tmakerjs.model.moveRelative(drillHoleModel, [measure.low[0], measure.low[1]]);\n\n\t\tmakerjs.model.addModel(model, drillHoleModel, \"currentDrillHole\");\n\n\t\treturn model;\n\t}\n}\n\nexport class CurrentGeneratedDrillHoleDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate drillHoleInstance: EdgeDrillHoles | GridDrillHoles | RadialDrillHoles | PresetDrillHoles | null,\n\t\tprivate focusedElement?: string\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (this.drillHoleInstance === null) {\n\t\t\treturn model;\n\t\t}\n\n\t\tlet drillHoleModel = this.drillHoleInstance.getAsModel();\n\t\tdrillHoleModel = makerjs.cloneObject(drillHoleModel);\n\n\t\tif(this.drillHoleInstance instanceof EdgeDrillHoles) {\n\t\t\tconst currentDrillHoleModel = this.drillHoleInstance.getCurrentEdgeDrillHoles(this.focusedElement);\n\n\t\t\tif(currentDrillHoleModel) {\n\t\t\t\tdrillHoleModel = currentDrillHoleModel;\n\t\t\t\tdrillHoleModel.layer = 'active-drillhole';\n\t\t\t}\n\t\t}\n\n\t\tmakerjs.model.scale(drillHoleModel, 10, true); // Convert to mm\n\t\tmakerjs.model.addModel(model, drillHoleModel, \"drillHoleModel\");\n\n\t\treturn model;\n\t}\n}\n\nexport default class DrillHoleOffsetLineDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate drillHoleInstance: EdgeDrillHoles | GridDrillHoles | RadialDrillHoles | PresetDrillHoles | null,\n\t\tprivate focusedElement?: string\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (this.drillHoleInstance === null) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst measure = makerjs.measure.modelExtents(model.models.shapeModel.models.baseModel);\n\t\tconst offsetLines = this.drillHoleInstance.getOffsetLines(this.focusedElement);\n\n\t\toffsetLines.forEach((offsetLine: OffsetLine, index: number) => {\n\t\t\tconst offsetLineModel = offsetLine.getModel();\n\t\t\toffsetLineModel.layer = \"offset-lines\";\n\t\t\tmakerjs.model.moveRelative(offsetLineModel, [measure.low[0], measure.low[1]]);\n\t\t\tmakerjs.model.addModel(model.models.shapeModel, offsetLineModel, `offsetLine_${index}`);\n\t\t});\n\n\t\treturn model;\n\t}\n}\n","import { IModel } from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { InterfaceModelDecorator } from \"./PreviewModelDecorator\";\nimport Cutout from \"@/Models/Cutout\";\nimport { renderLength } from \"@/functions/lengths\";\nimport { getShapeModelCenter } from \"@/functions/makerjs\";\n\nexport class CutoutRotationDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate cutout: Cutout\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif ( typeof model.models.shapeModel === 'undefined' ) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst center = getShapeModelCenter(model.models.shapeModel.models.baseModel);\n\n\t\tmakerjs.model.rotate(model.models.shapeModel, this.cutout.attributes.rotation, center);\n\n\t\treturn model;\n\t}\n\n}\n\nexport class CutoutRotationIndicatorDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate cutout: Cutout\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tconst rotationAngle = this.cutout.attributes.rotation;\n\n\t\tif (rotationAngle === 0) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst center = getShapeModelCenter(model.models.shapeModel.models.baseModel);\n\t\tconst size = 45;\n\t\tconst baseLine = new makerjs.paths.Line(center, [center[0] + size, center[1]]);\n\t\tconst rotationLine = new makerjs.paths.Line(center, [center[0] + size, center[1]]);\n\t\tconst arcLine = new makerjs.paths.Arc(center, size - 10, 0, rotationAngle);\n\n\t\tconst rotationModel = {} as IModel;\n\t\tmakerjs.path.rotate(rotationLine, rotationAngle, center);\n\t\tmakerjs.model.addPath(rotationModel, baseLine, 'base-line');\n\t\tmakerjs.model.addPath(rotationModel, rotationLine, 'rotation-line');\n\t\tmakerjs.model.addPath(rotationModel, arcLine, 'arc-line');\n\t\tmakerjs.model.addCaption(rotationModel, renderLength(rotationAngle, '°'), [center[0] + size - 20, center[1] - 20]);\n\n\t\t// Reverse the roation to make sure the rotation indicator is always straight\n\t\tmakerjs.model.rotate(rotationModel, -rotationAngle, center);\n\t\trotationModel.layer = 'rotation-indicator';\n\n\t\tmakerjs.model.addModel(model, rotationModel, 'rotationModel');\n\t\treturn model;\n\t}\n}\n","import { IModel } from \"makerjs\";\nimport {\n\tShapeModelDecorator,\n\tDimensionLineDecorator,\n\tInterfaceModelDecorator,\n\tCutoutMoveDecorator,\n} from \"./PreviewModelDecorator\";\nimport Cutout from \"@/Models/Cutout\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { chainModel } from \"@/functions/makerjs\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport { GuideLineDecorator, OffsetLineDecorator } from \"./DimensionLineDecorator\";\nimport { CutoutRotationDecorator, CutoutRotationIndicatorDecorator } from \"./CutoutRotationDecorator\";\nimport { CurrentCutoutFilletModelDecorator } from \"./ShapeModelDecorator\";\n\nexport class CutoutModelDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate cutouts: Cutout[]\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (this.cutouts.length === 0) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst cutoutsModel = { models: {} } as IModel;\n\n\t\tthis.cutouts.forEach((cutout: Cutout, index: number) => {\n\t\t\tlet modelDecorator: InterfaceModelDecorator;\n\t\t\tmodelDecorator = new ShapeModelDecorator(null, cutout.instance);\n\t\t\tmodelDecorator = new CutoutMoveDecorator(modelDecorator, cutout, model);\n\t\t\tmodelDecorator = new CutoutRotationDecorator(modelDecorator, cutout);\n\n\t\t\tconst cutoutModel = modelDecorator.getModel();\n\n\t\t\tmakerjs.model.addModel(cutoutsModel, cutoutModel, `cutoutModel_${index}`);\n\t\t});\n\n\t\tlet combinedModel = { models: {} } as IModel;\n\n\t\tObject.values(cutoutsModel.models).forEach((model: IModel) => {\n\t\t\tcombinedModel = makerjs.model.combineUnion(combinedModel, model);\n\t\t});\n\n\t\tcombinedModel = chainModel(combinedModel);\n\t\tmakerjs.model.addModel(model, combinedModel, \"cutoutModel\");\n\n\t\treturn model;\n\t}\n}\n\n/**\n * This decorator is used to show and add the current cutout in the preview.\n * So we can highlight this cutout seperated from the combined cutouts model.\n */\nexport class currentCutoutModelDecorator implements InterfaceModelDecorator {\n\tconstructor(\n\t\tprivate parentDecorator: InterfaceModelDecorator | null,\n\t\tprivate cutout: Cutout | null,\n\t\tprivate focusedElement: string,\n\t\tprivate ratio: number,\n\t\tprivate shouldApplyFillet: boolean,\n\t\tprivate minimumDrillHoleDiameter: Length,\n\t\tprivate baseShapeModel: IModel\n\t) {}\n\n\tgetModel(): IModel {\n\t\tlet model = { models: {} } as IModel;\n\n\t\tif (this.parentDecorator) {\n\t\t\tmodel = this.parentDecorator.getModel();\n\t\t}\n\n\t\tif (!this.cutout) {\n\t\t\treturn model;\n\t\t}\n\n\t\tlet modelDecorator: InterfaceModelDecorator;\n\t\tconst baseShapeInstance = this.cutout.instance;\n\t\tmodelDecorator = new ShapeModelDecorator(null, baseShapeInstance);\n\t\tmodelDecorator = new CutoutMoveDecorator(modelDecorator, this.cutout, this.baseShapeModel);\n\n\t\tmodelDecorator = new DimensionLineDecorator(modelDecorator, baseShapeInstance, this.ratio, this.focusedElement);\n\t\tmodelDecorator = new GuideLineDecorator(modelDecorator, baseShapeInstance, this.focusedElement);\n\n\t\tif(this.focusedElement?.includes(\"cutoutRotation\")) {\n\t\t\tmodelDecorator = new CutoutRotationIndicatorDecorator(modelDecorator, this.cutout);\n\t\t}\n\n\t\t// Rotate the model included the dimension lines\n\t\tmodelDecorator = new CutoutRotationDecorator(modelDecorator, this.cutout);\n\n\t\tif(this.focusedElement?.includes(\"cutoutOffset\")) {\n\t\t\tmodelDecorator = new OffsetLineDecorator(modelDecorator, baseShapeInstance, this.cutout, this.focusedElement);\n\t\t}\n\n\t\tif (this.shouldApplyFillet) {\n\t\t\tmodelDecorator = new CurrentCutoutFilletModelDecorator(modelDecorator, this.minimumDrillHoleDiameter, true);\n\t\t}\n\n\t\tlet cutoutModel = modelDecorator.getModel();\n\n\t\tif ( typeof cutoutModel.models.shapeModel === 'undefined' ) {\n\t\t\treturn model;\n\t\t}\n\n\t\tcutoutModel.models.shapeModel.layer = \"active-cutout\";\n\t\tcutoutModel = makerjs.cloneObject(cutoutModel);\n\n\t\tmakerjs.model.addModel(model, cutoutModel, \"currentCutout\");\n\n\t\tmakerjs.model.zero(model);\n\t\tmakerjs.model.originate(model);\n\n\t\treturn model;\n\t}\n}\n","import {IModel} from \"makerjs\";\nimport {sprintf} from \"sprintf-js\";\n\nimport isEmpty from \"lodash/isEmpty\";\nimport isUndefined from \"lodash/isUndefined\";\n\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport { isModelInsideParent } from \"@/functions/makerjs\";\nimport { toNumber } from \"@/functions/numbers\";\n\nimport DrillHole from \"@/Models/DrillHole\";\nimport {ValidatorInterface} from \"@/Models/Validators/ValidatorInterface\";\nimport RadialDrillHoleValidatorSet from \"@/Models/Validators/Sets/RadialDrillHoleValidatorSet\";\nimport GridDrillHoleValidatorSet from \"@/Models/Validators/Sets/GridDrillHoleValidatorSet\";\nimport CustomDrillHoleValidatorSet from \"@/Models/Validators/Sets/CustomDrillHoleValidatorSet\";\nimport EdgeDrillHoleValidatorSet from \"@/Models/Validators/Sets/EdgeDrillHoleValidatorSet\";\nimport NullValidatorSet from \"@/Models/Validators/Sets/NullValidatorSet\";\nimport CustomDrillHole from \"@/Models/CustomDrillHole\";\nimport RadialDrillHoles from \"@/Models/RadialDrillHoles\";\nimport GridDrillHoles from \"@/Models/GridDrillHoles\";\nimport EdgeDrillHoles from \"@/Models/EdgeDrillHoles\";\nimport PresetDrillHoles from \"@/Models/PresetDrillHoles\";\nimport {\n\tgetValidationErrors,\n\tgetValidationMessageForField,\n\thasValidationErrors,\n} from \"@/utilities/Validator\";\nimport ShapeDrillHoleGeneratorFactory from \"@/Models/ShapeDrillHoleGeneratorFactory\";\nimport PresetDrillHoleValidatorSet from \"@/Models/Validators/Sets/PresetDrillHoleValidatorSet\";\nimport Invalid from \"@/Models/DrillHoleGenerators/Invalid\";\nimport { ShapeModelCombineDecorator } from \"@/utilities/decorators/ShapeModelDecorator\";\nimport { CustomDrillHoleDecorator } from \"@/utilities/decorators/PreviewModelDecorator\";\nimport { StepTypes } from \"@/types/step\";\n\n/**\n * Calculates the grid spacing based on the size of the axis, desired edge offset, hole diameter and amount of holes.\n * The spacing is determined based off of the center of each hole to ensure an equal distance.\n *\n * All sizes are presumed to be of a single unit (i.e. mm, cm etc.).\n *\n * @param {number} size The size of the axis.\n * @param {number} offset The offset from the edge of the containing shape.\n * @param {number} diameter The diameter of the hole that needs to be drilled.\n * @param {number} length The amount of holes to add to the grid.\n *\n * @returns {number} The distance per hole.\n */\nexport function calculateGridSpacing( size: number, offset: number, diameter: number, length: number ): number {\n\tconst workArea = size - ( offset * 2 );\n\tconst spaceToUse = ( length > 1 ) ? length - 1 : 1;\n\n\treturn ( workArea - ( length * diameter ) ) / spaceToUse;\n}\n\nexport default {\n\tstate: (): object => ( {\n\t\tdefaultDrillHoleDiameter: toNumber( window.measurementSelectorVariables.pricingGroup.other_settings.default_drillhole_diameter ),\n\t\tdrillHoleDiameter: toNumber( window.measurementSelectorVariables.pricingGroup.other_settings.default_drillhole_diameter ),\n\t\tminDrillHoleDiameter: toNumber( window.measurementSelectorVariables.pricingGroup.other_settings.min_drillhole_diameter ?? 1 ),\n\t\tdrillHoleOffset: 30,\n\t\tdrillHoleRadialAmount: 10,\n\t\tdrillHoleRadialOffsetX: 30,\n\t\tdrillHoleRadialOffsetY: 30,\n\t\tdrillHoleRadialDiameter: 5,\n\t\tdrillHoleHorizontalAmount: 5,\n\t\tdrillHoleVerticalAmount: 5,\n\t\tcustomDrillHoles: [],\n\t\tcurrentCustomDrillhole: 0,\n\t\tdrillOption: window.measurementSelectorVariables.pricingGroup.other_settings.drill_hole_presets_active ? 'preset' : 'none',\n\t\tdrillHoleEdgeType: \"corners\",\n\t\tdrillHoleEdgeHoles: [],\n\t\tdefaultDrillHoleDimensions: true,\n\t\tdrillHoleEdgeMaxDistance: window.measurementSelectorVariables.drillHoleSettings.presetGroup.drill_hole_max_distance,\n\t\tdrillHoleEdgeTopBottom: window.measurementSelectorVariables.drillHoleSettings.presetGroup.drill_hole_distance_to_edge_top_bottom,\n\t\tdrillHoleEdgeLeftRight: window.measurementSelectorVariables.drillHoleSettings.presetGroup.drill_hole_distance_to_edge_left_right,\n\t\tdrillHoleStartingPoint: window.measurementSelectorVariables.drillHoleSettings.presetGroup.drill_hole_starting_point,\n\t} ),\n\tmutations: {\n\t\tupdateDrillHoleRadialAmount: ( state, value ): number => state.drillHoleRadialAmount = value,\n\t\tupdateDrillHoleRadialOffsetX: ( state, value ): number => state.drillHoleRadialOffsetX = value,\n\t\tupdateDrillHoleRadialOffsetY: ( state, value ): number => state.drillHoleRadialOffsetY = value,\n\t\tupdateDrillHoleRadialDiameter: ( state, value ): number => state.drillHoleRadialDiameter = value,\n\t\tupdateDrillHoleHorizontalAmount: ( state, value ): number => state.drillHoleHorizontalAmount = value,\n\t\tupdateDrillHoleVerticalAmount: ( state, value ): number => state.drillHoleVerticalAmount = value,\n\t\tupdateDrillHoleDiameter: ( state, value ): number => state.drillHoleDiameter = value,\n\t\tupdateDrillHoleOffset: ( state, value ): number => state.drillHoleOffset = value,\n\t\tupdateCurrentCustomDrillhole: ( state, drillhole: number ): number => state.currentCustomDrillhole = drillhole,\n\t\taddCustomHole: ( state, value: CustomDrillHole ): void => state.customDrillHoles.push( value ),\n\t\tremoveCustomHole: ( state, index: number ): void => state.customDrillHoles.splice(index, 1),\n\t\tresetCustomHoles: ( state ): CustomDrillHole[] => state.customDrillHoles = [],\n\t\tupdateCustomDrillholes: ( state, value: CustomDrillHole[] ): CustomDrillHole[] => state.customDrillHoles = value,\n\t\tupdateDrillOption: ( state, drillOption ): void => {\n\t\t\tstate.drillOption = drillOption;\n\t\t\tstate.defaultDrillHoleDimensions = true;\n\n\t\t\tif ( ! drillOption || drillOption.length === 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow?.dataLayer?.push( {\n\t\t\t\tevent: 'measurements_selector',\n\t\t\t\teventCategory: 'Drill options: ' + document.title,\n\t\t\t\teventAction: 'Step 3. Choose drill options',\n\t\t\t\teventLabel: drillOption,\n\t\t\t} );\n\t\t},\n\t\tupdateDrillHoleEdgeType( state, drillHoleEdgeType ): void {\n\t\t\tstate.drillHoleEdgeType = drillHoleEdgeType;\n\n\t\t\tif ( !drillHoleEdgeType || 0 === drillHoleEdgeType.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow?.dataLayer?.push( {\n\t\t\t\tevent: 'measurements_selector',\n\t\t\t\teventCategory: 'Drill hole edge type: ' + document.title,\n\t\t\t\teventAction: 'Step 3. Choose drill hole edge type',\n\t\t\t\teventLabel: drillHoleEdgeType,\n\t\t\t} );\n\t\t},\n\t\tupdateEdgeHoles: ( state, edgeHoles ): void => state.drillHoleEdgeHoles = edgeHoles,\n\t\tupdateUsingDefaultDrillHoleDimensions: ( state, usesDefaults ): void => state.defaultDrillHoleDimensions = usesDefaults,\n\t\tupdateDrillHoleEdgeTopBottom: ( state, distance ): void => state.drillHoleEdgeTopBottom = distance,\n\t\tupdateDrillHoleEdgeLeftRight: ( state, distance ): void => state.drillHoleEdgeLeftRight = distance,\n\t},\n\tgetters: {\n\t\tdrillOption: ( state ): string => state.drillOption,\n\t\tdrillHoleEdgeType: ( state ): string => state.drillHoleEdgeType,\n\t\tdrillHoleEdgeHoles: ( state ): number[] => state.drillHoleEdgeHoles,\n\t\tradialDrillHoles: ( state, getters ): RadialDrillHoles => {\n\t\t\tif ( getters.drillOption !== 'radial' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttry {\n\n\t\t\t\treturn new RadialDrillHoles(\n\t\t\t\t\tgetters.drillHoleRadialOffsetX,\n\t\t\t\t\tgetters.drillHoleRadialOffsetY,\n\t\t\t\t\tgetters.drillHoleDiameter,\n\t\t\t\t\tgetters.drillHoleRadialDiameter,\n\t\t\t\t\tgetters.drillHoleRadialAmount,\n\t\t\t\t\tgetters.enclosingRectangle\n\t\t\t\t);\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Intentionally left empty.\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tgridDrillHoles: ( state, getters ): GridDrillHoles => {\n\t\t\tif ( getters.drillOption !== 'grid' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn new GridDrillHoles(\n\t\t\t\t\tgetters.drillHoleDiameter,\n\t\t\t\t\tgetters.drillHoleOffset,\n\t\t\t\t\tgetters.drillHoleHorizontalAmount,\n\t\t\t\t\tgetters.drillHoleVerticalAmount,\n\t\t\t\t\tgetters.enclosingRectangle\n\t\t\t\t);\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Intentionally left empty.\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tedgeDrillHoles: ( state, getters ): EdgeDrillHoles => {\n\t\t\tif (getters.drillOption !== 'edges') {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( getters.drillHoleEdgeType === null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn new EdgeDrillHoles(\n\t\t\t\t\tgetters.shape,\n\t\t\t\t\tgetters.model,\n\t\t\t\t\tgetters.drillHoleDiameter,\n\t\t\t\t\tgetters.drillHoleOffset,\n\t\t\t\t\tgetters.drillHoleEdgeType,\n\t\t\t\t\tgetters.drillHoleEdgeHoles\n\t\t\t\t);\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Intentionally left empty.\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tpresetDrillHoles: ( state, getters ): PresetDrillHoles => {\n\t\t\tif ( getters.drillOption !== 'preset' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn new PresetDrillHoles(\n\t\t\t\t\tgetters.shape,\n\t\t\t\t\tgetters.model,\n\t\t\t\t\tgetters.primitives,\n\t\t\t\t\tgetters.drillHoleDiameter,\n\t\t\t\t\tgetters.drillHoleEdgeMaxDistance,\n\t\t\t\t\tgetters.drillHoleEdgeTopBottom,\n\t\t\t\t\tgetters.drillHoleEdgeLeftRight,\n\t\t\t\t\tgetters.drillHoleStartingPoint\n\t\t\t\t);\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Intentionally left empty.\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tcustomDrillHoles: ( state ): CustomDrillHole[] => state.customDrillHoles,\n\t\tgetCustomDrillHoles: ( state, getters ): DrillHole[] => {\n\t\t\tconst drillHoles = [];\n\n\t\t\tfor ( const hole of getters.customDrillHoles ) {\n\t\t\t\tdrillHoles.push(\n\t\t\t\t\tnew DrillHole(\n\t\t\t\t\t\tnew Length( hole.x ),\n\t\t\t\t\t\tnew Length( hole.y ),\n\t\t\t\t\t\tnew Length( hole.diameter )\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn drillHoles;\n\t\t},\n\t\tgetDrillHoleValidators: function ( state, getters ): ValidatorInterface[] {\n\t\t\tconst completeModel = getters.getExportableModel;\n\n\t\t\tif ( isEmpty( getters.shape ) || isEmpty( completeModel.models ) || ( getters.drillOption === 'edges' && isEmpty( getters.edgeDrillHoles ) ) ) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst minHoleDiameter = new Length( toNumber( window.measurementSelectorVariables.pricingGroup.other_settings.min_drillhole_diameter ?? 1 ) );\n\t\t\tconst { drillHoles } = completeModel.models;\n\n\t\t\tconst baseShapeModelDecorator = getters.getBaseShapeModelDecorator;\n\t\t\tconst combinedShape = (new ShapeModelCombineDecorator(new CustomDrillHoleDecorator(baseShapeModelDecorator, getters.getCustomDrillHoles)).getModel());\n\t\t\tconst baseModel = combinedShape.models.shapeModel.models.baseModel;\n\n\t\t\tlet validatorSet;\n\n\t\t\tswitch ( getters.drillOption ) {\n\t\t\t\tcase 'radial':\n\t\t\t\t\tvalidatorSet = new RadialDrillHoleValidatorSet( minHoleDiameter, state, getters.shape, getters.parsedDimensions, drillHoles, baseModel );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'grid':\n\t\t\t\t\tvalidatorSet = new GridDrillHoleValidatorSet( minHoleDiameter, state, drillHoles, baseModel );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'custom':\n\t\t\t\t\tvalidatorSet = new CustomDrillHoleValidatorSet( minHoleDiameter, state, getters.customDrillHoles, baseShapeModelDecorator.getModel(), combinedShape );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'edges':\n\t\t\t\t\tvalidatorSet = new EdgeDrillHoleValidatorSet( minHoleDiameter, state, getters.drillHoleConfig, drillHoles, baseModel );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'preset':\n\t\t\t\t\tvalidatorSet = new PresetDrillHoleValidatorSet( minHoleDiameter, state );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalidatorSet = new NullValidatorSet();\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn validatorSet.getValidators();\n\t\t},\n\t\tgetDrillHoleValidatorErrors: function ( state, getters ): ValidatorInterface[] {\n\t\t\treturn getValidationErrors( getters.getDrillHoleValidators );\n\t\t},\n\t\thasDrillHoleValidatorErrors: ( state, getters ): boolean => { return hasValidationErrors( getters.getDrillHoleValidators ); },\n\t\tdrillHoleConfig: ( state, getters, rootstate ): object => {\n\t\t\tconst data = {\n\t\t\t\ttype: getters.drillOption\n\t\t\t};\n\t\t\trootstate.measurements.forceRefresh;\n\n\t\t\tif ( getters.drillOption === 'none' ) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\tif ( getters.drillOption === 'edges' ) {\n\t\t\t\tdata[ 'edgeType' ] = getters.drillHoleEdgeType;\n\t\t\t\tdata[ 'offset' ] = getters.drillHoleOffset.in_mm();\n\t\t\t\tdata[ 'diameter' ] = getters.drillHoleDiameter.in_mm();\n\t\t\t\tif( getters.drillHoleEdgeType === 'around' ) {\n\t\t\t\t\tdata[ 'edges' ] = getters.drillHoleEdgeHoles;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( getters.drillOption === 'radial' ) {\n\t\t\t\tdata[ 'amount' ] = getters.drillHoleRadialAmount;\n\t\t\t\tdata[ 'position' ] = {};\n\t\t\t\tdata[ 'position' ][ 'left' ] = getters.drillHoleRadialOffsetX.in_mm();\n\t\t\t\tdata[ 'position' ][ 'bottom' ] = getters.drillHoleRadialOffsetY.in_mm();\n\t\t\t\tdata[ 'radialDiameter' ] = getters.drillHoleRadialDiameter.in_mm();\n\t\t\t\tdata[ 'diameter' ] = getters.drillHoleDiameter.in_mm();\n\t\t\t}\n\n\t\t\tif ( getters.drillOption === 'grid' ) {\n\t\t\t\tdata[ 'amountHorizontal' ] = getters.drillHoleHorizontalAmount;\n\t\t\t\tdata[ 'amountVertical' ] = getters.drillHoleVerticalAmount;\n\t\t\t\tdata[ 'offset' ] = getters.drillHoleOffset.in_mm();\n\t\t\t\tdata[ 'diameter' ] = getters.drillHoleDiameter.in_mm();\n\t\t\t}\n\n\t\t\tif ( getters.drillOption === 'custom' ) {\n\t\t\t\tdata[ 'settings' ] = getters.customDrillHoles;\n\t\t\t}\n\n\t\t\tif ( getters.drillOption === 'preset' ) {\n\t\t\t\tdata[ 'edge_left_right' ] = getters.drillHoleEdgeLeftRight.in_mm();\n\t\t\t\tdata[ 'edge_top_bottom' ] = getters.drillHoleEdgeTopBottom.in_mm();\n\t\t\t\tdata[ 'max_distance' ] = getters.drillHoleEdgeMaxDistance.in_mm();\n\t\t\t\tdata[ 'diameter' ] = getters.drillHoleDiameter.in_mm();\n\t\t\t\tdata[ 'starting_point' ] = getters.drillHoleStartingPoint;\n\t\t\t}\n\n\t\t\treturn data;\n\t\t},\n\t\tgetGeneratedDrillHoleInstance( state, getters ): [] {\n\t\t\tlet instance = null;\n\n\t\t\tif ( getters.edgeDrillHoles ) {\n\t\t\t\tinstance = getters.edgeDrillHoles;\n\t\t\t}\n\n\t\t\tif ( getters.radialDrillHoles ) {\n\t\t\t\tinstance = getters.radialDrillHoles;\n\t\t\t}\n\n\t\t\tif ( getters.gridDrillHoles ) {\n\t\t\t\tinstance = getters.gridDrillHoles;\n\t\t\t}\n\n\t\t\tif ( getters.presetDrillHoles ) {\n\t\t\t\tinstance = getters.presetDrillHoles;\n\t\t\t}\n\n\t\t\treturn instance;\n\t\t},\n\t\tgetGeneratedDrillHoles( state, getters, rootstate ): Function {\n\t\t\treturn ( isPreview = true ): IModel|null => {\n\t\t\t\tconst instance = getters.getGeneratedDrillHoleInstance;\n\t\t\t\tlet model = null;\n\n\t\t\t\t// This is currently necessary to ensure drill holes going around the shape are properly rendered as this isn't reactive.\n\t\t\t\trootstate.measurements.forceRefresh;\n\n\t\t\t\tif ( instance !== null ) {\n\t\t\t\t\tmodel = instance.getAsModel();\n\n\t\t\t\t\tif ( ( model.type === 'grid-drillHole' && isUndefined( model.models ) ) || ( model.type === 'radial-drillHole' && isEmpty( model.paths ) ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isPreview ) {\n\t\t\t\t\t\tmodel.layer = 'preview-drillhole';\n\n\t\t\t\t\t\tif( getters.currentStepName === StepTypes.drillholes && getters.drillOption !== 'none') {\n\t\t\t\t\t\t\tmodel.layer = 'active-drillhole';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t};\n\t\t},\n\t\tisDrillHoleValid( state, getters ) {\n\t\t\treturn ( field, index?: number ): boolean => {\n\t\t\t\tif ( ( field === 'drillHoleOffsetX' || field === 'drillHoleOffsetY' ) && index ) {\n\t\t\t\t\tfield = `${field}_${index}`;\n\t\t\t\t}\n\n\t\t\t\treturn ! hasValidationErrors( getters.getDrillHoleValidators, field );\n\t\t\t};\n\t\t},\n\t\tgetDrillHoleValidationMessage( state, getters ) {\n\t\t\treturn ( field, index?: number ): string => {\n\t\t\t\tif ( ( field === 'drillHoleOffsetX' || field === 'drillHoleOffsetY' || field === 'drillHoleOffset' ) && index ) {\n\t\t\t\t\tfield = `${field}_${index}`;\n\t\t\t\t}\n\n\t\t\t\treturn getValidationMessageForField( getters.getDrillHoleValidators, field );\n\t\t\t};\n\t\t},\n\t\tcurrentCustomDrillhole: ( state ): string => state.currentCustomDrillhole,\n\t\tminimumDrillHoleDiameterLength: ( state ): Length => new Length( state.minDrillHoleDiameter ),\n\t\tminimumDrillHoleDiameter: ( state, getters ): number => getters.minimumDrillHoleDiameterLength.in_cm(),\n\t\tminimumDrillHoleDiameterLabel( state, getters ): string {\n\t\t\treturn sprintf(\n\t\t\t\twindow.measurementSelectorVariables.i18n.drillHoleConfiguration.diameter_drill_hole_min,\n\t\t\t\tLength.from_cm( getters.minimumDrillHoleDiameter ).in_cm_i18n()\n\t\t\t);\n\t\t},\n\t\tusesDefaultDrillHoleDimensions: ( state ): boolean => state.defaultDrillHoleDimensions,\n\t\tcountEdges: (): Function => {\n\t\t\treturn ( shape, model, offset: Length ): number => {\n\t\t\t\ttry{\n\t\t\t\t\tconst shapeDrillHoleGeneratorFactory = new ShapeDrillHoleGeneratorFactory();\n\t\t\t\t\tconst shapeDrillHoleGenerator = shapeDrillHoleGeneratorFactory.getShapeDrillHoleGenerator( shape, model );\n\n\t\t\t\t\tif ( ! ( 'countEdges' in shapeDrillHoleGenerator ) ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn shapeDrillHoleGenerator.countEdges( offset );\n\t\t\t\t} catch( e ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\tdrillHoleDiameter: ( state ): Length => new Length( state.drillHoleDiameter ),\n\t\tdrillHoleOffset: ( state ): Length => new Length( state.drillHoleOffset ),\n\t\tdrillHoleEdgeMaxDistance: ( state ): Length => new Length( state.drillHoleEdgeMaxDistance ),\n\t\tdrillHoleEdgeTopBottom: ( state ): Length => new Length( state.drillHoleEdgeTopBottom ),\n\t\tdrillHoleEdgeLeftRight: ( state ): Length => new Length( state.drillHoleEdgeLeftRight ),\n\t\tdrillHoleStartingPoint: ( state ): Length => new Length( state.drillHoleStartingPoint ),\n\t\tdrillHoleRadialAmount: ( state ): number => Math.max(1, state.drillHoleRadialAmount),\n\t\tdrillHoleRadialDiameter: ( state ): Length => new Length( state.drillHoleRadialDiameter ),\n\t\tdrillHoleRadialOffsetX: ( state ): Length => new Length( state.drillHoleRadialOffsetX ),\n\t\tdrillHoleRadialOffsetY: ( state ): Length => new Length( state.drillHoleRadialOffsetY ),\n\t\tdrillHoleHorizontalAmount: ( state ): number => Math.max(1, state.drillHoleHorizontalAmount),\n\t\tdrillHoleVerticalAmount: ( state ): number => Math.max(1, state.drillHoleVerticalAmount),\n\t\tdrillHoleTypeEnabled: ( state, getters ): Function => {\n\t\t\treturn ( type: string ): boolean => {\n\t\t\t\tconst shapeDrillHoleGeneratorFactory = new ShapeDrillHoleGeneratorFactory();\n\t\t\t\tconst shapeDrillHoleGenerator = shapeDrillHoleGeneratorFactory.getShapeDrillHoleGenerator( getters.shape, getters.model );\n\n\t\t\t\tconst options = {\n\t\t\t\t\t'corners': 'getCorners' in shapeDrillHoleGenerator,\n\t\t\t\t\t'around': 'getAround' in shapeDrillHoleGenerator,\n\t\t\t\t\t'top_bottom': false,\n\t\t\t\t\t'left_right': false\n\t\t\t\t};\n\n\t\t\t\treturn ( ! isUndefined( options[ type ] ) && options[ type ] );\n\t\t\t};\n\t\t},\n\t\tgetEdgeCount: ( state, getters ): number => {\n\t\t\ttry {\n\t\t\t\tconst shapeDrillHoleGenerator = (new ShapeDrillHoleGeneratorFactory()).getShapeDrillHoleGenerator( getters.shape, getters.model );\n\t\t\t\tconst offset = getters.drillHoleOffset;\n\n\t\t\t\tif ( shapeDrillHoleGenerator instanceof Invalid ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn shapeDrillHoleGenerator.countEdges(offset);\n\t\t\t} catch(e) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t},\n\tactions: {\n\t\tasync updateDrillHolesFromConfig( { commit, state, dispatch }, drillholes ): Promise<void> {\n\t\t\tcommit( 'updateDrillOption', drillholes.type );\n\t\t\tcommit( 'updateDrillHoleDiameter', drillholes.diameter ?? state.defaultDrillHoleDiameter );\n\t\t\tcommit( 'updateUsingDefaultDrillHoleDimensions', false );\n\n\t\t\tswitch ( drillholes.type ) {\n\t\t\t\tcase 'edges':\n\t\t\t\t\tdispatch( 'updateEdgeDrillHolesFromConfig', drillholes );\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'grid':\n\t\t\t\t\tdispatch( 'updateGridDrillHolesFromConfig', drillholes );\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'custom':\n\n\t\t\t\t\t// Ensure that the custom drill holes have a diameter set.\n\t\t\t\t\tif (drillholes.type === 'custom' && Array.isArray(drillholes.settings)) {\n\t\t\t\t\t\tdrillholes.settings = drillholes.settings.map(hole => ({\n\t\t\t\t\t\t\t...hole,\n\t\t\t\t\t\t\tdiameter: hole.diameter ?? state.defaultDrillHoleDiameter\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\tcommit( 'updateCustomDrillholes', drillholes.settings );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'radial':\n\t\t\t\t\tdispatch( 'updateRadialDrillHolesFromConfig', drillholes );\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'preset':\n\t\t\t\t\tcommit( 'updateDrillHoleEdgeTopBottom', drillholes.edge_top_bottom );\n\t\t\t\t\tcommit( 'updateDrillHoleEdgeLeftRight', drillholes.edge_left_right );\n\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\tasync updateRadialDrillHolesFromConfig( { commit, state }, drillholes ): Promise<void> {\n\t\t\tcommit( 'updateDrillHoleRadialAmount', drillholes.amount );\n\t\t\tcommit( 'updateDrillHoleRadialOffsetX', drillholes.position.left );\n\t\t\tcommit( 'updateDrillHoleRadialOffsetY', drillholes.position.bottom );\n\t\t\tcommit( 'updateDrillHoleRadialDiameter', drillholes.radialDiameter );\n\t\t},\n\t\tasync updateGridDrillHolesFromConfig( { commit, state }, drillholes ): Promise<void> {\n\t\t\tcommit( 'updateDrillHoleHorizontalAmount', drillholes.amountHorizontal );\n\t\t\tcommit( 'updateDrillHoleVerticalAmount', drillholes.amountVertical );\n\t\t\tcommit( 'updateDrillHoleOffset', drillholes.offset );\n\t\t},\n\t\tasync updateEdgeDrillHolesFromConfig( { commit, state }, drillholes ): Promise<void> {\n\t\t\tcommit( 'updateDrillHoleEdgeType', drillholes.edgeType );\n\t\t\tcommit( 'updateDrillHoleOffset', drillholes.offset );\n\n\t\t\tif ( drillholes.edgeType === 'around' ) {\n\t\t\t\tcommit( 'updateEdgeHoles', drillholes.edges );\n\t\t\t}\n\t\t},\n\t\tasync resetDrillHoles( { commit, dispatch } ): Promise<void> {\n\t\t\tcommit( 'updateDrillOption', 'none' );\n\t\t\tcommit( 'updateDrillHoleEdgeType', 'corners' );\n\t\t},\n\t},\n};\n","import { Font } from \"opentype.js\";\n\nexport default {\n\tstate: (): object => ( {\n\t\tloading: false,\n\t\terror: null,\n\t\tfonts: [],\n\t\tselectedFontName: 'Exo-Bold',\n\t\tselectedFontObject: {},\n\t} ),\n\tmutations: {\n\t\tupdateLoadingState: ( state, value ): boolean => state.loading = value,\n\t\tupdateError: ( state, value ): string => state.error = value,\n\t\tsetSelectedFont: ( state, value ): string => state.selectedFontName = value,\n\t\tsetSelectedFontObject: ( state, value ): string => state.selectedFontObject = value,\n\t\taddFont: ( state, { fontName, font } ): void => {\n\t\t\tif( state.fonts.find( fontObject => fontObject.fontName === fontName ) !== undefined ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate.fonts.push( {\n\t\t\t\tfontName,\n\t\t\t\tfont\n\t\t\t} );\n\t\t}\n\t},\n\tactions: {\n\t\tasync loadFonts( { dispatch, getters, commit }, isCutout = false ): Promise<void> {\n\t\t\tconst { font } = ! isCutout ? getters.modifiers : getters.cutoutModifiers;\n\n\t\t\tif ( ! getters.fontIsLoaded(font) ) {\n\t\t\t\tawait dispatch( 'loadFont', font );\n\t\t\t}\n\t\t},\n\t\tasync loadFont( { commit }, fontName ): Promise<void> {\n\t\t\tcommit(\"updateLoadingState\", true);\n\n\t\t\tconst { default: openType } = await import( /* webpackChunkName: \"OpenType\" */ 'opentype.js' );\n\n\t\t\tif ( !fontName ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcommit( 'updateError', null );\n\n\t\t\tconst url = window.measurementSelectorVariables.fontDirUrl + fontName + '.ttf';\n\n\t\t\ttry {\n\n\t\t\t\t// Docs claim this approach should work (and it seems to be the case). However, TS suggests this isn't possible.\n\t\t\t\tconst font = await openType.load( url );\n\t\t\t\tcommit( 'addFont', { fontName, font } );\n\t\t\t\tcommit( 'setSelectedFontObject', font);\n\t\t\t\tcommit(\"updateLoadingState\", false);\n\t\t\t} catch( err ) {\n\t\t\t\tcommit( 'updateError', err.toString() );\n\t\t\t\tcommit(\"updateLoadingState\", false);\n\t\t\t}\n\t\t}\n\t},\n\tgetters: {\n\t\tfontIsLoaded: (state): Function => ( font: string ) => state.fonts.some( obj => obj.fontName === font ),\n\t\tfontIsLoading: ( state ): boolean => state.loading,\n\t\tgetSelectedFontName: ( state ): string => state.selectedFontName,\n\t\tselectedFontObject: ( state ): object => state.selectedFontObject,\n\t\tloadedFonts: ( state ): object => state.fonts,\n\t\tgetSelectedFontObject: ( state, getters ): Font|undefined => {\n\t\t\tconst font = state.fonts.find( fontObject => fontObject.fontName === getters.getSelectedFontName );\n\n\t\t\tif ( font === undefined ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\treturn font.font;\n\t\t},\n\t}\n};\n","import ShapeDrillHoleGeneratorFactory from \"@/Models/ShapeDrillHoleGeneratorFactory\";\nimport isEmpty from \"lodash/isEmpty\";\nimport { CutoutTypes } from \"@/Models/CutoutTypes\";\nimport { Step, StepTypes } from '@/types/step';\n\nconst i18n = window.measurementSelectorVariables.i18n;\n\nexport default {\n\tstate: (): object => ( {\n\t\tpreviewTransforms: {\n\t\t\tzoom: 1,\n\t\t\trotation: 0,\n\t\t\ttranslation: [ 0, 0 ],\n\t\t},\n\t\tselectedMenuItem: 'rectangle',\n\t\tfocusedElement: '',\n\t\tcurrentStepName: null,\n\t\tcurrentModalName: null,\n\t\tcurrentModalTriggerName: null,\n\t\tvalidSteps: [],\n\t\tdisabledSteps: [],\n\t\tcompletedSteps: [],\n\t\tselectedOptions: {},\n\t\tdefaultDimensions: true,\n\t\tpriceExcVat: 0,\n\t\tpriceIncVat: 0,\n\t\tsteps: [\n\t\t\t{\n\t\t\t\tid: StepTypes.shapeSize,\n\t\t\t\ttitle: i18n.title.shape.long,\n\t\t\t\tshortTitle: i18n.title.shape.short,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.cutouts,\n\t\t\t\ttitle: i18n.title.cutouts.long,\n\t\t\t\tshortTitle: i18n.title.cutouts.short,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.drillholes,\n\t\t\t\ttitle: i18n.title.drillHoles.long,\n\t\t\t\tshortTitle: i18n.title.drillHoles.short,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: window.extendedProductInformation ? window.extendedProductInformation['drillholes'] : '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.thickness,\n\t\t\t\ttitle: i18n.select_thickness,\n\t\t\t\tshortTitle: i18n.thickness,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.edgeFinish,\n\t\t\t\ttitle: i18n.edgeFinish.title.long,\n\t\t\t\tshortTitle: i18n.edgeFinish.title.short,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: window.extendedProductInformation ? window.extendedProductInformation['edge_finishing'] : '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.material,\n\t\t\t\ttitle: i18n.material.selectMaterial,\n\t\t\t\tshortTitle: i18n.material.material,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: StepTypes.sideSelection,\n\t\t\t\ttitle: i18n.sideSelection.title.long,\n\t\t\t\tshortTitle: i18n.sideSelection.title.short,\n\t\t\t\ttext: '',\n\t\t\t\tstatus: '',\n\t\t\t\tinformation: '',\n\t\t\t}\n\t\t]\n\t} ),\n\tmutations: {\n\t\tupdateZoom: ( state, zoom ): void => state.previewTransforms.zoom = zoom,\n\t\tupdateRotation: ( state, rotation ): void => state.previewTransforms.rotation = rotation,\n\t\tupdateTranslation: ( state, translation ): void => state.previewTransforms.translation = translation,\n\t\tupdateCurrentStepName: ( state, stepName ): void => state.currentStepName = stepName,\n\t\tupdateCurrentModalName: ( state, modalName ): void => state.currentModalName = modalName,\n\t\tupdateCurrentModalTriggerName: ( state, modalName ): void => state.currentModalTriggerName = modalName,\n\t\tupdateMenuItem: ( state, menuItem ): void => state.selectedMenuItem = menuItem,\n\t\tupdateFocusedElement: ( state, event ): void => {\n\t\t\tstate.focusedElement = ( event.target ) ? event.target.id : event.id;\n\t\t},\n\t\tupdateUsingDefaultDimensions: ( state, usesDefaults ): void => state.defaultDimensions = usesDefaults,\n\t\tupdatePriceExcVat: ( state, priceExcVat ): void => state.priceExcVat = priceExcVat,\n\t\tupdatePriceIncVat: ( state, priceIncVat ): void => state.priceIncVat = priceIncVat,\n\t},\n\tgetters: {\n\t\tgetStepById: (state, getters) => (id: StepTypes): object => {\n\t\t\tconst step = state.steps.find((step: Step) => step.id === id);\n\t\t\tlet currentStep = {};\n\n\t\t\tswitch (id) {\n\t\t\t\tcase StepTypes.shapeSize:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: `${getters.getShapeName}: ${getters.dimensionPreview}`,\n\t\t\t\t\t\tstatus: getters.hasDimensionValidatorErrors ? 'invalid' : 'completed',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.cutouts:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: getters.selectedCutoutsPreview,\n\t\t\t\t\t\tstatus: !getters.selectedCutoutsPreview ? '' : (getters.hasCutoutValidatorErrors ? 'invalid' : 'completed'),\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.drillholes:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: getters.drillOption === 'none' ? '' : i18n.drillOptions[getters.drillOption],\n\t\t\t\t\t\tstatus: getters.drillOption === 'none' ? '' : (getters.hasDrillHoleValidatorErrors ? 'invalid' : 'completed'),\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.thickness:\n\t\t\t\t\tconst currentThickness = getters.currentProductThickness;\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: `${currentThickness.thickness}mm`,\n\t\t\t\t\t\tstatus: currentThickness ? 'completed' : '',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.edgeFinish:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: i18n.edgeFinish.methods[getters.activeEdgeFinish],\n\t\t\t\t\t\tstatus: getters.activeEdgeFinish ? 'completed' : '',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.material:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: getters.currentProductMaterial?.title,\n\t\t\t\t\t\tstatus: getters.currentProductMaterial ? 'completed' : '',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase StepTypes.sideSelection:\n\t\t\t\t\tcurrentStep = {\n\t\t\t\t\t\ttext: getters.sideLabel,\n\t\t\t\t\t\tstatus: getters.sideLabel ? 'completed' : '',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...step,\n\t\t\t\t...currentStep,\n\t\t\t};\n\t\t},\n\t\tgetShapeName( state, getters ): string {\n\t\t\tconst { shape, presetShape } = getters;\n\t\t\treturn presetShape !== '' ? i18n.shapePresets[presetShape] : i18n.shapeNames[shape];\n\t\t},\n\t\tgetPriceExcVat: ( state ): number => state.priceExcVat,\n\t\tgetPriceIncVat: ( state ): number => state.priceIncVat,\n\t\tisMediaMobileSize() : boolean {\n\t\t\tconst media = window.matchMedia( \"(max-width: 991px)\" );\n\n\t\t\treturn media.matches;\n\t\t},\n\t\tzoom: ( state ): number => state.previewTransforms.zoom,\n\t\trotation: ( state ): number => state.previewTransforms.rotation,\n\t\ttranslation: ( state ): number[] => state.previewTransforms.translation,\n\t\tselectedMenuItem: ( state ): string => state.selectedMenuItem,\n\t\tcurrentStepName: ( state ): StepTypes => state.currentStepName,\n\t\tcurrentModalName: ( state ): string => state.currentModalName,\n\t\tcurrentModalTriggerName: ( state ): string => state.currentModalTriggerName,\n\t\tvalidSteps: ( state ): string[] => state.validSteps,\n\t\tcompletedSteps: ( state ): string[] => state.completedSteps,\n\t\tselectedOptions: ( state ): { [x: string]: string } => state.selectedOptions,\n\t\tfocusedElement: ( state ): string => state.focusedElement,\n\t\tusesDefaultDimensions: ( state ): boolean => state.defaultDimensions,\n\t\tfocusTrigger( state, getters ): string {\n\t\t\tif (getters.currentModalName === null) {\n\t\t\t\treturn getters.currentModalTriggerName;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tshapeSelectorButtons( state, getters ): object[] {\n\t\t\tlet buttons = [ 'rectangle', 'shapes', 'text', 'dxf' ];\n\t\t\tconst i18n = window.measurementSelectorVariables.i18n;\n\n\t\t\t// Filter out rectangles as they have their own separate button.\n\t\t\tconst otherShapeButtons = getters.enabledShapes.filter ( shape => shape !== 'rectangle' );\n\n\t\t\t// Filter out buttons that aren't enabled.\n\t\t\tbuttons = buttons.filter( ( button ) => {\n\t\t\t\tif ( otherShapeButtons.length > 0 && button === 'shapes' ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn getters.enabledShapes.includes( button );\n\t\t\t});\n\n\t\t\treturn buttons.map((button) => {\n\t\t\t\tconst selectionButton = {\n\t\t\t\t\tselection: button,\n\t\t\t\t\thandler: button,\n\t\t\t\t\ticon: button,\n\t\t\t\t\treset: false,\n\t\t\t\t\ttext: '',\n\t\t\t\t\tactive: getters.selectedMenuItem === button,\n\t\t\t\t};\n\n\t\t\t\tswitch (button) {\n\t\t\t\t\tcase 'rectangle':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.shapeNames.rectangle,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'dxf':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.upload,\n\t\t\t\t\t\t\treset: true,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'shapes':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.shapes,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.text.title,\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn selectionButton;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tdrillHoleSelectorButtons( state, getters ): object[] {\n\t\t\tlet buttons = [ 'none', 'edges', 'radial', 'grid', 'custom', 'preset' ];\n\t\t\tconst i18n = window.measurementSelectorVariables.i18n;\n\n\t\t\tconst {shape, model} = getters;\n\t\t\tconst shapeDrillHoleGeneratorFactory = new ShapeDrillHoleGeneratorFactory();\n\n\t\t\t// Filter out buttons that aren't enabled.\n\t\t\tbuttons = buttons.filter( ( button ) => {\n\t\t\t\tif ( ! shape ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst { usePreset, presetGroup } = window.measurementSelectorVariables.drillHoleSettings;\n\n\t\t\t\tconst shapeDrillHoleGenerator = shapeDrillHoleGeneratorFactory.getShapeDrillHoleGenerator( shape, model );\n\t\t\t\tconst forcePreset = usePreset && 'fromEdge' in shapeDrillHoleGenerator && !isEmpty( presetGroup );\n\n\t\t\t\tconst options = {\n\t\t\t\t\t'none': !forcePreset,\n\t\t\t\t\t'edges': !forcePreset && ( 'getCorners' in shapeDrillHoleGenerator || 'getAround' in shapeDrillHoleGenerator ),\n\t\t\t\t\t'radial': !forcePreset,\n\t\t\t\t\t'grid': !forcePreset,\n\t\t\t\t\t'custom': !forcePreset,\n\t\t\t\t\t'preset': forcePreset,\n\t\t\t\t};\n\n\t\t\t\treturn (typeof options[button] !== 'undefined') ? options[button] : false;\n\t\t\t});\n\n\t\t\treturn buttons.map((button) => {\n\t\t\t\tconst selectionButton = {\n\t\t\t\t\tselection: button,\n\t\t\t\t\thandler: button,\n\t\t\t\t\ticon: button,\n\t\t\t\t\ttext: i18n.drillOptions[ button ],\n\t\t\t\t\tactive: getters.drillOption === button,\n\t\t\t\t};\n\n\t\t\t\tswitch (button) {\n\t\t\t\t\tcase 'none':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ticon: 'cross',\n\t\t\t\t\t\t};\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn selectionButton;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tcutoutSelectorButtons( state, getters ): object[] {\n\t\t\tlet buttons = [ 'none', 'shape', 'text', 'dxf' ];\n\t\t\tconst i18n = window.measurementSelectorVariables.i18n;\n\n\t\t\t// Filter out buttons that aren't enabled.\n\t\t\tbuttons = buttons.filter( ( button ) => {\n\t\t\t\tconst options = {\n\t\t\t\t\t[CutoutTypes.none]: true,\n\t\t\t\t\t[CutoutTypes.shape]: true,\n\t\t\t\t\t[CutoutTypes.text]: true,\n\t\t\t\t\t[CutoutTypes.dxf]: false,\n\t\t\t\t};\n\n\t\t\t\treturn (typeof options[button] !== 'undefined') ? options[button] : false;\n\t\t\t});\n\n\t\t\treturn buttons.map((button) => {\n\t\t\t\tconst selectionButton = {\n\t\t\t\t\tselection: button,\n\t\t\t\t\thandler: button,\n\t\t\t\t\ticon: button,\n\t\t\t\t\ttext: '',\n\t\t\t\t\tactive: getters.cutoutType === button,\n\t\t\t\t};\n\n\t\t\t\tswitch (button) {\n\t\t\t\t\tcase 'none':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ticon: 'cross',\n\t\t\t\t\t\t\ttext: i18n.cutout.types.none,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'dxf':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.cutout.types.upload,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'shape':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ticon: 'shapes',\n\t\t\t\t\t\t\ttext: i18n.cutout.types.shape,\n\t\t\t\t\t\t};\n\t\t\t\t\tcase 'text':\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...selectionButton,\n\t\t\t\t\t\t\ttext: i18n.cutout.types.text,\n\t\t\t\t\t\t};\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn selectionButton;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t},\n\tactions: {}\n};\n","import axios, {AxiosResponse} from 'axios';\n\nexport const namespace = (): string => {\n\treturn `${ window.measurementSelectorVariables.restUrl }kps/v1/configuration`;\n};\n\nexport const RetrieveConfiguration = async ( short_link: string ): Promise<AxiosResponse> => {\n\treturn axios.get( `${namespace()}/get/`, { params: { short_link: encodeURIComponent( short_link ) } } );\n};\n\nexport const StoreConfiguration = async ( baseUrl: string, configuration: string, isTemporary = false, action: string, name: string ): Promise<AxiosResponse> => {\n\treturn await axios.post( `${namespace()}/create/`, { baseUrl, configuration, isTemporary, action, name }, {\n\t\theaders: {\n\t\t\t'X-WP-Nonce': window.measurementSelectorVariables.restNonce,\n\t\t}\n\t} );\n};\n","import {StoreConfiguration} from \"@/utilities/API\";\nimport isEqual from \"lodash/isEqual\";\nimport mapValues from \"lodash/mapValues\";\nimport omitBy from \"lodash/omitBy\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEmpty from \"lodash/isEmpty\";\nimport map from \"lodash/map\";\nimport { materialProduct } from \"@/types/product\";\n\nexport default {\n\tstate: (): object => ( {\n\t\tisGeneratingShareLink: false,\n\t\tshortLink: '',\n\t\tlastConfiguration: {},\n\t\tcurrentProductThickness: window.measurementSelectorVariables.thickness,\n\t\tcurrentProductMaterial: window.measurementSelectorVariables.material,\n\t\talternateThicknesses: window.measurementSelectorVariables.alternateThicknesses,\n\t\talternateMaterials: window.measurementSelectorVariables.alternateMaterials,\n\t\tconfigurationName: '',\n\t} ),\n\tmutations: {\n\t\tupdateIsGenerating: ( state, value: boolean ): boolean => state.isGeneratingShareLink = value,\n\t\tupdateShortLink: ( state, value: string ): string => state.shortLink = value,\n\t\tupdateLastConfiguration: ( state, value: object ): object => state.lastConfiguration = value,\n\t\tupdateThickness: ( state, thickness: number ): number => state.currentProductThickness = thickness,\n\t\tupdateMaterial: ( state, material: object ): object => state.currentProductMaterial = material,\n\t\tupdateConfigurationName: ( state, name: string ): string => state.configurationName = name,\n\t},\n\tgetters: {\n\t\tgetConfigurationName: ( state ): string => state.configurationName,\n\t\tmeasurementsConfig: ( state, getters ): object => {\n\t\t\tconst config = {\n\t\t\t\tbase: {\n\t\t\t\t\tshape: getters.shape,\n\t\t\t\t\tpresetShape: getters.presetShape,\n\t\t\t\t\tprimitives: getters.primitives,\n\t\t\t\t\tedgeFinish: getters.activeEdgeFinish,\n\t\t\t\t\toriginalUpload: btoa(getters.uploadedContent),\n\t\t\t\t\toriginalFilename: getters.getOriginalFilename,\n\t\t\t\t\toriginalFileType: getters.getOriginalFileType,\n\t\t\t\t},\n\t\t\t\tdrillholes: getters.drillHoleConfig,\n\t\t\t\tcutout: getters.cutoutConfig,\n\t\t\t\tcutouts: getters.cutoutsConfig,\n\t\t\t\tthickness: {\n\t\t\t\t\tvalue: getters.currentProductThickness.thickness,\n\t\t\t\t},\n\t\t\t\tversion: 1\n\t\t\t};\n\n\t\t\tif ( getters.dxfDefinition ) {\n\t\t\t\tconfig.base[ 'dxfDefinition' ] = getters.dxfDefinition;\n\t\t\t}\n\n\t\t\treturn config;\n\t\t},\n\t\tstringifiedConfig: ( state, getters ): string => {\n\t\t\treturn JSON.stringify( getters.measurementsConfig );\n\t\t},\n\t\tencodedConfiguration: ( state, getters ): string => {\n\t\t\treturn btoa( encodeURIComponent( getters.stringifiedConfig ) );\n\t\t},\n\t\tshareableMeasurementsConfig: ( state, getters ): string => {\n\t\t\treturn `${window.location.href.split( '?' )[ 0 ]}?share_configuration=${getters.encodedConfiguration}`;\n\t\t},\n\t\tisGeneratingLink: ( state ): boolean => {\n\t\t\treturn state.isGeneratingShareLink;\n\t\t},\n\t\tlastGeneratedConfiguration: ( state ): object => {\n\t\t\treturn state.lastConfiguration;\n\t\t},\n\t\tshortLink: ( state ): string => state.shortLink,\n\t\talternateThicknesses: ( state ): string => state.alternateThicknesses,\n\t\talternateMaterials: ( state, getters ): materialProduct[] => {\n\t\t\tif(getters.getBlockSettings) {\n\t\t\t\treturn getters.getBlockSettings.alternateMaterials;\n\t\t\t}\n\n\t\t\treturn state.alternateMaterials;\n\t\t},\n\t\tcurrentProductThickness: ( state ): string => state.currentProductThickness,\n\t\tcurrentProductMaterial: ( state ): string => state.currentProductMaterial,\n\t\thasAlteredConfiguration: ( state, getters ): boolean => {\n\t\t\treturn isEqual( getters.measurementsConfig, getters.lastGeneratedConfiguration ) === false;\n\t\t},\n\t\tgetBlockConfig: (): object|null => {\n\t\t\tconst block = document.querySelector('#measurements-selector-block');\n\t\t\tif(!block) return null;\n\n\t\t\tconst configData = block.getAttribute('data-config');\n\n\t\t\tif(!configData) return null;\n\n\t\t\tconst config = JSON.parse(configData);\n\n\t\t\tif(config.length === 0) return null;\n\n\t\t\treturn config[0].configuration;\n\t\t},\n\t\tgetBlockSettings: (): object|null => {\n\t\t\tconst block = document.querySelector('#measurements-selector-block');\n\t\t\tif(!block) return null;\n\n\t\t\tconst settingData = block.getAttribute('data-settings');\n\t\t\treturn JSON.parse(settingData);\n\t\t},\n\t\tisCutoutsEnabled: ( state, getters ): boolean => {\n\t\t\tif(getters.getBlockSettings?.disable_cutouts) return false;\n\n\t\t\treturn getters.getPricingGroup.getEnableCutouts();\n\t\t},\n\t\tisDrillHolesEnabled: ( state, getters ): boolean => {\n\t\t\tif(getters.getBlockSettings?.disable_drillholes) return false;\n\n\t\t\treturn getters.getPricingGroup.getEnableDrillholes();\n\t\t},\n\t\tisDrillHolesVisible: ( state, getters ): boolean => {\n\t\t\tif(!getters.shape) return false;\n\n\t\t\treturn getters.isDrillHolesEnabled && getters.shape !== 'dxf' && getters.shape !== 'text';\n\t\t}\n\t},\n\tactions: {\n\t\tasync generateConfigurationLink( { getters }, { url, isTemporary = false } ): Promise<string> {\n\t\t\tconst configuration = getters.measurementsConfig;\n\t\t\tconst lastConfiguration = getters.lastGeneratedConfiguration;\n\n\t\t\t// If nothing changed, skip generating a new shortlink.\n\t\t\tif ( isEqual( configuration, lastConfiguration ) && ( getters.shortLink !== '' && getters.shortLink !== undefined ) ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst action = 'save';\n\t\t\tconst name = getters.getConfigurationName;\n\n\t\t\tconst request = await StoreConfiguration( url, configuration, isTemporary, action, name );\n\n\t\t\tif ( ! isEmpty( request.data.short_link ) && request.data.short_link !== '' ) {\n\t\t\t\treturn request.data.short_link;\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tasync createConfigurationLink( { commit, dispatch, getters } ): Promise<void> {\n\t\t\tcommit( 'updateIsGenerating', true );\n\n\t\t\tconst { material } = window.measurementSelectorVariables;\n\t\t\tconst result = await dispatch( 'generateConfigurationLink', {\n\t\t\t\turl: material.permalink.split( '?' )[ 0 ],\n\t\t\t\tisTemporary: false,\n\t\t\t});\n\n\t\t\tif ( result !== '' ) {\n\t\t\t\tcommit( 'updateShortLink', result );\n\t\t\t\tcommit( 'updateLastConfiguration', getters.measurementsConfig );\n\t\t\t}\n\n\t\t\tcommit( 'updateIsGenerating', false );\n\t\t},\n\t\tasync generateShareableLink( { getters }, { url, isTemporary = false } ): Promise<string> {\n\t\t\tconst configuration = getters.measurementsConfig;\n\t\t\tconst lastConfiguration = getters.lastGeneratedConfiguration;\n\n\t\t\t// If nothing changed, skip generating a new shortlink.\n\t\t\tif ( isEqual( configuration, lastConfiguration ) && ( getters.shortLink !== '' && getters.shortLink !== undefined ) ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst request = await StoreConfiguration( url, configuration, isTemporary, 'share', '' );\n\n\t\t\tif ( ! isEmpty( request.data.short_link ) && request.data.short_link !== '' ) {\n\t\t\t\treturn request.data.short_link;\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tasync createShareableLink( { commit, dispatch, getters } ): Promise<void> {\n\t\t\tcommit( 'updateIsGenerating', true );\n\n\t\t\tconst { material } = window.measurementSelectorVariables;\n\t\t\tconst result = await dispatch( 'generateShareableLink', {\n\t\t\t\turl: material.permalink.split( '?' )[ 0 ],\n\t\t\t\tisTemporary: false,\n\t\t\t});\n\n\t\t\tif ( result !== '' ) {\n\t\t\t\tcommit( 'updateShortLink', result );\n\t\t\t\tcommit( 'updateLastConfiguration', getters.measurementsConfig );\n\t\t\t}\n\n\t\t\tcommit( 'updateIsGenerating', false );\n\t\t},\n\t\tasync loadConfiguration( { commit, dispatch, getters } ): Promise<void> {\n\t\t\tconst { measurementsConfig, currentShortLinkUrl } = window.measurementSelectorVariables;\n\t\t\tlet currentConfig = measurementsConfig;\n\n\t\t\t// Load the gutenberg block configuration if available.\n\t\t\tcurrentConfig = getters.getBlockConfig ? getters.getBlockConfig : currentConfig;\n\n\t\t\t// Remove share_configuration from URL.\n\t\t\tif ( window.history.replaceState && ( window.location.href.indexOf( 'share_configuration' ) !== -1 || window.location.href.indexOf( 'share=t_' ) !== -1 ) ) {\n\t\t\t\twindow.history.replaceState( {}, '', window.location.origin + window.location.pathname );\n\t\t\t}\n\n\t\t\tcommit( 'updateShortLink', currentShortLinkUrl );\n\t\t\tcommit( 'updateLastConfiguration', currentConfig );\n\t\t\tdispatch( 'updateFromConfig', currentConfig );\n\t\t},\n\t\tasync updateBaseFromConfig( { commit, dispatch }, base ): Promise<void> {\n\t\t\tconst { shape, primitives, presetShape } = base;\n\n\t\t\tif ( shape === 'dxf' ) {\n\t\t\t\tcommit( 'setUploadedContent', { result: atob(base.originalUpload), filename: base.originalFilename, filetype: base.originalFileType } );\n\t\t\t}\n\n\t\t\tif ( shape === 'text' ) {\n\t\t\t\tcommit( 'updateModifier', { modifier: 'desired_dimension', value: primitives.desired_dimension } );\n\t\t\t\tcommit( 'updateModifier', { modifier: 'font', value: primitives.font } );\n\t\t\t\tcommit( 'updateModifier', { modifier: 'text', value: primitives.text } );\n\t\t\t}\n\n\t\t\tif ( shape === 'rounded-rectangle' ) {\n\t\t\t\tcommit( 'updateModifier', { modifier: 'use_individual_corners', value: primitives.use_individual_corners } );\n\t\t\t}\n\n\t\t\tif ( shape === 'polygon' ) {\n\t\t\t\tcommit( 'updateModifier', { modifier: 'side_amount', value: primitives.side_amount } );\n\t\t\t}\n\n\t\t\tif ( shape === 'star' ) {\n\t\t\t\tcommit( 'updateModifier', { modifier: 'number_of_points', value: primitives.number_of_points } );\n\t\t\t}\n\n\t\t\t// Convert the numerical dimensions to strings. Non-numerical values are set to undefined.\n\t\t\tlet dimensions = mapValues( primitives, ( primitive ) => {\n\t\t\t\tif ( typeof primitive !== 'number' ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn primitive.toString();\n\t\t\t} );\n\n\t\t\t// Any value that is considered undefined is removed.\n\t\t\tdimensions = omitBy( dimensions, isUndefined );\n\n\t\t\tif ( presetShape == '' && (shape === 'rectangle' || shape === 'text' || shape === 'dxf') ) {\n\t\t\t\tcommit( 'updateMenuItem', shape );\n\t\t\t} else {\n\t\t\t\tcommit( 'updateMenuItem', 'shapes' );\n\t\t\t}\n\t\t\tawait dispatch( 'updateShape', shape );\n\t\t\tcommit( 'updatePresetShape', presetShape );\n\n\t\t\tcommit( 'setDimensionsForShape', { shape, dimensions } );\n\t\t},\n\t\tasync updateFromConfig( { dispatch, getters, commit }, { base, cutout, drillholes, cutouts } ): Promise<void> {\n\t\t\tconst { other_settings, enabled_shapes } = window.measurementSelectorVariables.pricingGroup;\n\t\t\tconst edgeFinishingIsEnabled  = window.measurementSelectorVariables.edgeFinishingIsEnabled === '1';\n\t\t\tconst { prefilledDrillHoles } = window.measurementSelectorVariables.drillHoleSettings;\n\n\t\t\tif ( base && base.shape && [ 'rectangle', ...enabled_shapes ].includes( base.shape ) ) {\n\t\t\t\tawait dispatch( 'updateBaseFromConfig', base );\n\t\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t\t}\n\n\t\t\t// Set cutout if enabled and the shape is included in the list of enabled shapes.\n\t\t\tif ( getters.isCutoutsEnabled && cutout && cutout.type !== 'none' && [ 'rectangle', ...getters.getEnabledCutoutShapesForPricingGroup ].includes( cutout.shape ) ) {\n\t\t\t\tawait dispatch( 'updateCutoutFromConfig', cutout );\n\t\t\t}\n\n\t\t\tif(getters.isCutoutsEnabled && cutouts && cutouts.length > 0) {\n\t\t\t\tawait dispatch( 'updateCutoutsFromConfig', cutouts );\n\t\t\t} else {\n\t\t\t\tawait dispatch( 'resetCutouts' );\n\t\t\t}\n\n\t\t\tif ( getters.isDrillHolesEnabled && drillholes !== undefined ) {\n\t\t\t\tawait dispatch( 'updateDrillHolesFromConfig', drillholes );\n\t\t\t}\n\n\t\t\tif ( getters.isDrillHolesEnabled && prefilledDrillHoles.length > 0 ) {\n\n\t\t\t\t// Map values to be ints\n\t\t\t\tconst mappedPrefilledDrillHoles = map( prefilledDrillHoles, ( drillHole: object ) => {\n\t\t\t\t\treturn mapValues( drillHole, ( val: string ) => parseInt( val ) );\n\t\t\t\t} );\n\n\t\t\t\tawait dispatch( 'updateDrillHolesFromConfig', { type: 'custom', settings: mappedPrefilledDrillHoles, diameter: other_settings.default_drillhole_diameter } );\n\t\t\t}\n\n\t\t\tif( edgeFinishingIsEnabled && base && base.edgeFinish ) {\n\t\t\t\tcommit( 'updateActiveEdgeFinish', base.edgeFinish );\n\t\t\t}\n\t\t},\n\t}\n};\n","import makerjs, {IModel} from \"makerjs\";\nimport {ValidatorInterface} from \"./ValidatorInterface\";\nimport { AbstractValidator, ValidatorObject } from \"./AbstractValidator\";\n\ninterface OffsetValidatorObject extends ValidatorObject {\n\tmodelInstance?: IModel;\n\tparentModelInstance?: IModel;\n\tminOffsetInMM?: number;\n}\n\nexport class Offset extends AbstractValidator implements ValidatorInterface {\n\tprivate readonly modelA: IModel;\n\tprivate readonly modelB: IModel;\n\tprivate readonly minOffsetInMM: number;\n\n\tprivate originalShapeModel: IModel;\n\tpublic offset: IModel;\n\n\tconstructor( options: OffsetValidatorObject ) {\n\t\tsuper( options );\n\n\t\tthis.modelA = options.parentModelInstance;\n\t\tthis.modelB = options.modelInstance;\n\t\tthis.minOffsetInMM = options.minOffsetInMM ?? 20;\n\n\t\tthis.createOriginalShapeModel();\n\t}\n\n\tcreateOriginalShapeModel(): void {\n\t\tconst clone = makerjs.cloneObject( this.modelA );\n\n\t\t// Remove a small margin from the offset to account for cutouts being exactly on the offset and thus valid.\n\t\tconst outline = makerjs.model.outline( clone, this.minOffsetInMM - .1, 0, true );\n\t\tmakerjs.model.addModel( clone, outline, 'outline' );\n\t\tthis.originalShapeModel = clone;\n\t}\n\n\thasObjectsWithinOffset(): boolean {\n\t\tconst result = makerjs.model.combine(makerjs.cloneObject(this.modelB), makerjs.cloneObject(this.originalShapeModel), true, false, false, false);\n\t\tlet hasPaths = false;\n\t\tmakerjs.model.walk(result.models.a, {\n\t\t\tonPath: (modelContext: any) => {\n\t\t\t\thasPaths = true;\n\t\t\t}\n\t\t});\n\n\t\treturn hasPaths;\n\t}\n\n\tgetMessage(): string {\n\t\tconst { generic } = window.measurementSelectorVariables.i18n.validators;\n\n\t\treturn super.getCustomMessage() ?? generic.offset.all;\n\t}\n\n\tisValid(): boolean {\n\t\treturn this.hasObjectsWithinOffset() === false;\n\t}\n\n\tisIgnorableModel(): boolean {\n\t\treturn [\n\t\t\t'grid-drillHole',\n\t\t\t'radial-drillHole',\n\t\t\t'edge-drillHoles-around',\n\t\t\t'edge-drillHoles-corners',\n\t\t\t'drillhole'\n\t\t].includes( this.modelB.type ) === false;\n\t}\n}\n","import { IModel } from \"makerjs\";\nimport { ValidatorInterface } from \"./ValidatorInterface\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\n\nexport class CutoutMissingValidator implements ValidatorInterface {\n\n\tconstructor(\n\t\tprivate baseModel: IModel,\n\t\tprivate combinedModel: IModel\n\t) {}\n\n\tgetMessage(): string {\n\t\tconst { cutout: cutoutValidatorMessages } = window.measurementSelectorVariables.i18n.validators;\n\n\t\treturn cutoutValidatorMessages.cutoutIncorrect ?? 'Cutout is incorrect. Please check the dimensions';\n\t}\n\n\tisValid(): boolean {\n\t\tlet isValid = false;\n\t\tconst options = {\n\t\t\tcontain: true,\n\t\t};\n\n\t\tconst baseModelChains = makerjs.model.findChains(this.baseModel, options);\n\t\tmakerjs.model.simplify(this.combinedModel); // Removes duplicate link paths\n\t\tconst combinedShapeChains = makerjs.model.findChains(this.combinedModel, options);\n\n\t\tif (!Array.isArray(baseModelChains) || !Array.isArray(combinedShapeChains)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tcombinedShapeChains.forEach((chain: makerjs.IChain, index) => {\n\n\t\t\t// The combined shape has more links than the base model\n\t\t\tif(chain?.links.length > baseModelChains[index]?.links.length) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\n\t\t\t// The combined shape has a cutout model\n\t\t\tif(chain.contains && chain.contains.length > 0) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\n\t\t\t// The combined shape has a different path length than the base model\n\t\t\tif(chain?.pathLength !== baseModelChains[index]?.pathLength) {\n\t\t\t\tisValid = true;\n\t\t\t}\n\t\t});\n\n\t\treturn isValid;\n\t}\n\n}\n","import { sprintf } from \"sprintf-js\";\n\nimport pick from \"lodash/pick\";\nimport isEmpty from \"lodash/isEmpty\";\n\nimport {\n\tcreateValidatorInstance,\n\tgetValidationErrors,\n\tgetValidationMessageForField,\n\thasValidationErrors\n} from \"@/utilities/Validator\";\nimport ShapeValidator from \"@/utilities/ShapeValidator\";\nimport { ValidatorInterface } from \"@/Models/Validators/ValidatorInterface\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport GroupedValidator from \"@/Models/Validators/GroupedValidator\";\nimport AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { CutoutTypes } from \"@/Models/CutoutTypes\";\nimport { Offset } from \"@/Models/Validators/Offset\";\nimport { MaximumDecimalPoints } from \"@/Models/Validators/MaximumDecimalPoints\";\n\nimport { isModelInsideParent } from \"@/functions/makerjs\";\nimport { CutoutModelDecorator } from \"@/utilities/decorators/CutoutModelDecorator\";\nimport { ShapeModelCombineDecorator } from \"@/utilities/decorators/ShapeModelDecorator\";\nimport { CutoutMissingValidator } from \"@/Models/Validators/CutoutMissingValidator\";\n\nexport default {\n\tgetters: {\n\t\tisShapeComplete: (state, getters): boolean => {\n\t\t\tconst { shape, measurements, uploadAsModel } = getters;\n\t\t\tconst shapeValidator = new ShapeValidator();\n\t\t\treturn shapeValidator.isShapeComplete(shape, measurements, uploadAsModel);\n\t\t},\n\t\tgetValidators: (state, getters): Function => {\n\t\t\treturn (shape: string, instance: AbstractShape, options = {}): ValidatorInterface[] => {\n\t\t\t\tif (instance === null) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tif (!instance.model) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tconst configuration = getters.getConfiguration(shape);\n\t\t\t\tconst dimensionValidators = pick(configuration.get_validators(), [...configuration.get_dimension_keys(), ...configuration.get_modifier_keys()]);\n\n\t\t\t\tif(configuration.hasNewValidators) {\n\t\t\t\t\treturn configuration.get_new_validators(instance, getters.getMinimalSize, getters.maximums, getters.dimensions);\n\t\t\t\t}\n\n\t\t\t\treturn getters.getDimensionValidatorInstances(dimensionValidators, shape, instance, options);\n\t\t\t};\n\t\t},\n\t\tgetGroupedValidators: (state, getters): Function => {\n\t\t\treturn (shape: string, instance: AbstractShape, options = {}): ValidatorInterface[] => {\n\t\t\t\tconst { getMinimum, getValidatorMaximums } = getters;\n\t\t\t\tconst configuration = (new ShapeConfigurationFactory()).get_configuration(shape);\n\t\t\t\tconst groupedValidators = pick(configuration.get_validators(), ['grouped']);\n\n\t\t\t\tif (isEmpty(groupedValidators)) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tlet instances = [];\n\n\t\t\t\tgroupedValidators.grouped.forEach((group: GroupedValidator) => {\n\t\t\t\t\tinstances = instances.concat(group.getFields().map((dimension) => {\n\t\t\t\t\t\treturn createValidatorInstance(group.getValidator(), {\n\t\t\t\t\t\t\tdimension,\n\t\t\t\t\t\t\tinstance,\n\t\t\t\t\t\t\tfield: `${options['prefix'] ?? ''}${shape}-${dimension}`,\n\t\t\t\t\t\t\tminimum: getMinimum(dimension),\n\t\t\t\t\t\t\tmaximums: getValidatorMaximums,\n\t\t\t\t\t\t\tcustomMessage: sprintf(group.getMessage(), getMinimum(dimension), 'cm'),\n\t\t\t\t\t\t\t...options,\n\t\t\t\t\t\t}) ?? false;\n\t\t\t\t\t}));\n\t\t\t\t});\n\n\t\t\t\treturn instances.filter(Boolean);\n\t\t\t};\n\t\t},\n\t\tgetValidatorMaximums: (state, getters): object => {\n\t\t\treturn getters.maximums;\n\t\t},\n\t\tgetDimensionValidators: (state, getters): ValidatorInterface[] => {\n\t\t\tconst { shape, getShapeInstance } = getters;\n\n\t\t\treturn getters.getValidators(shape, getShapeInstance);\n\t\t},\n\t\tgetGroupedDimensionValidators: (state, getters): ValidatorInterface[] => {\n\t\t\tconst { shape, getShapeInstance } = getters;\n\n\t\t\treturn getters.getGroupedValidators(shape, getShapeInstance);\n\t\t},\n\n\t\t// TODO: remove magic.\n\t\t// This logic will be removed and replaced with `get_new_validators` in the future. In the `getValidators` getter.\n\t\t// So every shape configuration will have its own validators.\n\t\tgetDimensionValidatorInstances: (state, getters): Function => {\n\t\t\tconst { hasAllMeasurements, hasAllModifiers, getMinimum, getValidatorMaximums } = getters;\n\n\t\t\treturn (dimensionValidators: Record<string, Array<unknown>>, shape: string, instance: AbstractShape, options = {}): ValidatorInterface[] => {\n\t\t\t\tif (isEmpty(shape) || !hasAllMeasurements || !hasAllModifiers || instance === null) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tlet shapeValidators = [];\n\n\t\t\t\tfor (const [dimension, validators] of Object.entries(dimensionValidators)) {\n\t\t\t\t\tconst validatorInstances = validators.map((validator: Function) => {\n\n\t\t\t\t\t\tconst opts = {\n\t\t\t\t\t\t\t...{\n\t\t\t\t\t\t\t\tdimension,\n\t\t\t\t\t\t\t\tinstance,\n\t\t\t\t\t\t\t\tfield: `${options['prefix'] ?? ''}${shape}-${dimension}`,\n\t\t\t\t\t\t\t\tminimum: getMinimum(dimension),\n\t\t\t\t\t\t\t\tmaximums: getValidatorMaximums,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t...options\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn createValidatorInstance(validator, opts) ?? false;\n\t\t\t\t\t}).filter(Boolean);\n\n\t\t\t\t\tshapeValidators = [...shapeValidators, ...validatorInstances];\n\t\t\t\t}\n\n\t\t\t\treturn shapeValidators;\n\t\t\t};\n\t\t},\n\t\tgetDimensionValidatorErrors: function (state, getters): ValidatorInterface[] {\n\t\t\treturn getValidationErrors(getters.getDimensionValidators);\n\t\t},\n\t\tgetGroupedDimensionValidatorErrors: function (state, getters): ValidatorInterface[] {\n\t\t\treturn getValidationErrors(getters.getGroupedDimensionValidators, null, true);\n\t\t},\n\t\thasDimensionValidatorErrors: (state, getters): boolean => getters.getDimensionValidatorErrors.length > 0,\n\t\thasGroupedDimensionValidatorErrors: (state, getters): boolean => {\n\t\t\treturn getters.getGroupedDimensionValidatorErrors.length > 0;\n\t\t},\n\t\thasValidatorErrors: (state, getters): boolean => {\n\t\t\tconst validators = [\n\t\t\t\tgetters.hasDimensionValidatorErrors,\n\t\t\t\tgetters.hasDrillHoleValidatorErrors,\n\t\t\t\tgetters.hasCutoutValidatorErrors,\n\t\t\t\tgetters.hasGroupedDimensionValidatorErrors,\n\t\t\t\tgetters.hasGroupedCutoutValidatorErrors,\n\t\t\t];\n\n\t\t\treturn validators.filter(Boolean).length > 0;\n\t\t},\n\t\tisDimensionValid: (state, getters): Function => {\n\t\t\treturn (field): boolean => {\n\t\t\t\tif (getters.fontIsLoading) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn !hasValidationErrors(getters.getDimensionValidators, field);\n\t\t\t};\n\t\t},\n\t\tisGroupValid: (state, getters): Function => {\n\t\t\treturn (field: string): boolean => {\n\t\t\t\treturn !hasValidationErrors(getters.getGroupedDimensionValidators, field, true);\n\t\t\t};\n\t\t},\n\t\tgetGroupedDimensionValidationMessage: (state, getters): string => {\n\t\t\tif (getters.hasGroupedDimensionValidatorErrors) {\n\t\t\t\treturn getters.getGroupedDimensionValidators[0].getMessage();\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tgetCutoutValidators: (state, getters): ValidatorInterface[] => {\n\t\t\tconst { shape, cutoutPrimitives, cutout, getValidators, getExportableModel } = getters;\n\n\t\t\tif (isEmpty(shape) || state.cutoutType === CutoutTypes.none || isEmpty(cutoutPrimitives) || isEmpty(cutout)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst { cutout: cutoutValidatorMessages } = window.measurementSelectorVariables.i18n.validators;\n\n\t\t\tconst configuration = getters.getConfiguration(cutout.instance.shape);\n\t\t\tlet shapeValidators = [];\n\n\t\t\tif(configuration.hasNewValidators) {\n\t\t\t\tshapeValidators = configuration.get_cutout_validators(cutout.instance, getters.cutoutDimensions);\n\t\t\t} else {\n\t\t\t\tshapeValidators = getValidators(cutout.instance.shape, cutout.instance, {\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tisCutout: true,\n\t\t\t\t\tprefix: 'cutout_',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst baseShapeModelDecorator = getters.getBaseShapeModelDecorator;\n\t\t\tconst combinedShape = (new ShapeModelCombineDecorator(new CutoutModelDecorator(baseShapeModelDecorator, getters.cutouts)).getModel());\n\t\t\tconst baseModel = combinedShape.models.shapeModel.models.baseModel;\n\t\t\tconst cutoutModel = combinedShape.models.cutoutModel.models.baseModel;\n\n\t\t\tshapeValidators.push(\n\t\t\t\tnew CutoutMissingValidator(\n\t\t\t\t\tbaseShapeModelDecorator.getModel(),\n\t\t\t\t\tcombinedShape\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Make sure the models cutout exists in the complete model.\n\t\t\tif (!cutoutModel) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\t// Only run this check if the model is completely within its parent. Otherwise, we'll just cut out the shape.\n\t\t\t// TODO: Exception for text as this dramatically slows down the model creation. Needs fixing\n\t\t\tif (isModelInsideParent(cutoutModel, baseModel ) && cutout.instance.shape !== \"text\" ) {\n\t\t\t\tshapeValidators.push( new Offset( {\n\t\t\t\t\tfield: 'cutoutOffset',\n\t\t\t\t\tdimension: 'cutoutOffset',\n\t\t\t\t\tmodelInstance: cutoutModel,\n\t\t\t\t\tparentModelInstance: baseModel,\n\t\t\t\t\tcustomMessage: sprintf(cutoutValidatorMessages.distance_from_edge, 2, 'cm'),\n\t\t\t\t\tisCutout: true,\n\t\t\t\t}));\n\t\t\t}\n\n\t\t\tshapeValidators.push(\n\t\t\t\tnew MaximumDecimalPoints({\n\t\t\t\t\tdimension: 'cutoutOffsetLeft',\n\t\t\t\t\tfield: 'cutoutOffsetLeft',\n\t\t\t\t\tvalue: cutout.offsets[0].in_cm(),\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tshapeValidators.push(\n\t\t\t\tnew MaximumDecimalPoints({\n\t\t\t\t\tdimension: 'cutoutOffsetBottom',\n\t\t\t\t\tfield: 'cutoutOffsetBottom',\n\t\t\t\t\tvalue: cutout.offsets[1].in_cm(),\n\t\t\t\t})\n\t\t\t);\n\n\t\t\treturn shapeValidators;\n\t\t},\n\t\tgetGroupedCutoutValidators: function (state, getters): ValidatorInterface[] {\n\t\t\tconst { shape, cutoutPrimitives, cutout, getCutoutMaximums: maximums } = getters;\n\n\t\t\tif (isEmpty(shape) || state.cutoutType === CutoutTypes.none || isEmpty(cutoutPrimitives) || isEmpty(cutout)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn getters.getGroupedValidators(cutout.shape, cutout.instance, {\n\t\t\t\tmaximums,\n\t\t\t\tminimum: 1,\n\t\t\t\tisCutout: true,\n\t\t\t\tprefix: 'cutout_',\n\t\t\t});\n\t\t},\n\t\tgetCutoutValidatorErrors: function (state, getters): ValidatorInterface[] {\n\t\t\treturn getters.getCutoutValidators.filter((validator: ValidatorInterface) => !validator.isValid());\n\t\t},\n\t\thasCutoutValidatorErrors: function (state, getters): boolean {\n\t\t\treturn getters.getCutoutValidatorErrors.length > 0;\n\t\t},\n\t\tgetGroupedCutoutValidatorErrors: function (state, getters): ValidatorInterface[] {\n\t\t\treturn getValidationErrors(getters.getGroupedCutoutValidators, null, true);\n\t\t},\n\t\thasGroupedCutoutValidatorErrors: (state, getters): boolean => {\n\t\t\treturn getters.getGroupedCutoutValidatorErrors.length > 0;\n\t\t},\n\t\tgetCutoutValidationMessage(state, getters) {\n\t\t\treturn (field: string): string => {\n\t\t\t\treturn getValidationMessageForField(getters.getCutoutValidators, field);\n\t\t\t};\n\t\t},\n\t\tgetGroupedCutoutValidationMessage: (state, getters): string => {\n\t\t\tif (getters.hasGroupedCutoutValidatorErrors) {\n\t\t\t\treturn getters.getGroupedCutoutValidatorErrors[0].getMessage();\n\t\t\t}\n\n\t\t\treturn '';\n\t\t},\n\t\tisCutoutValid: (state, getters) => {\n\t\t\treturn (field: string): boolean => {\n\t\t\t\treturn !hasValidationErrors(getters.getCutoutValidators, field);\n\t\t\t};\n\t\t},\n\t\tisCutoutGroupValid: (state, getters) => {\n\t\t\treturn (field: string): boolean => {\n\t\t\t\treturn !hasValidationErrors(getters.getGroupedCutoutValidatorErrors, field, true);\n\t\t\t};\n\t\t},\n\t}\n};\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport makerjs from \"makerjs\";\nimport {isEmpty} from \"lodash\";\nimport OffsetLine from \"../Lines/OffsetLine\";\nimport { IPoint } from \"makerjs\";\n\nexport class Arrow extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'arrow', dimensions );\n\n\t\tthis.labelMappings = {\n\t\t\thead_width: 'head_height',\n\t\t\thead_length: 'head_width',\n\t\t\tstem_width: 'stem_height',\n\t\t\tstem_length: 'stem_width',\n\t\t};\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.getStemLength().add( this.getHeadLength() );\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.getStemWidth().max( this.getHeadWidth() );\n\t}\n\n\t/**\n\t * Gets the stem width.\n\t */\n\tgetStemWidth(): Length {\n\t\treturn this.cleanedPrimitives.stem_width;\n\t}\n\n\t/**\n\t * Gets the stem length.\n\t */\n\tgetStemLength(): Length {\n\t\treturn this.cleanedPrimitives.stem_length;\n\t}\n\n\t/**\n\t * Gets the head width.\n\t */\n\tgetHeadWidth(): Length {\n\t\treturn this.cleanedPrimitives.head_width;\n\t}\n\n\t/**\n\t * Gets the head length.\n\t */\n\tgetHeadLength(): Length {\n\t\treturn this.cleanedPrimitives.head_length;\n\t}\n\n\t/**\n\t * Gets the difference in width between the head and stem..\n\t */\n\tgetWidthDifference(): Length {\n\t\treturn this.getHeadWidth().subtract( this.getStemWidth() ).abs();\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'stem_width', secondary: 'stem_length', tertiary: 'head_length', quaternary: 'head_width' };\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( isEmpty( this.cleanedPrimitives ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\n\t\tmakerjs.model.zero( this.model );\n\t\tmakerjs.model.originate( this.model );\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\n\t\t// Offset the center seeing as [ 0, 0 ] is the bottom-left corner of the stem.\n\t\tconst centerY = this.getHeadWidth().divide( 2 ).subtract( this.getStemWidth().divide( 2 ) );\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, centerY.in_mm()], [0, centerY.add( this.getStemWidth() ).in_mm()], this.renderDimensionLabel( 'stem_height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-arrow-stem_width', focusedElement, forceRender) ), // Stem height - vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [this.getStemLength().in_mm(), 0], this.renderDimensionLabel( 'stem_width' ), [0, -40], ratio, this.getDimensionLineType('measurements-arrow-stem_length', focusedElement, forceRender) ), // Stem width - Horizontal line\n\n\t\t\t\t// Head height - vertical line\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getLength().in_mm(), 0],\n\t\t\t\t\t[this.getLength().in_mm(), this.getHeadWidth().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel( 'head_height' ),\n\t\t\t\t\t[40, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-arrow-head_width', focusedElement, forceRender)\n\t\t\t\t),\n\n\t\t\t\t// Head width - horizontal line\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getStemLength().in_mm(), 0],\n\t\t\t\t\t[this.getStemLength().add( this.getHeadLength() ).in_mm(), 0],\n\t\t\t\t\tthis.renderDimensionLabel( 'head_width' ),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-arrow-head_length', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\tstem_width: 10,\n\t\t\tstem_length: 50,\n\t\t\thead_length: 30,\n\t\t\thead_width: 40,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst parentWidth = enclosingRectangle.width();\n\t\tconst parentHeight = enclosingRectangle.height();\n\n\t\tconst width = parentWidth.divide(4).in_cm();\n\t\tconst height = parentHeight.divide(4).in_cm();\n\n\t\treturn {\n\t\t\tstem_width: width,\n\t\t\tstem_length: height,\n\t\t\thead_length: Math.round(width + (width / 4 )),\n\t\t\thead_width: Math.round(height + (width / 2 )),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class Ellipse extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'ellipse', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [-this.getWidth().divide(2).in_mm(), -this.getHeight().divide(2).in_mm()], [-this.getWidth().divide(2).in_mm(), this.getHeight().divide(2).in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-ellipse-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [-this.getWidth().divide(2).in_mm(), -this.getHeight().divide(2).in_mm()], [this.getWidth().divide(2).in_mm(), -this.getHeight().divide(2).in_mm() ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-ellipse-width', focusedElement, forceRender) ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 25,\n\t\t\twidth: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\theight: height.divide(3).in_cm(),\n\t\t};\n\t}\n}\n","import Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class HalfCircle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'half-circle', dimensions );\n\t}\n\n\tgetDiameter(): Length {\n\t\treturn this.cleanedPrimitives.diameter;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.diameter;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.diameter.divide( 2 );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.diameter.divide( 2 );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'diameter' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getDiameter().in_mm(), 0 ], this.renderDimensionLabel( 'diameter' ), [0, -40], ratio, this.getDimensionLineType('measurements-half-circle-diameter', focusedElement, forceRender) ), // Horizontal line\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height', this.getHeight().in_cm() ), [-40, 0], ratio), // Vertical line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { diameter: 50 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\tdiameter: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class Circle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'circle', dimensions );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.diameter;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.diameter;\n\t}\n\n\tgetDiameter(): Length {\n\t\treturn this.cleanedPrimitives.diameter;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'diameter' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tconst dimensionLines = [];\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine( [-this.getDiameter().divide(2).in_mm(), -this.getDiameter().divide(2).in_mm()], [ -this.getDiameter().divide(2).in_mm(), this.getDiameter().divide(2).in_mm() ], this.renderDimensionLabel( 'height', this.getWidth() ), [-40, 0], ratio ), // Vertical line\n\t\t\t\tnew DimensionLine( [-this.getDiameter().divide(2).in_mm(), -this.getDiameter().divide(2).in_mm()], [ this.getDiameter().divide(2).in_mm(), -this.getDiameter().divide(2).in_mm() ], this.renderDimensionLabel( 'width', this.getWidth() ), [0, -40], ratio ) // Horizontal line\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-circle-diameter\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine( [-this.getDiameter().divide(2).in_mm(), 0], [ this.getDiameter().divide(2).in_mm(), 0 ], this.renderDimensionLabel( 'diameter' ), [0, 0], ratio, this.getDimensionLineType('measurements-circle-diameter', focusedElement, forceRender) ) // Horizontal line\n\t\t\t);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { diameter: 50 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\tdiameter: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport makerjs, { IPoint } from \"makerjs\";\nimport {isEmpty} from \"lodash\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class Heart extends AbstractShape {\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'heart', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\tconst a = this.getLength().in_cm() / (\n\t\t\t3 / 4 * Math.sqrt( 2 ) + 1 / 2\n\t\t);\n\n\t\tconst heartWidth = a * (\n\t\t\tMath.sqrt( 2 ) / 2 + 1\n\t\t);\n\n\t\treturn Length.from_cm( heartWidth );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-heart-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width', this.getWidth().in_cm() ), [0, -40], ratio ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( isEmpty( this.cleanedPrimitives ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\n\t\tmakerjs.model.zero( this.model );\n\t\tmakerjs.model.originate( this.model );\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { height: 20 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight: height.divide(4).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport makerjs from \"makerjs\";\nimport {isEmpty} from \"lodash\";\n\nexport class Hexagon extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'hexagon', dimensions );\n\t}\n\n\tgetSideLength(): Length {\n\t\treturn this.cleanedPrimitives.side_length;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.side_length;\n\t}\n\n\tgetWidth(): Length {\n\t\tconst width = this.getSideLength().multiply(2).in_mm();\n\n\t\treturn Length.from_mm( width );\n\t}\n\n\tgetHeight(): Length {\n\t\tconst height = Math.sqrt(3) * this.getSideLength().in_mm();\n\n\t\treturn Length.from_mm( height );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'side_length' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height', this.getHeight().in_cm() ), [-40, 0], ratio ),\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width', this.getWidth().in_cm() ), [0, -40], ratio ),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-hexagon-side_length\")) {\n\n\t\t\t// Offset the bottom left corner.\n\t\t\tconst sideLengthOffset = this.getSideLength().divide(2);\n\n\t\t\tdimensionLines.push(new DimensionLine( [sideLengthOffset.in_mm(), 0], [ this.getSideLength().add(sideLengthOffset).in_mm(), 0 ], this.renderDimensionLabel( 'side_length' ), [0, 40], ratio, this.getDimensionLineType('measurements-hexagon-side_length', focusedElement, forceRender)));\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( isEmpty( this.cleanedPrimitives ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\n\t\tmakerjs.model.zero( this.model );\n\t\tmakerjs.model.originate( this.model );\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { side_length: 20 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\tside_length: width.divide(4).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class IsoscelesTriangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'isosceles-triangle', dimensions );\n\n\t\tthis.labelMappings = {\n\t\t\tbase: 'width',\n\t\t};\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetBase(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetSideLength(): Length {\n\t\tconst halfWidth = this.getWidth().divide(2).in_mm();\n\t\tconst height = this.getHeight().in_mm();\n\n\t\tconst sideSquared = halfWidth * halfWidth + height * height;\n\t\tconst sideLength = Math.sqrt(sideSquared);\n\n\t\treturn Length.from_mm(sideLength);\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'base' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-isosceles-triangle-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-isosceles-triangle-base', focusedElement, forceRender) ), // Horizontal line\n\t\t\t\tnew DimensionLine( [ this.getWidth().divide(2).in_mm(), this.getHeight().in_mm() - 20 ], [this.getWidth().in_mm(), -20], this.renderDimensionLabel( 'side_length', this.getSideLength().in_cm() ), [40, 40], ratio ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 50,\n\t\t\tbase: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\tbase: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"../Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\nimport { IPoint } from \"makerjs\";\n\nexport class QuarterCircle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'quarter-circle', dimensions );\n\t}\n\n\tgetRadius(): Length {\n\t\treturn this.cleanedPrimitives.radius;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.radius;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.radius;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'radius' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getLength().in_mm(), 0 ], this.renderDimensionLabel( 'radius', this.getLength().in_cm() ), [0, -40], ratio, this.getDimensionLineType('measurements-quarter-circle-radius', focusedElement, forceRender) ),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { radius: 25 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\tradius: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine, { DimensionLineType } from \"../Lines/DimensionLine\";\n\nexport class Rectangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'rectangle', dimensions );\n\n\t\tthis.labelMappings = {\n\t\t\tlength: 'width',\n\t\t\twidth: 'height',\n\t\t};\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.length;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'length' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getWidth().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-rectangle-width', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getLength().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-rectangle-length', focusedElement, forceRender ) ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 50,\n\t\t\tlength: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth: height.divide(2).in_cm(),\n\t\t\tlength: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"../Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class RightAngledTriangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'right-angled-triangle', dimensions );\n\n\t\tthis.labelMappings = {\n\t\t\tbase: 'width',\n\t\t};\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetBase(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetSideLenght(): Length {\n\t\tconst hypotenuseSquared = this.getWidth().in_mm()**2 + this.getHeight().in_mm()**2;\n\n\t\t// Calculate the hypotenuse by taking the square root\n\t\treturn Length.from_mm(Math.sqrt(hypotenuseSquared));\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'base' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [this.getWidth().in_mm(), 0], [ this.getWidth().in_mm(), this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [40, 0], ratio, this.getDimensionLineType('measurements-right-angled-triangle-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-right-angled-triangle-base', focusedElement, forceRender) ), // Horizontal line\n\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), this.getHeight().in_mm() ], this.renderDimensionLabel( 'side_length', this.getSideLenght().in_cm() ), [-40, 40], ratio ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 50,\n\t\t\tbase: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\tbase: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"../Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class RightAngledTriangleMirrored extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'right-angled-triangle-mirrored', dimensions );\n\n\t\tthis.labelMappings = {\n\t\t\tbase: 'width',\n\t\t};\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetBase(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.base;\n\t}\n\n\tgetSideLenght(): Length {\n\t\tconst hypotenuseSquared = this.getWidth().in_mm()**2 + this.getHeight().in_mm()**2;\n\n\t\t// Calculate the hypotenuse by taking the square root\n\t\treturn Length.from_mm(Math.sqrt(hypotenuseSquared));\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'base' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-right-angled-triangle-mirrored-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-right-angled-triangle-mirrored-base', focusedElement, forceRender) ), // Horizontal line\n\n\t\t\t\tnew DimensionLine( [ 0, this.getHeight().in_mm() ], [this.getWidth().in_mm(), 0], this.renderDimensionLabel( 'side_length', this.getSideLenght().in_cm() ), [40, 40], ratio ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 50,\n\t\t\tbase: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\tbase: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import {IModel, IPoint} from \"makerjs\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\n\nexport default class GuideLine {\n\tprivate readonly startPoint: IPoint;\n\tprivate readonly endPoint: IPoint;\n\n\tconstructor( startPoint: IPoint, endPoint: IPoint ) {\n\t\tthis.startPoint = startPoint;\n\t\tthis.endPoint = endPoint;\n\t}\n\n\tgetModel(): IModel {\n\t\tconst model = {} as IModel;\n\t\tmakerjs.model.addPath(model, new makerjs.paths.Line(this.startPoint, this.endPoint), 'guideline');\n\n\t\treturn model;\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\nimport GuideLine from \"../Lines/GuideLine\";\n\nexport class RoundedRectangle extends AbstractShape {\n\tconstructor( dimensions?: object, modifiers?: object ) {\n\t\tsuper( 'rounded-rectangle', dimensions, modifiers );\n\n\t\tthis.labelMappings = {\n\t\t\tlength: 'width',\n\t\t\twidth: 'height',\n\t\t};\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.length;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetRadius(): Length {\n\t\treturn this.cleanedPrimitives.radius;\n\t}\n\n\tgetTopRightRadius(): Length {\n\t\treturn this.cleanedPrimitives[ 'top_right_radius' ];\n\t}\n\n\tgetBottomRightRadius(): Length {\n\t\treturn this.cleanedPrimitives[ 'bottom_right_radius' ];\n\t}\n\n\tgetBottomLeftRadius(): Length {\n\t\treturn this.cleanedPrimitives[ 'bottom_left_radius' ];\n\t}\n\n\tgetTopLeftRadius(): Length {\n\t\treturn this.cleanedPrimitives[ 'top_left_radius' ];\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'length', tertiary: 'radius', quaternary: 'top_right_radius' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getWidth().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-rounded-rectangle-width', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getLength().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-rounded-rectangle-length', focusedElement, forceRender) ), // Horizontal line\n\t\t\t];\n\t\t}\n\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-radius\") ) {\n\t\t\tconst top = this.getWidth().in_mm() - this.getRadius().in_mm();\n\t\t\tconst leftPoint = [0, top];\n\t\t\tconst rightPoint = [this.getRadius().in_mm(), top];\n\t\t\tconst radiusLine = new DimensionLine(leftPoint, rightPoint, this.renderDimensionLabel('radius'), [0, 0], ratio);\n\t\t\tdimensionLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-top_left_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-top_left_radius\") ) {\n\t\t\tconst top = this.getWidth().in_mm() - this.getTopLeftRadius().in_mm();\n\t\t\tconst leftPoint = [0, top];\n\t\t\tconst rightPoint = [this.getTopLeftRadius().in_mm(), top];\n\t\t\tconst radiusLine = new DimensionLine(leftPoint, rightPoint, this.renderDimensionLabel('top_left_radius'), [0, 0], ratio, this.getDimensionLineType('measurements-rounded-rectangle-top_left_radius', focusedElement, forceRender));\n\t\t\tdimensionLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-top_right_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-top_right_radius\") ) {\n\t\t\tconst top = this.getWidth().in_mm() - this.getTopRightRadius().in_mm();\n\t\t\tconst leftPoint = [this.getLength().in_mm() - this.getTopRightRadius().in_mm(), top];\n\t\t\tconst rightPoint = [this.getLength().in_mm(), top];\n\t\t\tconst radiusLine = new DimensionLine(leftPoint, rightPoint, this.renderDimensionLabel('top_right_radius'), [0, 0], ratio, this.getDimensionLineType('measurements-rounded-rectangle-top_right_radius', focusedElement, forceRender));\n\t\t\tdimensionLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-bottom_left_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-bottom_left_radius\") ) {\n\t\t\tconst top = this.getBottomLeftRadius().in_mm();\n\t\t\tconst leftPoint = [0, top];\n\t\t\tconst rightPoint = [this.getBottomLeftRadius().in_mm(), top];\n\t\t\tconst radiusLine = new DimensionLine(leftPoint, rightPoint, this.renderDimensionLabel('bottom_left_radius'), [0, 0], ratio, this.getDimensionLineType('measurements-rounded-rectangle-bottom_left_radius', focusedElement, forceRender));\n\t\t\tdimensionLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-bottom_right_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-bottom_right_radius\") ) {\n\t\t\tconst top = this.getBottomRightRadius().in_mm();\n\t\t\tconst leftPoint = [this.getLength().in_mm() - this.getBottomRightRadius().in_mm(), top];\n\t\t\tconst rightPoint = [this.getLength().in_mm(), top];\n\t\t\tconst radiusLine = new DimensionLine(leftPoint, rightPoint, this.renderDimensionLabel('bottom_right_radius'), [0, 0], ratio, this.getDimensionLineType('measurements-rounded-rectangle-bottom_right_radius', focusedElement, forceRender));\n\t\t\tdimensionLines.push(radiusLine);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tconst guideLines = [];\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-radius\") ) {\n\t\t\tconst left = this.getRadius().in_mm();\n\t\t\tconst topPoint = [left, this.getWidth().in_mm()];\n\t\t\tconst bottomPoint = [left, this.getWidth().in_mm() - this.getRadius().in_mm()];\n\t\t\tconst radiusLine = new GuideLine(topPoint, bottomPoint);\n\t\t\tguideLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-top_left_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-top_left_radius\") ) {\n\t\t\tconst left = this.getTopLeftRadius().in_mm();\n\t\t\tconst topPoint = [left, this.getWidth().in_mm()];\n\t\t\tconst bottomPoint = [left, this.getWidth().in_mm() - this.getTopLeftRadius().in_mm()];\n\t\t\tconst radiusLine = new GuideLine(topPoint, bottomPoint);\n\t\t\tguideLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-top_right_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-top_right_radius\") ) {\n\t\t\tconst left = this.getLength().in_mm() - this.getTopRightRadius().in_mm();\n\t\t\tconst topPoint = [left, this.getWidth().in_mm()];\n\t\t\tconst bottomPoint = [left, this.getWidth().in_mm() - this.getTopRightRadius().in_mm()];\n\t\t\tconst radiusLine = new GuideLine(topPoint, bottomPoint);\n\t\t\tguideLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-bottom_left_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-bottom_left_radius\") ) {\n\t\t\tconst left = this.getBottomLeftRadius().in_mm();\n\t\t\tconst topPoint = [left, 0];\n\t\t\tconst bottomPoint = [left, this.getBottomLeftRadius().in_mm()];\n\t\t\tconst radiusLine = new GuideLine(topPoint, bottomPoint);\n\t\t\tguideLines.push(radiusLine);\n\t\t}\n\n\t\t// measurements-rounded-rectangle-bottom_right_radius\n\t\tif( focusedElement.includes(\"measurements-rounded-rectangle-bottom_right_radius\") ) {\n\t\t\tconst left = this.getLength().in_mm() - this.getBottomRightRadius().in_mm();\n\t\t\tconst topPoint = [left, 0];\n\t\t\tconst bottomPoint = [left, this.getBottomRightRadius().in_mm()];\n\t\t\tconst radiusLine = new GuideLine(topPoint, bottomPoint);\n\t\t\tguideLines.push(radiusLine);\n\t\t}\n\n\t\treturn guideLines;\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 50,\n\t\t\tlength: 50,\n\t\t\tradius: 2,\n\t\t\t'top_left_radius': 2,\n\t\t\t'top_right_radius': 2,\n\t\t\t'bottom_left_radius': 2,\n\t\t\t'bottom_right_radius': 2,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst parentWidth = enclosingRectangle.width();\n\t\tconst parentHeight = enclosingRectangle.height();\n\n\t\tconst width = parentWidth.divide(2).in_cm();\n\t\treturn {\n\t\t\twidth: parentHeight.divide(2).in_cm(),\n\t\t\tlength: parentWidth.divide(2).in_cm(),\n\t\t\tradius: width / 10,\n\t\t\t'top_left_radius': width / 10,\n\t\t\t'top_right_radius': width / 10,\n\t\t\t'bottom_left_radius': width / 10,\n\t\t\t'bottom_right_radius': width / 10,\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class SlopedRectangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'sloped-rectangle', dimensions );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height_left;\n\t}\n\n\tgetHeightLeft(): Length {\n\t\treturn this.getLength();\n\t}\n\n\tgetRightLength(): Length {\n\t\treturn this.cleanedPrimitives.height_right;\n\t}\n\n\tgetHeightRight(): Length {\n\t\treturn this.getRightLength();\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height_left', secondary: 'width', tertiary: 'height_right' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [this.getWidth().in_mm(), 0], [this.getWidth().in_mm(), this.getRightLength().in_mm() ], this.renderDimensionLabel( 'height_right' ), [40, 0], ratio, this.getDimensionLineType('measurements-sloped-rectangle-height_right', focusedElement, forceRender)),\n\t\t\t\tnew DimensionLine( [0, 0], [0, this.getLength().in_mm()], this.renderDimensionLabel( 'height_left' ), [-40, 0], ratio, this.getDimensionLineType('measurements-sloped-rectangle-height_left', focusedElement, forceRender) ),\n\t\t\t\tnew DimensionLine( [0, 0], [this.getWidth().in_mm(), 0], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-sloped-rectangle-width', focusedElement, forceRender) ),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight_left: 50,\n\t\t\theight_right: 25,\n\t\t\twidth: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight_left: height.divide(2).in_cm(),\n\t\t\theight_right:height.divide(3).in_cm(),\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\nimport { IPoint } from \"makerjs\";\nimport GuideLine from \"../Lines/GuideLine\";\n\nexport class ArchedRectangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'arched-rectangle', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetRatios(): Ratio[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tfirstDimension: 'height',\n\t\t\t\tsecondDimension: 'width',\n\t\t\t\tratio: 0.5,\n\t\t\t}\n\t\t];\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tconst arcHeight = this.getHeight().in_mm() - this.getWidth().in_mm() / 2;\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-arched-rectangle-height', focusedElement, forceRender) ),\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-arched-rectangle-width', focusedElement, forceRender) ),\n\t\t\t\tnew DimensionLine( [this.getWidth().in_mm() / 2, 0], [this.getWidth().in_mm() / 2, arcHeight], this.renderDimensionLabel( 'height', new Length(arcHeight) ), [0, 0], ratio ),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tconst arcHeight = this.getHeight().in_mm() - this.getWidth().in_mm() / 2;\n\t\treturn [\n\t\t\tnew GuideLine( [0, arcHeight], [this.getWidth().in_mm(), arcHeight] ),\n\t\t];\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( ! this.cleanedPrimitives.height || ! this.cleanedPrimitives.width ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 50,\n\t\t\theight: 75,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\theight: height.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport isUndefined from \"lodash/isUndefined\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport OffsetLine from \"../Lines/OffsetLine\";\nimport GuideLine from \"../Lines/GuideLine\";\n\ninterface TrapezoidPoint {\n\tx: number;\n\ty: number;\n}\n\ninterface TrapezoidOffset {\n\tlength: number;\n\tline: TrapezoidPoint;\n\tx: number;\n\ty: number;\n}\n\nexport interface TrapezoidPosition {\n\ttop: TrapezoidPoint;\n\tbottom: TrapezoidPoint;\n\theight: TrapezoidPoint;\n\toffset: TrapezoidOffset;\n}\n\nexport class Trapezoid extends AbstractShape {\n\tconstructor( dimensions?: object, modifiers?: object ) {\n\t\tsuper( 'trapezoid', dimensions, modifiers );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.getWidthBottom().max( this.getWidthTop() );\n\t}\n\n\tgetWidthTop(): Length {\n\t\treturn this.cleanedPrimitives.width_top;\n\t}\n\n\tgetWidthBottom(): Length {\n\t\treturn this.cleanedPrimitives.width_bottom;\n\t}\n\n\tgetOffsetLeft(): Length {\n\t\treturn this.cleanedPrimitives.offset_left;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width_top', secondary: 'height', tertiary: 'width_bottom', quaternary: 'offset_left' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tconst height_horizontal_position = this.getWidthBottom().max( this.getWidthTop() );\n\n\t\tlet top_starting_x_position = this.getOffsetLeft().abs();\n\t\tlet bottom_starting_x_position = new Length( 0 );\n\n\t\t// If top is wider, we need to adjust the x position of the top and bottom line.\n\t\tif ( this.getWidthTop().in_mm() > this.getWidthBottom().in_mm() ) {\n\t\t\ttop_starting_x_position = new Length( 0 );\n\t\t\tbottom_starting_x_position = this.getOffsetLeft().abs();\n\t\t}\n\n\t\t// The width of the line changes depending on the starting position.\n\t\tconst actual_width_top = this.getWidthTop().add(top_starting_x_position);\n\t\tconst actual_width_bottom = this.getWidthBottom().add(bottom_starting_x_position);\n\n\t\tconst allLines =  [\n\t\t\tnew DimensionLine( [height_horizontal_position.in_mm(), 0], [height_horizontal_position.in_mm(), this.getLength().in_mm()], this.renderDimensionLabel( 'height' ), [40, 0], ratio, this.getDimensionLineType('measurements-trapezoid-height', focusedElement, forceRender) ), // Vertical line\n\t\t\tnew DimensionLine( [top_starting_x_position.in_mm(), this.getLength().in_mm()], [actual_width_top.in_mm(), this.getLength().in_mm()], this.renderDimensionLabel( 'width_top' ), [0, 40], ratio, this.getDimensionLineType('measurements-trapezoid-width_top', focusedElement, forceRender) ), // Horizontal line\n\t\t\tnew DimensionLine( [bottom_starting_x_position.in_mm(), 0], [actual_width_bottom.in_mm(), 0], this.renderDimensionLabel( 'width_bottom' ), [0, -40], ratio, this.getDimensionLineType('measurements-trapezoid-width_bottom', focusedElement, forceRender) ), // Horizontal line\n\t\t];\n\n\t\tconst widest_width = this.getWidthBottom().max( this.getWidthTop() );\n\t\tconst smallest_width = this.getWidthBottom().min( this.getWidthTop() );\n\n\t\tconst left_offset = ( widest_width.in_mm() - smallest_width.in_mm() ) / 2;\n\n\t\tif(left_offset === 0) {\n\t\t\treturn allLines;\n\t\t}\n\n\t\tconst left_point = [0, this.getHeight().in_mm() / 2];\n\t\tconst right_point = [left_offset, this.getHeight().in_mm() / 2];\n\n\t\tallLines.push(new DimensionLine( left_point, right_point, this.renderDimensionLabel( 'offset_left' ), [0, 0], ratio ));\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn allLines;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth_top: 20,\n\t\t\theight: 30,\n\t\t\twidth_bottom: 50,\n\t\t\toffset_left: 15,\n\t\t};\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tconst widest_width = this.getWidthBottom().max( this.getWidthTop() );\n\t\tconst smallest_width = this.getWidthBottom().min( this.getWidthTop() );\n\n\t\tconst left_offset = ( widest_width.in_mm() - smallest_width.in_mm() ) / 2;\n\n\t\tif( left_offset === 0 ) { // Don't show guide lines if the shape is a rectangle.\n\t\t\treturn [];\n\t\t}\n\n\t\tconst bottom_point = [left_offset, 0];\n\t\tconst top_point = [left_offset, this.getHeight().in_mm()];\n\t\treturn [\n\t\t\tnew GuideLine( bottom_point, top_point )\n\t\t];\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\tconst width_top = width.divide(4).in_cm();\n\t\tconst width_bottom = width_top + ( width_top / 2 );\n\n\t\treturn {\n\t\t\twidth_top: width_top,\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\twidth_bottom: width_bottom,\n\t\t\toffset_left: ( ( width_bottom - width_top ) / 2 ),\n\t\t};\n\t}\n\n\tgetHiddenDimensions(): string[] {\n\t\treturn ['offset_left'];\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { cloneObject } from \"makerjs\";\nimport OffsetLine from \"../Lines/OffsetLine\";\n\nexport class Star extends AbstractShape {\n\tconstructor( dimensions?: object, modifiers?: object ) {\n\t\tsuper( 'star', dimensions, modifiers );\n\t}\n\n\tgetOuterRadius(): Length {\n\t\treturn this.cleanedPrimitives.outer_radius;\n\t}\n\n\tgetInnerRadius(): Length {\n\t\treturn this.cleanedPrimitives.inner_radius;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.inner_radius;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.outer_radius;\n\t}\n\n\t/**\n\t * Gets the number of points.\n\t */\n\tgetNumberOfPoints(): number {\n\t\treturn parseInt( this.cleanedPrimitives.number_of_points );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'inner_radius', secondary: 'outer_radius' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif (!this.model) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst starModel = cloneObject(this.model);\n\t\tmakerjs.model.scale(starModel, 10); // Model is in cm, but we want to work in mm.\n\n\t\tconst chains = makerjs.model.findChains(starModel);\n\t\tif(!chains || chains.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst measure = makerjs.measure.modelExtents(this.model);\n\t\tconst pointsOnChain = makerjs.chain.toKeyPoints(chains[0]);\n\t\tconst innerRadiusPoint = makerjs.point.closest([1, -1], pointsOnChain); // Force point to bottom left for readability.\n\t\tconst height = Length.from_cm(measure['height']);\n\t\tconst width = Length.from_cm(measure['width']);\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\n\t\t\t\tnew DimensionLine( [Length.from_cm(measure['low'][0]).in_mm(), Length.from_cm(measure['low'][1]).in_mm()], [ Length.from_cm(measure['low'][0]).in_mm(), Length.from_cm(measure['high'][1]).in_mm() ], this.renderDimensionLabel( 'height', height.in_cm() ), [-40, 0], ratio), // Vertical line\n\n\t\t\t\tnew DimensionLine( [Length.from_cm(measure['low'][0]).in_mm(), Length.from_cm(measure['low'][1]).in_mm()], [ Length.from_cm(measure['high'][0]).in_mm(), Length.from_cm(measure['low'][1]).in_mm() ], this.renderDimensionLabel( 'width', width.in_cm() ), [0, -40], ratio), // Vertical line\n\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'outer_radius' ), [0, 0], ratio, this.getDimensionLineType('measurements-star-outer_radius', focusedElement, forceRender) ), // Outer radius - horizontal line\n\t\t\t\tnew DimensionLine( [0, 0], innerRadiusPoint, this.renderDimensionLabel( 'inner_radius' ), [0, 0], ratio, this.getDimensionLineType('measurements-star-inner_radius', focusedElement, forceRender) ), // Inner radius - diagonal line\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\tinner_radius: 20,\n\t\t\touter_radius: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\tconst outer_radius = width.divide(3).in_cm();\n\n\t\treturn {\n\t\t\tinner_radius: outer_radius - ( outer_radius / 2 ),\n\t\t\touter_radius: outer_radius,\n\t\t};\n\t}\n\n\tgetDefaultCutoutModifiers(): object {\n\t\treturn {\n\t\t\tnumber_of_points: 5,\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport makerjs, { IChain, IModel } from \"makerjs\";\nimport uniqBy from \"lodash/uniqBy\";\nimport take from \"lodash/take\";\nimport DimensionLine from \"../Lines/DimensionLine\";\n\nexport class DXF extends AbstractShape {\n\tconstructor( model: IModel ) {\n\t\tsuper( 'dxf' );\n\t\tthis.model = model;\n\t}\n\n\tcreateModel(): void {}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif ( ! this.model ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst measure = makerjs.measure.modelExtents( this.model );\n\t\tconst extremes = [[measure.low[0], measure.low[1]], [measure.high[0], measure.high[1]]];\n\n\t\tconst verticalLines = [];\n\t\tconst horizontalLines = [];\n\t\tconst shapeBottom = extremes[0][1];\n\t\tconst shapeLeft = extremes[0][0];\n\n\t\tconst chains = makerjs.model.findChains( this.model ) as IChain[];\n\t\tfor ( const chain of chains ) {\n\t\t\tconst chainModel = makerjs.chain.toNewModel( chain, false );\n\t\t\tconst chainMeasure = makerjs.measure.modelExtents( chainModel );\n\t\t\tconst chainExtreme = [[chainMeasure.low[0], chainMeasure.low[1]], [chainMeasure.high[0], chainMeasure.high[1]]];\n\t\t\tverticalLines.push(new DimensionLine( [shapeLeft, chainExtreme[0][1]], [ shapeLeft, chainExtreme[1][1] ], this.renderDimensionLabel( 'height', new Length(chainExtreme[1][1] - chainExtreme[0][1]) ), [-40, 0], ratio)); // Vertical line\n\t\t\thorizontalLines.push(new DimensionLine( [chainExtreme[0][0], shapeBottom], [ chainExtreme[1][0], shapeBottom ], this.renderDimensionLabel( 'width', new Length(chainExtreme[1][0] - chainExtreme[0][0]) ), [0, -40], ratio )); // Horizontal line\n\t\t}\n\n\t\tconst limitedVerticalLines = take( uniqBy( verticalLines, 'label' ), 10 );\n\t\tlimitedVerticalLines.sort((a, b) => b.getLength() - a.getLength()); // We want to show the longest lines first\n\t\tlimitedVerticalLines.forEach( ( line, index ) => {\n\t\t\tline.shiftOffset( index + 1 );\n\t\t});\n\n\t\tconst limitedHorizontalLines = take( uniqBy( horizontalLines, 'label' ), 10 );\n\t\tlimitedHorizontalLines.sort((a, b) => b.getLength() - a.getLength()); // We want to show the longest lines first\n\t\tlimitedHorizontalLines.forEach( ( line, index ) => {\n\t\t\tline.shiftOffset( index + 1 );\n\t\t});\n\n\t\treturn [].concat( limitedVerticalLines, limitedHorizontalLines );\n\t}\n\n\tgetLength(): Length {\n\t\tconst measure = makerjs.measure.modelExtents( this.model );\n\t\treturn Length.from_mm( measure.height );\n\t}\n\n\tgetWidth(): Length {\n\t\tconst measure = makerjs.measure.modelExtents( this.model );\n\t\treturn Length.from_mm( measure.width );\n\t}\n\n\t/**\n\t * Gets the length from the passed extreme array.\n\t *\n\t * @param {array} extremes The extremes to get.\n\t */\n\tgetLengthFromExtreme( extremes ): Length {\n\t\tconst [min, max] = extremes;\n\t\tconst [min_x] = min;\n\t\tconst [max_x] = max;\n\n\t\treturn new Length( max_x - min_x );\n\t}\n\n\t/**\n\t * Gets the width from the passed extreme array.\n\t *\n\t * @param {array} extremes The extremes to get.\n\t */\n\tgetWidthFromExtreme( extremes ): Length {\n\t\tconst [min, max] = extremes;\n\t\tconst [, min_y] = min;\n\t\tconst [, max_y] = max;\n\n\t\treturn new Length( max_y - min_y );\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {};\n\t}\n\n\tgetDefaultCutoutDimensions(): Dimensions {\n\t\treturn {};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport GuideLine from \"../Lines/GuideLine\";\n\nexport class FlatOval extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'flat-oval', dimensions );\n\t}\n\n\tgetRadius(): Length {\n\t\treturn this.cleanedPrimitives.radius;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.radius.multiply(2);\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width; // calculate with radius\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'radius' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\n\t\t// Width of the straight part of the flat oval.\n\t\tconst baseWidth = this.getWidth().subtract(this.getRadius().multiply(2));\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height', this.getHeight().in_cm() ), [-40, 0], ratio ),\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width', this.getWidth().in_cm() ), [0, -40], ratio, this.getDimensionLineType('measurements-flat-oval-width', focusedElement, forceRender) ),\n\t\t\t\tnew DimensionLine( [ this.getRadius().in_mm(), this.getHeight().divide(2).in_mm() ], [ baseWidth.add(this.getRadius()).in_mm(), this.getHeight().divide(2).in_mm() ], this.renderDimensionLabel( 'width', baseWidth.in_cm() ), [0, 0], ratio ),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-flat-oval-radius\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine( [ 0, this.getHeight().divide(2).in_mm() ], [ this.getRadius().in_mm(), this.getHeight().divide(2).in_mm() ], this.renderDimensionLabel( 'radius', this.getRadius().in_cm() ), [ 0, 0 ], ratio, this.getDimensionLineType('measurements-flat-oval-radius', focusedElement, forceRender) )\n\t\t\t);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tconst baseWidth = this.getWidth().subtract(this.getRadius().multiply(2));\n\n\t\treturn [\n\t\t\tnew GuideLine( [ this.getRadius().in_mm(), 0 ], [ this.getRadius().in_mm(), this.getHeight().in_mm() ] ),\n\t\t\tnew GuideLine( [ baseWidth.add(this.getRadius()).in_mm(), 0 ], [ baseWidth.add(this.getRadius()).in_mm(), this.getHeight().in_mm() ] ),\n\t\t];\n\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\tradius: 20,\n\t\t\twidth: 100,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\tradius: width.divide(5).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine, { DimensionLineType } from \"@/Models/Lines/DimensionLine\";\n\nexport class SlopedRightRectangle extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'sloped-right-rectangle', dimensions );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width_bottom;\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidthTop(): Length {\n\t\treturn this.cleanedPrimitives.width_top;\n\t}\n\n\tgetWidthBottom(): Length {\n\t\treturn this.cleanedPrimitives.width_bottom;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width_top', tertiary: 'width_bottom' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tconst prefix = focusedElement.includes(\"cutout_measurement\") && !forceRender ? 'cutout_' : '';\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [0, this.getHeight().in_mm()], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, `${prefix}measurements-sloped-right-rectangle-height` === focusedElement ? DimensionLineType.primary : DimensionLineType.default ),\n\t\t\t\tnew DimensionLine( [0, this.getHeight().in_mm()], [this.getWidthTop().in_mm(), this.getHeight().in_mm()], this.renderDimensionLabel( 'width_top' ), [0, 40], ratio, `${prefix}measurements-sloped-right-rectangle-width_top` === focusedElement ? DimensionLineType.primary : DimensionLineType.default ),\n\t\t\t\tnew DimensionLine( [0, 0], [this.getWidthBottom().in_mm(), 0], this.renderDimensionLabel( 'width_bottom' ), [0, -40], ratio, `${prefix}measurements-sloped-right-rectangle-width_bottom` === focusedElement ? DimensionLineType.primary : DimensionLineType.default ),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 50,\n\t\t\twidth_top: 50,\n\t\t\twidth_bottom: 25,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth_top: width.divide(2).in_cm(),\n\t\t\twidth_bottom:width.divide(3).in_cm(),\n\t\t\theight: height.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport makerjs from \"makerjs\";\nimport {isEmpty} from \"lodash\";\n\nexport class Octagon extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'octagon', dimensions );\n\t}\n\n\tgetSideLength(): Length {\n\t\treturn this.cleanedPrimitives.side_length;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.side_length;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.side_length;\n\t}\n\n\tgetHeight(): Length {\n\t\tconst height = (1 + Math.sqrt(2)) * this.getSideLength().in_mm();\n\n\t\treturn Length.from_mm( height );\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'side_length' };\n\t}\n\n\tgetRadius(): Length {\n\t\tconst sides = 8;\n\t\tconst angleInRadians = Math.PI / sides;\n\t\tconst sinAngle = Math.sin( angleInRadians );\n\t\tconst radius = this.getSideLength().in_mm() / ( 2 * sinAngle );\n\t\treturn Length.from_mm( radius );\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\n\t\t// Calculate the sloped side radius\n\t\tconst angleInRadians = Math.PI / 4;\n\t\tconst sinAngle = Math.sin( angleInRadians );\n\t\tconst radius = this.getSideLength().in_mm() / ( 2 * sinAngle );\n\t\tconst offset = Length.from_mm( radius );\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height', this.getHeight().in_cm() ), [-40, 0], ratio ),\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getHeight().in_mm(), 0 ], this.renderDimensionLabel( 'width', this.getHeight().in_cm() ), [0, -40], ratio ),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-octagon-side_length\")) {\n\t\t\tdimensionLines.push(new DimensionLine( [offset.in_mm(), 0], [ this.getSideLength().add(offset).in_mm(), 0 ], this.renderDimensionLabel( 'side_length' ), [0, 40], ratio, this.getDimensionLineType('measurements-octagon-side_length', focusedElement, forceRender) ));\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( isEmpty( this.cleanedPrimitives ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\n\t\tmakerjs.model.zero( this.model );\n\t\tmakerjs.model.originate( this.model );\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn { side_length: 20 };\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\tside_length: width.divide(4).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class Droplet extends AbstractShape {\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'droplet', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine([0, 0], [0, this.getHeight().in_mm()], this.renderDimensionLabel('height'), [-40, 0], ratio, this.getDimensionLineType('measurements-droplet-height', focusedElement, forceRender)),\n\t\t\t\tnew DimensionLine([0, 0], [this.getWidth().in_mm(), 0], this.renderDimensionLabel('width'), [0, -40], ratio, this.getDimensionLineType('measurements-droplet-width', focusedElement, forceRender)),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 80,\n\t\t\twidth: 50\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\twidth: height.divide(4).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport makerjs from \"makerjs\";\nexport class Polygon extends AbstractShape {\n\tconstructor( dimensions?: object, modifiers?: object ) {\n\t\tsuper( 'polygon', dimensions, modifiers );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetSideAmount(): number {\n\t\treturn +this.cleanedPrimitives.side_amount;\n\t}\n\n\tgetSideLength(): Length {\n\t\tconst sideLength = 2 * this.getWidth().divide(2).in_mm() * Math.sin(Math.PI / this.getSideAmount());\n\n\t\treturn Length.from_mm(sideLength);\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif (!this.model) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tconst measure = makerjs.measure.modelExtents(this.model);\n\n\t\t\t// @ts-expect-error - makerjs types are incorrect\n\t\t\tconst line = this.getClosestLineToOrigin(this.model.paths);\n\n\t\t\tconst startLine = [Length.from_cm(line.origin[0]).in_mm(), Length.from_cm(line.origin[1]).in_mm()];\n\t\t\tconst endLine = [Length.from_cm(line.end[0]).in_mm(), Length.from_cm(line.end[1]).in_mm()];\n\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-polygon-width', focusedElement, forceRender) ),\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, Length.from_cm(measure.height).in_mm() ], this.renderDimensionLabel( 'height', Length.from_cm(measure.height).in_cm() ), [-40, 0], ratio ),\n\n\t\t\t\tnew DimensionLine( startLine, endLine, this.renderDimensionLabel( 'width', this.getSideLength().in_cm() ), [0, 0], ratio ),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Creates a model instance of the shape.\n\t */\n\tcreateModel(): void {\n\t\tif ( ! this.cleanedPrimitives.width || ! this.cleanedPrimitives.side_amount ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\n\t\tif ( ! this.model ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmakerjs.model.zero( this.model );\n\t\tmakerjs.model.originate( this.model );\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 80,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t};\n\t}\n\n\tgetDefaultCutoutModifiers(): object {\n\t\treturn {\n\t\t\tside_amount: 8,\n\t\t};\n\t}\n\n\tgetClosestLineToOrigin(shapeLines: makerjs.paths.Line[]): makerjs.paths.Line {\n\t\tlet closestLine = '';\n\t\tlet minDistance = Infinity;\n\n\t\tfor (const [key, line] of Object.entries(shapeLines)) {\n\t\t\tconst originDistance = Math.sqrt(Math.pow(line.origin[0], 2) + Math.pow(line.origin[1], 2));\n\t\t\tconst endDistance = Math.sqrt(Math.pow(line.end[0], 2) + Math.pow(line.end[1], 2));\n\n\t\t\tconst distance = Math.min(originDistance, endDistance);\n\n\t\t\tif (distance < minDistance) {\n\t\t\t\tminDistance = distance;\n\t\t\t\tclosestLine = key;\n\t\t\t}\n\t\t}\n\n\t\treturn shapeLines[closestLine];\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class Egg extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'egg', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tconst radiusY = this.getHeight().divide(3);\n\t\t\tconst radiusX = this.getWidth().divide(2);\n\n\t\t\treturn [\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[-radiusX.in_mm(), -radiusY.in_mm()],\n\t\t\t\t\t[-radiusX.in_mm(), this.getHeight().in_mm()-radiusY.in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height'),\n\t\t\t\t\t[-40, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-egg-height', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[-radiusX.in_mm(), -radiusY.in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm()-radiusX.in_mm(), -radiusY.in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('width'),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-egg-width', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 50,\n\t\t\twidth: 30,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth: width.divide(3).in_cm(),\n\t\t\theight: height.divide(2).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, { Dimensions, DimensionProperties } from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport GuideLine from \"@/Models/Lines/GuideLine\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { isEmpty } from \"lodash\";\n\nexport class Kite extends AbstractShape {\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'kite', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.getHeightTop().add( this.getHeightBottom() );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.getWidth();\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetHeightTop(): Length {\n\t\treturn this.cleanedPrimitives.height_top;\n\t}\n\n\tgetHeightBottom(): Length {\n\t\treturn this.cleanedPrimitives.height_bottom;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'height_top', tertiary: 'height_bottom' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[0, this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height', this.getHeight().in_cm()),\n\t\t\t\t\t[-40, 0],\n\t\t\t\t\tratio\n\t\t\t\t),\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[this.getWidth().in_mm(), 0],\n\t\t\t\t\tthis.renderDimensionLabel('width', this.getWidth().in_cm()),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-kite-width\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('width', this.getWidth().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-kite-width', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-kite-height_top\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height_top', this.getHeightTop().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-kite-height_top', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-kite-height_bottom\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), 0],\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height_bottom', this.getHeightBottom().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-kite-height_bottom', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tif(focusedElement.includes(\"measurements-kite-height_bottom\") || focusedElement.includes(\"measurements-kite-height_top\")) {\n\t\t\treturn [\n\t\t\t\tnew GuideLine(\n\t\t\t\t\t[0, this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm(), this.getHeightBottom().in_mm()]\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tcreateModel(): void {\n\t\tif(isEmpty(this.cleanedPrimitives)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\t\tmakerjs.model.zero(this.model);\n\t\tmakerjs.model.originate(this.model);\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 50,\n\t\t\theight_top: 30,\n\t\t\theight_bottom: 50,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst height = enclosingRectangle.height();\n\t\tconst width = enclosingRectangle.width();\n\n\t\tconst height_top = height.divide(4).in_cm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\theight_top: height_top,\n\t\t\theight_bottom: height_bottom,\n\t\t};\n\t}\n}\n","import AbstractShape, { Dimensions, DimensionProperties } from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { isEmpty } from \"lodash\";\n\nexport class Barrel extends AbstractShape {\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'barrel', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.getWidth();\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetSideHeight(): Length {\n\t\treturn this.cleanedPrimitives.side_height;\n\t}\n\n\tgetLargestHeight(): Length {\n\t\tconst height = this.getHeight();\n\t\tconst sideHeight = this.getSideHeight();\n\t\treturn height.in_mm() > sideHeight.in_mm() ? height : sideHeight;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'height', tertiary: 'side_height' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[0, this.getLargestHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height', this.getLargestHeight().in_cm()),\n\t\t\t\t\t[-40, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-barrel-height', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[this.getWidth().in_mm(), 0],\n\t\t\t\t\tthis.renderDimensionLabel('width'),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-barrel-width', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-barrel-height\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), 0],\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height'),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-barrel-height', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-barrel-side_height\")) {\n\t\t\tconst offsetY = this.getLargestHeight().subtract(this.getSideHeight()).divide(2);\n\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, offsetY.in_mm()],\n\t\t\t\t\t[0, offsetY.add(this.getSideHeight()).in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('side_height'),\n\t\t\t\t\t[40, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-barrel-side_height', focusedElement, forceRender)\n\t\t\t\t),\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().in_mm(), offsetY.in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm(), offsetY.add(this.getSideHeight()).in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('side_height'),\n\t\t\t\t\t[-40, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-barrel-side_height', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tcreateModel(): void {\n\t\tif(isEmpty(this.cleanedPrimitives)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\t\tmakerjs.model.zero(this.model);\n\t\tmakerjs.model.originate(this.model);\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 70,\n\t\t\theight: 40,\n\t\t\tside_height: 20,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst height = enclosingRectangle.height();\n\t\tconst width = enclosingRectangle.width();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\theight: height.divide(2).in_cm(),\n\t\t\tside_height: height.divide(4).in_cm(),\n\t\t};\n\t}\n}\n","import AbstractShape, { Dimensions, DimensionProperties } from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\nimport GuideLine from \"@/Models/Lines/GuideLine\";\nimport { makerjs } from \"../../../../source/js/shared/rendering/makerjs\";\nimport { isEmpty } from \"lodash\";\n\nexport class Jewel extends AbstractShape {\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'jewel', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.getHeightTop().add( this.getHeightBottom() );\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.getWidth();\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width_bottom;\n\t}\n\n\tgetHeightTop(): Length {\n\t\treturn this.cleanedPrimitives.height_top;\n\t}\n\n\tgetHeightBottom(): Length {\n\t\treturn this.cleanedPrimitives.height_bottom;\n\t}\n\n\tgetWidthTop(): Length {\n\t\treturn this.cleanedPrimitives.width_top;\n\t}\n\n\tgetWidthBottom(): Length {\n\t\treturn this.cleanedPrimitives.width_bottom;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width_top', secondary: 'width_bottom', tertiary: 'height_top', quaternary: 'height_bottom' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tlet dimensionLines = [];\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\tdimensionLines = [\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[0, this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height', this.getHeight().in_cm()),\n\t\t\t\t\t[-40, 0],\n\t\t\t\t\tratio\n\t\t\t\t),\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[this.getWidth().in_mm(), 0],\n\t\t\t\t\tthis.renderDimensionLabel('width', this.getWidth().in_cm()),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-jewel-width_top\")) {\n\t\t\tconst offset = this.getWidth().subtract(this.getWidthTop()).divide(2).in_mm();\n\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[offset, this.getHeight().in_mm()],\n\t\t\t\t\t[this.getWidthTop().in_mm() + offset, this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('width_top', this.getWidthTop().in_cm()),\n\t\t\t\t\t[0, -40],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-jewel-width_top', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tif(focusedElement.includes(\"measurements-jewel-width_bottom\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[0, this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('width_bottom', this.getWidthTop().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-jewel-width_bottom', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-jewel-height_top\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeight().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height_top', this.getHeightTop().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-jewel-height_top', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif(focusedElement.includes(\"measurements-jewel-height_bottom\")) {\n\t\t\tdimensionLines.push(\n\t\t\t\tnew DimensionLine(\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), 0],\n\t\t\t\t\t[this.getWidth().divide(2).in_mm(), this.getHeightBottom().in_mm()],\n\t\t\t\t\tthis.renderDimensionLabel('height_bottom', this.getHeightBottom().in_cm()),\n\t\t\t\t\t[0, 0],\n\t\t\t\t\tratio,\n\t\t\t\t\tthis.getDimensionLineType('measurements-jewel-height_bottom', focusedElement, forceRender)\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn dimensionLines;\n\t}\n\n\tgetGuideLines(focusedElement = ''): GuideLine[] {\n\t\tif(focusedElement.includes(\"measurements-jewel-height_bottom\") || focusedElement.includes(\"measurements-jewel-height_top\")) {\n\t\t\treturn [\n\t\t\t\tnew GuideLine(\n\t\t\t\t\t[0, this.getHeightBottom().in_mm()],\n\t\t\t\t\t[this.getWidth().in_mm(), this.getHeightBottom().in_mm()]\n\t\t\t\t),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tcreateModel(): void {\n\t\tif(isEmpty(this.cleanedPrimitives)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.createModel();\n\t\tmakerjs.model.zero(this.model);\n\t\tmakerjs.model.originate(this.model);\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth_top: 20,\n\t\t\twidth_bottom: 40,\n\t\t\theight_top: 10,\n\t\t\theight_bottom: 40,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst height = enclosingRectangle.height();\n\t\tconst width = enclosingRectangle.width();\n\n\t\tconst height_top = height.divide(4).in_cm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\treturn {\n\t\t\twidth_top: width.divide(4).in_cm(),\n\t\t\twidth_bottom: width.divide(2).in_cm(),\n\t\t\theight_top: height_top,\n\t\t\theight_bottom: height_bottom,\n\t\t};\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"@/Models/Lines/DimensionLine\";\n\nexport class Parallelogram extends AbstractShape {\n\tangle = 60; // Defined in makerjs.js\n\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'parallelogram', dimensions );\n\t}\n\n\tgetHeight(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.height;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetSlantedWidth(): Length {\n\t\tconst angleRadians = this.angle * Math.PI / 180;\n\t\tconst slantHeight = this.getHeight().in_mm() / Math.sin(angleRadians);\n\t\tconst width = slantHeight * Math.cos(angleRadians);\n\n\t\treturn Length.from_mm(width);\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'height', secondary: 'width' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\tif(focusedElement.includes(\"cutout_measurement\") || forceRender) {\n\t\t\treturn [\n\t\t\t\tnew DimensionLine( [0, 0], [ 0, this.getHeight().in_mm() ], this.renderDimensionLabel( 'height' ), [-40, 0], ratio, this.getDimensionLineType('measurements-parallelogram-height', focusedElement, forceRender) ), // Vertical line\n\t\t\t\tnew DimensionLine( [0, 0], [ this.getWidth().in_mm(), 0 ], this.renderDimensionLabel( 'width' ), [0, -40], ratio, this.getDimensionLineType('measurements-parallelogram-width', focusedElement, forceRender) ), // Horizontal line\n\t\t\t\tnew DimensionLine([0, this.getHeight().in_mm()], [this.getSlantedWidth().add(this.getWidth()).in_mm(), this.getHeight().in_mm()], this.renderDimensionLabel('width', this.getSlantedWidth().add(this.getWidth()).in_cm()), [0, 40], ratio),\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\theight: 60,\n\t\t\twidth: 100,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\tconst enclosingRectangle = parentShape.getEnclosingRectangle();\n\t\tconst width = enclosingRectangle.width();\n\t\tconst height = enclosingRectangle.height();\n\n\t\treturn {\n\t\t\twidth: width.divide(2).in_cm(),\n\t\t\theight: height.divide(3).in_cm(),\n\t\t};\n\t}\n}\n","import { Arrow } from \"./Arrow\";\nimport { Ellipse } from \"./Ellipse\";\nimport { HalfCircle } from \"./HalfCircle\";\nimport { Circle } from \"./Circle\";\nimport { Heart } from \"./Heart\";\nimport { Hexagon } from \"./Hexagon\";\nimport { IsoscelesTriangle } from \"./IsoscelesTriangle\";\nimport { QuarterCircle } from \"./QuarterCircle\";\nimport { Rectangle } from \"./Rectangle\";\nimport { RightAngledTriangle } from \"./RightAngledTriangle\";\nimport { RightAngledTriangleMirrored } from \"./RightAngledTriangleMirrored\";\nimport { RoundedRectangle } from \"./RoundedRectangle\";\nimport { SlopedRectangle } from \"./SlopedRectangle\";\nimport { ArchedRectangle } from \"./ArchedRectangle\";\nimport { Text } from \"./Text\";\nimport { Trapezoid } from \"./Trapezoid\";\nimport { Star } from \"./Star\";\nimport { DXF } from \"./DXF\";\nimport AbstractShape from \"./AbstractShape\";\nimport { IModel } from \"makerjs\";\nimport { FlatOval } from \"./FlatOval\";\nimport { SlopedRightRectangle } from \"./SlopedRightRectangle\";\nimport { Octagon } from \"./Octagon\";\nimport { Droplet } from \"./Droplet\";\nimport { Polygon } from \"./Polygon\";\nimport { Egg } from \"./Egg\";\nimport { Kite } from \"./Kite\";\nimport { Barrel } from \"./Barrel\";\nimport { Jewel } from \"./Jewel\";\nimport { Parallelogram } from \"./Parallelogram\";\n\ninterface PreviewShapeFactoryParameters {\n\tshape: string;\n\tdimensions?: object;\n\tmodifiers?: object;\n\tfonts?: object;\n\tmodel?: IModel;\n}\n\nexport class PreviewShapeFactory {\n\tget( { shape, dimensions, modifiers, fonts, model = null }: PreviewShapeFactoryParameters ): AbstractShape {\n\t\tlet instance = null;\n\n\t\tswitch (shape) {\n\t\t\tcase 'rectangle':\n\t\t\t\tinstance = new Rectangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'right-angled-triangle':\n\t\t\t\tinstance = new RightAngledTriangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'right-angled-triangle-mirrored':\n\t\t\t\tinstance = new RightAngledTriangleMirrored( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'rounded-rectangle':\n\t\t\t\tinstance = new RoundedRectangle( dimensions, modifiers );\n\t\t\t\tbreak;\n\t\t\tcase 'egg':\n\t\t\t\tinstance = new Egg( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'ellipse':\n\t\t\t\tinstance = new Ellipse( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'flat-oval':\n\t\t\t\tinstance = new FlatOval( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'isosceles-triangle':\n\t\t\t\tinstance = new IsoscelesTriangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'quarter-circle':\n\t\t\t\tinstance = new QuarterCircle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'half-circle':\n\t\t\t\tinstance = new HalfCircle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'circle':\n\t\t\t\tinstance = new Circle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'star':\n\t\t\t\tinstance = new Star( dimensions, modifiers );\n\t\t\t\tbreak;\n\t\t\tcase 'hexagon':\n\t\t\t\tinstance = new Hexagon( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'octagon':\n\t\t\t\tinstance = new Octagon( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'polygon':\n\t\t\t\tinstance = new Polygon( dimensions, modifiers );\n\t\t\t\tbreak;\n\t\t\tcase 'arrow':\n\t\t\t\tinstance = new Arrow( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'heart':\n\t\t\t\tinstance = new Heart( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'sloped-rectangle':\n\t\t\t\tinstance = new SlopedRectangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'sloped-right-rectangle':\n\t\t\t\tinstance = new SlopedRightRectangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'arched-rectangle':\n\t\t\t\tinstance = new ArchedRectangle( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'trapezoid':\n\t\t\t\tinstance = new Trapezoid( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'kite':\n\t\t\t\tinstance = new Kite( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'barrel':\n\t\t\t\tinstance = new Barrel( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'jewel':\n\t\t\t\tinstance = new Jewel( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'droplet':\n\t\t\t\tinstance = new Droplet( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'parallelogram':\n\t\t\t\tinstance = new Parallelogram( dimensions );\n\t\t\t\tbreak;\n\t\t\tcase 'text':\n\t\t\t\tinstance = new Text( dimensions, fonts, modifiers );\n\t\t\t\tbreak;\n\t\t\tcase 'dxf':\n\t\t\t\tinstance = new DXF( model );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (instance !== null) {\n\t\t\tinstance.createModel();\n\t\t}\n\n\t\treturn instance;\n\t}\n}\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'rectangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'rectangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'rectangle', cutoutMeasurements.dimensions[ 'rectangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'rectangle', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\nimport isEmpty from \"lodash/isEmpty\";\nimport omitBy from \"lodash/omitBy\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'rounded-rectangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'rounded-rectangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'rounded-rectangle', cutoutMeasurements.dimensions[ 'rounded-rectangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'rounded-rectangle', parsedDimensions );\n\t\t},\n\t\tuseIndividualCorners: ( state, getters, rootState ): boolean => {\n\t\t\tconst { pricingGroup } = window.measurementSelectorVariables;\n\t\t\tconst { modifiers } = rootState.measurements;\n\n\t\t\tif ( 'use_individual_corners' in modifiers ) {\n\t\t\t\treturn modifiers.use_individual_corners === true;\n\t\t\t}\n\n\t\t\tif ( ! ( 'rounded-rectangle' in pricingGroup.shape_settings ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn pricingGroup.shape_settings[ 'rounded-rectangle' ][ 'use_individual_corners' ];\n\t\t},\n\t\tdefaultCutoutDimensions: ( state, getters, rootState, rootGetters ): Record<string, number> => {\n\t\t\tconst parent = new PreviewShapeFactory().get( { shape: rootGetters.shape } ).getDimensionProperties();\n\t\t\tconst { primary, secondary } = parent;\n\n\t\t\tconst dimensions = {\n\t\t\t\twidth: rootGetters.dimensions[primary] / 2,\n\t\t\t\tlength: rootGetters.dimensions[secondary ?? primary] / 2,\n\t\t\t};\n\n\t\t\tif ( getters.useIndividualCorners ) {\n\t\t\t\tdimensions['top_left_radius'] = rootGetters.dimensions[primary] / 10;\n\t\t\t\tdimensions['top_right_radius'] = rootGetters.dimensions[primary] / 10;\n\t\t\t\tdimensions['bottom_left_radius'] = rootGetters.dimensions[primary] / 10;\n\t\t\t\tdimensions['bottom_right_radius'] = rootGetters.dimensions[primary] / 10;\n\t\t\t} else {\n\t\t\t\tdimensions['radius'] = rootGetters.dimensions[primary] / 10;\n\t\t\t}\n\n\t\t\treturn dimensions;\n\t\t},\n\t\tdimensionPreview: ( state, getters, rootState, rootGetters ): string => {\n\n\t\t\t// Filter out dimension keys that don't exist within the shape.\n\t\t\tconst configuration = ( new ShapeConfigurationFactory() ).get_configuration( 'rounded-rectangle' );\n\t\t\tconst dimensions = omitBy( rootGetters.parsedDimensions, ( dimension: unknown, key: string ): boolean => {\n\t\t\t\treturn configuration.get_dimension_keys().indexOf( key ) === -1;\n\t\t\t} );\n\n\t\t\tconst commonDimensions = [];\n\t\t\tconst radiusDimensions = [];\n\n\t\t\tfor ( const [key, value] of Object.entries( dimensions ) ) {\n\t\t\t\tif ( key.indexOf( 'radius' ) !== -1 ) {\n\t\t\t\t\tradiusDimensions.push( value );\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcommonDimensions.push( value );\n\t\t\t}\n\n\t\t\tconst { radius, radii } = window.measurementSelectorVariables.i18n.validators.dimensions.labels;\n\n\t\t\tconst label = radiusDimensions.length === 1 ? radius : radii;\n\t\t\tconst dimensionLabels = commonDimensions.map( value => value + 'cm' ).join( ' × ' );\n\t\t\tconst radiusLabels = radiusDimensions.map( value => value + 'cm' ).join( '/' );\n\n\t\t\treturn `${dimensionLabels} ${label}: ${radiusLabels}`;\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'circle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'circle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'circle', cutoutMeasurements.dimensions[ 'circle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'circle', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'half-circle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'half-circle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'half-circle', cutoutMeasurements.dimensions[ 'half-circle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'half-circle', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'quarter-circle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'quarter-circle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'quarter-circle', cutoutMeasurements.dimensions[ 'quarter-circle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'quarter-circle', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'egg',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'egg' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'egg', cutoutMeasurements.dimensions[ 'egg' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'egg', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'ellipse',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'ellipse' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'ellipse', cutoutMeasurements.dimensions[ 'ellipse' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'ellipse', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'flat-oval',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'flat-oval' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'flat-oval', cutoutMeasurements.dimensions[ 'flat-oval' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'flat-oval', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'sloped-rectangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'sloped-rectangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'sloped-rectangle', cutoutMeasurements.dimensions[ 'sloped-rectangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'sloped-rectangle', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'sloped-right-rectangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'sloped-right-rectangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'sloped-right-rectangle', cutoutMeasurements.dimensions[ 'sloped-right-rectangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'sloped-right-rectangle', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'arched-rectangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'arched-rectangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'arched-rectangle', cutoutMeasurements.dimensions[ 'arched-rectangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'arched-rectangle', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'isosceles-triangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'isosceles-triangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'isosceles-triangle', cutoutMeasurements.dimensions[ 'isosceles-triangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'isosceles-triangle', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'right-angled-triangle',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'right-angled-triangle' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'right-angled-triangle', cutoutMeasurements.dimensions[ 'right-angled-triangle' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'right-angled-triangle', parsedDimensions );\n\t\t}\n\t},\n\tactions: {},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'right-angled-triangle-mirrored',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'right-angled-triangle-mirrored' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'right-angled-triangle-mirrored', cutoutMeasurements.dimensions[ 'right-angled-triangle-mirrored' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'right-angled-triangle-mirrored', parsedDimensions );\n\t\t}\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'trapezoid',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'trapezoid' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'trapezoid', cutoutMeasurements.dimensions[ 'trapezoid' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'trapezoid', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'hexagon',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'hexagon' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'hexagon', cutoutMeasurements.dimensions[ 'hexagon' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'hexagon', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'octagon',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'octagon' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'octagon', cutoutMeasurements.dimensions[ 'octagon' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'octagon', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'polygon',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn {\n\t\t\t\t...convertUnits( cutoutMeasurements.dimensions[ 'polygon' ] ),\n\t\t\t\tside_amount: cutoutMeasurements.modifiers.side_amount,\n\t\t\t};\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'polygon', cutoutMeasurements.dimensions[ 'polygon' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'polygon', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'heart',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'heart' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'heart', cutoutMeasurements.dimensions[ 'heart' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'heart', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'star',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn {\n\t\t\t\t...convertUnits( cutoutMeasurements.dimensions[ 'star' ] ),\n\t\t\t\tnumber_of_points: cutoutMeasurements.modifiers.number_of_points,\n\t\t\t};\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'star', cutoutMeasurements.dimensions[ 'star' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'star', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'arrow',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'arrow' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'arrow', cutoutMeasurements.dimensions[ 'arrow' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'arrow', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'kite',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'kite' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'kite', cutoutMeasurements.dimensions[ 'kite' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'kite', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'barrel',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutMaximums: ( state, getters, rootState, { getCutoutMaximumRectangle } ): object => {\n\t\t\treturn ( new ShapeConfigurationFactory() ).get_configuration( 'barrel' ).get_maximum_dimensions( getCutoutMaximumRectangle );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'barrel' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'barrel', cutoutMeasurements.dimensions[ 'barrel' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'barrel', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'jewel',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutMaximums: ( state, getters, rootState, { getCutoutMaximumRectangle } ): object => {\n\t\t\treturn ( new ShapeConfigurationFactory() ).get_configuration( 'jewel' ).get_maximum_dimensions( getCutoutMaximumRectangle );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'jewel' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'jewel', cutoutMeasurements.dimensions[ 'jewel' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'jewel', parsedDimensions );\n\t\t},\n\t},\n};\n","import makerjs, {IModel} from \"makerjs\";\nimport AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\nimport { Text } from \"@/Models/Shapes/Text\";\nimport { CutoutTypes } from \"@/Models/CutoutTypes\";\nimport isEmpty from \"lodash/isEmpty\";\n\nconst fallbackModel = new makerjs.models.Rectangle( 1, 1 );\n\nexport default {\n\tnamespaced: true,\n\tstate: (): object => ( {\n\t\ttextModel: fallbackModel,\n\t\ttextShapeInstance: null,\n\t\tdefaultSize: '20',\n\t} ),\n\tgetters: {\n\t\ttextModel: ( state ): IModel => state.textModel,\n\t\tgetTextShapeInstance: ( state ): AbstractShape|null => state.textShapeInstance,\n\t\tgetInstance: ( state, getters, rootState, rootGetters ): Text => {\n\t\t\tconst { shapeInstance, measurements } = rootGetters;\n\n\t\t\treturn shapeInstance( 'text', measurements );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'text' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'text', parsedDimensions );\n\t\t},\n\t},\n\tactions: {\n\t\tasync setDefaults( { state, rootState, getters, commit, rootGetters }, isCutout = false ): Promise<void> {\n\t\t\tif ( ! isCutout ) {\n\t\t\t\trootState.cutout.cutoutType = CutoutTypes.none;\n\t\t\t}\n\n\t\t\tlet instance = getters.getInstance;\n\t\t\tlet defaultModifiers = instance.getDefaultModifiers();\n\t\t\tlet defaultDimensions = instance.getDefaultDimensions();\n\n\t\t\tif ( isCutout ) {\n\t\t\t\tinstance = rootGetters.shapeInstance('text', getters.cutoutMeasurements );\n\t\t\t\tdefaultModifiers = instance.getDefaultCutoutModifiers();\n\t\t\t\tdefaultDimensions = instance.getDefaultCutoutDimensions(rootGetters.baseShapeInstance);\n\t\t\t}\n\n\t\t\tcommit( 'updateLoadingState', true, { root: true } );\n\n\t\t\tconst measurements = isCutout ? rootGetters.cutoutMeasurements : rootState.measurements;\n\n\t\t\tfor (const [modifier, value] of Object.entries( defaultModifiers )) {\n\t\t\t\tif ( isEmpty( measurements.modifiers[ modifier ] ) ) {\n\t\t\t\t\tcommit( isCutout ? \"updateCutoutModifier\" : \"updateModifier\", { modifier, value }, { root: true } );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { desired_length = state.defaultSize } = defaultDimensions;\n\n\t\t\t// isCutout here needs to be added here as it otherwise remains empty. Needs checking.\n\t\t\tif ( isEmpty( desired_length ) || isCutout ) {\n\t\t\t\tcommit( isCutout ? 'setCutoutDimensionsForShape' : 'setDimensionsForShape', { shape: 'text', dimensions: { desired_length } }, { root: true } );\n\t\t\t}\n\n\t\t\tcommit( 'updateLoadingState', false, { root: true } );\n\t\t},\n\t},\n};\n","import { formatToLocaleString } from \"@/functions/numbers\";\nimport AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements, uploadAsModel } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'dxf',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t\tmodel: uploadAsModel\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: (): object => {\n\t\t\treturn {};\n\t\t},\n\t\tgetCutoutArea: (): number => {\n\t\t\treturn 0;\n\t\t},\n\t\tisCenteredShape: (): boolean => false,\n\t\tgetArea: (): object => {\n\t\t\treturn {};\n\t\t},\n\t\tdimensionPreview: ( state, getters, rootState, rootGetters ): string => {\n\t\t\tif( getters.getInstance.model === null ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst width = getters.getInstance.getWidth().in_cm();\n\t\t\tconst height = getters.getInstance.getLength().in_cm();\n\n\t\t\treturn `${formatToLocaleString(height)}cm × ${formatToLocaleString(width)}cm`;\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'droplet',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutMaximums: ( state, getters, rootState, { getCutoutMaximumRectangle } ): object => {\n\t\t\treturn ( new ShapeConfigurationFactory() ).get_configuration( 'droplet' ).get_maximum_dimensions( getCutoutMaximumRectangle );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'droplet' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'droplet', cutoutMeasurements.dimensions[ 'droplet' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'droplet', parsedDimensions );\n\t\t},\n\t},\n};\n","import AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport { PreviewShapeFactory } from \"@/Models/Shapes/PreviewShapeFactory\";\nimport { convertUnits } from \"@/functions/numbers\";\n\nexport default {\n\tnamespaced: true,\n\tgetters: {\n\t\tgetInstance: ( state, getters, rootState, { measurements } ): AbstractShape => {\n\t\t\treturn ( new PreviewShapeFactory() ).get( {\n\t\t\t\tshape: 'parallelogram',\n\t\t\t\tdimensions: measurements.dimensions,\n\t\t\t\tmodifiers: measurements.modifiers,\n\t\t\t} );\n\t\t},\n\t\tcutoutPrimitives: ( state, getters, rootState, { cutoutMeasurements } ): object => {\n\t\t\treturn convertUnits( cutoutMeasurements.dimensions[ 'parallelogram' ] );\n\t\t},\n\t\tgetCutoutArea: ( state, getters, rootState, { cutoutMeasurements, getArea } ): number => {\n\t\t\treturn getArea( 'parallelogram', cutoutMeasurements.dimensions[ 'parallelogram' ] );\n\t\t},\n\t\tisCenteredShape: (): boolean => true,\n\t\tgetArea: ( state, getters, rootState, { getArea, parsedDimensions } ): object => {\n\t\t\treturn getArea( 'parallelogram', parsedDimensions );\n\t\t},\n\t},\n};\n","import Area from \"./Area\";\nimport Length from \"./Length\";\n\nexport default class Rectangle {\n\tstatic NAME = 'rectangle';\n\n\tconstructor( length, width ) {\n\t\tthis.length = length;\n\t\tthis.width = width;\n\t}\n\n\tget_name() {\n\t\treturn Rectangle.NAME;\n\t}\n\n\tget_required_material() {\n\t\treturn this;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn this;\n\t}\n\n\tget_area() {\n\t\treturn new Area( this.length.in_mm() * this.width.in_mm() );\n\t}\n\n\tget_circumference() {\n\t\treturn this.width.add( this.width ).add( this.length ).add( this.length );\n\t}\n\n\tstatic from_cms( length, width ) {\n\t\tlength = Length.from_cm( length );\n\t\twidth = Length.from_cm( width );\n\t\treturn new Rectangle( length, width );\n\t}\n\n\tget_length() {\n\t\treturn this.length;\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_shortest_side() {\n\t\tif ( this.length.in_mm() < this.width.in_mm() ) {\n\t\t\treturn this.length;\n\t\t}\n\n\t\treturn this.width;\n\t}\n\n\tget_longest_side() {\n\t\tif ( this.length.in_mm() > this.width.in_mm() ) {\n\t\t\treturn this.length;\n\t\t}\n\n\t\treturn this.width;\n\t}\n\n\tmake_length_longest_side() {\n\t\tif ( this.width > this.length ) {\n\t\t\treturn new Rectangle( this.width, this.length );\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tremove_sides( length ) {\n\t\treturn new Rectangle( this.get_length().subtract( length ), this.get_width().subtract( length ) );\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"length\", \"width\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\tlength: maximum_rectangle.get_length(),\n\t\t\twidth: maximum_rectangle.get_width()\n\t\t};\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tlength: this.length.in_mm(),\n\t\t\twidth: this.width.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Rectangle( new Length( primitives.length ), new Length( primitives.width ) );\n\t}\n}\n","import AbstractShape, {Dimensions, DimensionProperties} from \"./AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport DimensionLine from \"../Lines/DimensionLine\";\n\n/**\n * Class used as a safe fallback in case a shape hasn't yet been properly created\n * due to unforseen reasons (i.e. wanted font isn't  loaded, modifier is missing etc).\n */\nexport class Fallback extends AbstractShape {\n\tconstructor( dimensions?: object ) {\n\t\tsuper( 'fallback', {} );\n\n\t\tthis.labelMappings = {};\n\t}\n\n\tgetLength(): Length {\n\t\treturn this.cleanedPrimitives.length;\n\t}\n\n\tgetWidth(): Length {\n\t\treturn this.cleanedPrimitives.width;\n\t}\n\n\tgetDimensionProperties(): DimensionProperties {\n\t\treturn { primary: 'width', secondary: 'length' };\n\t}\n\n\tgetDimensionLines(ratio = 1, focusedElement = '', forceRender = false): DimensionLine[] {\n\t\treturn [];\n\t}\n\n\tgetDefaultDimensions(): Dimensions {\n\t\treturn {\n\t\t\twidth: 1,\n\t\t\tlength: 1,\n\t\t};\n\t}\n\n\tgetDefaultCutoutDimensions(parentShape: AbstractShape): Dimensions {\n\t\treturn {\n\t\t\twidth: 0,\n\t\t\tlength: 0,\n\t\t};\n\t}\n}\n","import rectangleState from './shapes/rectangle';\nimport roundedRectangleState from './shapes/rounded-rectangle';\nimport circleState from './shapes/circle';\nimport halfCircleState from './shapes/half-circle';\nimport quarterCircleState from './shapes/quarter-circle';\nimport eggState from './shapes/egg';\nimport ellipseState from './shapes/ellipse';\nimport flatOvalState from './shapes/flat-oval';\nimport slopedRectangleState from './shapes/sloped-rectangle';\nimport slopedRightRectangleState from './shapes/sloped-right-rectangle';\nimport archedRectangleState from './shapes/arched-rectangle';\nimport isoscelesTriangleState from './shapes/isosceles-triangle';\nimport rightAngledTriangleState from './shapes/right-angled-triangle';\nimport rightAngledTriangleMirroredState from './shapes/right-angled-triangle-mirrored';\nimport trapezoidState from './shapes/trapezoid';\nimport hexagonState from './shapes/hexagon';\nimport octagonState from './shapes/octagon';\nimport polygonState from './shapes/polygon';\nimport heartState from './shapes/heart';\nimport starState from './shapes/star';\nimport arrowState from './shapes/arrow';\nimport kiteState from './shapes/kite';\nimport barrelState from './shapes/barrel';\nimport jewelState from './shapes/jewel';\nimport textState from './shapes/text';\nimport dxfState from './shapes/dxf';\nimport dropletState from './shapes/droplet';\nimport parallogramState from './shapes/parallelogram';\n\nimport isEmpty from \"lodash/isEmpty\";\nimport AbstractShape from \"@/Models/Shapes/AbstractShape\";\nimport Length from \"../../../../source/js/shared/models/Geometry/Length\";\nimport Rectangle from \"../../../../source/js/shared/models/Geometry/Rectangle\";\nimport ShapeConfigurationFactory from \"@/Models/ShapeConfigurations/ShapeConfigurationFactory\";\nimport { ShapeConfigurationInterface } from \"@/Models/ShapeConfigurations/ShapeConfigurationInterface\";\nimport makerjs, { IMeasureWithCenter } from \"makerjs\";\nimport { ShapeModelDecorator } from '@/utilities/decorators/PreviewModelDecorator';\nimport {PreviewShapeFactory} from \"@/Models/Shapes/PreviewShapeFactory\";\nimport {Fallback} from \"@/Models/Shapes/Fallback\";\n\nexport default {\n\tmodules: {\n\t\t'rectangle': rectangleState,\n\t\t'rounded-rectangle': roundedRectangleState,\n\t\t'circle': circleState,\n\t\t'half-circle': halfCircleState,\n\t\t'quarter-circle': quarterCircleState,\n\t\t'egg': eggState,\n\t\t'ellipse': ellipseState,\n\t\t'flat-oval': flatOvalState,\n\t\t'sloped-rectangle': slopedRectangleState,\n\t\t'sloped-right-rectangle': slopedRightRectangleState,\n\t\t'arched-rectangle': archedRectangleState,\n\t\t'isosceles-triangle': isoscelesTriangleState,\n\t\t'right-angled-triangle': rightAngledTriangleState,\n\t\t'right-angled-triangle-mirrored': rightAngledTriangleMirroredState,\n\t\t'trapezoid': trapezoidState,\n\t\t'hexagon': hexagonState,\n\t\t'octagon': octagonState,\n\t\t'polygon': polygonState,\n\t\t'heart': heartState,\n\t\t'star': starState,\n\t\t'arrow': arrowState,\n\t\t'kite': kiteState,\n\t\t'barrel': barrelState,\n\t\t'jewel': jewelState,\n\t\t'text': textState,\n\t\t'dxf': dxfState,\n\t\t'droplet': dropletState,\n\t\t'parallelogram': parallogramState,\n\t},\n\tgetters: {\n\t\tenclosingRectangle( state, getters, rootState, rootGetter ): IMeasureWithCenter {\n\t\t\tif (getters.shape === 'text') {\n\t\t\t\treturn makerjs.measure.modelExtents( getters['text/textModel'] );\n\t\t\t}\n\n\t\t\treturn makerjs.measure.modelExtents( rootGetter.model );\n\t\t},\n\t\tgetMinimalSize: ( state, getters, rootState, rootGetters ): number => {\n\t\t\tif (isEmpty( getters.shape ) || !( getters.shape in state )) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\tconst minimums = window.measurementSelectorVariables.shapeSettings['default']['minimumDimension'];\n\n\t\t\treturn minimums[rootGetters.activeEdgeFinish];\n\t\t},\n\t\tbaseShapeInstance: ( state, getters ): AbstractShape => {\n\t\t\tif (!getters.shape || !( getters.shape in state )) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn getters[`${getters.shape}/getInstance`];\n\t\t},\n\t\tshapeInstance: ( state, getters ): Function => {\n\t\t\treturn ( shape: string, measurements: object ): AbstractShape => {\n\t\t\t\tconst config = { ...measurements, shape };\n\n\t\t\t\tif ( shape === 'text' ) {\n\t\t\t\t\tconst { fontIsLoaded, getSelectedFontName, loadedFonts } = getters;\n\n\t\t\t\t\t// Don't create model if font isn't present\n\t\t\t\t\tif ( ! fontIsLoaded( getSelectedFontName ) ) {\n\t\t\t\t\t\treturn new Fallback();\n\t\t\t\t\t}\n\n\t\t\t\t\tconfig['fonts'] = loadedFonts;\n\t\t\t\t}\n\n\t\t\t\treturn ( new PreviewShapeFactory() ).get( config );\n\t\t\t};\n\t\t},\n\t\tgetShapeArea( state, getters ): number {\n\t\t\tif (!( getters.shape in state )) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn getters[`${getters.shape}/getArea`];\n\t\t},\n\t\tgetConfiguration(): Function {\n\t\t\treturn ( shape: string ): ShapeConfigurationInterface => {\n\t\t\t\treturn ( new ShapeConfigurationFactory() ).get_configuration( shape );\n\t\t\t};\n\t\t},\n\t\tcalculatedMaximums( state, getters, rootState, rootGetters ): Function {\n\t\t\treturn ( maximumLength: number, maximumWidth: number, materialLoss: number ): Record<string, Length | number> => {\n\t\t\t\tconst { canUseFullPlateLength, canUseFullPlateWidth } = window.measurementSelectorVariables.shapeSettings;\n\n\t\t\t\t// Tweak maximum values based on sawing method.\n\t\t\t\tconst usesSawing = rootGetters.activeEdgeFinish === 'sawing';\n\n\t\t\t\tif ( ! usesSawing ) {\n\t\t\t\t\tmaximumLength = canUseFullPlateLength ? maximumLength : maximumLength - 40;\n\t\t\t\t\tmaximumWidth = canUseFullPlateWidth ? maximumWidth : maximumWidth - 40;\n\t\t\t\t}\n\n\t\t\t\tlet maximumRectangle = new Rectangle( new Length( maximumLength ), new Length( maximumWidth ) );\n\n\t\t\t\tif ('rectangle' !== getters.shape) {\n\t\t\t\t\tmaximumRectangle = maximumRectangle.remove_sides( new Length( materialLoss ) );\n\t\t\t\t}\n\n\t\t\t\treturn getters.getConfiguration( getters.shape ).get_maximum_dimensions( maximumRectangle, getters.dimensions );\n\t\t\t};\n\t\t},\n\t\tmaximums( state, getters ): Record<string, Length | number> {\n\t\t\tlet maximumLength = window.measurementSelectorVariables.shapeSettings.maximumLength;\n\t\t\tlet maximumWidth = window.measurementSelectorVariables.shapeSettings.maximumWidth;\n\n\t\t\t// Swap maximum values for certain shapes.\n\t\t\tif( getters.getPricingGroup.swapMaximumDimensions( getters.shape ) ) {\n\t\t\t\tmaximumLength = window.measurementSelectorVariables.shapeSettings.maximumWidth;\n\t\t\t\tmaximumWidth = window.measurementSelectorVariables.shapeSettings.maximumLength;\n\t\t\t}\n\n\t\t\treturn getters.calculatedMaximums(\n\t\t\t\tmaximumLength,\n\t\t\t\tmaximumWidth,\n\t\t\t\twindow.measurementSelectorVariables.settings.standardMaterialLoss\n\t\t\t);\n\t\t},\n\t\tgetCenter(state, getters, rootState, { getShapeInstance }): (roundNumber?: boolean, unit?: string) => { x: number, y: number } {\n\t\t\treturn ( roundNumber = true, unit = 'mm' ): { x: number, y: number } => {\n\t\t\t\tconst modelDecorator = new ShapeModelDecorator(null, getShapeInstance);\n\t\t\t\tconst model = modelDecorator.getModel();\n\t\t\t\tconst measure = makerjs.measure.modelExtents(model);\n\t\t\t\tlet centerX = 0;\n\t\t\t\tlet centerY = 0;\n\n\t\t\t\t// Some shapes are drawn from the center, so we need to adjust the center point.\n\t\t\t\tif(measure['low'][0] === 0 && measure['low'][1] === 0) {\n\t\t\t\t\tcenterX = measure['center'][0];\n\t\t\t\t\tcenterY = measure['center'][1];\n\t\t\t\t} else {\n\t\t\t\t\tcenterX = measure['low'][0] * -1;\n\t\t\t\t\tcenterY = measure['low'][1] * -1;\n\t\t\t\t}\n\n\t\t\t\tlet offsetX = new Length(centerX);\n\t\t\t\tlet offsetY = new Length(centerY);\n\n\t\t\t\tif ( roundNumber ) {\n\t\t\t\t\toffsetX = offsetX.round( unit !== 'cm' ? 0 : 2 );\n\t\t\t\t\toffsetY = offsetY.round( unit !== 'cm' ? 0 : 2 );\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tx: offsetX[`in_${unit}`](),\n\t\t\t\t\ty: offsetY[`in_${unit}`](),\n\t\t\t\t};\n\t\t\t};\n\t\t},\n\t\tgetMeasurements( state, getters, rootState, { dimensions, cutoutDimensions } ): Function {\n\t\t\treturn ( shape: string, isCutout = false ): ShapeConfigurationInterface => {\n\t\t\t\treturn isCutout ? cutoutDimensions : dimensions;\n\t\t\t};\n\t\t},\n\t\tgetModifiers( state, getters, rootState, { modifiers, cutoutModifiers } ): Function {\n\t\t\treturn ( isCutout= false ): ShapeConfigurationInterface => {\n\t\t\t\treturn isCutout ? cutoutModifiers : modifiers;\n\t\t\t};\n\t\t},\n\t\tisShapeValid( state, getters, rootState, { isDimensionValid, isCutoutValid } ): Function {\n\t\t\treturn ( isCutout = false ): ShapeConfigurationInterface => {\n\t\t\t\treturn isCutout ? isCutoutValid : isDimensionValid;\n\t\t\t};\n\t\t},\n\t\tgetCategorizedShapes(state, getters): Function {\n\t\t\treturn ( shapes ): object => {\n\t\t\t\tconst categories = {};\n\n\t\t\t\tshapes.forEach((shape) => {\n\t\t\t\t\tconst configuration = getters.getConfiguration(shape);\n\t\t\t\t\tconst category = configuration.get_category();\n\n\t\t\t\t\tif (category === \"\") {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!(category in categories)) {\n\t\t\t\t\t\tcategories[category] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tcategories[category].push(shape);\n\t\t\t\t});\n\n\t\t\t\treturn categories;\n\t\t\t};\n\t\t}\n\t},\n};\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\n\nexport default class AbstractShape {\n\tstatic DEFAULT_MATERIAL_LOSS = 20;\n\n\t/**\n\t * @return {string} The name of the shape.\n\t */\n\tget_name() {\n\t\tthrow new Error( 'Method `get_name()` must be implemented' );\n\t}\n\n\t/**\n\t * @return {Rectangle} The enclosing rectangle.\n\t */\n\tget_enclosing_rectangle() {\n\t\tthrow new Error( 'Method `get_enclosing_rectangle()` must be implemented' );\n\t}\n\n\tget_required_material() {\n\t\tconst enclosing_rect = this.get_enclosing_rectangle();\n\t\tconst length         = enclosing_rect.get_length().add( new Length( this.get_material_loss() ) );\n\t\tconst width          = enclosing_rect.get_width().add( new Length( this.get_material_loss() ) );\n\n\t\treturn new Rectangle( length, width );\n\t}\n\n\t/**\n\t * @return {Area} The area of the shape.\n\t */\n\tget_area() {\n\t\tthrow new Error( 'Method `get_area()` must be implemented' );\n\t}\n\n\t/**\n\t * @return {Length} The circumference of the shape.\n\t */\n\tget_circumference() {\n\t\tthrow new Error( 'Method `get_circumference()` must be implemented' );\n\t}\n\n\tget_material_loss() {\n\t\tconst pricingGroup = window.measurementSelectorVariables.pricingGroup.other_settings;\n\n\t\tif ( ! ( 'material_loss' in pricingGroup ) ) {\n\t\t\treturn AbstractShape.DEFAULT_MATERIAL_LOSS;\n\t\t}\n\n\t\treturn pricingGroup[ 'material_loss' ] !== '' ? pricingGroup[ 'material_loss' ] * 2 : AbstractShape.DEFAULT_MATERIAL_LOSS;\n\t}\n\n\t/**\n\t * @return {any[]} The primitives of the shape.\n\t */\n\tserialize_primitives() {\n\t\tthrow new Error( 'Method `serialize_primitives()` must be implemented' );\n\t}\n\n\tstatic deserialize_primitives() {\n\t\tthrow new Error( 'Method `deserialize_primitives()` must be implemented' );\n\t}\n}\n","//\n//Returns the fraction of a circle this object represents. Fraction must be\n//between 0 and 1.\n//\n//\n//This should be implemented, because the name for every fraction should be\n//different.\n//\n//@inheritDoc\n//\n//These are not implemented, because they are easier to implement for\n//specific fractions.\nimport Length from \"./Length\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class CircleFraction extends AbstractShape {\n\tstatic NAME = \"quarter-circle\";\n\n\tconstructor( diameter ) {\n\t\tsuper();\n\n\t\tthis.diameter = diameter;\n\t}\n\n\tget_area() {\n\t\tconst radius = this.diameter.in_mm() / 2;\n\t\tconst area = Math.PI * Math.pow( radius, 2 );\n\t\treturn new Area( this.get_fraction() * area );\n\t}\n\n\tget_circumference() {\n\t\tconst circle_circumference = new Length( Math.PI * this.diameter.in_mm() );\n\n\t\tif ( this.get_fraction() === +1 ) {\n\t\t\treturn circle_circumference;\n\t\t}\n\n\t\treturn new Length( this.get_fraction() * circle_circumference.in_mm() + this.diameter.in_mm() );\n\t}\n\n\tget_diameter() {\n\t\treturn this.diameter;\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"diameter\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tdiameter: this.diameter.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) //The circle with radius has never been on production, but this makes sure on test we show the correct circle.\n\t{\n\t\tif ( !( undefined !== primitives.diameter ) && undefined !== primitives.radius ) {\n\t\t\tprimitives.diameter = primitives.radius * 2;\n\t\t}\n\n\t\treturn new this( new Length( primitives.diameter ) );\n\t}\n\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport CircleFraction from \"./CircleFraction\";\n\nexport default class Circle extends CircleFraction {\n\tstatic NAME = \"circle\";\n\n\tget_name() {\n\t\treturn Circle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\tconst length = new Length( this.diameter.in_mm() );\n\t\tconst width = new Length( this.diameter.in_mm() );\n\t\treturn new Rectangle( length, width );\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\tdiameter: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_fraction() {\n\t\treturn 1;\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class NullShape extends AbstractShape {\n\tget_name() {\n\t\treturn \"unknown-shape\";\n\t}\n\n\tget_required_material() {\n\t\treturn new Rectangle( new Length( 0 ), new Length( 0 ) );\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( new Length( 0 ), new Length( 0 ) );\n\t}\n\n\tget_area() {\n\t\treturn new Area( 0 );\n\t}\n\n\tget_circumference() {\n\t\treturn new Length( 0 );\n\t}\n\n\tserialize_primitives() {\n\t\treturn [];\n\t}\n\n\tstatic deserialize_primitives() {\n\t\treturn new NullShape();\n\t}\n\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport RightAngledTriangle from \"./RightAngledTriangle\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class AbstractRightAngledTriangle extends AbstractShape {\n\tconstructor( base, height ) {\n\t\tsuper();\n\n\t\tthis.base = base;\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * Gets the enclosing rectangle for the triangle.\n\t *\n\t * @return {Rectangle} The enclosing rectangle.\n\t */\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.base, this.height );\n\t}\n\n\t/**\n\t * Gets the total area for the triangle.\n\t *\n\t * @return {Area} The area.\n\t */\n\tget_area() {\n\t\tconst area_in_mm2 = 0.5 * this.base.in_mm() * this.height.in_mm();\n\t\treturn Area.from_mm2( area_in_mm2 );\n\t}\n\n\t/**\n\t * Gets the circumference of the triangle.\n\t *\n\t * @return {Length} The circumference.\n\t */\n\tget_circumference() //Pythagorean theorem, a^2 + b^2 = c^2\n\t{\n\t\tconst a = this.base.in_mm();\n\t\tconst b = this.height.in_mm();\n\t\tconst c = Math.sqrt( Math.pow( a, 2 ) + Math.pow( b, 2 ) );\n\t\treturn Length.from_mm( a + b + c );\n\t}\n\n\t/**\n\t * Gets the base.\n\t *\n\t * @return {number} The base length.\n\t */\n\tget_base() {\n\t\treturn this.base;\n\t}\n\n\t/**\n\t * Gets the height.\n\t *\n\t * @return {number} The height.\n\t */\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\t/**\n\t * Gets the maximum dimensions.\n\t *\n\t * @param {Rectangle} maximum_rectangle The maximum rectangle.\n\t *\n\t * @return {{base: *, height: *}} The maximum dimensions.\n\t */\n\tget_maximum_dimensions( maximum_rectangle ) // Shapes can be ordered in the maximum sheet size minus 2.5cm on every side.\n\t{\n\t\treturn {\n\t\t\tbase: maximum_rectangle.get_length(),\n\t\t\theight: maximum_rectangle.get_width()\n\t\t};\n\t}\n\n\t/**\n\t * Gets the dimension keys.\n\t *\n\t * @return {string[]} The dimension keys.\n\t */\n\tget_dimension_keys() {\n\t\treturn [\"base\", \"height\"];\n\t}\n\n\t/**\n\t * Gets the modifier keys.\n\t *\n\t * @return {*[]} The modifier keys.\n\t */\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\t/**\n\t * Serializes the primitives.\n\t *\n\t * @return {{base, height}} The serialized primitives.\n\t */\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tbase: this.base.in_mm(),\n\t\t\theight: this.base.in_mm()\n\t\t};\n\t}\n\n\t/**\n\t * Deserializes the primitives to create a new instance.\n\t *\n\t * @param {object} primitives The primitives.\n\t *\n\t * @return {RightAngledTriangle} The instance.\n\t */\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new RightAngledTriangle( new Length( primitives.base ), new Length( primitives.height ) );\n\t}\n\n}\n","import AbstractRightAngledTriangle from \"./AbstractRightAngledTriangle\";\n\nexport default class RightAngledTriangle extends AbstractRightAngledTriangle {\n\tstatic NAME = \"right-angled-triangle\";\n\n\tget_name() {\n\t\treturn RightAngledTriangle.NAME;\n\t}\n\n}\n","import AbstractRightAngledTriangle from \"./AbstractRightAngledTriangle\";\n\nexport default class RightAngledTriangleMirrored extends AbstractRightAngledTriangle {\n\tstatic NAME = \"right-angled-triangle-mirrored\";\n\n\tget_name() {\n\t\treturn RightAngledTriangleMirrored.NAME;\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Ellipse extends AbstractShape {\n\tstatic NAME = \"ellipse\";\n\n\tconstructor( width, height ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn Ellipse.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.height );\n\t}\n\n\tget_area() {\n\t\tconst a = this.width.in_mm() / 2;\n\t\tconst b = this.height.in_mm() / 2;\n\t\treturn new Area( Math.PI * a * b );\n\t}\n\n\tget_circumference() //This is a mathematical property of an ellipse.\n\t{\n\t\tconst a         = this.width.in_mm() / 2;\n\t\tconst b         = this.height.in_mm() / 2;\n\t\tconst h         = Math.pow( a - b, 2 ) / Math.pow( a + b, 2 );\n\t\tconst perimeter = Math.PI * (\n\t\t\ta + b\n\t\t) * (\n\t\t\t1 + 3 * h / (\n\t\t\t\t10 + Math.sqrt( 4 - 3 * h )\n\t\t\t)\n\t\t);\n\t\treturn new Length( perimeter );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //Because customers can rotate their ellipse, simply assume width must be the longest.\n\t{\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Ellipse( new Length( primitives.width ), new Length( primitives.height ) );\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Egg extends AbstractShape {\n\tstatic NAME = \"egg\";\n\n\tconstructor( width, height ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn Egg.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.height );\n\t}\n\n\t// Formula beased on: https://rechneronline.de/pi/egg-profile.php\n\tget_circumference() {\n\t\tconst a = this.width.in_mm() / 2;\n\t\tconst h1 = ( this.height.in_mm() / 3 ) * 2; // first half height\n\t\tconst h2 = this.height.in_mm() / 3; // second half height\n\n\t\t// Calculate the constants κ and λ\n\t\tconst kappa = ( a - h1 ) / ( a + h1 );\n\t\tconst lambda = ( a - h2 ) / ( a + h2 );\n\n\t\t// Helper function to calculate the term inside the formula\n\t\tfunction ellipseTerm( a, h, k ) {\n\t\t\treturn ( a + h ) * ( 1 + ( 3 * Math.pow( k, 2 ) ) / ( 10 + Math.sqrt( 4 - 3 * Math.pow( k, 2 ) ) ) );\n\t\t}\n\n\t\tconst p = Math.PI / 2 * ( ellipseTerm( a, h1, kappa ) + ellipseTerm( a, h2, lambda ) );\n\t\treturn new Length( p );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tget_area() {\n\t\tconst a = this.width.in_mm() / 2;\n\t\tconst b = this.height.in_mm() / 2;\n\n\t\treturn new Area( Math.PI * a * b );\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Egg( new Length( primitives.width ), new Length( primitives.height ) );\n\t}\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class RoundedRectangle extends AbstractShape {\n\tstatic NAME = \"rounded-rectangle\";\n\n\tconstructor( length, width, radius, top_left_radius, top_right_radius, bottom_left_radius, bottom_right_radius ) {\n\t\tsuper();\n\n\t\tthis.length = length;\n\t\tthis.width = width;\n\t\tthis.radius = radius;\n\t\tthis.top_right_radius = top_right_radius;\n\t\tthis.bottom_right_radius = bottom_right_radius;\n\t\tthis.bottom_left_radius = bottom_left_radius;\n\t\tthis.top_left_radius = top_left_radius;\n\t}\n\n\tget_name() {\n\t\treturn RoundedRectangle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.length, this.width );\n\t}\n\n\tget_area() //A = 2 r (a + b) + a b + π r^2\n\t{\n\t\tif( this.is_individual_radius() ) {\n\t\t\tconst width = this.length.in_mm();\n\t\t\tconst height = this.width.in_mm();\n\t\t\tconst totalRectangleArea = width * height;\n\n\t\t\tconst topRightCircleArea = Math.PI * Math.pow( this.top_right_radius.in_mm(), 2 );\n\t\t\tconst topRightRectangleArea = ( this.top_right_radius.in_mm() * 2 ) * ( this.top_right_radius.in_mm() * 2 );\n\n\t\t\tconst bottomRightCircleArea = Math.PI * Math.pow( this.bottom_right_radius.in_mm(), 2 );\n\t\t\tconst bottomRightRectangleArea = ( this.bottom_right_radius.in_mm() * 2 ) * ( this.bottom_right_radius.in_mm() * 2 );\n\n\t\t\tconst bottomLeftCircleArea = Math.PI * Math.pow( this.bottom_left_radius.in_mm(), 2 );\n\t\t\tconst bottomLeftRectangleArea = ( this.bottom_left_radius.in_mm() * 2 ) * ( this.bottom_left_radius.in_mm() * 2 );\n\n\t\t\tconst topLeftCircleArea = Math.PI * Math.pow( this.top_left_radius.in_mm(), 2 );\n\t\t\tconst topLeftRectangleArea = ( this.top_left_radius.in_mm() * 2 ) * ( this.top_left_radius.in_mm() * 2 );\n\n\t\t\tconst topRightCornerArea = ( topRightCircleArea - topRightRectangleArea ) / 4;\n\t\t\tconst bottomRightCornerArea = ( bottomRightCircleArea - bottomRightRectangleArea ) / 4;\n\t\t\tconst bottomLeftCornerArea = ( bottomLeftCircleArea - bottomLeftRectangleArea ) / 4;\n\t\t\tconst topLeftCornerArea = ( topLeftCircleArea - topLeftRectangleArea ) / 4;\n\n\t\t\tconst area = totalRectangleArea - topRightCornerArea - bottomRightCornerArea - bottomLeftCornerArea - topLeftCornerArea;\n\n\t\t\treturn new Area( area );\n\t\t}\n\n\t\tconst a = this.length.in_mm();\n\t\tconst b = this.width.in_mm();\n\t\tconst r = this.radius.in_mm();\n\t\treturn new Area( 2 * r * ( a + b ) + a * b + Math.PI * r * r );\n\t}\n\n\tget_circumference()\n\t{\n\n\t\tif( this.is_individual_radius() ) {\n\t\t\tconst width = this.length.in_mm();\n\t\t\tconst height = this.width.in_mm();\n\n\t\t\tconst topRightPerimeter = this.get_corner_perimeter( this.top_right_radius.in_mm() );\n\t\t\tconst bottomRightPerimeter = this.get_corner_perimeter( this.bottom_right_radius.in_mm() );\n\t\t\tconst bottomLeftPerimeter = this.get_corner_perimeter( this.bottom_left_radius.in_mm() );\n\t\t\tconst topLeftPerimeter = this.get_corner_perimeter( this.top_left_radius.in_mm() );\n\n\t\t\tconst cornerPerimeter = topRightPerimeter + bottomRightPerimeter + bottomLeftPerimeter + topLeftPerimeter;\n\t\t\tconst rectanglePerimeter = 2 * ( width - height );\n\n\t\t\tconst perimeter = rectanglePerimeter + cornerPerimeter;\n\n\t\t\treturn new Length( perimeter );\n\t\t}\n\n\t\t//p = 2 (a + b + π r)\n\t\tconst a = this.length.in_mm();\n\t\tconst b = this.width.in_mm();\n\t\tconst r = this.radius.in_mm();\n\t\treturn new Length( 2 * ( a + b + Math.PI * r ) );\n\t}\n\n\tget_corner_perimeter( radius ) {\n\t\tconst perimeter_circle = ( radius * 2 ) * Math.PI;\n\t\treturn perimeter_circle / 4;\n\t}\n\n\tget_length() {\n\t\treturn this.length;\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_radius() {\n\t\treturn this.radius;\n\t}\n\n\tis_individual_radius() {\n\t\treturn this.top_left_radius && this.top_right_radius && this.bottom_left_radius && this.bottom_right_radius;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst smallest_length = Math.min( maximum_rectangle.get_length().in_mm(), maximum_rectangle.get_width().in_mm() );\n\t\treturn {\n\t\t\tlength: maximum_rectangle.get_length(),\n\t\t\twidth: maximum_rectangle.get_width(),\n\t\t\tradius: new Length( smallest_length / 2 )\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"length\", \"width\", \"radius\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tlength: this.length.in_mm(),\n\t\t\twidth: this.width.in_mm(),\n\t\t\tradius: this.radius.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new RoundedRectangle(\n\t\t\tnew Length( primitives.length ),\n\t\t\tnew Length( primitives.width ),\n\t\t\tnew Length( primitives.radius ),\n\t\t\tnew Length( primitives.top_left_radius ),\n\t\t\tnew Length( primitives.top_right_radius ),\n\t\t\tnew Length( primitives.bottom_left_radius ),\n\t\t\tnew Length( primitives.bottom_right_radius )\n\t\t);\n\t}\n\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class IsoscelesTriangle extends AbstractShape {\n\tstatic NAME = \"isosceles-triangle\";\n\n\tconstructor( base, height ) {\n\t\tsuper();\n\n\t\tthis.base = base;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn IsoscelesTriangle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.base, this.height );\n\t}\n\n\tget_area() {\n\t\treturn new Area( this.base.in_mm() * this.height.in_mm() / 2 );\n\t}\n\n\tget_circumference() //a^2 + b^2 = c^2\n\t//c = sqrt( a^2 + b^2 )\n\t{\n\t\tconst a = this.base.in_mm() / 2;\n\t\tconst b = this.height.in_mm();\n\t\tconst c = Math.sqrt( Math.pow( a, 2 ) + Math.pow( b, 2 ) );\n\t\treturn new Length( this.base.in_mm() + c * 2 );\n\t}\n\n\tget_base() {\n\t\treturn this.base;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //Both the base and the height can never be bigger than the longest length.\n\t{\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\t\treturn {\n\t\t\tbase: longest_side,\n\t\t\theight: longest_side\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"base\", \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tbase: this.base.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new IsoscelesTriangle( new Length( primitives.base ), new Length( primitives.height ) );\n\t}\n\n}\n","import CircleFraction from \"./CircleFraction\";\nimport Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\n\nexport default class HalfCircle extends CircleFraction {\n\tstatic NAME = \"half-circle\";\n\n\tget_name() {\n\t\treturn HalfCircle.NAME;\n\t}\n\n\tget_fraction() {\n\t\treturn 0.5;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( new Length( this.diameter.in_mm() ), new Length( this.diameter.in_mm() / 2 ) );\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side();\n\t\treturn {\n\t\t\tdiameter: shortest_side\n\t\t};\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class QuarterCircle extends AbstractShape {\n\tstatic NAME = \"quarter-circle\";\n\n\tconstructor( radius ) {\n\t\tsuper();\n\n\t\tthis.radius = radius;\n\t}\n\n\tget_name() {\n\t\treturn QuarterCircle.NAME;\n\t}\n\n\tget_area() {\n\t\tconst area = Math.PI * Math.pow( this.radius.in_mm(), 2 );\n\t\treturn new Area( 0.25 * area );\n\t}\n\n\tget_circumference() {\n\t\tconst diameter = this.radius.multiply( 2 ).in_mm();\n\t\tconst circle_circumference = new Length( Math.PI * diameter );\n\n\t\treturn new Length( 0.25 * circle_circumference.in_mm() + diameter );\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.radius, this.radius );\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //Because a quarter circle only uses half of a plate a circle uses we should\n\t//double the maximum diameter.\n\t{\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side();\n\t\treturn {\n\t\t\tradius: shortest_side\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"radius\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tradius: this.radius.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives )\t{\n\t\treturn new this( new Length( primitives.radius ) );\n\t}\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Hexagon extends AbstractShape {\n\tstatic NAME = \"hexagon\";\n\n\tconstructor( side_length ) {\n\t\tsuper();\n\n\t\tthis.side_length = side_length;\n\t}\n\n\tget_name() {\n\t\treturn Hexagon.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\tconst side_length = this.side_length.in_mm();\n\t\tconst long_side   = side_length * 2;\n\t\tconst short_side  = Math.sqrt( Math.pow( side_length, 2 ) - Math.pow( side_length / 2, 2 ) ) * 2;\n\t\treturn new Rectangle( new Length( long_side ), new Length( short_side ) );\n\t}\n\n\tget_area() {\n\t\tconst area = 3 * Math.sqrt( 3 ) / 2 * Math.pow( this.side_length.in_mm(), 2 );\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\treturn new Length( 6 * this.side_length.in_mm() );\n\t}\n\n\tget_side_length() {\n\t\treturn this.side_length;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //See https://en.wikipedia.org/wiki/Hexagon#Parameters\n\t//The shortest side is the d, now we need to calculate R.\n\t//r = 0.5d\n\t//r = ( sqrt(3) / 2 ) * R\n\t//r / ( sqrt(3) / 2 ) = R\n\t//R = r / ( sqrt(3) / 2 )\n\t{\n\t\tlet shortest_side = maximum_rectangle.get_shortest_side().in_mm();\n\t\tshortest_side = shortest_side / 2;\n\t\tconst maximum_side_length = shortest_side / (\n\t\t\tMath.sqrt( 3 ) / 2\n\t\t);\n\t\treturn {\n\t\t\tside_length: new Length( maximum_side_length )\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"side_length\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tside_length: this.side_length\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Hexagon( new Length( primitives.side_length ) );\n\t}\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Octagon extends AbstractShape {\n\tstatic NAME = \"octagon\";\n\tstatic SIDES = 8;\n\n\tconstructor( side_length ) {\n\t\tsuper();\n\n\t\tthis.side_length = side_length;\n\t}\n\n\tget_name() {\n\t\treturn Octagon.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\tconst sqrt2 = Math.sqrt( 2 );\n\t\tconst sideLength = this.get_side_length().in_mm();\n\t\tconst width = sideLength * ( 1 + sqrt2 );\n\t\treturn new Rectangle( new Length( width ), new Length( width ) );\n\t}\n\n\tget_area() {\n\t\tconst sqrt2 = Math.sqrt( 2 );\n\t\tconst area = 2 * ( 1 + sqrt2 ) * Math.pow( this.get_side_length().in_mm(), 2 );\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\treturn new Length( Octagon.SIDES * this.side_length.in_mm() );\n\t}\n\n\tget_side_length() {\n\t\treturn this.side_length;\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"side_length\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tside_length: this.side_length\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Octagon( new Length( primitives.side_length ) );\n\t}\n}\n","import Length from \"./Length\";\nimport Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Polygon extends AbstractShape {\n\tstatic NAME = \"polygon\";\n\n\tconstructor( width, side_amount ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.side_amount = side_amount;\n\t}\n\n\tget_name() {\n\t\treturn Polygon.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.width );\n\t}\n\n\tget_area() {\n\t\tconst radius = this.width.divide( 2 ).in_mm();\n\t\tconst area = 0.5 * this.side_amount * radius * radius * Math.sin( ( 2 * Math.PI ) / this.side_amount );\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\tconst radius = this.width.divide( 2 ).in_mm();\n\t\tconst side_length = 2 * radius * Math.sin( Math.PI / this.side_amount );\n\t\treturn new Length( this.side_amount * side_length );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_side_amount() {\n\t\treturn this.side_amount;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [ \"side_amount\" ];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\tside_amount: this.side_amount,\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Polygon(\n\t\t\tnew Length( primitives.width ),\n\t\t\tparseInt( primitives.side_amount, 10 )\n\t\t);\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport IsoscelesTriangle from \"./IsoscelesTriangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Arrow extends AbstractShape {\n\tstatic NAME = \"arrow\";\n\n\tconstructor( stem_length, stem_width, head_length, head_width ) {\n\t\tsuper();\n\n\t\tthis.stem_length = stem_length;\n\t\tthis.stem_width = stem_width;\n\t\tthis.head_length = head_length;\n\t\tthis.head_width = head_width;\n\t}\n\n\tget_name() {\n\t\treturn Arrow.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.stem_length.add( this.head_length ), this.stem_width.max( this.head_width ) );\n\t}\n\n\tget_area() {\n\t\tconst stem_area = new Rectangle( this.stem_length, this.stem_width ).get_area();\n\t\tconst head_area = new IsoscelesTriangle( this.head_width, this.head_length ).get_area();\n\t\treturn stem_area.add( head_area );\n\t}\n\n\tget_circumference() //When using the simple shapes we over count the circumference, so subtract the shared line twice.\n\t{\n\t\tconst stem_circumference   = new Rectangle( this.stem_length, this.stem_width ).get_circumference();\n\t\tconst head_circumference   = new IsoscelesTriangle( this.head_width, this.head_length ).get_circumference();\n\t\tconst shared_circumference = this.stem_width.min( this.head_width );\n\t\treturn stem_circumference.add( head_circumference ).subtract( shared_circumference ).subtract( shared_circumference );\n\t}\n\n\tget_stem_length() {\n\t\treturn this.stem_length;\n\t}\n\n\tget_stem_width() {\n\t\treturn this.stem_width;\n\t}\n\n\tget_head_length() {\n\t\treturn this.head_length;\n\t}\n\n\tget_head_width() {\n\t\treturn this.head_width;\n\t}\n\n\tget_maximum_dimensions() {\n\t\treturn {};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"stem_length\", \"stem_width\", \"head_length\", \"head_width\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tstem_length: this.stem_length.in_mm(),\n\t\t\tstem_width: this.stem_width.in_mm(),\n\t\t\thead_length: this.head_length.in_mm(),\n\t\t\thead_width: this.head_width.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Arrow( new Length( primitives.stem_length ), new Length( primitives.stem_width ), new Length( primitives.head_length ), new Length( primitives.head_width ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Star extends AbstractShape {\n\tstatic NAME = \"star\";\n\tstatic MINIMUM_NUMBER_OF_POINTS = 2;\n\tstatic MAXIMUM_NUMBER_OF_POINTS = 15;\n\n\tconstructor( number_of_points, outer_radius, inner_radius ) {\n\t\tsuper();\n\n\t\tthis.number_of_points = number_of_points;\n\t\tthis.outer_radius = outer_radius;\n\t\tthis.inner_radius = inner_radius;\n\t}\n\n\tget_name() {\n\t\treturn this.constructor.NAME;\n\t}\n\n\tget_enclosing_rectangle() // This is a low effort rectangle, because the outer radius is also the radius of the circle that contains\n\t// this star, we can simply use the rectangle that fits that circle. There might be a more optimized rectangle.\n\t{\n\t\tlet circle_radius = this.outer_radius.max( this.inner_radius );\n\t\tcircle_radius = circle_radius.multiply( 2 );\n\n\t\treturn new Rectangle( circle_radius, circle_radius );\n\t}\n\n\tget_area() {\n\t\tconst ac        = this.outer_radius.in_mm();\n\t\tconst ab        = this.inner_radius.in_mm();\n\t\tconst angle_eab = 2 * Math.PI / (\n\t\t\tthis.number_of_points * 2\n\t\t);\n\t\tconst be        = ab * Math.sin( angle_eab );\n\t\tconst area_abcd = be * ac;\n\t\treturn new Area( this.number_of_points * area_abcd );\n\t}\n\n\tget_circumference() {\n\t\tconst ac        = this.outer_radius.in_mm();\n\t\tconst ab        = this.inner_radius.in_mm();\n\t\tconst angle_eab = 2 * Math.PI / (\n\t\t\tthis.number_of_points * 2\n\t\t);\n\t\tconst be        = ab * Math.sin( angle_eab );\n\t\tconst ae        = Math.sqrt( Math.pow( ab, 2 ) - Math.pow( be, 2 ) );\n\t\tconst bc        = Math.sqrt( Math.pow( ac - ae, 2 ) + Math.pow( be, 2 ) );\n\t\treturn new Length( this.number_of_points * 2 * bc );\n\t}\n\n\tget_number_of_points() {\n\t\treturn this.number_of_points;\n\t}\n\n\tget_inner_radius() {\n\t\treturn this.inner_radius;\n\t}\n\n\tget_outer_radius() {\n\t\treturn this.outer_radius;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //Use the same low effort method as we used in get_enclosing_rectangle.\n\t{\n\t\tconst maximum_radius = maximum_rectangle.get_shortest_side().in_mm() / 2;\n\t\treturn {\n\t\t\tinner_radius: new Length( maximum_radius ),\n\t\t\touter_radius: new Length( maximum_radius ),\n\t\t\tnumber_of_points: this.MAXIMUM_NUMBER_OF_POINTS\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"inner_radius\", \"outer_radius\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [ \"number_of_points\" ];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\tinner_radius: this.inner_radius.in_mm(),\n\t\t\touter_radius: this.outer_radius.in_mm(),\n\t\t\tnumber_of_points: this.number_of_points\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Star(\n\t\t\tparseInt( primitives.number_of_points, 10 ),\n\t\t\tnew Length( primitives.inner_radius ),\n\t\t\tnew Length( primitives.outer_radius )\n\t\t);\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport RightAngledTriangle from \"./RightAngledTriangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class SlopedRectangle extends AbstractShape {\n\tstatic NAME = \"sloped-rectangle\";\n\n\tconstructor( width, height_left, height_right ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height_left = height_left;\n\t\tthis.height_right = height_right;\n\t}\n\n\tget_name() {\n\t\treturn SlopedRectangle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.get_longest_height() );\n\t}\n\n\tget_area() {\n\t\tconst largest_height = this.get_longest_height();\n\t\tconst smallest_height = this.get_shortest_height();\n\t\tconst base_rectangle = new Rectangle( this.width, this.get_shortest_height() );\n\t\tconst top_triangle = new RightAngledTriangle( this.width, largest_height.subtract( smallest_height ) );\n\t\treturn base_rectangle.get_area().add( top_triangle.get_area() );\n\t}\n\n\tget_circumference() //Pythagorean theorem, a^2 + b^2 = c^2\n\t{\n\t\tconst diagonal_length = Math.sqrt( Math.pow( this.width.in_mm(), 2 ) + Math.pow( this.get_longest_height().subtract( this.get_shortest_height() ).in_mm(), 2 ) );\n\t\treturn this.width.add( this.height_left ).add( this.height_right ).add( new Length( diagonal_length ) );\n\t}\n\n\tget_longest_height() {\n\t\treturn this.height_left.max( this.height_right );\n\t}\n\n\tget_shortest_height() {\n\t\treturn this.height_left.min( this.height_right );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height_left() {\n\t\treturn this.height_left;\n\t}\n\n\tget_height_right() {\n\t\treturn this.height_right;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_width(),\n\t\t\theight_left: maximum_rectangle.get_longest_side(),\n\t\t\theight_right: maximum_rectangle.get_longest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"height_left\", \"width\", \"height_right\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight_left: this.height_left.in_mm(),\n\t\t\theight_right: this.height_right.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new SlopedRectangle( new Length( primitives.width ), new Length( primitives.height_left ), new Length( primitives.height_right ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport RightAngledTriangle from \"./RightAngledTriangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class SlopedRightRectangle extends AbstractShape {\n\tstatic NAME = \"sloped-right-rectangle\";\n\n\tconstructor( height, width_top, width_bottom ) {\n\t\tsuper();\n\n\t\tthis.height = height;\n\t\tthis.width_top = width_top;\n\t\tthis.width_bottom = width_bottom;\n\t}\n\n\tget_name() {\n\t\treturn SlopedRightRectangle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.height, this.get_longest_width() );\n\t}\n\n\tget_area() {\n\t\tconst largest_height = this.get_longest_width();\n\t\tconst smallest_height = this.get_shortest_width();\n\t\tconst base_rectangle = new Rectangle( this.height, this.get_shortest_width() );\n\t\tconst top_triangle = new RightAngledTriangle( this.height, largest_height.subtract( smallest_height ) );\n\t\treturn base_rectangle.get_area().add( top_triangle.get_area() );\n\t}\n\n\tget_circumference() //Pythagorean theorem, a^2 + b^2 = c^2\n\t{\n\t\tconst diagonal_length = Math.sqrt( Math.pow( this.height.in_mm(), 2 ) + Math.pow( this.get_longest_width().subtract( this.get_shortest_width() ).in_mm(), 2 ) );\n\t\treturn this.height.add( this.width_top ).add( this.width_bottom ).add( new Length( diagonal_length ) );\n\t}\n\n\tget_longest_width() {\n\t\treturn this.width_top.max( this.width_bottom );\n\t}\n\n\tget_shortest_width() {\n\t\treturn this.width_top.min( this.width_bottom );\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_width_top() {\n\t\treturn this.width_top;\n\t}\n\n\tget_width_bottom() {\n\t\treturn this.width_bottom;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\theight: maximum_rectangle.get_height(),\n\t\t\twidth_top: maximum_rectangle.get_longest_side(),\n\t\t\twidth_bottom: maximum_rectangle.get_longest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"width_top\", \"height\", \"width_bottom\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\theight: this.height.in_mm(),\n\t\t\twidth_top: this.width_top.in_mm(),\n\t\t\twidth_bottom: this.width_bottom.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new SlopedRightRectangle( new Length( primitives.height ), new Length( primitives.width_top ), new Length( primitives.width_bottom ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class ArchedRectangle extends AbstractShape {\n\tstatic NAME = 'arched-rectangle';\n\n\tconstructor( width, height ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn ArchedRectangle.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.height );\n\t}\n\n\tget_area() {\n\t\tconst radius           = this.width.in_mm() / 2;\n\t\tconst half_circle      = Math.PI * Math.pow( radius, 2 ) * 0.5;\n\t\tconst rectangle_height = this.height.in_mm() - radius;\n\t\tconst area             = half_circle + ( this.width.in_mm() * rectangle_height );\n\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\tconst half_circle_circumference = new Length( Math.PI * this.width.in_mm() / 2 );\n\t\tconst rectangle_height          = this.height.in_mm() - this.width.in_mm() / 2;\n\t\tconst rectangle_circumference   = new Length( this.width.in_mm() + ( rectangle_height * 2 ) );\n\n\t\treturn new Length( half_circle_circumference.in_mm() + rectangle_circumference.in_mm() );\n\t}\n\n\tget_required_material() {\n\t\tconst enclosing_rect = this.get_enclosing_rectangle();\n\n\t\tconst width  = enclosing_rect.get_width().add( new Length( this.get_material_loss() ) );\n\t\tconst height = enclosing_rect.get_length().add( new Length( this.get_material_loss() ) );\n\n\t\treturn new Rectangle( width, height );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new ArchedRectangle( new Length( primitives.width ), new Length( primitives.height ) );\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport Circle from \"./Circle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Heart extends AbstractShape {\n\tstatic NAME = \"heart\";\n\n\tconstructor( height ) {\n\t\tsuper();\n\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn Heart.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\tconst a = this.get_rectangle_side().in_mm();\n\t\tconst b = ( Math.sqrt( 2 ) / 2 + 1 ) * a;\n\t\treturn new Rectangle( this.height, new Length( b ) );\n\t}\n\n\tget_rectangle_side() //https://rechneronline.de/pi/heart.php.\n\t{\n\t\tconst h           = this.height.in_mm();\n\t\tconst side_length = h / (\n\t\t\t3 / 4 * Math.sqrt( 2 ) + 1 / 2\n\t\t);\n\t\treturn new Length( side_length );\n\t}\n\n\tget_area() //Two half circles on the top gives us one whole.\n\t{\n\t\tconst side_length = this.get_rectangle_side();\n\t\tconst rectangle   = new Rectangle( side_length, side_length );\n\t\tconst circle      = new Circle( side_length );\n\t\treturn rectangle.get_area().add( circle.get_area() );\n\t}\n\n\tget_circumference() //Two half circles on the top gives us one whole.\n\t//The rectangle circumference only counts half, because the other half is inside the shape.\n\t{\n\t\tconst side_length = this.get_rectangle_side();\n\t\tconst rectangle   = new Rectangle( side_length, side_length );\n\t\tconst circle      = new Circle( side_length );\n\t\treturn rectangle.get_circumference().divide( 2 ).add( circle.get_circumference() );\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) //The heart width is the limiting factor, so calculate the height from the maximum width.\n\t{\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side();\n\t\tconst b             = shortest_side.in_mm();\n\t\tconst a             = b / (\n\t\t\tMath.sqrt( 2 ) / 2 + 1\n\t\t);\n\t\tconst h             = a * (\n\t\t\t3 / 4 * Math.sqrt( 2 ) + 1 / 2\n\t\t);\n\t\treturn {\n\t\t\theight: new Length( h )\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Heart( new Length( primitives.height ) );\n\t}\n\n}\n","export default class Text {\n\tstatic NAME = \"text\";\n\n\tget_name() {\n\t\treturn Text.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t}\n\n\tget_area() {\n\t}\n\n\tget_circumference() {\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_length(),\n\t\t\theight: maximum_rectangle.get_width()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"desired_length\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [\"font\", \"text\", \"desired_dimension\"];\n\t}\n\n\tserialize_primitives() {\n\t}\n\n\tstatic deserialize_primitives() {\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport Area from \"./Area\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class Trapezoid extends AbstractShape {\n\tstatic NAME = \"trapezoid\";\n\n\tconstructor( width_bottom, offset_left, width_top, height ) {\n\t\tsuper();\n\n\t\tthis.width_bottom = width_bottom;\n\t\tthis.offset_left = offset_left;\n\t\tthis.width_top = width_top;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn Trapezoid.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width_top.max( this.width_bottom ), this.height );\n\t}\n\n\tget_area() {\n\t\treturn new Area( ( this.width_bottom.in_mm() + this.width_top.in_mm() ) / 2 * this.height.in_mm() );\n\t}\n\n\tget_circumference() {\n\t\tconst left_diagonal = Math.sqrt( Math.pow( this.offset_left.in_mm(), 2 ) + Math.pow( this.height.in_mm(), 2 ) );\n\t\tconst offset_right = this.width_bottom.subtract( this.width_top.add( this.offset_left ) );\n\t\tconst right_diagonal = Math.sqrt( Math.pow( offset_right.in_mm(), 2 ) + Math.pow( this.height.in_mm(), 2 ) );\n\t\treturn this.width_bottom.add( this.width_top ).add( new Length( left_diagonal ) ).add( new Length( right_diagonal ) );\n\t}\n\n\tget_width_bottom() {\n\t\treturn this.width_bottom;\n\t}\n\n\tget_width_top() {\n\t\treturn this.width_top;\n\t}\n\n\tget_offset_left() {\n\t\treturn this.offset_left;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth_bottom: maximum_rectangle.get_longest_side(),\n\t\t\toffset_left: maximum_rectangle.get_longest_side(),\n\t\t\twidth_top: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_longest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [\"width_top\", \"height\", \"width_bottom\", \"offset_left\"];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth_bottom: this.width_bottom.in_mm(),\n\t\t\toffset_left: this.offset_left.in_mm(),\n\t\t\twidth_top: this.width_top.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Trapezoid( new Length( primitives.width_bottom ), new Length( primitives.offset_left ), new Length( primitives.width_top ), new Length( primitives.height ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Area from \"./Area\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\n\nexport default class FlatOval extends AbstractShape {\n\tstatic NAME = \"flat-oval\";\n\n\tconstructor( width, radius ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.radius = radius;\n\t}\n\n\tget_name() {\n\t\treturn FlatOval.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.get_width(), this.get_height() );\n\t}\n\n\tget_area() {\n\t\tconst radius = this.get_radius().in_mm();\n\t\tconst areaCircle = Math.PI * Math.pow( radius, 2 );\n\t\tconst width = this.get_width().in_mm() - ( radius * 2 );\n\t\tconst areaRectangle = width * this.get_height().in_mm();\n\t\tconst area = areaCircle + areaRectangle;\n\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\tconst radius = this.get_radius().in_mm();\n\t\tconst diameter = radius * 2;\n\n\t\tconst width = this.get_width().in_mm();\n\n\t\tconst perimeterRectangle = 2 * ( width - diameter );\n\t\tconst perimeterCircle = Math.PI * diameter;\n\t\tconst perimeter = perimeterRectangle + perimeterCircle;\n\n\t\treturn new Length( perimeter );\n\t}\n\n\tget_radius() {\n\t\treturn this.radius;\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.radius.multiply( 2 );\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle )\t{\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\tradius: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"radius\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\tradius: this.radius.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new FlatOval( new Length( primitives.width ), new Length( primitives.radius ) );\n\t}\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Kite extends AbstractShape {\n\tstatic NAME = \"kite\";\n\n\tconstructor( width, height_top, height_bottom ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height_top = height_top;\n\t\tthis.height_bottom = height_bottom;\n\t}\n\n\tget_name() {\n\t\treturn Kite.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.get_width(), this.get_height() );\n\t}\n\n\tget_area() {\n\t\tconst area = ( this.get_height().in_mm() * this.get_width().in_mm() ) / 2;\n\n\t\treturn new Area( area );\n\t}\n\n\tget_circumference() {\n\t\tconst halfWidth = this.get_width().divide( 2 ).in_mm();\n\t\tconst upperSlope = Math.sqrt( this.get_height_top().in_mm() ** 2 + halfWidth ** 2 );\n\t\tconst lowerSlope = Math.sqrt( this.get_height_bottom().in_mm() ** 2 + halfWidth ** 2 );\n\t\tconst perimeter = 2 * ( upperSlope + lowerSlope );\n\n\t\treturn new Length( perimeter );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height_top.add( this.height_bottom );\n\t}\n\n\tget_height_top() {\n\t\treturn this.height_top;\n\t}\n\tget_height_bottom() {\n\t\treturn this.height_bottom;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\t\tconst height_top = longest_side.divide( 3 ).in_mm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_shortest_side(),\n\t\t\theight_top: new Length( height_top ),\n\t\t\theight_bottom: new Length( height_bottom ),\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height_top\", \"height_bottom\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight_top: this.height_top.in_mm(),\n\t\t\theight_bottom: this.height_bottom.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Kite( new Length( primitives.width ), new Length( primitives.height_top ), new Length( primitives.height_bottom ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Barrel extends AbstractShape {\n\tstatic NAME = \"barrel\";\n\n\tconstructor( width, height, side_height ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.side_height = side_height;\n\t}\n\n\tget_name() {\n\t\treturn Barrel.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.get_width(), this.get_height() );\n\t}\n\n\tget_area() {\n\t\tconst height = this.get_height().in_mm();\n\t\tconst width = this.get_width().in_mm();\n\t\tconst sideHeight = this.get_side_height().in_mm();\n\n\t\tconst circleSegmentHeight = ( height - sideHeight ) / 2;\n\n\t\tconst arcRadius = ( circleSegmentHeight / 2 ) + ( Math.pow( width, 2 ) / ( 8 * circleSegmentHeight ) );\n\t\tconst arcAngle = 2 * Math.asin( width / ( 2 * arcRadius ) );\n\t\tconst circleSegmentArea = ( Math.pow( arcRadius, 2 ) / 2 ) * ( arcAngle - Math.sin( arcAngle ) );\n\n\t\tconst barrelArea = ( width * height ) + ( 2 * circleSegmentArea );\n\t\treturn new Area( barrelArea );\n\t}\n\n\tget_circumference() {\n\t\tconst width = this.get_width().in_mm();\n\t\tconst height = this.get_height().in_mm();\n\t\tconst sideHeight = this.get_side_height().in_mm();\n\n\t\tconst circleSegmentHeight = ( height - sideHeight ) / 2;\n\n\t\tconst arcRadius = ( circleSegmentHeight / 2 ) + ( Math.pow( width, 2 ) / ( 8 * circleSegmentHeight ) );\n\t\tconst arcAngle = 2 * Math.asin( width / ( 2 * arcRadius ) );\n\t\tconst arcLength = arcRadius * arcAngle;\n\n\t\tconst barrelCircumference = ( width * 2 ) + ( 2 * arcLength );\n\n\t\treturn new Length( barrelCircumference );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_side_height() {\n\t\treturn this.side_height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\n\t\treturn {\n\t\t\twidth: longest_side,\n\t\t\theight: longest_side,\n\t\t\tside_height: maximum_rectangle.get_shortest_side(),\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height\", \"side_height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight: this.height,\n\t\t\tside_height: this.side_height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Barrel(\n\t\t\tnew Length( primitives.width ),\n\t\t\tnew Length( primitives.height ),\n\t\t\tnew Length( primitives.side_height )\n\t\t);\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Jewel extends AbstractShape {\n\tstatic NAME = \"jewel\";\n\n\tconstructor( width_top, width_bottom, height_top, height_bottom ) {\n\t\tsuper();\n\n\t\tthis.width_top = width_top;\n\t\tthis.width_bottom = width_bottom;\n\t\tthis.height_top = height_top;\n\t\tthis.height_bottom = height_bottom;\n\t}\n\n\tget_name() {\n\t\treturn Jewel.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.get_width(), this.get_height() );\n\t}\n\n\t/**\n\t * Calculate the total area of the jewel shape, which consiss of a bottom\n\t * isosceles trangle and a top trapezoid.\n\t */\n\tget_area() {\n\t\tconst width_top = this.get_width_top().in_mm();\n\t\tconst width_bottom = this.get_width_bottom().in_mm();\n\t\tconst height_top = this.get_height_top().in_mm();\n\t\tconst height_bottom = this.get_height_bottom().in_mm();\n\n\t\tconst bottom_triangle = width_bottom * height_bottom / 2;\n\t\tconst top_trapezoid = ( width_top + width_bottom ) / 2 * height_top;\n\n\t\treturn new Area( bottom_triangle + top_trapezoid );\n\t}\n\n\t/**\n\t * Calculate the circumference of the shape, by calculating the angled side\n\t * lengths for both the triangle and trapezoid, and adding the top width.\n\t */\n\tget_circumference() {\n\t\tconst width_top = this.get_width_top().in_mm();\n\t\tconst width_bottom = this.get_width_bottom().in_mm();\n\t\tconst height_top = this.get_height_top().in_mm();\n\t\tconst height_bottom = this.get_height_bottom().in_mm();\n\n\t\tconst triangle_side_length = Math.sqrt( Math.pow( width_bottom / 2, 2 ) + Math.pow( height_bottom, 2 ) );\n\t\tconst trapezoid_side_length = Math.sqrt( Math.pow( ( width_bottom - width_top ) / 2, 2 ) + Math.pow( height_top, 2 ) );\n\n\t\treturn new Length( triangle_side_length * 2 + trapezoid_side_length * 2 + width_top );\n\t}\n\n\tget_width() {\n\t\treturn this.width_bottom;\n\t}\n\n\tget_height() {\n\t\treturn this.height_top.add( this.height_bottom );\n\t}\n\n\tget_width_top() {\n\t\treturn this.width_top;\n\t}\n\n\tget_width_bottom() {\n\t\treturn this.width_bottom;\n\t}\n\n\tget_height_top() {\n\t\treturn this.height_top;\n\t}\n\n\tget_height_bottom() {\n\t\treturn this.height_bottom;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst longest_side = maximum_rectangle.get_longest_side();\n\t\tconst height_top = longest_side.divide( 3 ).in_mm();\n\t\tconst height_bottom = height_top + ( height_top / 2 );\n\n\t\treturn {\n\t\t\twidth_top: maximum_rectangle.get_shortest_side(),\n\t\t\twidth_bottom: maximum_rectangle.get_shortest_side(),\n\t\t\theight_top: new Length( height_top ),\n\t\t\theight_bottom: new Length( height_bottom ),\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width_top\", \"width_bottom\", \"height_top\", \"height_bottom\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth_top: this.width_top.in_mm(),\n\t\t\twidth_bottom: this.width_bottom.in_mm(),\n\t\t\theight_top: this.height_top.in_mm(),\n\t\t\theight_bottom: this.height_bottom.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Jewel(\n\t\t\tnew Length( primitives.width_top ),\n\t\t\tnew Length( primitives.width_bottom ),\n\t\t\tnew Length( primitives.height_top ),\n\t\t\tnew Length( primitives.height_bottom )\n\t\t);\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Droplet extends AbstractShape {\n\tstatic NAME = \"droplet\";\n\tcalculations = {};\n\tarea = null;\n\tcircumference = null;\n\n\tconstructor( height, width ) {\n\t\tsuper();\n\n\t\tthis.height = height;\n\t\tthis.width = width;\n\t}\n\n\tget_name() {\n\t\treturn Droplet.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\tconst a = this.get_rectangle_side().in_mm();\n\t\tconst b = ( Math.sqrt( 2 ) / 2 + 1 ) * a;\n\t\treturn new Rectangle( this.height, new Length( b ) );\n\t}\n\n\tget_rectangle_side() {\n\t\tconst h = this.height.in_mm();\n\t\tconst side_length = h / (\n\t\t\t3 / 4 * Math.sqrt( 2 ) + 1 / 2\n\t\t);\n\t\treturn new Length( side_length );\n\t}\n\n\tget_area() {\n\t\tif ( ! this.area ) {\n\t\t\tthis.calculate_shape();\n\t\t}\n\n\t\treturn this.area;\n\t}\n\n\tget_circumference() {\n\t\tif ( ! this.circumference ) {\n\t\t\tthis.calculate_shape();\n\t\t}\n\n\t\treturn this.circumference;\n\t}\n\n\tcalculate_shape() {\n\t\tconst width = this.width.in_mm();\n\t\tconst height = this.height.in_mm();\n\n\t\tconst base_circle_radius = width / 2;\n\t\tconst intersect_circle_radius = ( height - base_circle_radius ) / 2;\n\n\t\tconst circle_segment_height = this.get_circle_segment_height( base_circle_radius, intersect_circle_radius );\n\n\t\tconst chord_length = 2 * Math.sqrt( 2 * base_circle_radius * circle_segment_height - Math.pow( circle_segment_height, 2 ) );\n\t\tconst triangle_height = height - circle_segment_height;\n\t\tconst triangle_base = chord_length / 2;\n\t\tconst triangle_side_length = Math.sqrt( Math.pow( triangle_base, 2 ) + Math.pow( triangle_height, 2 ) );\n\n\t\tconst arc_length = base_circle_radius * 2 * Math.acos( 1 - circle_segment_height / base_circle_radius );\n\t\tconst circumference = 2 * triangle_side_length + arc_length;\n\n\t\tconst area = (\n\t\t\t( base_circle_radius * arc_length ) +\n\t\t\t( chord_length * ( circle_segment_height - base_circle_radius ) ) +\n\t\t\tchord_length * Math.sqrt( ( 4 * Math.pow( triangle_side_length, 2 ) - Math.pow( chord_length, 2 ) ) / 4 )\n\t\t) / 2;\n\n\t\tthis.area = new Area( area );\n\t\tthis.circumference = new Length( circumference );\n\n\t\tthis.calculations = {\n\t\t\tbase_circle_radius,\n\t\t\tintersect_circle_radius,\n\t\t\tcircle_segment_height,\n\t\t\tchord_length,\n\t\t\ttriangle_height,\n\t\t\ttriangle_base,\n\t\t\ttriangle_side_length,\n\t\t\tarc_length,\n\t\t\tperimeter: circumference,\n\t\t\tarea,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate the circle segment height, which for this shape is the point\n\t * where the base circle overlaps with the intersect circle. The Y value of\n\t * these intersect points is the circle segment height.\n\t */\n\tget_circle_segment_height( base_circle_radius, intersect_circle_radius ) {\n\t\tconst distance = intersect_circle_radius;\n\n\t\t// Check if there's an intersection\n\t\tif ( distance > ( base_circle_radius + intersect_circle_radius ) || distance < Math.abs( base_circle_radius - intersect_circle_radius ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Calculate the point where these two circles intersect\n\t\tconst intersect = ( Math.pow( base_circle_radius, 2 ) - Math.pow( intersect_circle_radius, 2 ) + Math.pow( distance, 2 ) ) / ( 2 * distance );\n\n\t\t// Add the base circle radius to get the Y value\n\t\treturn intersect + base_circle_radius;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\tconst shortest_side = maximum_rectangle.get_shortest_side();\n\t\tconst b             = shortest_side.in_mm();\n\t\tconst a             = b / (\n\t\t\tMath.sqrt( 2 ) / 2 + 1\n\t\t);\n\t\tconst h             = a * (\n\t\t\t3 / 4 * Math.sqrt( 2 ) + 1 / 2\n\t\t);\n\t\treturn {\n\t\t\theight: new Length( h )\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"height\", \"width\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\theight: this.height.in_mm(),\n\t\t\twidth: this.width.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Droplet( new Length( primitives.height ), new Length( primitives.width ) );\n\t}\n\n}\n","import Rectangle from \"./Rectangle\";\nimport Length from \"./Length\";\nimport AbstractShape from \"./AbstractShape\";\nimport Area from \"./Area\";\n\nexport default class Parallelogram extends AbstractShape {\n\tstatic NAME = \"parallelogram\";\n\n\tconstructor( width, height ) {\n\t\tsuper();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tget_name() {\n\t\treturn Parallelogram.NAME;\n\t}\n\n\tget_enclosing_rectangle() {\n\t\treturn new Rectangle( this.width, this.height );\n\t}\n\n\tget_area() {\n\t\tconst width = this.width.in_mm();\n\t\tconst height = this.height.in_mm();\n\n\t\treturn new Area( width * height );\n\t}\n\n\tget_circumference() {\n\t\tconst width = this.width.in_mm();\n\t\tconst height = this.height.in_mm();\n\t\tconst circumference = ( ( 2 * width ) + ( 2 * height ) );\n\t\treturn new Length( circumference );\n\t}\n\n\tget_width() {\n\t\treturn this.width;\n\t}\n\n\tget_height() {\n\t\treturn this.height;\n\t}\n\n\tget_maximum_dimensions( maximum_rectangle ) {\n\t\treturn {\n\t\t\twidth: maximum_rectangle.get_longest_side(),\n\t\t\theight: maximum_rectangle.get_shortest_side()\n\t\t};\n\t}\n\n\tget_dimension_keys() {\n\t\treturn [ \"width\", \"height\" ];\n\t}\n\n\tget_modifier_keys() {\n\t\treturn [];\n\t}\n\n\tserialize_primitives() {\n\t\treturn {\n\t\t\twidth: this.width.in_mm(),\n\t\t\theight: this.height.in_mm()\n\t\t};\n\t}\n\n\tstatic deserialize_primitives( primitives ) {\n\t\treturn new Parallelogram( new Length( primitives.width ), new Length( primitives.height ) );\n\t}\n}\n","import Rectangle from \"./Geometry/Rectangle\";\nimport Circle from \"./Geometry/Circle\";\nimport NullShape from \"./Geometry/NullShape\";\nimport RightAngledTriangle from \"./Geometry/RightAngledTriangle\";\nimport RightAngledTriangleMirrored from \"./Geometry/RightAngledTriangleMirrored\";\nimport Ellipse from \"./Geometry/Ellipse\";\nimport Egg from \"./Geometry/Egg\";\nimport RoundedRectangle from \"./Geometry/RoundedRectangle\";\nimport IsoscelesTriangle from \"./Geometry/IsoscelesTriangle\";\nimport HalfCircle from \"./Geometry/HalfCircle\";\nimport QuarterCircle from \"./Geometry/QuarterCircle\";\nimport Hexagon from \"./Geometry/Hexagon\";\nimport Octagon from \"./Geometry/Octagon\";\nimport Polygon from \"./Geometry/Polygon\";\nimport Arrow from \"./Geometry/Arrow\";\nimport Star from \"./Geometry/Star\";\nimport SlopedRectangle from \"./Geometry/SlopedRectangle\";\nimport SlopedRightRectangle from \"./Geometry/SlopedRightRectangle\";\nimport ArchedRectangle from \"./Geometry/ArchedRectangle\";\nimport Heart from \"./Geometry/Heart\";\nimport Text from \"./Geometry/Text\";\nimport Trapezoid from \"./Geometry/Trapezoid\";\nimport FlatOval from \"./Geometry/FlatOval\";\nimport Kite from \"./Geometry/Kite\";\nimport Barrel from \"./Geometry/Barrel\";\nimport Jewel from \"./Geometry/Jewel\";\nimport Droplet from \"./Geometry/Droplet\";\nimport Parallelogram from \"./Geometry/Parallelogram\";\n\nexport default class ShapeFactory {\n\tconstructor() {\n\t\tthis.shapes = {\n\t\t\t[ Rectangle.NAME ]: Rectangle,\n\t\t\t[ Circle.NAME ]: Circle,\n\t\t\t[ RightAngledTriangle.NAME ]: RightAngledTriangle,\n\t\t\t[ RightAngledTriangleMirrored.NAME ]: RightAngledTriangleMirrored,\n\t\t\t[ RoundedRectangle.NAME ]: RoundedRectangle,\n\t\t\t[ Egg.NAME ]: Egg,\n\t\t\t[ Ellipse.NAME ]: Ellipse,\n\t\t\t[ FlatOval.NAME ]: FlatOval,\n\t\t\t[ IsoscelesTriangle.NAME ]: IsoscelesTriangle,\n\t\t\t[ HalfCircle.NAME ]: HalfCircle,\n\t\t\t[ QuarterCircle.NAME ]: QuarterCircle,\n\t\t\t[ Hexagon.NAME ]: Hexagon,\n\t\t\t[ Octagon.NAME ]: Octagon,\n\t\t\t[ Polygon.NAME ]: Polygon,\n\t\t\t[ Arrow.NAME ]: Arrow,\n\t\t\t[ Star.NAME ]: Star,\n\t\t\t[ SlopedRectangle.NAME ]: SlopedRectangle,\n\t\t\t[ SlopedRightRectangle.NAME ]: SlopedRightRectangle,\n\t\t\t[ ArchedRectangle.NAME ]: ArchedRectangle,\n\t\t\t[ Heart.NAME ]: Heart,\n\t\t\t[ Text.NAME ]: Text,\n\t\t\t[ Trapezoid.NAME ]: Trapezoid,\n\t\t\t[ Kite.NAME ]: Kite,\n\t\t\t[ Barrel.NAME ]: Barrel,\n\t\t\t[ Jewel.NAME ]: Jewel,\n\t\t\t[ Droplet.NAME ]: Droplet,\n\t\t\t[ Parallelogram.NAME ]: Parallelogram,\n\t\t};\n\t}\n\n\t/**\n\t * @param {string|number} shape_name\n\t * @param {*} primitives\n\t *\n\t * @returns {AbstractShape|NullShape} The shape instance.\n\t */\n\tcreate_shape_from_primitives( shape_name, primitives ) {\n\t\tif ( !( shape_name in this.shapes ) ) {\n\t\t\treturn new NullShape();\n\t\t}\n\n\t\treturn this.shapes[ shape_name ].deserialize_primitives( primitives );\n\t}\n\n\t/**\n\t * @param {string|number} shape_name\n\t * @returns {AbstractShape|NullShape} The shape instance.\n\t */\n\tget_shape_object( shape_name ) {\n\t\treturn this.shapes[ shape_name ] ?? new NullShape();\n\t}\n}\n","const settings = window.measurementSelectorVariables;\n\nexport default {\n\tstate: (): { activeEdgeFinish: string } => ({\n\t\tactiveEdgeFinish: 'sawing',\n\t}),\n\tmutations: {\n\t\tupdateActiveEdgeFinish( state, activeEdgeFinish ): void {\n\t\t\tstate.activeEdgeFinish = activeEdgeFinish;\n\t\t},\n\t},\n\tgetters: {\n\t\tisEdgeFinishVisible: (state, getters): boolean => {\n\t\t\tif ( getters.shape && getters.getPricingGroup.get_shape_settings(getters.exportShape).customer_choose_production_method ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tgetEdgeFinishMethods: ( state, getters, rootState, rootGetters ): {\n\t\t\tvalue: string;\n\t\t\tlabel: string;\n\t\t}[] => {\n\t\t\tconst methods = settings.i18n.edgeFinish.methods;\n\n\t\t\t// Any sawing method that has a price defined, becomes available for all enabled shapes.\n\t\t\tconst availableMethods = Object.entries(methods).filter((value) => {\n\t\t\t\tconst price = rootGetters.getPricingGroup.get_sawing_selling_price_per_m(value[0], rootGetters.exportShape);\n\t\t\t\treturn price > 0;\n\t\t\t});\n\n\t\t\tconst defaultEdgeFinish = getters.getDefaultEdgeFinish;\n\n\t\t\t// Add default sawing method as edge finish option\n\t\t\tif( defaultEdgeFinish && !availableMethods.find((value) => value[0] === defaultEdgeFinish) ) {\n\t\t\t\tavailableMethods.push([defaultEdgeFinish, methods[defaultEdgeFinish]]);\n\t\t\t}\n\n\t\t\treturn availableMethods.map( (value) => ({\n\t\t\t\tvalue: value[0],\n\t\t\t\tlabel: value[1] as string,\n\t\t\t}) );\n\t\t},\n\t\tgetDefaultEdgeFinish: ( state, getters, rootState, rootGetters ): string => {\n\t\t\tconst shapeSettings = rootGetters.getPricingGroup.get_shape_settings(rootGetters.exportShape);\n\t\t\treturn shapeSettings.sawing_method;\n\t\t},\n\t\tactiveEdgeFinish( state, getters ): string {\n\t\t\tconst methods = getters.getEdgeFinishMethods;\n\t\t\tif(methods.find((method) => method.value === state.activeEdgeFinish)) {\n\t\t\t\treturn state.activeEdgeFinish;\n\t\t\t}\n\t\t\treturn getters.getDefaultEdgeFinish;\n\t\t},\n\t},\n};\n","interface ShapeSettings {\n\tsawing_method: string;\n\tpurchase_price_minimum?: string;\n\tselling_price_minimum?: string;\n\tswap_maximum_dimensions?: boolean;\n}\n\ninterface SawingMethodSettings {\n\tpurchase_price_per_m?: string;\n\tselling_price_per_m?: string;\n}\n\ninterface OtherSettings {\n\tshape_purchase_price_starting_rate?: string;\n\tshape_selling_price_starting_rate?: string;\n\tenable_cutout?: boolean;\n\tenable_drillholes?: boolean;\n}\n\nexport default class PricingGroup {\n\tenabled_shapes: string[];\n\tshape_settings: Record<string, ShapeSettings>;\n\tsawing_method_settings: Record<string, SawingMethodSettings>;\n\tother_settings: OtherSettings;\n\n\tconstructor( settings: {\n\t\tenabled_shapes?: string[];\n\t\tshape_settings?: Record<string, ShapeSettings>;\n\t\tsawing_method_settings?: Record<string, SawingMethodSettings>;\n\t\tother_settings?: OtherSettings;\n\t} ) {\n\t\tthis.enabled_shapes = settings.enabled_shapes || [];\n\t\tthis.shape_settings = settings.shape_settings || {};\n\t\tthis.sawing_method_settings = settings.sawing_method_settings || {};\n\t\tthis.other_settings = {\n\t\t\tshape_purchase_price_starting_rate:\n\t\t\t\tsettings.other_settings?.shape_purchase_price_starting_rate || \"0\",\n\t\t\tshape_selling_price_starting_rate:\n\t\t\t\tsettings.other_settings?.shape_selling_price_starting_rate || \"0\",\n\t\t\tenable_cutout: settings.other_settings?.enable_cutout || false,\n\t\t\tenable_drillholes: settings.other_settings?.enable_drillholes || false,\n\t\t};\n\t}\n\n\tget_sawing_method_settings( sawing_method: string ): SawingMethodSettings {\n\t\treturn this.sawing_method_settings[ sawing_method ] || {};\n\t}\n\n\tget_sawing_purchase_price_per_m( sawing_method: string ): number {\n\t\tconst sawing_method_settings = this.get_sawing_method_settings(\n\t\t\tsawing_method\n\t\t);\n\t\treturn parseFloat( sawing_method_settings.purchase_price_per_m || \"0\" );\n\t}\n\n\tget_sawing_selling_price_per_m( sawing_method: string, shape: string ): number {\n\t\tconst shapeSettings = this.get_shape_settings( shape );\n\n\t\tif(shape === 'rectangle' && shapeSettings.sawing_method === sawing_method) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst sawing_method_settings = this.get_sawing_method_settings(\n\t\t\tsawing_method\n\t\t);\n\t\treturn parseFloat( sawing_method_settings.selling_price_per_m || \"0\" );\n\t}\n\n\tget_shape_settings( shape: string ): ShapeSettings {\n\t\treturn this.shape_settings[ shape ] || {\n\t\t\tsawing_method: \"sawing\",\n\t\t};\n\t}\n\n\tget_sawing_method( shape: string ): string {\n\t\tconst shape_settings = this.get_shape_settings( shape );\n\t\treturn shape_settings.sawing_method || \"sawing\";\n\t}\n\n\tget_purchase_starting_price(): number {\n\t\treturn parseFloat( this.other_settings.shape_purchase_price_starting_rate );\n\t}\n\n\tget_selling_starting_price(): number {\n\t\treturn parseFloat( this.other_settings.shape_selling_price_starting_rate );\n\t}\n\n\tget_minimum_purchase_price( shape: string ): number {\n\t\tconst shape_settings = this.get_shape_settings( shape );\n\t\treturn parseFloat( shape_settings.purchase_price_minimum || \"0\" );\n\t}\n\n\tget_minimum_selling_price( shape: string ): number {\n\t\tconst shape_settings = this.get_shape_settings( shape );\n\t\treturn parseFloat( shape_settings.selling_price_minimum || \"0\" );\n\t}\n\n\tget_enabled_shapes(): string[] {\n\t\treturn this.enabled_shapes;\n\t}\n\n\tgetEnableCutouts(): boolean {\n\t\treturn this.other_settings.enable_cutout;\n\t}\n\n\tgetEnableDrillholes(): boolean {\n\t\treturn this.other_settings.enable_drillholes;\n\t}\n\n\tswapMaximumDimensions( shape: string ): boolean {\n\t\tconst shape_settings = this.get_shape_settings( shape );\n\t\treturn shape_settings.swap_maximum_dimensions || false;\n\t}\n\n\tjsonSerialize(): {\n\t\tenabled_shapes: string[];\n\t\tshape_settings: Record<string, ShapeSettings>;\n\t\tsawing_method_settings: Record<string, SawingMethodSettings>;\n\t\tother_settings: OtherSettings;\n\t\t} {\n\t\treturn {\n\t\t\tenabled_shapes: this.enabled_shapes,\n\t\t\tshape_settings: this.shape_settings,\n\t\t\tsawing_method_settings: this.sawing_method_settings,\n\t\t\tother_settings: this.other_settings,\n\t\t};\n\t}\n}\n","import {IModel} from \"makerjs\";\nimport {DXFToModel, SVGToModel} from \"@/functions/makerjs\";\n\nexport default {\n\tstate: {\n\t\tuploadedContent: '',\n\t\toriginalFilename: '',\n\t\toriginalFileType: '',\n\t\tisParsing: false,\n\t},\n\tgetters: {\n\t\tuploadedContent: (state):string => state.uploadedContent,\n\t\tuploadAsModel: (state, getters):null|IModel => {\n\t\t\tif (getters.uploadedContent.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Handle SVG\n\t\t\tif ( state.originalFileType === \"image/svg+xml\" ) {\n\t\t\t\treturn SVGToModel(getters.uploadedContent);\n\t\t\t}\n\n\t\t\treturn DXFToModel(getters.uploadedContent);\n\t\t},\n\t\tgetOriginalFilename: (state):string => state.originalFilename,\n\t\tgetOriginalFileType: (state):string => state.originalFileType,\n\t\tgetIsParsingFile: (state):boolean => state.isParsing\n\t},\n\tmutations: {\n\t\tsetUploadedContent(state, {result, filename, filetype}): void {\n\t\t\tstate.uploadedContent = result.trim();\n\t\t\tstate.originalFilename = filename;\n\t\t\tstate.originalFileType = filetype;\n\t\t},\n\t\tsetParsingState(state, isParsing): void {\n\t\t\tstate.isParsing = isParsing;\n\t\t}\n\t},\n\tactions: {\n\t\tupdateUploadedContent({commit}, file): void {\n\n\t\t\t// If more than 2MB do not proceed\n\t\t\tif (file.size > 2000000) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcommit('setParsingState', true);\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = function(e): void {\n\t\t\t\tcommit('setUploadedContent', {result: e.target.result, filename: file.name, filetype: file.type});\n\t\t\t\tcommit('setParsingState', false);\n\t\t\t};\n\t\t\treader.readAsText(file);\n\t\t}\n\t}\n};\n","\nexport type config = {\n\tbase: {\n\t\tshape: string,\n\t\tpresetShape: string,\n\t\tprimitives: {},\n\t},\n\tdrillholes: {\n\t\ttype: string,\n\t\tedgeType?: string,\n\t\toffset?: number,\n\t\tdiameter?: number,\n\t\tsettings?: {}[],\n\t\tamount?: number,\n\t\tposition?: {},\n\t\tradialDiameter?: number,\n\t\tamountHorizontal?: number,\n\t\tamountVertical?: number,\n\t},\n\tcutouts: {\n\t\ttype: string,\n\t\tshape: string,\n\t\tprimitives: {},\n\t\tmodifiers: {\n\t\t\tuse_individual_corners?: boolean,\n\t\t}|[],\n\t\tposition: {},\n\t}[]\n};\n\nexport abstract class AbstractPreset {\n\tabstract getConfig(): config;\n\tabstract getName(): string;\n\n\thasCutouts(): boolean {\n\t\treturn this.getConfig().cutouts.length > 0;\n\t}\n\n\thasDrillholes(): boolean {\n\t\treturn this.getConfig().drillholes.type !== \"none\";\n\t}\n\n\t// Used to check if shapes are enabled for current product\n\tgetShapes(): string[] {\n\t\tconst shapes = [];\n\t\tshapes.push(this.getConfig().base.shape);\n\n\t\tif(this.hasCutouts()) {\n\t\t\tthis.getConfig().cutouts.forEach(cutout => shapes.push(cutout.shape));\n\t\t}\n\n\t\treturn shapes;\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class CircleCircleNone extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'circleCircleNone';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"circle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"diameter\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"none\"\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"circle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"diameter\": 25\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": [],\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 250,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RoundedrectangleNoneCustom extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'roundedrectangleNoneCustom';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rounded-rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50,\n\t\t\t\t\t\"radius\": 2,\n\t\t\t\t\t\"top_left_radius\": 2,\n\t\t\t\t\t\"top_right_radius\": 2,\n\t\t\t\t\t\"bottom_left_radius\": 2,\n\t\t\t\t\t\"bottom_right_radius\": 2\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"custom\",\n\t\t\t\t\"settings\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 100,\n\t\t\t\t\t\t\"y\": 250,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 220,\n\t\t\t\t\t\t\"y\": 150,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 350,\n\t\t\t\t\t\t\"y\": 350,\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class CircleNoneCustom extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'circleNoneCustom';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"circle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"diameter\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"custom\",\n\t\t\t\t\"settings\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 100,\n\t\t\t\t\t\t\"y\": 250,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 220,\n\t\t\t\t\t\t\"y\": 150,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 350,\n\t\t\t\t\t\t\"y\": 350,\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleCircleNone extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleCircleNone';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"none\"\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"circle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"diameter\": 20\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": [],\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 150,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleNoneCustom extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleNoneCustom';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"custom\",\n\t\t\t\t\"settings\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 250,\n\t\t\t\t\t\t\"y\": 150,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 400,\n\t\t\t\t\t\t\"y\": 350,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 150,\n\t\t\t\t\t\t\"y\": 300,\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleNoneEdges extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleNoneEdges';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"edges\",\n\t\t\t\t\"edgeType\": \"corners\",\n\t\t\t\t\"offset\": 30,\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleRectangleEdges extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleRectangleEdges';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"edges\",\n\t\t\t\t\"edgeType\": \"corners\",\n\t\t\t\t\"offset\": 30,\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"width\": 25,\n\t\t\t\t\t\t\"length\": 15\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": [],\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 250,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleRectangleNone extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleRectangleNone';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"none\"\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"width\": 25,\n\t\t\t\t\t\t\"length\": 15\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": [],\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 150,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleRectangleCustom extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleRectangleCustom';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"custom\",\n\t\t\t\t\"settings\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 300,\n\t\t\t\t\t\t\"y\": 300,\n\t\t\t\t\t\t\"diameter\": 20\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 350,\n\t\t\t\t\t\t\"y\": 150,\n\t\t\t\t\t\t\"diameter\": 20\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"x\": 400,\n\t\t\t\t\t\t\"y\": 350,\n\t\t\t\t\t\t\"diameter\": 20\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"width\": 25,\n\t\t\t\t\t\t\"length\": 15\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": [],\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 150,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class CircleNoneRadial extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'circleNoneRadial';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"circle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"diameter\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"radial\",\n\t\t\t\t\"amount\": 10,\n\t\t\t\t\"position\": {\n\t\t\t\t\t\"left\": 250,\n\t\t\t\t\t\"bottom\": 250\n\t\t\t\t},\n\t\t\t\t\"radialDiameter\": 350,\n\t\t\t\t\"diameter\": 20\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleNoneGrid extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleNoneGrid';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"grid\",\n\t\t\t\t\"amountHorizontal\": 5,\n\t\t\t\t\"amountVertical\": 5,\n\t\t\t\t\"offset\": 30,\n\t\t\t\t\"diameter\": 20\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RoundedrectangleNoneEdges extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'roundedrectangleNoneEdges';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rounded-rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50,\n\t\t\t\t\t\"radius\": 2,\n\t\t\t\t\t\"top_left_radius\": 2,\n\t\t\t\t\t\"top_right_radius\": 2,\n\t\t\t\t\t\"bottom_left_radius\": 2,\n\t\t\t\t\t\"bottom_right_radius\": 2\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"edges\",\n\t\t\t\t\"edgeType\": \"corners\",\n\t\t\t\t\"offset\": 30,\n\t\t\t\t\"diameter\": 20\n\t\t\t},\n\t\t\t\"cutouts\": [],\n\t\t};\n\t}\n}\n","import { AbstractPreset, config } from \"./AbstractPreset\";\n\nexport default class RectangleRoundedrectangleNone extends AbstractPreset {\n\tgetName(): string {\n\t\treturn 'rectangleRoundedrectangleNone';\n\t}\n\n\tgetConfig(): config {\n\t\treturn {\n\t\t\t\"base\": {\n\t\t\t\t\"shape\": \"rectangle\",\n\t\t\t\t\"presetShape\": this.getName(),\n\t\t\t\t\"primitives\": {\n\t\t\t\t\t\"width\": 50,\n\t\t\t\t\t\"length\": 50\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"drillholes\": {\n\t\t\t\t\"type\": \"none\"\n\t\t\t},\n\t\t\t\"cutouts\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"shape\",\n\t\t\t\t\t\"shape\": \"rounded-rectangle\",\n\t\t\t\t\t\"primitives\": {\n\t\t\t\t\t\t\"width\": 25,\n\t\t\t\t\t\t\"length\": 25,\n\t\t\t\t\t\t\"radius\": 2.5,\n\t\t\t\t\t\t\"top_left_radius\": 2.5,\n\t\t\t\t\t\t\"top_right_radius\": 2.5,\n\t\t\t\t\t\t\"bottom_left_radius\": 2.5,\n\t\t\t\t\t\t\"bottom_right_radius\": 2.5\n\t\t\t\t\t},\n\t\t\t\t\t\"modifiers\": {\n\t\t\t\t\t\t\"use_individual_corners\": false\n\t\t\t\t\t},\n\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\"left\": 250,\n\t\t\t\t\t\t\"bottom\": 250,\n\t\t\t\t\t\t\"rotation\": 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t};\n\t}\n}\n","/**\n * Adding new presets\n *\n * Use naming like: [Shape][Cutout][DrillholeType]\n * - Add name with translation to ShapePresenter.php in get_presets()\n * - Create a new class inside this folder and extends AbstractPreset\n * - Run the measurements app and create the preset example and use share configration to get the config values form the console. (for example add a console.log in loadConfiguration() method)\n * - Copy the values and add to getConfig() method, remove unused values (only need base, drillholes and cutouts).\n * - Make sure to remove drillhole diameter from the config (we use always the default from the pricing group).\n * - Set presetShape in config to \"presetShape\": this.getName().\n * - Add the new preset to the PresetFactory presets array.\n * - Add svg icon to /components/icons and add to utils.ts\n */\n\nimport { AbstractPreset } from \"./AbstractPreset\";\nimport CircleCircleNone from \"./CircleCircleNone\";\nimport RoundedrectangleNoneCustom from \"./RoundedrectangleNoneCustom\";\nimport CircleNoneCustom from \"./CircleNoneCustom\";\nimport RectangleCircleNone from \"./RectangleCircleNone\";\nimport RectangleNoneCustom from \"./RectangleNoneCustom\";\nimport RectangleNoneEdges from \"./RectangleNoneEdges\";\nimport RectangleRectangleEdges from \"./RectangleRectangleEdges\";\nimport RectangleRectangleNone from \"./RectangleRectangleNone\";\nimport RectangleRectangleCustom from \"./RectangleRectangleCustom\";\nimport CircleNoneRadial from \"./CircleNoneRadial\";\nimport RectangleNoneGrid from \"./RectangleNoneGrid\";\nimport RoundedrectangleNoneEdges from \"./RoundedrectangleNoneEdges\";\nimport RectangleRoundedrectangleNone from \"./RectangleRoundedrectangleNone\";\n\nexport default class PresetFactory {\n\tgetAll(enabledShapes: string[], cutouts: boolean, drillHoles: boolean): AbstractPreset[] {\n\t\tlet presets = [\n\t\t\tnew RectangleNoneEdges(),\n\t\t\tnew RectangleNoneCustom(),\n\t\t\tnew RectangleRectangleNone(),\n\t\t\tnew RectangleCircleNone(),\n\t\t\tnew CircleNoneCustom(),\n\t\t\tnew RectangleNoneGrid(),\n\t\t\tnew RoundedrectangleNoneCustom(),\n\t\t\tnew CircleCircleNone(),\n\t\t\tnew RectangleRectangleCustom(),\n\t\t\tnew CircleNoneRadial(),\n\t\t\tnew RectangleRectangleEdges(),\n\t\t\tnew RoundedrectangleNoneEdges(),\n\t\t\tnew RectangleRoundedrectangleNone(),\n\t\t];\n\n\t\t// Filter out presets that are not enabled\n\t\tpresets = presets.filter( (preset) => {\n\t\t\treturn preset.getShapes().some(shape => enabledShapes.includes(shape));\n\t\t});\n\n\t\t// Filter out presets with cutouts if cutouts are disabled\n\t\tpresets = presets.filter( (preset) => {\n\t\t\tif(preset.hasCutouts()) {\n\t\t\t\treturn !cutouts ? false : true;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} );\n\n\t\t// Filter out presets with drillholes if drillholes are disabled\n\t\tpresets = presets.filter( (preset) => {\n\t\t\tif(preset.hasDrillholes()) {\n\t\t\t\treturn !drillHoles ? false : true;\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t\treturn presets;\n\t}\n}\n","import { createStore} from 'vuex';\nimport isArray from \"lodash/isArray\";\nimport mapValues from \"lodash/mapValues\";\nimport isEmpty from \"lodash/isEmpty\";\nimport isEqual from \"lodash/isEqual\";\nimport has from \"lodash/has\";\nimport isUndefined from \"lodash/isUndefined\";\nimport omitBy from \"lodash/omitBy\";\nimport debounce from \"lodash/debounce\";\nimport makerjs, { IModel } from \"makerjs\";\n\nimport Client from \"@/utilities/Client\";\n\nimport cutoutState from './modules/cutoutState';\nimport drillHoleState from './modules/drillHoleState';\nimport fonts from './modules/fonts';\nimport ui from './modules/uiState';\nimport config from './modules/config';\nimport validation from './modules/validation';\nimport shapeState from './modules/shapeState';\n\nimport { CutoutTypes } from '@/Models/CutoutTypes';\nimport AbstractShape from \"@/Models/Shapes/AbstractShape\";\n\nimport Length from \"../../../source/js/shared/models/Geometry/Length\";\nimport ShapeFactory from \"../../../source/js/shared/models/ShapeFactory\";\nimport NullShape from \"../../../source/js/shared/models/Geometry/NullShape\";\nimport {convertUnits, countDecimals, formatToLocaleString} from \"@/functions/numbers\";\nimport ShapeConfigurationFactory from '@/Models/ShapeConfigurations/ShapeConfigurationFactory';\nimport { renderMaxLength } from \"@/functions/lengths\";\nimport { sprintf } from 'sprintf-js';\nimport edgeFinishStore from './modules/edgeFinishStore';\nimport PricingGroup from '@/Models/Pricing/PricingGroup';\nimport fileUploadState from './modules/fileUploadState';\nimport { addCaptionBackgrounds, addStyleToSVG, dottedGuideLines, getTexturedSVG, reorderSVG } from '@/utilities/SVGPreview';\nimport { ShapeModelDecorator, CustomDrillHoleDecorator, CutoutModelDecorator, DimensionLineDecorator, GeneratedDrillHoleDecorator, InterfaceModelDecorator, currentCutoutModelDecorator, CurrentCustomDrillHoleDecorator } from '@/utilities/decorators/PreviewModelDecorator';\nimport { FilletModelDecorator, ShapeModelCombineDecorator } from '@/utilities/decorators/ShapeModelDecorator';\nimport { GuideLineDecorator } from '@/utilities/decorators/DimensionLineDecorator';\nimport DrillHoleOffsetLineDecorator, { CurrentGeneratedDrillHoleDecorator } from '@/utilities/decorators/DrillHoleDecorator';\nimport { StepTypes } from '@/types/step';\nimport PresetFactory from '@/presets/PresetFactory';\nimport { AbstractPreset } from '@/presets/AbstractPreset';\n\nconst settings = window.measurementSelectorVariables;\nconst client = new Client( settings.restUrl );\n\nconst asymmetricShapes = [\n\t'right-angled-triangle',\n\t'right-angled-triangle-mirrored',\n\t'arrow',\n\t'sloped-rectangle',\n\t'trapezoid',\n\t'text',\n\t'dxf',\n];\n\nconst fallbackModel = new makerjs.models.Rectangle( 1, 1 );\nconst enabledShapes = settings.enabledShapes;\nconst shape = settings.shape;\nconst dimensions = {};\n\nlet modifiers  = {\n\t'desired_dimension': 'height',\n\t'use_individual_corners': 'rounded-rectangle' in settings.pricingGroup.shape_settings && settings.pricingGroup.shape_settings[ 'rounded-rectangle' ][ 'use_individual_corners' ],\n};\n\nenabledShapes.forEach( ( enabledShape ) => {\n\tdimensions[ enabledShape ] = settings.shapeSettings.defaultDimensions[ enabledShape ];\n\n\t// TODO @Willemijnr bij het rechttrekken van height/length dit ook meenemen aub\n\tif ( enabledShape === 'rectangle' ) {\n\t\tdimensions[ enabledShape ].length = settings.shapeSettings.defaultDimensions.rectangle['height'];\n\t\tdelete dimensions[ enabledShape ].height;\n\t}\n} );\n\n// When no dimensions are passed, PHP defaults to passing an array [] which would break our code.\nif ( ! isArray( settings.dimensions ) ) {\n\tdimensions[ shape ] = settings.dimensions;\n}\nif ( ! isArray( settings.modifiers ) ) {\n\tmodifiers = settings.modifiers;\n}\n\nconst retrieveDxfDefinitionDebouncedFn = debounce( async ( dispatch ) => {\n\tdispatch('retrieveDxfDefinition');\n}, 1000, { leading: true, trailing: true } );\n\nexport const store = createStore({\n\tmodules: {\n\t\tcutout: cutoutState,\n\t\tdrillHole: drillHoleState,\n\t\tconfig: config,\n\t\tfonts: fonts,\n\t\tuiState: ui,\n\t\tvalidation: validation,\n\t\tshapeState,\n\t\tedgeFinish: edgeFinishStore,\n\t\tfileUploadState\n\t},\n\tstate: () => ({\n\t\tenabledShapes: enabledShapes,\n\t\tmeasurements: {\n\t\t\tshape,\n\t\t\tdimensions,\n\t\t\tmodifiers,\n\t\t\tdxfDefinition: {\n\t\t\t\tsvgPath: '',\n\t\t\t},\n\t\t\tsideSelection: 'topSide',\n\t\t\tsideUserSelected: false,\n\t\t\tforceRefresh: 0,\n\t\t},\n\t\tui: {\n\t\t\tisRetrievingProperties: false,\n\t\t\tisRetrievingBulkPricing: false,\n\t\t\tscale: 1,\n\t\t},\n\t\tpreviewShapeDimensions: {\n\t\t\twidth: 0,\n\t\t\theight: 0,\n\t\t},\n\t\tmodel: fallbackModel,\n\t\tpresetShape: '',\n\t}),\n\tmutations: {\n\t\tforceRefresh( state ): void {\n\t\t\tstate.measurements.forceRefresh = Math.random();\n\t\t},\n\t\tupdateModifier( state, { modifier, value } ): void {\n\t\t\tif ( value === '' ) {\n\t\t\t\tvalue = 0;\n\t\t\t}\n\n\t\t\tif ( typeof value === 'string' ) {\n\t\t\t\tvalue = value.replace( ',', '.' );\n\t\t\t}\n\n\t\t\tstate.measurements.modifiers[ modifier ] = value;\n\t\t},\n\t\tupdatePresetShape(state, preset): void {\n\t\t\tstate.presetShape = preset;\n\t\t},\n\t\tupdateDimension( state, { dimension, value } ): void {\n\t\t\tconst { shape } = state.measurements;\n\n\t\t\tif ( value === '' ) {\n\t\t\t\tvalue = 0;\n\t\t\t}\n\n\t\t\tif ( typeof value === 'string' ) {\n\t\t\t\tvalue = value.replace( ',', '.' );\n\t\t\t}\n\n\t\t\tstate.measurements.dimensions[shape][dimension] = value;\n\t\t},\n\t\tsetDimensionsForShape( state, { shape, dimensions } ): void {\n\t\t\tstate.measurements.dimensions[shape] = dimensions;\n\t\t},\n\t\tupdateDxfDefinition( state, dxfDefinition ): void {\n\t\t\tstate.measurements.dxfDefinition = dxfDefinition;\n\t\t},\n\t\tupdateIsRetrievingProperties( state, isRetrievingProperties ): void {\n\t\t\tstate.ui.isRetrievingProperties = isRetrievingProperties;\n\t\t},\n\t\tupdateIsRetrievingBulkPricing( state, isRetrievingBulkPricing ): void {\n\t\t\tstate.ui.isRetrievingBulkPricing = isRetrievingBulkPricing;\n\t\t},\n\t\tupdateSideSelection( state, sideSelection ): void {\n\t\t\tstate.measurements.sideUserSelected = true;\n\t\t\tstate.measurements.sideSelection = sideSelection;\n\t\t},\n\t\tupdatePreviewShapeDimensions( state, { width, height } ): void {\n\t\t\tstate.previewShapeDimensions.width = width;\n\t\t\tstate.previewShapeDimensions.height = height;\n\t\t},\n\t},\n\tgetters: {\n\t\tenabledShapes: ( state, getters ): string[] => {\n\t\t\tif(getters.getBlockSettings) {\n\t\t\t\treturn getters.getBlockSettings.shapes;\n\t\t\t}\n\t\t\treturn state.enabledShapes;\n\t\t},\n\t\tgetPresets: ( state, getters ): AbstractPreset[] => {\n\t\t\tconst presetFactory = new PresetFactory();\n\t\t\treturn presetFactory.getAll(getters.enabledShapes, getters.isCutoutsEnabled, getters.isDrillHolesEnabled);\n\t\t},\n\t\tpresetShape: ( state ): string => state.presetShape,\n\t\tactiveSection: ( state ): string => state.ui.activeSection,\n\t\tshape: ( state ): string => state.measurements.shape,\n\t\tgetPreviewShapeWidth: ( state ): number => state.previewShapeDimensions.width,\n\t\tgetPreviewShapeHeight: ( state ): number => state.previewShapeDimensions.height,\n\t\texportShape: ( state, getters ): string => {\n\t\t\tlet exportShape = state.measurements.shape;\n\t\t\tif ( getters.drillOption !== 'none' || getters.cutoutType !== CutoutTypes.none || getters.shape === 'dxf') {\n\t\t\t\texportShape = 'customized-shape';\n\t\t\t}\n\n\t\t\treturn exportShape;\n\t\t},\n\t\tdimensions: ( state, { shape } ): object => state.measurements.dimensions[ shape ],\n\t\tmodifiers: ( state ): object => state.measurements.modifiers,\n\t\tdxfExport: ( state, getters ): string => {\n\t\t\tif (!getters.isShapeComplete) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst completeModel = getters.getExportableModel;\n\n\t\t\tif ( isEmpty( completeModel ) || isEmpty( completeModel.models ) || getters.isUsingFallback ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst exportModel = makerjs.cloneObject( completeModel );\n\n\t\t\treturn makerjs.exporter.toDXF( exportModel, {units: 'mm'} );\n\t\t},\n\t\tgetExportableModel( state, getters ): IModel|null {\n\t\t\tconst emptyModel = {models: {}} as IModel;\n\t\t\tif(!getters.isShapeComplete) {\n\t\t\t\treturn emptyModel;\n\t\t\t}\n\t\t\tconst modelDecorator = getters.getExportableModelDecorator;\n\t\t\tif(!modelDecorator) {\n\t\t\t\treturn emptyModel;\n\t\t\t}\n\t\t\treturn modelDecorator.getModel();\n\t\t},\n\t\tisUsingFallback( state, getters ): boolean {\n\t\t\treturn isEqual( getters.shapeModel(), fallbackModel );\n\t\t},\n\t\tdxfDefinition: ( state ): object => state.measurements.dxfDefinition,\n\t\tisRetrievingProperties: ( state ): boolean => state.ui.isRetrievingProperties,\n\t\tisRetrievingBulkPricing: ( state ): boolean => state.ui.isRetrievingBulkPricing,\n\t\tparsedDimensions( state, { dimensions } ): object {\n\t\t\treturn mapValues( dimensions, ( ( dimension ) => {\n\t\t\t\treturn parseFloat( dimension );\n\t\t\t} ) );\n\t\t},\n\t\tprimitives( state, { modifiers, parsedDimensions } ): object {\n\t\t\treturn {\n\t\t\t\t...modifiers,\n\t\t\t\t...parsedDimensions,\n\t\t\t};\n\t\t},\n\t\tusePriceFromServer( state, { exportShape } ): boolean {\n\t\t\treturn exportShape === 'dxf' || exportShape === 'text' || exportShape == 'customized-shape';\n\t\t},\n\t\texportCompositeDxf( state, { exportShape } ): boolean {\n\t\t\treturn exportShape === 'text' || exportShape == 'customized-shape' || exportShape === 'dxf';\n\t\t},\n\t\tisAsymmetricShape: ( state, { shape } ): boolean => {\n\t\t\treturn asymmetricShapes.includes( shape );\n\t\t},\n\t\tsideSelection: ( state ): string => state.measurements.sideSelection,\n\t\tsideUserSelected: ( state ): string => state.measurements.sideUserSelected,\n\t\tshowSideSelection( state, getters ): boolean {\n\t\t\tif(!getters.shape) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn (getters.isAsymmetricShape && settings.settings['sheetSides'] !== 'symmetrical') || settings.sideSelectionSettings.showSideSelection;\n\t\t},\n\t\tsideAppearance: ( state, getters ): string => {\n\t\t\tif ( settings.settings[ 'sheetSides' ] === 'asymmetical' ) {\n\t\t\t\treturn settings.i18n.sideSelection.settings[ getters.sideSelection ].appearance ?? 'gloss';\n\t\t\t}\n\t\t\treturn settings.settings[ 'displayTexture' ] ?? 'gloss';\n\t\t},\n\t\tsideLabel: ( state, getters ): string => {\n\t\t\treturn settings.i18n.sideSelection.settings[ getters.sideSelection ].label;\n\t\t},\n\t\tsideColor: ( state, getters ): string => {\n\t\t\tif ( settings.settings[ 'sheetSides' ] === 'asymmetical' ) {\n\t\t\t\treturn settings.i18n.sideSelection.settings[ getters.sideSelection ].color || 'white';\n\t\t\t}\n\n\t\t\treturn settings.settings[ 'displayColor' ] ?? 'white';\n\t\t},\n\t\tforceRefresh: ( state ): number => state.measurements.forceRefresh,\n\t\tdimensionPreview: ( state, getters ): string => {\n\t\t\tif ( ! isUndefined( getters[ `${getters.shape}/dimensionPreview` ] ) ) {\n\t\t\t\treturn getters[ `${getters.shape}/dimensionPreview` ];\n\t\t\t}\n\n\t\t\tconst values = Object.values( getters.parsedDimensions ).map( ( value: number|string ) => {\n\t\t\t\treturn formatToLocaleString(value) + 'cm';\n\t\t\t});\n\t\t\treturn values.join( ' × ' );\n\t\t},\n\t\tgetMinimum: ( state, getters ): Function => {\n\t\t\treturn ( dimension: string ): number => {\n\t\t\t\tif ( dimension === 'number_of_points' ) {\n\t\t\t\t\treturn 2;\n\t\t\t\t}\n\n\t\t\t\tif ( dimension === 'side_amount' ) {\n\t\t\t\t\treturn 3;\n\t\t\t\t}\n\n\t\t\t\treturn getters.getMinimalSize;\n\t\t\t};\n\t\t},\n\t\tgetShapeInstance: ( state, getters ): AbstractShape => {\n\t\t\treturn getters.baseShapeInstance;\n\t\t},\n\t\tmeasurements: ( state ): object => state.measurements,\n\t\tgetFallbackModel(): Function {\n\t\t\treturn (): IModel => {\n\t\t\t\treturn fallbackModel;\n\t\t\t};\n\t\t},\n\t\tmodel: ( state, getters ): IModel => {\n\t\t\tconst shapeInstance = getters.baseShapeInstance;\n\n\t\t\tif ( ! shapeInstance ) {\n\t\t\t\treturn getters.getFallbackModel();\n\t\t\t}\n\n\t\t\treturn shapeInstance.render();\n\t\t},\n\t\tshapeModel( state, getters ): Function {\n\t\t\treturn (): IModel => {\n\t\t\t\tconst { shape, getFallbackModel, model } = getters;\n\n\t\t\t\tif ( ! getters.isShapeComplete || ! model ) {\n\t\t\t\t\treturn getFallbackModel();\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t};\n\t\t},\n\t\tgetBaseShapeModelDecorator( state, getters ): InterfaceModelDecorator {\n\t\t\treturn new ShapeModelDecorator(null, getters.baseShapeInstance);\n\t\t},\n\t\tgetExportableModelDecorator(state, getters): InterfaceModelDecorator {\n\t\t\tlet modelDecorator = getters.getBaseShapeModelDecorator;\n\n\t\t\tconst baseShapeModel = modelDecorator.getModel();\n\n\t\t\t// Make sure the base shape is available\n\t\t\tif(isEmpty(baseShapeModel.models)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmodelDecorator = new GeneratedDrillHoleDecorator(modelDecorator, getters.getGeneratedDrillHoleInstance);\n\t\t\tmodelDecorator = new CustomDrillHoleDecorator(modelDecorator, getters.getCustomDrillHoles);\n\n\t\t\tmodelDecorator = new CutoutModelDecorator(modelDecorator, getters.cutouts);\n\n\t\t\tmodelDecorator = new ShapeModelCombineDecorator(modelDecorator);\n\n\t\t\tif(getters.shouldApplyFillet) {\n\t\t\t\tmodelDecorator = new FilletModelDecorator(modelDecorator, getters.filletSize);\n\t\t\t}\n\t\t\treturn modelDecorator;\n\t\t},\n\t\tgetPreviewModel(state, getters): String {\n\t\t\tconst { baseShapeInstance, currentStepName, hasValidatorErrors } = getters;\n\t\t\tlet modelDecorator = getters.getExportableModelDecorator;\n\n\t\t\t// If there are validation errors, don't show the model\n\t\t\tif(hasValidatorErrors) return '';\n\n\t\t\tif(!modelDecorator) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tconst baseModel = modelDecorator.getModel();\n\n\t\t\t// Calculate the ratio of the base shape model\n\t\t\tconst measure = makerjs.measure.modelExtents(baseModel);\n\t\t\tif(!measure) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tlet ratio = Math.max(measure.width / getters.getPreviewShapeWidth, measure.height / getters.getPreviewShapeHeight);\n\t\t\tratio = ratio === Infinity ? 0.6 : ratio;\n\n\t\t\tmodelDecorator = new DimensionLineDecorator(modelDecorator, baseShapeInstance, ratio, getters.focusedElement, true);\n\t\t\tmodelDecorator = new GuideLineDecorator(modelDecorator, baseShapeInstance, getters.focusedElement);\n\n\t\t\tif(currentStepName === StepTypes.drillholes) {\n\t\t\t\tmodelDecorator = new DrillHoleOffsetLineDecorator(modelDecorator, getters.getGeneratedDrillHoleInstance, getters.focusedElement);\n\t\t\t\tmodelDecorator = new CurrentGeneratedDrillHoleDecorator(modelDecorator, getters.getGeneratedDrillHoleInstance, getters.focusedElement);\n\t\t\t}\n\n\t\t\tif(currentStepName === StepTypes.drillholes && getters.getCustomDrillHoles.length > 0) {\n\t\t\t\tmodelDecorator = new CurrentCustomDrillHoleDecorator(modelDecorator, getters.getCustomDrillHoles[getters.currentCustomDrillhole], getters.focusedElement);\n\t\t\t}\n\n\t\t\tif(currentStepName === StepTypes.cutouts && getters.cutouts.length > 0) {\n\t\t\t\tconst baseShapeModelDecorator = getters.getBaseShapeModelDecorator;\n\t\t\t\tconst baseShapeModel = baseShapeModelDecorator.getModel();\n\t\t\t\tmodelDecorator = new currentCutoutModelDecorator(modelDecorator, getters.cutouts[getters.currentCutoutIndex], getters.focusedElement, ratio, getters.shouldApplyFillet, getters.filletSize, baseShapeModel);\n\t\t\t}\n\n\t\t\tconst completeModel = modelDecorator.getModel();\n\n\t\t\tmakerjs.model.zero(completeModel);\n\t\t\tmakerjs.model.originate(completeModel);\n\n\t\t\t// Create an invisible rectangle around the model to add an extra padding\n\t\t\t// for the preview and the dimensions lines\n\t\t\tconst measureComplete = makerjs.measure.modelExtents(completeModel);\n\t\t\tconst padding = 40;\n\t\t\tconst paddingModel = new makerjs.models.Rectangle(\n\t\t\t\tmeasureComplete.width + (padding * ratio),\n\t\t\t\tmeasureComplete.height + (padding * ratio)\n\t\t\t);\n\n\t\t\tmakerjs.model.moveRelative(paddingModel, [\n\t\t\t\t(padding / -2) * ratio,\n\t\t\t\t(padding / -2) * ratio,\n\t\t\t]);\n\n\t\t\t// @ts-expect-error paddingModel is an instance of IModel\n\t\t\tpaddingModel.layer = 'hidden-rectangle';\n\t\t\tmakerjs.model.addModel(completeModel, paddingModel, 'hidden-rectangle');\n\n\t\t\tlet svgString = makerjs.exporter.toSVG(completeModel, {\n\t\t\t\tuseSvgPathOnly: true, // Every model with a layer defined has their own path inside the svg\n\t\t\t\tunits: 'mm',\n\t\t\t\tstroke: '#0074b5',\n\t\t\t});\n\n\t\t\tsvgString = addCaptionBackgrounds(svgString, ratio);\n\t\t\tif(getters.sideColor && getters.sideAppearance) {\n\t\t\t\tsvgString = getTexturedSVG(svgString, getters.sideColor, getters.sideAppearance);\n\t\t\t}\n\n\t\t\tsvgString = dottedGuideLines(svgString);\n\t\t\tsvgString = addStyleToSVG(svgString);\n\n\t\t\treturn reorderSVG(svgString);\n\n\t\t},\n\t\tshowSubtractLayers( state, getters ): boolean {\n\t\t\treturn getters.currentStepName !== StepTypes.drillholes;\n\t\t},\n\t\tdimensionLabel(): ( dimension: string ) => string {\n\t\t\treturn ( dimension: string ): string => {\n\t\t\t\treturn window.measurementSelectorVariables.i18n.dimensionNames[dimension];\n\t\t\t};\n\t\t},\n\t\tmapLabel( state, getters ): (maximums: []) => string {\n\t\t\treturn ( maximums ) => {\n\t\t\t\treturn mapValues( maximums, ( maximum: Length, key: string ) => {\n\t\t\t\t\tif ( maximum instanceof Length ) {\n\t\t\t\t\t\treturn sprintf( settings.i18n.maximum, renderMaxLength( maximum.in_cm() ), 'cm' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( key === 'number_of_points' || key === 'side_amount' ) {\n\t\t\t\t\t\treturn sprintf( settings.i18n.maximum, maximum, '' );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn `${maximum}`;\n\t\t\t\t} );\n\t\t\t};\n\t\t},\n\n\t\t// Get extra instructions for dimension when the dimension input is focused\n\t\tgetInstructionsForDimension( state, getters ): (dimension: string, basedOnDimension: string, isCutout: boolean) => {} {\n\t\t\treturn ( dimension: string, basedOnDimension: string, isCutout = false ): {} => {\n\t\t\t\tif(!getters.focusedElement) return '';\n\t\t\t\tif(!getters.focusedElement.includes(`-${dimension}`)) return '';\n\n\t\t\t\tconst i18n = window.measurementSelectorVariables.i18n.validators.dimensions;\n\t\t\t\tconst dimensionLabel = getters.dimensionLabel(dimension).toLowerCase();\n\t\t\t\tconst basedOnDimensionLabel = getters.dimensionLabel(basedOnDimension).toLowerCase();\n\n\t\t\t\tif(isCutout) {\n\t\t\t\t\tconst configuration = getters.getConfiguration(getters.cutout.instance.shape);\n\t\t\t\t\tconst minimums = configuration.get_minimum_dimensions(1, getters.cutoutDimensions);\n\t\t\t\t\tconst maximums = configuration.get_maximum_variable_dimensions(getters.cutoutDimensions);\n\t\t\t\t\tif(!minimums[dimension]) {\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif(maximums[dimension]) {\n\t\t\t\t\t\treturn sprintf(i18n.basedOnValueBetween, basedOnDimensionLabel, getters.cutoutDimensions[basedOnDimension], dimensionLabel, minimums[dimension]?.in_cm(), maximums[dimension]?.in_cm(), 'cm');\n\t\t\t\t\t}\n\n\t\t\t\t\treturn sprintf(i18n.basedOnValueMinimum, basedOnDimensionLabel, getters.cutoutDimensions[basedOnDimension], dimensionLabel, minimums[dimension]?.in_cm(), \"cm\");\n\t\t\t\t}\n\n\t\t\t\tconst configuration = getters.getConfiguration( getters.shape );\n\t\t\t\tconst minimums = configuration.get_minimum_dimensions(getters.getMinimalSize, getters.dimensions);\n\t\t\t\tconst maximums = {\n\t\t\t\t\t...getters.maximums,\n\t\t\t\t\t...configuration.get_maximum_variable_dimensions(getters.dimensions),\n\t\t\t\t};\n\n\t\t\t\t// Gets instructions string with correct dimmensions\n\t\t\t\treturn sprintf(i18n.basedOnValueBetween, basedOnDimensionLabel, getters.dimensions[basedOnDimension], dimensionLabel, minimums[dimension]?.in_cm(), maximums[dimension]?.in_cm(), 'cm');\n\t\t\t};\n\t\t},\n\t\tgetMaxLabelForDimension( state, getters ): (dimension: string) => string {\n\t\t\treturn ( dimension: string): string => {\n\t\t\t\tconst actualLabel = getters.getShapeInstance.getDimensionLabel(dimension);\n\t\t\t\tconst maxLabel = getters.mapLabel(getters.maximums);\n\t\t\t\treturn maxLabel[actualLabel] ?? '';\n\t\t\t};\n\t\t},\n\t\thasAllMeasurements( state, getters ): boolean {\n\t\t\tconst currentMeasurements = state.measurements.dimensions[ getters.shape ];\n\n\t\t\t// DXF's should be always considered valid.\n\t\t\tif ( getters.shape === 'dxf' ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ( isEmpty( currentMeasurements ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst requiredMeasurements = ( new ShapeConfigurationFactory() ).get_configuration( getters.shape ).get_dimension_keys();\n\n\t\t\treturn isEmpty( requiredMeasurements.filter( ( measurement ) => {\n\t\t\t\tconst current = currentMeasurements[ measurement ];\n\t\t\t\treturn ! has( currentMeasurements, measurement ) || ( ! current && current !== 0 && current !== '0' );\n\t\t\t} ) );\n\t\t},\n\t\thasAllModifiers( state, getters ): boolean {\n\t\t\tconst currentModifiers = state.measurements.modifiers;\n\t\t\tconst requiredModifiers = ( new ShapeConfigurationFactory() ).get_configuration( getters.shape ).get_modifier_keys();\n\n\t\t\tif ( isEmpty( requiredModifiers ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn isEmpty( requiredModifiers.filter( ( modifier ) => {\n\t\t\t\tconst current = currentModifiers[ modifier ];\n\t\t\t\treturn ! has( currentModifiers, modifier ) || ( ! current && current !== 0 && current !== '0' );\n\t\t\t} ) );\n\t\t},\n\t\tisCenteredShape( state, getters ): boolean {\n\t\t\treturn [\n\t\t\t\t'circle',\n\t\t\t\t'heart',\n\t\t\t\t'hexagon',\n\t\t\t\t'octagon',\n\t\t\t\t'polygon',\n\t\t\t\t'star',\n\t\t\t\t'ellipse',\n\t\t\t\t'quarter-circle',\n\t\t\t\t'kite',\n\t\t\t].includes( getters.shape );\n\t\t},\n\t\tshapeObject( state, getters ): AbstractShape|NullShape {\n\t\t\tconst { shape, modifiers } = state.measurements;\n\n\t\t\treturn getters.getShapeObject( shape, getters.parsedDimensions, modifiers );\n\t\t},\n\t\tgetShapeObject(): Function {\n\t\t\treturn ( shape: string, dimensions: object, modifiers = {} ): AbstractShape|NullShape => {\n\t\t\t\tif ( isEmpty( dimensions ) ) {\n\t\t\t\t\treturn new NullShape();\n\t\t\t\t}\n\n\t\t\t\treturn ( new ShapeFactory() ).create_shape_from_primitives(\n\t\t\t\t\tshape,\n\t\t\t\t\t{\n\t\t\t\t\t\t...convertUnits( dimensions ),\n\t\t\t\t\t\t...modifiers\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t};\n\t\t},\n\t\tgetArea( state, getters ): Function {\n\t\t\treturn ( shape: string, dimensions: object, modifiers = {} ): number => {\n\t\t\t\tconst instance = getters.getShapeObject( shape, dimensions, modifiers );\n\n\t\t\t\tif ( instance === NullShape ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn instance.get_area().area ?? 0;\n\t\t\t};\n\t\t},\n\t\tcanUseExactCenter( state, getters ): boolean {\n\t\t\tconst center = getters.getCenter( false, 'cm' );\n\n\t\t\treturn countDecimals( center.x ) <= 1 && countDecimals( center.y ) <= 1;\n\t\t},\n\t\thasProblematicCorners( state, getters ): boolean {\n\t\t\tif(!getters.isShapeComplete) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst model = getters.getExportableModel;\n\t\t\tlet problemPoints = 0;\n\n\t\t\tconst fillet = getters.filletSize;\n\n\t\t\t// Check model for remaining sharp corners\n\t\t\tconst chains = makerjs.model.findChains( model as IModel, { contain: { alternateDirection: true }, pointMatchingDistance: getters.filletSize.in_mm() } ) as makerjs.IChain[];\n\n\t\t\tif(!Array.isArray(chains)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor(let i = 0; i < chains.length; i++) {\n\t\t\t\tconst chain = chains[i];\n\t\t\t\tif(chain.links.length > 1) {\n\n\t\t\t\t\t// Foreach item in the chain link\n\t\t\t\t\tfor(let j = 0; j < chain.links.length; j++) {\n\n\t\t\t\t\t\t// Set link and next link, and set next link to first link if at the end of the chain\n\t\t\t\t\t\tconst link = chain.links[j];\n\t\t\t\t\t\tconst nextLink = j + 1 < chain.links.length ? chain.links[j + 1] : chain.links[0];\n\n\t\t\t\t\t\t// Check if the angle between the two links is less than 90 degrees\n\t\t\t\t\t\tconst angle = makerjs.angle.ofChainLinkJoint(link, nextLink);\n\n\t\t\t\t\t\tconst midpoint = link.reversed ? link.endPoints[0] : link.endPoints[1];\n\t\t\t\t\t\tconst startpoint = link.reversed ? link.endPoints[1] : link.endPoints[0];\n\n\t\t\t\t\t\tif( angle >= 45 ) {\n\t\t\t\t\t\t\tproblemPoints++;\n\t\t\t\t\t\t\tif(window.appDebug ?? false) {\n\t\t\t\t\t\t\t\tmakerjs.model.addModel(model, new makerjs.models.Holes(fillet.in_mm(), [midpoint]), 'debug_fillet_' + i + '.' + j + 'angle_' + angle);\n\t\t\t\t\t\t\t\tmakerjs.model.addModel(model, new makerjs.models.Holes(fillet.in_mm()/2, [startpoint, nextLink.endPoints[1]]), 'debug_fillet_' + i + '.' + j + 'angle_' + angle);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check contained chains\n\t\t\t\tif(typeof chain.contains !== 'undefined' && chain.contains.length > 0) {\n\t\t\t\t\tfor(let j = 0; j < chain.contains.length; j++) {\n\t\t\t\t\t\tconst childChain = chain.contains[j];\n\t\t\t\t\t\tif(childChain.links.length > 1) {\n\n\t\t\t\t\t\t\t// Foreach item in the chain link\n\t\t\t\t\t\t\tfor(let j = 0; j < childChain.links.length; j++) {\n\n\t\t\t\t\t\t\t\t// Set link and next link, and set next link to first link if at the end of the childChain\n\t\t\t\t\t\t\t\tconst link = childChain.links[j];\n\t\t\t\t\t\t\t\tconst nextLink = j + 1 < childChain.links.length ? childChain.links[j + 1] : childChain.links[0];\n\n\t\t\t\t\t\t\t\t// Check if the angle between the two links is less than 90 degrees\n\t\t\t\t\t\t\t\tconst angle = makerjs.angle.ofChainLinkJoint(link, nextLink);\n\n\t\t\t\t\t\t\t\tconst midpoint = link.reversed ? link.endPoints[0] : link.endPoints[1];\n\t\t\t\t\t\t\t\tconst startpoint = link.reversed ? link.endPoints[1] : link.endPoints[0];\n\n\t\t\t\t\t\t\t\tif( angle >= 45 ) {\n\t\t\t\t\t\t\t\t\tproblemPoints++;\n\t\t\t\t\t\t\t\t\tif(window.appDebug ?? false) {\n\t\t\t\t\t\t\t\t\t\tmakerjs.model.addModel(model, new makerjs.models.Holes(fillet.in_mm(), [midpoint]), 'debug_fillet_' + i + '.' + j + 'angle_' + angle);\n\t\t\t\t\t\t\t\t\t\tmakerjs.model.addModel(model, new makerjs.models.Holes(fillet.in_mm()/2, [startpoint, nextLink.endPoints[1]]), 'debug_fillet_' + i + '.' + j + 'angle_' + angle);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn problemPoints > 0;\n\t\t},\n\t\tgetPricingGroup(): PricingGroup {\n\n\t\t\t// @ts-expect-error possible wrong types in constructor\n\t\t\treturn new PricingGroup( settings.pricingGroup );\n\t\t},\n\t},\n\tactions: {\n\t\tasync retrieveDxfDefinitionDebounced( { dispatch } ): Promise<void> {\n\t\t\tretrieveDxfDefinitionDebouncedFn(dispatch);\n\t\t},\n\t\tasync retrieveDxfDefinition( { commit, rootGetters, getters } ): Promise<void> {\n\t\t\tif ( ! rootGetters.isShapeComplete ) {\n\t\t\t\tcommit( 'updateDxfDefinition', { svgPath: '' } );\n\t\t\t\tcommit( 'updateIsRetrievingProperties', false );\n\t\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( rootGetters.isUsingFallback ) {\n\t\t\t\tcommit( 'updateDxfDefinition', { svgPath: '' } );\n\t\t\t\tcommit( 'updateIsRetrievingProperties', false );\n\t\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( !rootGetters.usePriceFromServer ) {\n\t\t\t\tcommit( 'updateDxfDefinition', { svgPath: '' } );\n\t\t\t\tcommit( 'updateIsRetrievingProperties', false );\n\t\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcommit( 'updateIsRetrievingProperties', true );\n\t\t\tconst file = new Blob( [ getters.dxfExport ], { type: 'application/dxf' } );\n\n\t\t\tconst data = await client.getProperties( settings.product_id, file, getters.exportShape, rootGetters.activeEdgeFinish );\n\n\t\t\tcommit( 'updateDxfDefinition', data );\n\t\t\tcommit( 'updateIsRetrievingProperties', false );\n\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t},\n\t\tasync updatePlateShape( { dispatch }, shape ): Promise<void> {\n\t\t\tawait dispatch( 'updateShape', shape );\n\n\t\t\tawait dispatch( 'resetCutouts' );\n\t\t\tawait dispatch( 'resetDrillHoles' );\n\t\t},\n\t\tasync  updatePlateDimension( { commit, getters, dispatch }, { dimension, value } ): Promise<void> {\n\t\t\tcommit( 'updateDimension', { dimension, value } );\n\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\n\t\t\tif ( getters.cutout && getters.usesDefaultCutoutDimensions === true ) {\n\t\t\t\tawait dispatch( 'updateCutoutPosition' );\n\t\t\t}\n\t\t},\n\t\tasync updateShapeDimensions( { commit, state, getters }, shape ): Promise<void> {\n\t\t\tif ( shape === 'dxf' || shape === 'rectangle' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst instance = getters.baseShapeInstance;\n\n\t\t\tif ( ! ( 'getDefaultDimensions' in instance ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Convert the numerical dimensions to strings. Non-numerical values are set to undefined.\n\t\t\tlet dimensions = mapValues( instance.getDefaultDimensions(), ( primitive ) => {\n\t\t\t\tif ( typeof primitive !== 'number' ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn primitive.toString();\n\t\t\t} );\n\n\t\t\t// Any value that is considered undefined is removed.\n\t\t\tdimensions = omitBy( dimensions, isUndefined );\n\n\t\t\tswitch ( shape ) {\n\t\t\t\tcase 'star':\n\t\t\t\t\tif ( !state.measurements.modifiers.number_of_points ) {\n\t\t\t\t\t\tcommit( 'updateModifier', { modifier: 'number_of_points', value: 5 } );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isEmpty( state.measurements.dimensions[ shape ] ) ) {\n\t\t\t\t\t\tcommit( 'setDimensionsForShape', { shape, dimensions } );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tif ( !state.measurements.modifiers.side_amount ) {\n\t\t\t\t\t\tcommit( 'updateModifier', { modifier: 'side_amount', value: 8 } );\n\t\t\t\t\t}\n\t\t\t\t\tif ( isEmpty( state.measurements.dimensions[ shape ] ) ) {\n\t\t\t\t\t\tcommit( 'setDimensionsForShape', { shape, dimensions } );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif ( isEmpty( state.measurements.dimensions[ shape ] ) ) {\n\t\t\t\t\t\tcommit( 'setDimensionsForShape', { shape, dimensions } );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcommit( 'updateUsingDefaultDimensions', false );\n\t\t},\n\t\tasync updateShape( { commit, state, getters, dispatch }, shape ): Promise<void> {\n\t\t\tstate.measurements.shape = shape;\n\n\t\t\tif ( shape === 'text' ) {\n\t\t\t\tawait dispatch( 'resetCutouts' );\n\t\t\t\tawait dispatch( 'resetDrillHoles' );\n\n\t\t\t\tawait dispatch( 'text/setDefaults', false, { root: true } );\n\t\t\t}\n\n\t\t\tif( shape === 'dxf' ) {\n\t\t\t\tawait dispatch( 'resetCutouts' );\n\t\t\t\tawait dispatch( 'resetDrillHoles' );\n\t\t\t}\n\n\t\t\tif ( shape !== null && getters.baseShapeInstance !== null ) {\n\t\t\t\tawait dispatch( 'updateShapeDimensions', shape );\n\t\t\t}\n\n\t\t\tif ( !getters.isAsymmetricShape ) {\n\t\t\t\tcommit( 'updateSideSelection', 'topSide' );\n\t\t\t}\n\n\t\t\tcommit( 'updateZoom', 1 );\n\t\t\tcommit( 'updateRotation', 0 );\n\t\t\tcommit( 'updateTranslation', [ 0, 0 ] );\n\n\t\t\tif ( !shape || 0 === shape.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow?.dataLayer?.push( {\n\t\t\t\tevent: \"measurements_selector\",\n\t\t\t\teventCategory: \"Shapes & Sizes: \" + document.title,\n\t\t\t\teventAction: \"Step 2. Choose Shape\",\n\t\t\t\teventLabel: shape,\n\t\t\t} );\n\t\t},\n\t\tloadPresetConfig( { commit, dispatch }, preset ): void {\n\t\t\tconst config = preset.getConfig();\n\n\t\t\tcommit( 'updatePresetShape', preset.getName() );\n\t\t\tcommit( 'updateLastConfiguration', config );\n\t\t\tdispatch( 'updateFromConfig', config );\n\t\t}\n\t},\n} );\n","import {detectBrowser} from \"@/functions/browser\";\n\ndeclare global {\n\tinterface Window {\n\t\tmeasurementSelectorVariables: {\n\t\t\tproduct_id: string;\n\t\t\ti18n: {\n\t\t\t\t[key: string]: any; /* eslint-disable-line */\n\t\t\t};\n\t\t\tfontDirUrl: string;\n\t\t\tmodifiers;\n\t\t\tdimensions;\n\t\t\tshape: string;\n\t\t\tenabledShapes: string[];\n\t\t\trestUrl: string;\n\t\t\trestNonce: string;\n\t\t\tpricingGroup: {\n\t\t\t\tenabled_shapes: string[];\n\t\t\t\tother_settings: {\n\t\t\t\t\tmin_drillhole_diameter: number | null;\n\t\t\t\t\tdefault_drillhole_diameter: number | null;\n\t\t\t\t\tenable_drillholes: boolean;\n\t\t\t\t\tprefill_custom_drill_holes: number[][];\n\t\t\t\t\tenable_cutout: boolean;\n\t\t\t\t\tfillet_sharp_edges: boolean;\n\t\t\t\t\tmax_safe_cutout_percentage: number | null;\n\t\t\t\t\tdrill_hole_presets_active: boolean|number;\n\t\t\t\t\tcustomer_choose_production_method: boolean;\n\t\t\t\t};\n\t\t\t\tshape_settings: {\n\t\t\t\t\tarrow: object;\n\t\t\t\t\tcircle: object;\n\t\t\t\t\tdxf: object;\n\t\t\t\t\tegg: object;\n\t\t\t\t\tellipse: object;\n\t\t\t\t\t\"flat-oval\": object;\n\t\t\t\t\t\"half-circle\": object;\n\t\t\t\t\theart: object;\n\t\t\t\t\thexagon: object;\n\t\t\t\t\toctagon: object;\n\t\t\t\t\tpolygon: object;\n\t\t\t\t\t\"isosceles-triangle\": object;\n\t\t\t\t\t\"right-angled-triangle\": object;\n\t\t\t\t\t\"right-angled-triangle-mirrored\": object;\n\t\t\t\t\t\"rounded-rectangle\": object;\n\t\t\t\t\t\"sloped-rectangle\": object;\n\t\t\t\t\t\"sloped-right-rectangle\": object;\n\t\t\t\t\tstar: object;\n\t\t\t\t\ttext: object;\n\t\t\t\t\ttrapezoid: object;\n\t\t\t\t\tkite: object;\n\t\t\t\t\tbarrel: object;\n\t\t\t\t\tjewel: object;\n\t\t\t\t\tdroplet: object;\n\t\t\t\t\tparallelogram: object;\n\t\t\t\t};\n\t\t\t};\n\t\t\tsettings: {\n\t\t\t\tstandardMaterialLoss: number;\n\t\t\t};\n\t\t\tshapeSettings: {\n\t\t\t\trectangle: {\n\t\t\t\t\tminimumLength?: number;\n\t\t\t\t\tminimumWidth?: number;\n\t\t\t\t};\n\t\t\t\tdefault: {\n\t\t\t\t\tminimumDimension?: number;\n\t\t\t\t};\n\t\t\t\tmaximumLength?: number;\n\t\t\t\tmaximumWidth?: number;\n\t\t\t\tcanUseFullPlateLength?: boolean;\n\t\t\t\tcanUseFullPlateWidth?: boolean;\n\t\t\t\tarea?: number;\n\t\t\t\tmaximumMaterial?: {\n\t\t\t\t\tlength: number;\n\t\t\t\t\twidth: number;\n\t\t\t\t};\n\t\t\t\tdefaultDimensions: {\n\t\t\t\t\tarrow: object;\n\t\t\t\t\tcircle: object;\n\t\t\t\t\tdxf: object;\n\t\t\t\t\tegg: object;\n\t\t\t\t\tellipse: object;\n\t\t\t\t\t\"flat-oval\": object;\n\t\t\t\t\t\"half-circle\": object;\n\t\t\t\t\theart: object;\n\t\t\t\t\thexagon: object;\n\t\t\t\t\tpolygon: object;\n\t\t\t\t\t\"isosceles-triangle\": object;\n\t\t\t\t\trectangle: object;\n\t\t\t\t\t\"right-angled-triangle\": object;\n\t\t\t\t\t\"right-angled-triangle-mirrored\": object;\n\t\t\t\t\t\"rounded-rectangle\": object;\n\t\t\t\t\t\"sloped-rectangle\": object;\n\t\t\t\t\tstar: object;\n\t\t\t\t\ttext: object;\n\t\t\t\t\ttrapezoid: object;\n\t\t\t\t\tkite: object;\n\t\t\t\t\tbarrel: object;\n\t\t\t\t\tjewel: object;\n\t\t\t\t\tdroplet: object;\n\t\t\t\t\tparallelogram: object;\n\t\t\t\t};\n\t\t\t};\n\t\t\tcutoutSettings: {\n\t\t\t\tminimumLength?: number;\n\t\t\t\tminimumWidth?: number;\n\t\t\t};\n\t\t\tdrillHoleSettings: {\n\t\t\t\tprefilledDrillHoles: object[];\n\t\t\t\tusePreset: boolean;\n\t\t\t\tpresetGroup: {\n\t\t\t\t\tdrill_hole_max_distance: number;\n\t\t\t\t\tdrill_hole_distance_to_edge_top_bottom: number;\n\t\t\t\t\tdrill_hole_distance_to_edge_left_right: number;\n\t\t\t\t\tdrill_hole_starting_point: number;\n\t\t\t\t};\n\t\t\t};\n\t\t\tmeasurementsConfig: object[];\n\t\t\tconfigurationName: string;\n\t\t\tconvertConfig: boolean;\n\t\t\tconvertCustomDrillHoles: boolean;\n\t\t\tcurrentShortLinkUrl: string;\n\t\t\tthickness: number;\n\t\t\talternateThicknesses: object[];\n\t\t\tmaterial: materialProduct;\n\t\t\talternateMaterials: materialProduct[];\n\t\t\tloggedInUser: string;\n\t\t\tshop: {\n\t\t\t\tname: string;\n\t\t\t\tcurrency: string;\n\t\t\t\tlocale: string;\n\t\t\t};\n\t\t\thtml: {\n\t\t\t\tavailability: string;\n\t\t\t};\n\t\t\tdrawingExplainer: {\n\t\t\t\turl: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttarget: string;\n\t\t\t} | null;\n\t\t\tdrawingRules: {\n\t\t\t\turl: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttarget: string;\n\t\t\t} | null;\n\t\t\tassets: string;\n\t\t\tedgeFinishingIsEnabled: string;\n\t\t\tsideSelectionSettings: {\n\t\t\t\tshowSideSelection: boolean;\n\t\t\t}\n\t\t};\n\t\textendedProductInformation: ExtendedProductInformationLayouts;\n\t\tdataLayer: {\n\t\t\tpush: Function;\n\t\t};\n\t\tappDebug: boolean;\n\t}\n}\n\nimport PortalVue from 'portal-vue';\nimport { configureCompat, createApp, h } from 'vue';\nimport vSelect from 'vue-select';\nimport V3ScrollLock from 'v3-scroll-lock';\nimport { FocusTrap } from 'focus-trap-vue';\nimport App from './App.vue';\nimport { store } from './store';\nimport { ExtendedProductInformationLayouts } from './types/extendedProductInformation';\nimport { materialProduct } from \"./types/product\";\n\n/*\n * Before mounting hide the product delivery information that's already there.\n * Do this in JavaScript to make it available to noscript users.\n */\nconst productDelivery = document.querySelector<HTMLElement>('.summary > .product-delivery');\nif (productDelivery) {\n\tproductDelivery.hidden = true;\n}\n\n// Required to trigger on first load if it's a customized shape, because of preset drillholes for example\nif(store.getters.exportShape === 'customized-shape') {\n\tstore.dispatch( 'retrieveDxfDefinitionDebounced' );\n}\n\n// Required to trigger the async remote price calculation based on a getter changing.\nstore.watch( ( state, getters ) => getters.dxfExport || getters.activeEdgeFinish, async() => {\n\tawait store.dispatch( 'retrieveDxfDefinitionDebounced' );\n});\n\nconst startApp = async (): Promise<void> => {\n\tconst app = createApp({\n\t\tname: 'MeasurementsSelector', // Appears in Vue devtools\n\t\trender() {\n\t\t\treturn h(App);\n\t\t}\n\t});\n\n\tapp.component('VSelect', vSelect);\n\tapp.component('FocusTrap', FocusTrap);\n\tapp.use(store);\n\tapp.use(PortalVue);\n\tapp.use(V3ScrollLock, {});\n\n\t// Register a global custom directive called `v-focus`\n\tapp.directive('focus', {\n\n\t\t// When the bound element is mounted into the DOM...\n\t\tmounted(el) {\n\n\t\t\t// Focus the element\n\t\t\tel.focus();\n\t\t}\n\t});\n\n\t// Set global variables\n\tapp.config.globalProperties.$i18n = window.measurementSelectorVariables.i18n;\n\tapp.config.globalProperties.$kpsSettings = window.measurementSelectorVariables;\n\tapp.config.globalProperties.$userBrowser = detectBrowser();\n\n\t// Make global variable available in <setup>.\n\tapp.provide('userBrowser', detectBrowser());\n\n\tapp.mount('#app-measurements-selector');\n};\n\n// Component declares \"modelValue\" prop, which is Vue 3 usage. Opt-in to Vue 3 behavior.\nconfigureCompat({\n\tCOMPONENT_V_MODEL: false,\n\tATTR_FALSE_VALUE: 'suppress-warning',\n\tRENDER_FUNCTION: 'suppress-warning',\n});\n\nstartApp();\n","export default function Worker_fn() {\n  return new Worker(__webpack_public_path__ + \"js/webworker.worker.js\");\n}\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\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"js/\" + \"OpenType\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\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); }","var inProgress = {};\nvar dataWebpackPrefix = \"app-measurements-selector:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/wp-content/themes/kunststofplatenshop/dist/app-measurements-selector/\";","// 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__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\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[\"webpackChunkapp_measurements_selector\"] = self[\"webpackChunkapp_measurements_selector\"] || [];\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__(487); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["detectBrowser","browsers","matches","filter","browser","navigator","userAgent","indexOf","length","includes","Length","constructor","millimeters","this","from_m","meters","from_cm","centimeters","from_mm","in_m","in_cm","in_cm_i18n","locale","window","measurementSelectorVariables","shop","replace","toLocaleString","minimumFractionDigits","maximumFractionDigits","in_mm","add","subtract","max","Math","min","multiply","int","divide","by","abs","round","decimals","Number","is_lesser_than","extractPolygons","model","paths","x","y","mapped","path","end","type","push","arc","origin","calculateArea","polygons","i","j","point1","point2","area","centroid","filletModel","fillet","reverse","filletToUse","left","right","chains","findChains","contain","alternateDirection","pointMatchingDistance","chain","links","addModel","contains","childChain","isModelInsideParent","parentModel","allowPartial","result","results","callback","options","onPath","points","toKeyPoints","pathContext","map","point","offset","p","isPointInsideModel","walk","chainModel","completeModel","models","shapeModel","cutoutModel","keys","Object","Array","isArray","forEach","index","toNewModel","childIndex","htmlToElement","html","template","document","createElement","trim","innerHTML","content","firstChild","maybeFixCirclePath","commands","newPath","flat","join","DXFToModel","dxf","helper","polylinesObject","toPolylines","polylines","polyline","polylinesText","vertices","vertex","childModel","mirror","ConnectTheDots","zero","originate","SVGToModel","svg","svg_optimized","svg_element","data","element","children","tagName","getAttribute","subPath","fixedPath","svgPathData","fromSVGPathData","getShapeModelCenter","measure","modelExtents","irregularShapes","center","async","loadFont","url","default","openType","font","load","err","console","log","toString","class","script","__exports__","render","d","fill","alt","xmlns","width","height","viewBox","props","String","__name","variant","setup","__props","_ctx","_cache","CheckIcon","key","ErrorIcon","cx","cy","r","modalName","label","store","showInfoModal","commit","onClick","InfoCircle","_","useEscapeEvent","methodToTrigger","handleEscKey","e","addEventListener","removeEventListener","isOpen","Boolean","dialog","isDialogOpen","close","show","value","showModal","onAfterLeave","open","immediate","_component_focus_trap","_directive_scroll_lock","ref_key","ref","name","active","$event","$slots","image","imageSize","src","sizes","_hoisted_4","title","text","ContentImage","stroke","rx","iconComponents","circle","CircleIcon","RoundedRectangle","egg","EggIcon","ellipse","EllipseIcon","FlatOvalIcon","RightAngledTriangle","RightAngledTriangleMirrored","IsoscelesTriangle","HalfCircle","QuarterCircle","SlopedRectangle","SlopedRightRectangle","ArchedRectangle","trapezoid","TrapezoidIcon","hexagon","HexagonIcon","octagon","OctagonIcon","polygon","PolygonIcon","arrow","ArrowIcon","star","StarIcon","heart","HeartIcon","rectangle","RectangleIcon","RectangleCutout","kite","KiteIcon","barrel","BarrelIcon","jewel","JewelIcon","parallelogram","shapes","ShapesIcon","TextIcon","upload","UploadIcon","cross","CrossIcon","edges","DrillHoleEdges","radial","DrillHoleRadial","grid","DrillHoleGrid","custom","DrillHoleCustom","preset","DrillHolePresetIcon","droplet","DropletIcon","download","DownloadIcon","specs","SpecsIcon","circleCircleNone","CircleCircleNoneIcon","circleNoneCustom","CircleNoneCustomIcon","circleNoneRadial","CircleNoneRadialIcon","rectangleCircleEdges","RectangleCircleEdgesIcon","rectangleCircleNone","RectangleCircleNoneIcon","rectangleNoneCustom","RectangleNoneCustomIcon","rectangleNoneEdges","RectangleNoneEdgesIcon","rectangleNoneGrid","RectangleNoneGridIcon","rectangleRectangleCustom","RectangleRectangleCustomIcon","rectangleRectangleEdges","RectangleRectangleEdgesIcon","rectangleRectangleNone","RectangleRectangleNoneIcon","rectangleRoundedrectangleNone","RectangleRoundedrectangleNoneIcon","roundedrectangleNoneCustom","RoundedrectangleNoneCustomIcon","roundedrectangleNoneEdges","RoundedrectangleNoneEdgesIcon","getIconComponent","icon","n","href","filetype","filesize","downloads","item","DownloadLink","acf_fc_layout","ContentImageText","ContentDownloads","currentModalName","getters","isCurrent","i18n","closeModal","to","ModalDialog","HtmlContent","appear","mode","onBeforeEnter","el","gsap","set","overflow","onEnter","done","sectionHeight","scrollHeight","fromTo","duration","ease","onComplete","onAfterEnter","onBeforeLeave","onLeave","css","stepName","step","getStepById","currentStepName","htmlId","uniqueId","status","updateCurrentStep","shortTitle","AccordionIndicator","disabled","MeasurementsHeightTransition","id","stepError","modalTriggerLabel","InfoModal","information","showDesktopPreview","primitives","unit","onResize","resizeProductGallery","initialized","previewIsShown","shape","canPreview","tag","toggleAddToCartButtonState","state","submit","getElementsByClassName","hasFailedLoadingFont","Function","previewContainer","isDragging","dragStart","hasValidatorErrors","previewModel","getPreviewModel","isShapeComplete","isLoading","getExportableModel","fontIsLoading","translation","transformContainerStyle","transform","zoom","rotation","previewTransformStyle","display","transition","transformOrigin","resizeObserver","ResizeObserver","updatePreviewShapeDimensions","offsetWidth","offsetHeight","mousedown","event","screenX","screenY","mouseup","mousemove","diffX","diffY","hasErrors","newValue","oldValue","deep","observe","dispatch","disconnect","style","onMousedown","onMouseup","onMousemove","$i18n","messages","failedLoadingFont","isLoadingFont","isLoadingCalculations","noPreview","updateZoom","updateRotation","previewControls","rotateCounterClockwise","RotateCounterClockwise","rotateClockwise","RotateClockwise","zoomOut","ZoomOut","zoomIn","ZoomIn","mounted","setProductGallery","addFullScreenListener","created","beforeUnmount","galleryItemId","controlsItemId","productGallery","isMediaDesktopSize","watch","usesDefaultDimensions","sideUserSelected","computed","methods","$","jQuery","$wrap","querySelector","$gallery","getElementById","$preview","keenSlider","init","on","$previewButton","showPreview","hidePreview","moveToSlide","addPreviewButtongroup","addClass","removeClass","prepend","media","matchMedia","previousShowDesktopPreview","components","PreviewButtongroup","ShapePreview","buttonsPerRow","totalButtons","selectedItem","activeItem","rows","col","row","floor","ceil","isActive","args","selectedMenuItem","shapeSelectorButtons","activeItemIndex","findIndex","reset","updateShape","updateCurrentMenuItem","resetUpload","addMenuItemToDataLayer","menuItem","dataLayer","eventCategory","eventAction","eventLabel","svgPath","filename","ButtonGroup","ButtonPrimitive","handler","selection","instructions","edit","remove","hidden","disabledShapes","storeShapeGetter","storeShapeUpdater","action","prefix","isCutout","modifierAction","presetShape","currentShape","setCategory","presets","getPresets","shapeName","getShapeName","categorizedShapes","enabledShapes","categories","getCategorizedShapes","shapeCategories","reduce","acc","category","editShape","updatePreset","TextLabel","shapeNames","getName","shapePresets","EditableItem","cutout","addSizeToDataLayer","dimension","dimensionNames","eventValue","countDecimals","stripNonNumeric","parseFloat","endsWithSeparator","endsWith","limitDecimals","toDecimalPoint","toFixed","formatToLocaleString","language","parsedValue","separator","substring","isNaN","formatted","useGrouping","formatForInputField","convertUnits","dimensions","fromCM","toNumber","parseInt","flexJustify","invalid","inputmode","onBlur","readonly","delay","emits","isNumerical","isWholeNumber","numericNewValue","describedby","ids","unshift","InputGroup","InputLabel","for","getMeasurements","dimensionLabel","dimensionMaxLabel","getMaxLabelForDimension","isDimensionValid","isShapeValid","get","ShapeInputFieldsWrapper","DimensionInput","inputRef","modelValue","useIndividualCorners","radius","topRightRadius","top_right_radius","bottomRightRadius","bottom_right_radius","bottomLeftRadius","bottom_left_radius","topLeftRadius","top_left_radius","diameter","isCutoutGroupValid","isGroupValid","heightLeft","height_left","heightRight","height_right","widthTop","width_top","widthBottom","width_bottom","base","numericValue","offsetLeft","offset_left","sideLength","side_length","stemLength","stem_length","stemWidth","stem_width","headLength","head_length","headWidth","head_width","modifiers","getModifiers","innerRadius","inner_radius","outerRadius","outer_radius","numberOfPoints","number_of_points","modifier","valueA","valueB","labelA","labelB","idPrefix","required","toggleValues","checked","FontOptions","select","kpsSettings","internalModel","updateModel","setPosition","$el","setTimeout","scrollIntoView","behavior","block","fontObject","getSelectedFontObject","undefined","root","_component_v_select","inputId","placeholder","selectFont","onOpen","search","attributes","events","option","fontDirUrl","loading","severity","cssClasses","classes","desiredLength","desired_length","desiredDimension","desired_dimension","FontSelect","TextToggle","TextNotice","InfoCircleDark","height_notice","shapeFieldsMissing","WarningIcon","message","getInstructionsForDimension","ValidationMessage","sideAmount","heightTop","height_top","heightBottom","height_bottom","sideHeight","side_height","getCurrentShapeInputComponent","RectangleDimensionInputs","RoundedRectangleDimensionInputs","CircleDimensionInputs","HalfCircleDimensionInputs","QuarterCircleDimensionInputs","EggDimensionInputs","EllipseDimensionInputs","FlatOvalDimensionInputs","SlopedRectangleDimensionInputs","SlopedRightRectangleDimensionInputs","RightAngledTriangleDimensionInputs","RightAngledTriangleMirroredDimensionInputs","IsoscelesTriangleDimensionInputs","TrapezoidDimensionInputs","HexagonDimensionInputs","OctagonDimensionInputs","PolygonDimensionInputs","HeartDimensionInputs","ArrowDimensionInputs","StarDimensionInputs","TextDimensionInputs","DropletDimensionInputs","KiteDimensionInputs","BarrelDimensionInputs","JewelDimensionInputs","ParallelogramDimensionInputs","ShapeFieldsMissing","hasSlotContent","slot","isSlotEmpty","isVNodeEmpty","asArray","arg","vnode","every","hasGroupedDimensionValidatorErrors","getGroupedDimensionValidationMessage","hasProblematicCorners","validationDimensionMessages","validators","getDimensionValidatorErrors","validator","field","getMessage","currentProps","MessageContainer","problematicCornersNotice","ShapeType","ShapeInputs","_hoisted_9","_hoisted_10","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_19","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","$props","$setup","$data","$options","_component_FormattedPrice","_component_ChevronRightIcon","_component_StoreButton","_component_StoreModal","_component_ShareButton","_component_ShareModal","_component_PriceStructureComponent","_component_measurements_height_transition","_component_BulkPriceTable","shouldShowSpinner","price","totalPriceIncVat","totalPriceExVat","vatExcluded","showPriceStructure","addDataLayerEvent","meta","hidePriceStructure","materialPrice","pricesIncVat","material","isEx","showSpinner","pricesExVat","sawingCosts","sawing","minimumPriceFee","showBulkPrice","bulkDiscount","unitPrice","bulkUnitPrice","quantity","shapeFee","fee","total","translatedShapeName","availability","originalPriceExVat","updateDiscountedPrice","updateQuantity","roundPrice","append","shouldShowTable","bulkPrices","leftColumn","rightColumn","getMeasurementsCacheKey","obj","dxfExport","primitivesIdentifier","edgeFinish","renderedPrice","settings","$kpsSettings","canFormat","numberFormatter","Intl","NumberFormat","currency","format","FormattedPrice","productId","requestCount","lastRequest","retrieveBulkItems","getCacheKey","$quantityInput","self","val","minimumPrice","hasTwoColumns","halfPoint","slice","discountedPrice","refreshTable","$emit","thisRequest","activeEdgeFinish","response","prices","dimensionValue","dimensionName","params","product_id","requestUrl","restUrl","updateIsRetrievingBulkPricing","Promise","resolve","oldShape","newShape","oldDimensions","newDimensions","oldPrice","newPrice","newQuantity","oldQuantity","free","excl","incl","isFree","PriceCalculator","price_per_square_meter","minimum_price","circumference_price_per_meter","calculate_material_price","required_material","get_required_material","get_area","in_m2","calculate_sawing_price","get_circumference","calculate","share","openPopup","shareConfiguration","ShareIcon","button","$refs","shareLink","role","hasShortLink","hasAlteredConfiguration","isGeneratingLink","generatingLink","generateShareableLink","generateLink","shortLink","copyShareableLink","copyLink","whatsappUrl","shareWhatsApp","target","emailUrl","shareMail","EmailIcon","WhatsApp","sprintf","viewMyConfiguration","encodeURIComponent","shareableUrl","execCommand","$store","storeConfiguration","getModalID","isLoggedIn","loggedInUser","newVal","storeLink","modalID","storeConfigurationName","storeConfig","storeConfigurationButton","storeConfigurationNameRequired","storeConfigurationSucces","myAcccountConfigurations","storeConfigurationLink","storedConfigurationsUrl","invalidName","generateConfigurationLink","storeConfigName","focus","dxfDefinition","discountedPriceExVat","priceStructureToggleUsed","showMinimumFee","totalWithoutMinimum","getPricingGroup","get_minimum_selling_price","calculator","pricePerM2ExcludingTax","get_sawing_selling_price_per_m","showPrices","isRetrievingProperties","isRetrievingBulkPricing","showComplexStructure","FIRST_BULK_THRESHOLD","usePriceFromServer","priceExVat","shapeObject","get_selling_starting_price","pricesExVatBase","assign","vatRate","priceIncVat","updatePriceExcVat","vat","exVat","updatePriceIncVat","BulkPriceTable","PriceStructureComponent","ShareModal","ShareButton","StoreModal","StoreButton","ChevronRightIcon","RadialDrillHoleConfiguration","get_input_keys","GridDrillHoleConfiguration","EdgeDrillHoleConfiguration","NullDrillHoleConfiguration","DrillHoleConfigurationFactory","get_configuration","drillHoleType","Invalid","OffsetLineType","createModelForArrow","difference","createModelForHeart","a","sqrt","diagonal","halfDiagonal","right_line","Line","left_line","right_arc","Arc","left_arc","createModelForArchedRectangle","bottom_line","createModelForRoundedRectangle","maxRadius","BottomLeft","BottomRight","TopRight","TopLeft","Bottom","Top","Right","Left","createModelForFlatOval","Belt","createModelForOctagon","sides","angleInRadians","PI","sinAngle","sin","Polygon","createModelForDroplet","xAxisMiddle","baseCircleRadius","baseCircleOrigin","baseCircle","Circle","intersectCircleRadius","intersectCircleOrigin","intersectCircle","intersectionPoints","intersection","intersectionPointA","intersectionPointB","dropletTipTop","dropletTipLineA","dropletTipLineB","dropletBase","path2Angles","createModelForEgg","startAngle","endAngle","radiusY","radiusX","arcTop","EllipticArc","arcBottom","rotate","createModelForBarrel","arcHeight","lineLeft","lineRight","createModelForParallelogram","angle","tan","toRadians","createModelFromShape","offset_top","offset_bottom","Rectangle","b","c","Ellipse","side_amount","Star","right_height","left_height","right_side","left_side","topLeft","topRight","bottomLeft","bottomRight","topBase","OffsetLine","startPoint","endPoint","getModel","subModel","addPath","captionStartPoint","captionEndPoint","addCaption","layer","moveRelative","roundLength","renderLength","renderMaxLength","DrillHole","edge","getId","getPath","getAsModel","getOffsetLines","focusedElement","StepTypes","Shape","getOffsetModel","outline","offsetModel","entry","getCorners","resultPath","countEdges","getAround","holeCounts","previousPoint","shift","holes","edgeCount","currentPoint","prevX","prevY","curX","curY","newLine","holeCount","lineLength","getTotalLength","holePoint","getPointAtLength","deduplicate","drillholes","found","deduplicated","drillhole","createEdgePath","offsetTopBottom","offsetLeftRight","startingPoint","newEntry","createOffsettedLine","cloned","fromEdge","edgePath","side","entries","holesPerSide","toPoints","coordinates","Trapezoid","originalPaths","super","enclosed","enclosedRectangle","ShapeDrillHoleGeneratorFactory","getShapeDrillHoleGenerator","lastGeneratedConfiguration","drillHoleEdgeHoles","drillHoleOffset","isMediaMobileSize","shapeDrillHoleGenerator","focusChanged","updateDrillEdgeHoles","edgeType","defaultHoles","_component_portal_target","holeInfo","drillHoleConfiguration","isDrillHoleValid","getDrillHoleValidationMessage","minimumDrillHoleDiameter","drillHoleEdgeType","drillHoleTypeEnabled","getEdgeCount","drillOption","drillHoleDiameter","drillHoleFieldsWithMessage","configuration","invalidKeys","updateDrillHoleEdgeType","drillHolesChoosePosition","DrillHoleEdgeTypeCorner","drillHoleEdgeTypes","corners","DrillHoleEdgeTypeAround","around","DrillHoleEdgeTypeTopBottom","top_bottom","DrillHoleEdgeTypeLeftRight","left_right","distance_from_edge","diameter_drill_hole","DrillHoleEdgeCounts","drillHolesNotice","activeHole","activeIndex","isEditorVisible","isRemoveButtonActive","isEditingExistingHole","listHasHoles","customDrillHoles","editableCustomDrillHoles","minimumDrillHoleDiameterLabel","activeIndexPlusOne","getCenter","drillHoleSettings","drillHoles","prefilledDrillHoles","setRemoveButtonActiveState","addHole","getI18nNumber","removeHole","editHole","holeNumber","saveHole","addNewHole","setListHasHoles","splice","hole","edit_hole","remove_hole","singular_hole","diameter_drill_hole_short","distance_from_edge_left","distance_from_edge_bottom","add_hole","add_hole_long","enclosingRectangle","drillHoleRadialAmount","drillHoleRadialDiameter","drillHoleRadialOffsetX","drillHoleRadialOffsetY","radialDiameter","amount","position","bottom","diameter_from_center","offset_x","offset_y","hasDrillHoleValidatorErrors","drillHoleHorizontalAmount","drillHoleVerticalAmount","holes_amount_horizontally","holes_amount_vertically","drillHoleValidationMessage","onUpdate","canUseExactCenter","usesDefaultDrillHoleDimensions","drillHoleSelectorButtons","isCenteredDrillHoles","showCenterOfShapeNotice","showDrillHolesNotice","updateDrillOption","ButtonStrip","DrillHoleEdgeTypes","DrillHoleRadialSettings","DrillHoleGridSettings","DrillHolePreset","centerOfShapeNotice","isCutoutValid","getCutoutValidationMessage","shapeSupportCutoutRotation","cutoutOutsideModel","cutoutOffsetLeft","cutoutOffsetBottom","cutoutShape","cutoutRotation","offsetBottom","previousShape","legend","cutoutNotice","cutoutOutsideShapeNotice","CutoutTypes","cutoutType","cutoutSelectorButtons","updateCutoutType","none","isAddingCutout","isEditingExistingCutout","containerRef","usesDefaultCutoutDimensions","cutouts","currentCutoutIndex","hasGroupedCutoutValidatorErrors","getGroupedCutoutValidationMessage","getCutoutValidatorErrors","excludedFields","filteredValidators","editCutout","isMaxSafeCutoutReached","maxSafeCutoutPercentage","pricingGroup","other_settings","max_safe_cutout_percentage","getCutoutArea","getShapeArea","addCutout","saveCutout","scrollTo","removeCutout","view","CutoutType","offsets","CutoutPosition","save","largeCutoutNotice","FILE_INPUT_NAME","Client","getProperties","file","formData","FormData","Blob","fetch","method","body","json","ok","Error","svg_path","uploadingError","measurementsConfig","drawingRules","drawingExplainer","showDrawingRules","showDrawingExplanation","isHoveringFile","fileUpload","getOriginalFilename","fileInputName","isUploading","getIsParsingFile","hasSucceeded","uploadedContent","allowed_mime_types","allowed_file_extensions","hasAllowedMimeType","mimetype","handleFileUpload","files","uploadFile","resetInput","setIsHoveringFile","processDroppedFile","dataTransfer","original_filename","removeFile","onDragover","onDragenter","onDragleave","onDragend","onDragdrop","onDrop","dragNewFilesToUpload","dragFilesToUpload","or","selectFile","accept","onChange","dxfExplainer","uploadingFile","sideSelection","explanation","updateSideSelection","addCaptionBackgrounds","svgString","ratio","parser","DOMParser","doc","parseFromString","svgElement","documentElement","captions","textElements","querySelectorAll","fontSize","setAttribute","removeProperty","setProperty","tempSvg","createElementNS","tempText","cloneNode","getBBox","appendChild","bbox","removeChild","xPadding","yPadding","rect","serializer","XMLSerializer","serializeToString","dottedGuideLines","guideLines","dotDash","getTexturedSVG","sideColor","sideAppearance","preserveAspectRatio","shapePath","defs","metallicGradient","clonedPath","removeAttribute","after","brushedTextureHighlightGradient","brushedTextureBrushingFilter","getColorMatrixValues","brushedTextureNoiseFilter","brushedTextureHighlight","brushedTextureBrushing","brushedTextureNoise","color","hex","g","reorderSVG","dimensionLines","parentNode","insertBefore","addStyleToSVG","activeCutout","activeDrillhole","hiddenRectangle","rawImage","badge","onInput","activeValue","front","topSide","back","backSide","svgFront","getRectangle","appearance","svgBack","exporter","toSVG","useSvgPathOnly","OptionSelectorWrapper","OptionSelector","SideToggle","exportShape","getEdgeFinishMethods","getDefaultEdgeFinish","updateEdgeFinish","getBadge","premium","assets","currentThickness","currentProductThickness","thicknesses","alternateThicknesses","baseShapeInstanceModel","baseShapeInstance","thickness","getUrl","permalink","generateTemporaryLink","location","isTemporary","thickness_in_mm","currentProductMaterial","alternateMaterials","pricePerSquareMeter","suffix","setMaterial","isEmpty","clearable","selectMaterial","getPriceIncVat","getPriceExcVat","vatIncluded","RulerIcon","selectedUnit","measuringInstructions","isDrillHolesVisible","measurements","stringifiedConfig","exportCompositeDxf","isEdgeFinishVisible","isCutoutsVisible","showSideSelection","isPortalActive","defaultFont","fontObj","fontName","_component_portal","HeaderPricingInformation","AccordionContainer","AccordionItem","shapeSize","ShapeSelector","MountingShapePreview","ShapeSettings","ShapeUpload","InstructionsButton","measuringInstructionsLabel","ThicknessSelector","MaterialSelector","DrillHoles","CutoutsConfiguration","SideSelection","EdgeFinish","MetaInformation","Units","DimensionLineType","Area","from_mm2","from_cm2","centimeters_squared","from_m2","meters_squared","fromDimensions","in_cm2","in_mm2","EnclosedShape","enclosedShape","high","low","mapToUnits","items","DimensionLine","shiftOffset","baseLine","ofLineInDegrees","arrowStartLeft","arrowStartRight","arrowEndLeft","arrowEndRight","getLength","pointDistance","AbstractShape","cleanedPrimitives","labelMappings","parseDimensions","parseModifiers","getShape","getEnclosingRectangle","getMidPoint","getOriginalEnclosedShape","createMidPoint","centerDot","move","CM","degrees","withMidPoint","renderDimensionLabel","getDimensionLabel","hasPaths","property","createModel","primitive","getDimensionProperties","primary","secondary","getRatios","centerX","centerY","getGuideLines","getDimensionLineType","forceRender","getDefaultModifiers","getDefaultCutoutModifiers","getHiddenDimensions","getLabelMappings","invertedMappings","Text","fonts","createTextModel","calculateLetterEnclosing","find","calculateRatio","createFixedHeightText","firstRender","actualLength","shapeSettings","textModel","scale","unitsPerEm","layout","align","lineHeight","maximumLength","glyphs","glyph","character","glyphToModel","getHeight","getWidth","getDesiredLength","getDimensionLines","getDesiredDimension","getDefaultDimensions","getDefaultCutoutDimensions","parentShape","defaultModifiers","defaultText","capitalize","firstLetter","restOfWord","toUpperCase","AbstractValidator","instance","customMessage","minimum","minimums","maximum","maximums","getField","getPrefix","getCustomMessage","getDimension","getDimensionMethodKey","split","dimension_part","getDimensionValue","getValidatorTranslationStrings","labels","getIsCutout","MaximumDecimalPoints","decimalPoints","isValid","MinimumValue","getMinimum","ArrowConfiguration","get_dimension_keys","get_modifier_keys","get_maximum_dimensions","get_labels","stem_height","head_height","get_validators","get_category","MaximumValue","getMaximum","CircleConfiguration","maximum_rectangle","get_shortest_side","EllipseConfiguration","get_longest_side","HalfCircleConfiguration","hasNewValidators","shortest_side","longest_side","get_minimum_dimensions","get_new_validators","get_cutout_validators","HeartConfiguration","formula1","formula2","min_width","HexagonConfiguration","maximum_side_length","IsoscelesTriangleConfiguration","NullConfiguration","QuarterCircleConfiguration","RectangleConfiguration","get_length","get_width","RightAngledTriangleConfiguration","RoundedRectangleConfiguration","use_individual_corners","shape_settings","GroupedValidator","group","fields","getValidator","getGroup","getFields","SlopedRectangleConfiguration","at_least_one","grouped","MinimumRatio","ratios","getInvalidRatios","applicableRatios","firstDimension","invalidRatios","secondValue","secondDimension","calculatedRatio","invalidRatio","half","toLowerCase","ArchedRectangleConfiguration","StarConfiguration","maximum_radius","MaximumTextValue","sheet","MinimumTextValue","TextConfiguration","TrapezoidConfiguration","OrValidator","some","FlatOvalConfiguration","get_maximum_variable_dimensions","minWidth","SlopedRightRectangleConfiguration","OctagonConfiguration","diagonalFactor","DropletConfiguration","maxWidth","minHeight","PolygonConfiguration","EggConfiguration","KiteConfiguration","BarrelConfiguration","shortestSide","maxSideHeight","JewelConfiguration","maxWidthTop","minWidthBottom","ParallogramConfiguration","ShapeConfigurationFactory","ShapeValidator","uploadAsModel","hasRequiredDimensions","requiredDimensions","requiredDimension","requiredModifiers","requiredPrimitive","Cutout","getShapeObject","getInitialDimensions","enabledShape","EdgeDrillHoleType","cutoutMeasurements","defaultCutoutDimensions","mutations","updateCutoutOffsetLeft","updateCutoutOffsetBottom","updateCutoutRotation","updateCutoutShape","updateCutoutDimension","currentValue","newResult","setCutoutDimensionsForShape","setCutoutModifiers","resetCutoutDimension","updateCutoutModifier","updateUsingDefaultCutoutDimensions","usesDefaults","updateCutouts","updateCutoutIndex","updateCutoutByIndex","removeCutoutByIndex","cutoutByIndex","currentCutout","cutoutModifiers","cutoutDimensions","cutoutPrimitives","rootState","shapeState","selectedCutoutsPreview","shapeInstance","shapeValidator","cutoutInstance","shouldApplyFillet","filletSharpEdges","fillet_sharp_edges","filletSize","rootGetters","minimumDrillHoleDiameterLength","getArea","cutoutsConfig","cutoutConfig","cutoutCenterPosition","getEnabledCutoutShapesForPricingGroup","enabled_shapes","baseModel","isCutoutsEnabled","actions","updateCurrentCutout","resetCutoutShapeAndDimension","updateCutoutPosition","updateCutoutFromConfig","dimensionsInCm","updateCutoutsFromConfig","updateDefaultCutoutMeasurements","parentShapeObject","cutoutShapeObject","resetCutouts","AbstractValidatorSet","RadialDrillHoleValidatorSet","minHoleDiameter","parsedDimensions","getValidators","drillHole","offsetX","offsetY","GridDrillHoleValidatorSet","horizontal","vertical","IsUnique","values","CustomDrillHoleMissingValidator","combinedModel","drillHoleId","drillHoleMessages","incorrect","baseModelChains","simplify","combinedShapeChains","checkPathIdExists","pathLength","pathId","modelKey","prototype","hasOwnProperty","call","CustomDrillHoleValidatorSet","combinedShape","parsed","mapToInstances","rules","invalidHole","invalid_hole","parsedIds","holeRules","unique","ArrayContains","condition","invert","checkedItems","EdgeDrillHoleValidatorSet","drillHoleConfig","additionalValidators","undefined_around_edges","NullValidatorSet","RadialDrillHoles","cloneToRadial","GridDrillHoles","horizontalAmount","verticalAmount","cloneToGrid","calculateGridSpacing","size","workArea","spaceToUse","EdgeDrillHoles","shapeDrillHoleGeneratorFactory","CORNERS","AROUND","drillHolesModel","findClosestDrillHole","closestDrillHole","minDistance","pow","distance","getCurrentEdgeDrillHoles","drillHoleModel","startsWith","filteredDrillHoles","PresetDrillHoles","topBottom","leftRight","maxDistance","generatePresetHoles","calculateForLengthAndWidth","calculateDrillHolesForEdge","distanceBetweenHoles","realDistance","Axis","createValidatorInstance","requiredProperties","getValidationErrors","shouldAllFail","filtered","fieldSpecific","hasValidationErrors","errors","getValidationMessageForField","PresetDrillHoleValidatorSet","drillHoleEdgeMaxDistance","ShapeModelDecorator","parentDecorator","cloneObject","ShapeModelCombineDecorator","cachedModel","combineSubtraction","combineUnion","FilletModelDecorator","CurrentCutoutFilletModelDecorator","DimensionLineDecorator","dimensionLine","dimensionLineModel","OffsetLineDecorator","originalModel","originalModelDecorator","offsetLines","offsetLine","offsetLineModel","GuideLineDecorator","guideLine","guideLineModel","CutoutMoveDecorator","baseShapeModel","baseShapeMeasure","cutoutMeasure","GeneratedDrillHoleDecorator","drillHoleInstance","CustomDrillHoleDecorator","CurrentCustomDrillHoleDecorator","CurrentGeneratedDrillHoleDecorator","currentDrillHoleModel","DrillHoleOffsetLineDecorator","CutoutRotationDecorator","CutoutRotationIndicatorDecorator","rotationAngle","rotationLine","arcLine","rotationModel","CutoutModelDecorator","cutoutsModel","modelDecorator","currentCutoutModelDecorator","defaultDrillHoleDiameter","default_drillhole_diameter","minDrillHoleDiameter","min_drillhole_diameter","currentCustomDrillhole","drill_hole_presets_active","defaultDrillHoleDimensions","presetGroup","drill_hole_max_distance","drillHoleEdgeTopBottom","drill_hole_distance_to_edge_top_bottom","drillHoleEdgeLeftRight","drill_hole_distance_to_edge_left_right","drillHoleStartingPoint","drill_hole_starting_point","updateDrillHoleRadialAmount","updateDrillHoleRadialOffsetX","updateDrillHoleRadialOffsetY","updateDrillHoleRadialDiameter","updateDrillHoleHorizontalAmount","updateDrillHoleVerticalAmount","updateDrillHoleDiameter","updateDrillHoleOffset","updateCurrentCustomDrillhole","addCustomHole","removeCustomHole","resetCustomHoles","updateCustomDrillholes","updateEdgeHoles","edgeHoles","updateUsingDefaultDrillHoleDimensions","updateDrillHoleEdgeTopBottom","updateDrillHoleEdgeLeftRight","radialDrillHoles","gridDrillHoles","edgeDrillHoles","presetDrillHoles","getCustomDrillHoles","getDrillHoleValidators","baseShapeModelDecorator","getBaseShapeModelDecorator","validatorSet","getDrillHoleValidatorErrors","rootstate","forceRefresh","getGeneratedDrillHoleInstance","getGeneratedDrillHoles","isPreview","diameter_drill_hole_min","updateDrillHolesFromConfig","edge_top_bottom","edge_left_right","updateRadialDrillHolesFromConfig","updateGridDrillHolesFromConfig","amountHorizontal","amountVertical","updateEdgeDrillHolesFromConfig","resetDrillHoles","error","selectedFontName","selectedFontObject","updateLoadingState","updateError","setSelectedFont","setSelectedFontObject","addFont","loadFonts","fontIsLoaded","getSelectedFontName","loadedFonts","previewTransforms","currentModalTriggerName","validSteps","disabledSteps","completedSteps","selectedOptions","defaultDimensions","priceExcVat","steps","long","short","extendedProductInformation","select_thickness","updateTranslation","updateCurrentStepName","updateCurrentModalName","updateCurrentModalTriggerName","updateMenuItem","updateFocusedElement","updateUsingDefaultDimensions","currentStep","dimensionPreview","hasDimensionValidatorErrors","hasCutoutValidatorErrors","drillOptions","sideLabel","focusTrigger","buttons","otherShapeButtons","selectionButton","usePreset","forcePreset","types","namespace","StoreConfiguration","baseUrl","headers","restNonce","isGeneratingShareLink","lastConfiguration","configurationName","updateIsGenerating","updateShortLink","updateLastConfiguration","updateThickness","updateMaterial","updateConfigurationName","getConfigurationName","config","originalUpload","btoa","originalFilename","originalFileType","getOriginalFileType","version","JSON","stringify","encodedConfiguration","shareableMeasurementsConfig","getBlockSettings","getBlockConfig","configData","parse","settingData","disable_cutouts","getEnableCutouts","isDrillHolesEnabled","disable_drillholes","getEnableDrillholes","request","short_link","createConfigurationLink","createShareableLink","loadConfiguration","currentShortLinkUrl","currentConfig","history","replaceState","pathname","updateBaseFromConfig","atob","updateFromConfig","edgeFinishingIsEnabled","mappedPrefilledDrillHoles","Offset","modelA","modelB","minOffsetInMM","originalShapeModel","parentModelInstance","modelInstance","createOriginalShapeModel","clone","hasObjectsWithinOffset","combine","modelContext","generic","all","isIgnorableModel","CutoutMissingValidator","cutoutValidatorMessages","cutoutIncorrect","getConfiguration","dimensionValidators","getMinimalSize","getDimensionValidatorInstances","getGroupedValidators","getValidatorMaximums","groupedValidators","instances","concat","getDimensionValidators","getShapeInstance","getGroupedDimensionValidators","hasAllMeasurements","hasAllModifiers","shapeValidators","validatorInstances","opts","getGroupedDimensionValidatorErrors","getCutoutValidators","getGroupedCutoutValidators","getCutoutMaximums","getGroupedCutoutValidatorErrors","Arrow","getStemLength","getHeadLength","getStemWidth","getHeadWidth","getWidthDifference","tertiary","quaternary","parentWidth","parentHeight","getDiameter","Heart","heartWidth","Hexagon","getSideLength","sideLengthOffset","getBase","halfWidth","sideSquared","getRadius","getSideLenght","hypotenuseSquared","GuideLine","getTopRightRadius","getBottomRightRadius","getBottomLeftRadius","getTopLeftRadius","top","leftPoint","rightPoint","radiusLine","topPoint","bottomPoint","getHeightLeft","getRightLength","getHeightRight","getWidthBottom","getWidthTop","getOffsetLeft","height_horizontal_position","top_starting_x_position","bottom_starting_x_position","actual_width_top","actual_width_bottom","allLines","widest_width","smallest_width","left_offset","left_point","right_point","bottom_point","top_point","getOuterRadius","getInnerRadius","getNumberOfPoints","starModel","pointsOnChain","innerRadiusPoint","closest","DXF","extremes","verticalLines","horizontalLines","shapeBottom","shapeLeft","chainMeasure","chainExtreme","limitedVerticalLines","sort","line","limitedHorizontalLines","getLengthFromExtreme","min_x","max_x","getWidthFromExtreme","min_y","max_y","FlatOval","baseWidth","Octagon","Droplet","getSideAmount","getClosestLineToOrigin","startLine","endLine","shapeLines","closestLine","Infinity","originDistance","endDistance","Egg","Kite","getHeightTop","getHeightBottom","Barrel","getSideHeight","getLargestHeight","Jewel","Parallelogram","getSlantedWidth","angleRadians","slantHeight","cos","PreviewShapeFactory","namespaced","getInstance","isCenteredShape","parent","commonDimensions","radiusDimensions","radii","dimensionLabels","radiusLabels","cutoutMaximums","getCutoutMaximumRectangle","fallbackModel","textShapeInstance","defaultSize","getTextShapeInstance","setDefaults","static","get_name","NAME","get_enclosing_rectangle","from_cms","make_length_longest_side","remove_sides","serialize_primitives","deserialize_primitives","Fallback","modules","rootGetter","calculatedMaximums","maximumWidth","materialLoss","canUseFullPlateLength","canUseFullPlateWidth","usesSawing","maximumRectangle","swapMaximumDimensions","standardMaterialLoss","roundNumber","enclosing_rect","get_material_loss","DEFAULT_MATERIAL_LOSS","CircleFraction","get_fraction","circle_circumference","get_diameter","NullShape","AbstractRightAngledTriangle","area_in_mm2","get_base","get_height","h","perimeter","h1","h2","kappa","lambda","ellipseTerm","k","is_individual_radius","totalRectangleArea","topRightCircleArea","topRightRectangleArea","bottomRightCircleArea","bottomRightRectangleArea","bottomLeftCircleArea","bottomLeftRectangleArea","topLeftCircleArea","topLeftRectangleArea","topRightCornerArea","bottomRightCornerArea","bottomLeftCornerArea","topLeftCornerArea","topRightPerimeter","get_corner_perimeter","bottomRightPerimeter","bottomLeftPerimeter","topLeftPerimeter","cornerPerimeter","rectanglePerimeter","perimeter_circle","get_radius","smallest_length","long_side","short_side","get_side_length","sqrt2","SIDES","get_side_amount","stem_area","head_area","stem_circumference","head_circumference","shared_circumference","get_stem_length","get_stem_width","get_head_length","get_head_width","circle_radius","ac","ab","angle_eab","be","area_abcd","ae","bc","get_number_of_points","get_inner_radius","get_outer_radius","MAXIMUM_NUMBER_OF_POINTS","get_longest_height","largest_height","smallest_height","get_shortest_height","base_rectangle","top_triangle","diagonal_length","get_height_left","get_height_right","get_longest_width","get_shortest_width","get_width_top","get_width_bottom","half_circle","rectangle_height","half_circle_circumference","rectangle_circumference","get_rectangle_side","left_diagonal","offset_right","right_diagonal","get_offset_left","areaCircle","areaRectangle","perimeterRectangle","perimeterCircle","upperSlope","get_height_top","lowerSlope","get_height_bottom","get_side_height","circleSegmentHeight","arcRadius","arcAngle","asin","circleSegmentArea","barrelArea","arcLength","barrelCircumference","bottom_triangle","top_trapezoid","triangle_side_length","trapezoid_side_length","calculations","circumference","calculate_shape","base_circle_radius","intersect_circle_radius","circle_segment_height","get_circle_segment_height","chord_length","triangle_height","triangle_base","arc_length","acos","intersect","ShapeFactory","create_shape_from_primitives","shape_name","get_shape_object","updateActiveEdgeFinish","get_shape_settings","customer_choose_production_method","availableMethods","defaultEdgeFinish","sawing_method","PricingGroup","sawing_method_settings","shape_purchase_price_starting_rate","shape_selling_price_starting_rate","enable_cutout","enable_drillholes","get_sawing_method_settings","get_sawing_purchase_price_per_m","purchase_price_per_m","selling_price_per_m","get_sawing_method","get_purchase_starting_price","get_minimum_purchase_price","purchase_price_minimum","selling_price_minimum","get_enabled_shapes","swap_maximum_dimensions","jsonSerialize","isParsing","setUploadedContent","setParsingState","updateUploadedContent","reader","FileReader","onload","readAsText","AbstractPreset","hasCutouts","getConfig","hasDrillholes","getShapes","CircleCircleNone","RoundedrectangleNoneCustom","CircleNoneCustom","RectangleCircleNone","RectangleNoneCustom","RectangleNoneEdges","RectangleRectangleEdges","RectangleRectangleNone","RectangleRectangleCustom","CircleNoneRadial","RectangleNoneGrid","RoundedrectangleNoneEdges","RectangleRoundedrectangleNone","PresetFactory","getAll","client","asymmetricShapes","retrieveDxfDefinitionDebouncedFn","leading","trailing","cutoutState","drillHoleState","uiState","validation","edgeFinishStore","fileUploadState","ui","previewShapeDimensions","random","updateModifier","updatePresetShape","updateDimension","setDimensionsForShape","updateDxfDefinition","updateIsRetrievingProperties","presetFactory","activeSection","getPreviewShapeWidth","getPreviewShapeHeight","isUsingFallback","exportModel","toDXF","units","emptyModel","getExportableModelDecorator","isAsymmetricShape","sideSelectionSettings","getFallbackModel","measureComplete","padding","paddingModel","showSubtractLayers","mapLabel","basedOnDimension","basedOnDimensionLabel","basedOnValueBetween","basedOnValueMinimum","actualLabel","maxLabel","currentMeasurements","requiredMeasurements","measurement","current","currentModifiers","problemPoints","link","nextLink","ofChainLinkJoint","midpoint","reversed","endPoints","startpoint","appDebug","Holes","retrieveDxfDefinitionDebounced","retrieveDxfDefinition","updatePlateShape","updatePlateDimension","updateShapeDimensions","loadPresetConfig","productDelivery","startApp","app","App","component","use","directive","globalProperties","$userBrowser","provide","mount","COMPONENT_V_MODEL","ATTR_FALSE_VALUE","RENDER_FUNCTION","Worker_fn","Worker","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","m","deferred","O","chunkIds","fn","priority","notFulfilled","fulfilled","getter","__esModule","definition","o","defineProperty","enumerable","f","chunkId","promises","u","miniCssF","globalThis","prop","inProgress","dataWebpackPrefix","l","needAttach","scripts","getElementsByTagName","s","charset","timeout","nc","onScriptComplete","prev","onerror","clearTimeout","doneFns","bind","head","Symbol","toStringTag","nmd","installedChunks","installedChunkData","promise","reject","loadingEnded","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}