{"version":3,"sources":["../../src/lib/A-Request/A-HttpRequestData.context.ts","../../src/lib/A-Request/A-HttpServerRequest.context.ts","../../src/lib/A-Request/A-Request.constants.ts","../../src/lib/A-Server/A-HttpServer.error.ts","../../src/lib/A-Request/A-Request.error.ts","../../src/lib/A-Request/A-Request.helper.ts","../../src/lib/A-Request/A-Request.env.ts","../../src/lib/A-Request/A-Request.entity.ts","../../src/lib/A-Request/A-Request.types.ts","../../src/lib/A-Response/A-Response.constants.ts","../../src/lib/A-Response/A-Response.entity.ts","../../src/lib/A-Response/A-Response.error.ts","../../src/lib/A-Server/A-HttpServer.constants.ts","../../src/lib/A-ServerRoute/A-ServerRoute.entity.ts","../../src/lib/A-ServerLogger/A-ServerLogger.component.ts","../../src/lib/A-Server/A-HttpServer.container.ts","../../src/lib/A-Server/A-Server.context.ts","../../src/lib/A-Server/A-Server.error.ts","../../src/lib/A-ServerRoute/A-ServerRoute.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.constants.ts","../../src/lib/A-ServerRouter/A-ServerRouter.meta.ts","../../src/lib/A-ServerRouter/A-ServerRouterDefine.decorator.ts","../../src/lib/A-ServerRouter/A-ServerRouter.component.ts","../../src/lib/A-ServerController/A-ServerController.component.ts","../../src/lib/A-ServerEntityList/A-EntityListPagination.context.ts","../../src/lib/A-ServerEntityList/A-EntityListCacheState.context.ts","../../src/lib/A-ServerEntityList/A-EntityList.entity.ts","../../src/lib/A-ServerEntityList/A-EntityList.types.ts","../../src/lib/A-ServerListQuery/A-ServerListQueryFilter.context.ts","../../src/lib/A-ServerLogger/A-ServerLogger.constants.ts","../../src/lib/A-ServerMiddleware/A-ServerMiddleware.component.ts","../../src/lib/A-ServerProxy/A-ServerProxy.constants.ts","../../src/lib/A-ServerProxy/A-ServerProxy.context.ts","../../src/lib/A-ServerProxy/A-ServerProxy.component.ts","../../src/lib/A-ServerStatic/A-ServerStatic.context.ts","../../src/lib/A-ServerStatic/A-ServerStatic.component.ts","../../src/constants/env.constants.ts"],"names":["A_Error","A_IdentityHelper","A_Context","A_Request_Event","_a","_b","_c","A_Entity","ASEID","A_Feature","A_Inject","A_Scope","_d","_e","A_Service","A_ServiceFeatures","A_Config","A_Fragment","A_Component","A_Logger","A_SERVER_TYPES__A_EntityListEvent","A_Concept","A_Polyfill"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIO,IAAM,iBAAA,GAAN,cAAgC,kBAAA,CAEpC;AAAA,EAGC,YAAY,IAAA,EAAc;AACtB,IAAA,KAAA;AAAA,MACI;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,IAAU,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAChC;AAAA,EAGA,QAAA,CAAS,WAA2B,OAAA,EAAiB;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EACtC;AAEJ;ACxBO,IAAM,0BAAA,GAAN,cAEG,kBAAA,CAoBR;AAAA,EAQE,IAAc,QAAA,GAA4B;AACtC,IAAA,OAAO,MAAM,MAAA,CAAO,OAAA;AAAA,EACxB;AAAA,EAEA,IAAc,SAAA,GAA4B;AACtC,IAAA,OAAO,MAAM,MAAA,CAAO,QAAA;AAAA,EACxB;AAAA,EAKA,WAAA,CACI,SACA,QAAA,EACF;AACE,IAAA,KAAA,CAAM,qBAAA,EAAuB,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAGlD,IAAA,IAAA,CAAK,GAAA,GAAM,iBAAiB,cAAA,EAAe;AAAA,EAC/C;AAAA,EAEA,IAAI,EAAA,GAAa;AACb,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,KAAK,QAAA,CAAS,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,EACpE;AAAA,EAEA,IAAI,OAAA,GAAoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,EAAE,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,WAAA,GAAkC;AAClC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAA,IAAK,MAAA;AAAA,EACpD;AAAA,EAGA,IAAI,IAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,KAAK,KAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,IAAI,cAAA,GAAyB;AACzB,IAAA,IAAI,UAAU,IAAA,CAAK,QAAA;AACnB,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAA,GAAU,QAAQ,MAAA,EAAO;AAAA,IAC7B;AAEA,IAAA,MAAM,CAAC,OAAA,EAAS,WAAW,IAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,UAAU,CAAA;AAC7D,IAAA,OAAO,OAAA,GAAU,MAAO,WAAA,GAAc,GAAA;AAAA,EAC1C;AAAA,EAGA,eAAA,GAAkB;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,MAAA,EAAO;AAAA,EACrC;AAAA,EAEA,cAAA,GAAiB;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,MAAA,EAAO;AAAA,EACnC;AACJ;;;ACtGO,IAAM,iBAAA,GAAoB;AAAA,EAE7B,OAAA,EAAS,mBAAA;AAAA,EAET,MAAA,EAAQ,kBAAA;AAAA,EAER,WAAA,EAAa,uBAAA;AAAA,EAEb,OAAA,EAAS,mBAAA;AAAA,EAET,UAAA,EAAY,sBAAA;AAAA,EAEZ,OAAA,EAAS,mBAAA;AAAA,EAET,SAAA,EAAW,qBAAA;AAAA,EAEX,SAAA,EAAW,qBAAA;AAAA,EAEX,MAAA,EAAQ,kBAAA;AAAA,EAER,KAAA,EAAO,iBAAA;AAAA,EAEP,WAAA,EAAa,uBAAA;AAAA,EAEb,YAAA,EAAc,wBAAA;AAAA,EAEd,aAAA,EAAe,yBAAA;AAAA,EAEf,cAAA,EAAgB;AACpB;ACzBO,IAAM,kBAAA,GAAN,MAAM,kBAAA,SAA0B,OAAA,CAA8D;AAAA;AAAA;AAAA;AAAA,EA8DjG,OAAe,mBAAmB,MAAA,EAAwB;AACtD,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA,IAAK,eAAA;AAAA,EAC9C;AAAA,EA8BA,WAAA,CACI,QACA,MAAA,EACF;AAEE,IAAA,QAAQ,IAAA;AAAM;AAAA,MAEV,MAAK,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,MAAA,KAAW,QAAA;AACjD,QAAA,KAAA,CAAM;AAAA,UACF,KAAA,EAAO,kBAAA,CAAkB,kBAAA,CAAmB,MAAM,CAAA;AAAA,UAClD,WAAA,EAAa;AAAA,SAChB,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA;AAAA;AAAA,MAGJ,KAAK,MAAA,YAAkB,KAAA;AACnB,QAAA,KAAA,CAAM,MAAM,CAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,GAAA;AACd,QAAA;AAAA;AAAA,MAGJ,MAAK,OAAO,MAAA,KAAW,YAAY,MAAA,KAAW,IAAA,IAAQ,EAAE,MAAA,YAAkB,KAAA,CAAA;AACtE,QAAA,MAAM,MAAA,GAAS,MAAA;AAGf,QAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,EAAO;AACnC,UAAA,KAAA,CAAM,MAAgC,CAAA;AACtC,UAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,GAAA;AAAA,QACnC,CAAA,MAAO;AAEH,UAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,GAAS,mBAAkB,kBAAA,CAAmB,MAAA,CAAO,MAAM,CAAA,GAAI,uBAAA;AACpF,UAAA,KAAA,CAAM;AAAA,YACF,KAAA;AAAA,YACA,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,eAAe,MAAA,CAAO;AAAA,WACzB,CAAA;AACD,UAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,GAAA;AAAA,QACnC;AACA,QAAA;AAAA,MAEJ;AAEI,QAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA;AACtF,EACJ;AAAA,EAGU,gBAAgB,MAAA,EAAsC;AAC5D,IAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAC5B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,IACzB;AAAA,EACJ;AAAA,EAGA,MAAA,GAAuC;AACnC,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK;AAAA,KACjB;AAAA,EACJ;AACJ,CAAA;AA/Ja,kBAAA,CAEO,mBAAA,GAA8B,GAAA;AAFrC,kBAAA,CAGO,aAAA,GAAgB,oBAAA;AAHvB,kBAAA,CAKO,yBAAA,GAAoC,GAAA;AAL3C,kBAAA,CAMO,mBAAA,GAAsB,uBAAA;AAAA;AAAA;AAAA;AAN7B,kBAAA,CAWe,kBAAA,GAA6C;AAAA;AAAA,EAEjE,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,kBAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,gBAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,wBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,QAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,kBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,iCAAA;AAAA,EACL,GAAA,EAAK,+BAAA;AAAA;AAAA,EAGL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,4BAAA;AAAA,EACL,GAAA,EAAK,yBAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,eAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK;AACT,CAAA;AAvDG,IAAM,iBAAA,GAAN;ACFA,IAAM,cAAA,GAAN,cAA6BA,OAAAA,CAAQ;AAQ5C;AARa,cAAA,CAEO,uBAAA,GAA0B,8BAAA;AAFjC,cAAA,CAGO,eAAA,GAAkB,mBAAA;AAHzB,cAAA,CAIO,mBAAA,GAAsB,mBAAA;AAJ7B,cAAA,CAKO,mBAAA,GAAsB,iBAAA;AAL7B,cAAA,CAMO,sBAAA,GAAyB,6BAAA;;;ACuBtC,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzB,OAAO,aAAA,CAAc,GAAA,EAAa,YAAA,EAA8C;AAE5E,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAE9C,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,IAAA,MAAM,kBAAkB,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAE9D,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,cAAA,GAAiB,gBAAgB,CAAC,CAAA;AACxC,MAAA,MAAM,UAAA,GAAa,YAAY,CAAC,CAAA;AAEhC,MAAA,IAAI,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AAChC,QAAA,MAAM,SAAA,GAAY,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACxC,QAAA,IAAI,UAAA,EAAY;AACZ,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,kBAAA,CAAmB,UAAU,CAAA;AAAA,QACrD;AAAA,MACJ,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AAEtC,QAAA,OAAO,EAAC;AAAA,MACZ;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,aAAyC,GAAA,EAAgB;AAC5D,IAAA,MAAM,QAAgC,EAAC;AAGvC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAGzB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG3C,IAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,EAAG;AACtC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,KAAA,CAAM,kBAAA,CAAmB,GAAG,CAAC,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,aACH,YAAA,EACsB;AACtB,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,IAAI,CAAC,YAAA,EAAc,OAAO,EAAC;AAE3B,IAAA,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAA,MAAA,KAAU;AACtC,MAAA,MAAM,CAAC,MAAM,GAAG,IAAI,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC3B,MAAA,IAAI,QAAQ,KAAA,EAAO;AACf,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,iBACH,OAAA,EAIF;AACE,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,kBAAkB,CAAA;AACzE,QAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA,IAAQ,IAAI,CAAA;AAC5C,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,mCAAmC,CAAA;AAC1F,QAAA,UAAA,GAAa,gBAAA,CAAgB,mBAAA,CAAoB,OAAA,CAAQ,IAAI,CAAA;AAC7D,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,qBAAqB,CAAA;AAC5E,QAAA,MAAM,eAAA,GAAkB,iBAAgB,kBAAA,CAAmB,MAAA,CAAO,OAAO,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA;AAE9G,QAAA,UAAA,GAAa;AAAA,UACT,GAAG,eAAA,CAAgB,MAAA;AAAA,UACnB,QAAQ,eAAA,CAAgB;AAAA,SAC5B;AACA,QAAA,QAAA,GAAW,WAAA;AACX,QAAA;AAAA,MACJ,MAAK,CAAC,CAAC,OAAA,CAAQ,eAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,OAAO,CAAA;AAC9D,QAAA,UAAA,GAAa,OAAA,CAAQ,IAAA;AACrB,QAAA,QAAA,GAAW,MAAA;AACX,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC1C,QAAA,QAAA,GAAW,KAAA;AACX,QAAA;AAAA;AAIR,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAIH,IAAA,EACiC;AACjC,IAAA,MAAM,SAA4C,EAAC;AAEnD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,MAAM,CAAC,GAAA,EAAK,KAAA,GAAQ,EAAE,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,MAAA,MAAM,aAAa,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC7D,MAAA,MAAM,eAAe,kBAAA,CAAmB,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAGjE,MAAA,IAAI,cAAc,MAAA,EAAQ;AACtB,QAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAAA,QAC9B,CAAA,MAAO;AACH,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,YAAY,CAAA;AAAA,QAChD;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAA,CAAO,UAAU,CAAA,GAAI,YAAA;AAAA,MACzB;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,kBAAA,CAIH,MAAA,EAIA,WAAA,EAIF;AAEE,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,KAAA,CAAM,eAAe,CAAA;AACvD,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,MAAM,IAAI,cAAA;AAAA,QACN,cAAA,CAAe,uBAAA;AAAA,QACf;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,GAAO,aAAA,CAAc,CAAC,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,EAAS;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAQ,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAK,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAEzF,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,QAAgC,EAAC;AAEvC,IAAA,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAClB,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AAChD,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,MAAA,EAAW;AAEvC,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,oBAAoB,CAAA;AACxD,MAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AAEjE,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,SAAA,GAAY,UAAU,CAAC,CAAA;AAC7B,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAEhD,QAAA,IAAI,aAAA,EAAe;AAEf,UAAA,MAAM,IAAA,GAA6B;AAAA,YAC/B,SAAA;AAAA,YACA,QAAA,EAAU,cAAc,CAAC,CAAA;AAAA,YACzB,QAAA,EAAU,QAAA;AAAA,YACV,QAAA,EAAU,gBAAA,GAAmB,CAAC,CAAA,IAAK,0BAAA;AAAA,YACnC,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAAA,YACpC,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,QAAQ;AAAA,WAC9C;AACA,UAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QACnB,CAAA,MAAO;AAEH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,YAAA;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EAC3B;AAEJ;;;ACjRO,IAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA,EAKjC,wBAAA,EAA0B,GAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,8BAAA,EAAgC,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5C,iCAAA,EAAmC,MAAA;AAAA;AAAA;AAAA;AAAA,EAKnC,8BAAA,EAAgC,IAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,4BAAA,EAA8B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,2BAAA,EAA6B,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,oCAAA,EAAsC;AAE1C;AAGO,IAAM,0BAAA,GAA6B,MAAA,CAAO,IAAA,CAAK,qBAAqB;AC1C3E,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAkCO,IAAM,SAAA,GAAN,cAKK,QAAA,CAGN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiIF,WAAA,CAAY,QAAwB,OAAA,EAA6B;AAC7D,IAAA,KAAA,CAAM,MAAM,CAAA;AArHhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,UAAA,uBAAsE,GAAA,EAAI;AAsHhF,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,WAAA,EAAa,KAAK,IAAA,GAAO,IAAA;AAAA;AAAA,MACzB,OAAA,EAAS,GAAA;AAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,YAAA,EAAc,IAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,iBAAA,EAAmB,KAAA;AAAA,MACnB,gBAAA,EAAkB,KAAA;AAAA,MAClB,GAAI,WAAW;AAAC,KACpB;AAAA,EACJ;AAAA,EA5IA,WAAW,OAAA,GAAkB;AACzB,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiJA,QAAQ,SAAA,EAAiC;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM;AAAA,MACnB,OAAA,EAAU,KAAK,WAAA,CAAiC,OAAA;AAAA,MAChD,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,MAAA,EAAS,KAAK,WAAA,CAAiC,MAAA;AAAA,MAC/C,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,IAAI,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,OAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,MAAA,GAAsB;AAEtB,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,IAAA,CAAK,GAAG,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAAA,EAA6C,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAA;AAEpF,IAAA,OAAO,eAAA,CAAgB,aAAA;AAAA,MAAc,IAAA,CAAK,GAAA;AAAA,MACtC,IAAA,CAAK,kBAAkB,IAAA,IAAQ;AAAA,KAEnC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,KAAA,GAAoB;AACpB,IAAA,OAAO,eAAA,CAAgB,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAAkC;AAClC,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,MAAA,IAAA,CAAK,WAAW,eAAA,CAAgB,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,GAAA,GAAc;AACd,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,MAAA,GAAoC;AACpC,IAAA,OAAQ,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAAE,aAAY,IAAmC,SAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,OAAA,GAA+B;AAC/B,IAAA,OAAO,KAAK,QAAA,CAAS,OAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAA,GAA8B;AAC9B,IAAA,MAAM,MAAA,GAASC,gBAAAA,CAAiB,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,GAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AACvE,IAAA,OAAO,MAAA,GAAS,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,KAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,UAAU,EAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,SAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,YAAY,CAAA,IAAK,EAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,aAAA,GAAwB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,gBAAgB,CAAA,GAAI,QAAA,CAAS,KAAK,OAAA,CAAQ,gBAAgB,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU,WAAA,IAAe,KAAK,QAAA,CAAS,MAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAAoB;AACpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,EAAY,WAAA,EAAY,IAAK,EAAA;AACpD,IAAA,OAAO,mCAAA,CAAoC,KAAK,SAAS,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,cAAA,IAAkB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAkC;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA,IAAK,MAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAmBA,IAAA,CACI,aACA,OAAA,EACqB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ,SAAA,EAAqD;AACzD,IAAA,OAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,cAAc,SAAS,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAA,EAA2C;AAChD,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,SAAA,KAAc,SAAS,KAAK,EAAC;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAoB;AAChB,IAAA,OAAO,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAA,EAA4B;AAChC,IAAA,OAAO,KAAK,MAAA,EAAQ,IAAA,CAAK,UAAQ,IAAA,CAAK,SAAA,KAAc,SAAS,CAAA,IAAK,KAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA2B;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,CAAC,KAAA,EAAO,SAAS,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA,IAAK,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAkC;AACxC,IAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU,IAAA,EAAuB;AAC7B,IAAA,OAAO,QAAQ,IAAA,CAAK,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ,WAAA,EAA8B;AAClC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,EAAA;AAC5C,IAAA,OAAO,aAAa,QAAA,CAAS,WAAW,CAAA,IAAK,YAAA,CAAa,SAAS,KAAK,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAIA,cAAA,GAAyB;AACrB,IAAA,MAAM,UAAA,GAAa;AAAA,MACf,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,GAAA;AAAA,MACL,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI;AAAA,KAC5B;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,SAAS,QAAQ,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,EAAA,CAAG,OAA8B,QAAA,EAA8B;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,OAA8B,QAAA,EAA8B;AAC5D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAA,EAA8B;AAC/B,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAM,QAAA,KAAY;AAClD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,KAAA,EAA4B;AACjC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,EAC5B;AAAA,EAGA,YAAA,GAAqB;AACjB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAIxB,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAExC,MAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACxC,QAAA,MAAM,QAAQ,MAAM;AAChB,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,EAAQ;AAAA,QACZ,CAAA;AACA,QAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC5B,UAAA,OAAA,EAAQ;AACR,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACd,CAAA;AAEA,QAAA,MAAM,UAAU,MAAM;AAClB,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAChC,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAC9B,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAAA,QACtC,CAAA;AAEA,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,KAAK,CAAA;AAC7B,QAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,MAAM,KAAK,SAAA,EAAU;AAAA,IAEzB,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,iDAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QAC1C,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACL;AAAA,EAGA,MAAM,QAAA,GAA0B;AAC5B,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,4BAAA,EAA+B,KAAA,YAAiBD,OAAAA,GAAU,KAAA,CAAM,UAAU,kBAAkB,CAAA,CAAA;AAAA,QACzG,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,GAAwB;AAC1B,IAAA,MAAM,cAAcE,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG,QAAQF,OAAO,CAAA;AAE1D,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,WAAW,CAAA;AACjC,MAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAEjC,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAEtB,MAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,GAAA,EAAwC;AAC/C,IAAA,OAAA,CAAQ,IAAI,4BAAA,EAA8B,IAAA,CAAK,QAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,OAAO,CAAA;AAE7E,IAAA,IAAI,GAAA;AACA,MAAAE,SAAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,SAAS,GAAG,CAAA;AAErB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAErB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAEzC,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAgB,WAAW,IAAA,EAA6B;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAI,iBAAA,CAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ;AAAA,MACtB,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,WAAA,CAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,KAAK;AAAA,KACpB,CAAA,CACA,OAAA,CAAQA,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AAE9B,IAAA,IAAI;AAEA,MAAA,KAAA,CAAM,OAAA,CAAQA,SAAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA;AAEnC,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,KAAK,CAAA;AAE/C,MAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,IAElB,SAAS,KAAA,EAAO;AAEZ,MAAA,KAAA,CAAM,OAAA,EAAQ;AAEd,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,0BAAA,EAA6B,KAAA,YAAiBF,OAAAA,GAAU,KAAA,CAAM,UAAU,uCAAuC,CAAA,CAAA;AAAA,QAC5H,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAgB,WAAA,GAA6B;AACzC,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,sBAAA,EAAyB,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,qBAAqB,CAAA,CAAA;AAAA,QACtG,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,SAAA,GAA2B;AACvC,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,IAE3C,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,0BAAA,EAA6B,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,4BAA4B,CAAA,CAAA;AAAA,QACjH,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,aAAA,GAA+B;AAC3C,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,SAAS,CAAA;AAE3C,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,0EAAA,EAA6E,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAA;AAAA,OAClH,CAAA;AAAA,IAEL,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,WAAA,GAAc,KAAA,YAAiB,iBAAA,GAC/B,KAAA,GACA,IAAI,iBAAA,CAAkB;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,uBAAA,EAA0B,KAAA,YAAiBA,OAAAA,GAAU,KAAA,CAAM,UAAU,oBAAoB,CAAA,CAAA;AAAA,QACtG,aAAA,EAAe;AAAA,OAClB,CAAA;AAEL,MAAA,MAAM,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,EAAA,GAAA,iBAAA,CAAkB,MAAM,CAAA,CACP,MAAA,EACkB,YACnC,IAAA,EACU;AAEb,IAAA,OAAA,CAAQ,eAAA,EAAgB;AAExB,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,EAAQ,IAAI,0BAA0B,CAAA,IACjD,sBAAsB,wBAAwB,CAAA;AAErD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,EAAA,EAAI,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG,EAAE,cAAA,EAAgB,IAAA,EAAM,CAAA;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,EAAA,GAAA,iBAAA,CAAkB,MAAM,CAAA,CACW,OAAA,EACT,UAC1B,IAAA,EACU;AAEb,IAAA,IAAI,QAAQ,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,SAAS,WAAA,EAAc;AAC5D,MAAA,MAAM,IAAI,cAAA;AAAA,QACN,cAAA,CAAe,uBAAA;AAAA,QACf,CAAA,oCAAA,EAAuC,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,OAAA;AAAA,OACpE;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA;AACT,MAAA,OAAA,CAAQ,IAAA,GAAO,EAAA;AAEnB,IAAA,OAAA,CAAQ,IAAA,IAAQ,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,SAAS,QAA0B,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,EAAA,GAAA,iBAAA,CAAkB,SAAS,CAAA,CACQ,YACnC,IAAA,EACU;AACb,IAAA,OAAA,CAAQ,cAAA,EAAe;AAEvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAErB,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAA,GAAA,iBAAA,CAAkB,OAAO,CAAA,CACU,YACnC,IAAA,EACU;AAEb,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,EAAA,GAAA,iBAAA,CAAkB,OAAO,CAAA,CACT,KAAA,EACmB,YACnC,IAAA,EACU;AACb,IAAA,OAAA,CAAQ,cAAA,EAAe;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,EAAA,GAAA,iBAAA,CAAkB,KAAK,CAAA,CACN,MAAA,EACkB,YACnC,IAAA,EACU;AAEb,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,eAAA,CAAgB,iBAAiB,OAAO,CAAA;AAE/D,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAA,GAAA,iBAAA,CAAkB,UAAU,CAAA,CACO,YACnC,IAAA,EACU;AAEb,IAAA,IAAI,CAAC,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAmB;AAC5G,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa;AAAA,OAChB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAA+B;AAC3B,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,UAAA,EAAY,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,MACnC,aAAA,EAAe,KAAK,gBAAA;AAAiB,KACzC;AAAA,EACJ;AACJ;AAvJW,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,EAAO;AAAA,EAOb,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAppB/B,SAAA,CAkpBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAuBA,eAAA,CAAA;AAAA,EARN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAOI,4BAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,4BAAS,iBAAiB,CAAA;AAAA,CAAA,EA3qBtB,SAAA,CAyqBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AA+BA,eAAA,CAAA;AAAA,EAXN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAUI,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAzsB/B,SAAA,CAwsBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAKI,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EA1tB/B,SAAA,CAytBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAeA,eAAA,CAAA;AAAA,EANN,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAKI,4BAASA,OAAO,CAAA,CAAA;AAAA,EAChB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EA1uB/B,SAAA,CAwuBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAcA,eAAA,CAAA;AAAA,EAJN,UAAU,MAAA,EAAO;AAAA,EAKb,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAxvB/B,SAAA,CAsvBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;AAkBA,eAAA,CAAA;AAAA,EAJN,UAAU,MAAA,EAAO;AAAA,EAKb,4BAAS,0BAA0B,CAAA;AAAA,CAAA,EAzwB/B,SAAA,CAwwBF,SAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;;AC/tBJ,IAAK,eAAA,qBAAAG,gBAAAA,KAAL;AACH,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,iBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AALA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;;;ACzEL,IAAM,kBAAA,GAAqB;AAAA;AAAA;AAAA;AAAA,EAI9B,OAAA,EAAS,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIT,OAAA,EAAS,qBAAA;AAAA;AAAA;AAAA;AAAA,EAIT,QAAA,EAAU,sBAAA;AAAA;AAAA;AAAA;AAAA,EAIV,MAAA,EAAQ,oBAAA;AAAA;AAAA;AAAA;AAAA,EAIR,UAAA,EAAY;AAChB;ACvBA,IAAAC,KAAAC,GAAAA,EAAAC,GAAAA;AA4CO,IAAM,UAAA,GAAN,cAA8CC,QAAAA,CAGnD;AAAA,EAkDE,WAAA,CAAY,QAAgC,OAAA,EAA8B;AACtE,IAAA,KAAA,CAAM,MAAM,CAAA;AARhB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAwE,GAAA,EAAI;AAIpF;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAwB,KAAA;AAK5B,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,oBAAA,EAAsB,IAAA;AAAA;AAAA,MACtB,aAAA,EAAe,IAAA;AAAA,MACf,kBAAA,EAAoB,IAAA;AAAA;AAAA,MACpB,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,IAAA;AAAA,MACZ,kBAAA,EAAoB,IAAA;AAAA,MACpB,OAAA,EAAS,OAAA;AAAA,MACT,kBAAA,EAAoB,kBAAA;AAAA,MACpB,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAI,WAAW;AAAC,KACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EA9DA,WAAW,SAAA,GAAoB;AAC3B,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAiEA,QAAQ,SAAA,EAAyC;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,KAAAA,CAAM;AAAA,MACnB,OAAA,EAASN,UAAU,IAAA,CAAK,IAAA;AAAA,MACxB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,MAAA,EAAS,KAAK,WAAA,CAAkC,MAAA;AAAA,MAChD,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,IAAI,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,EAA2B;AAC5C,IAAA,IAAA,CAAK,QAAA,uBAAe,GAAA,EAAmE;AAAA,EAG3F;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,KAAK,QAAA,CAAS,WAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,UAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,UAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,gBAAgB,CAAA,IAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,GAAsB;AAQxB,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QAC1C,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,OAAA,GAAwB;AAE1B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAGpB,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,aAAA,EAAe;AAC9B,QAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,MACtB;AAEA,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAOtB,MAAA,IAAA,CAAK,QAAA,CAAS,mBAAmB,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,GAAA,EAAwC;AAC/C,IAAA,IAAI,GAAA;AACA,MAAAA,SAAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,SAAS,GAAG,CAAA;AAErB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAE1C,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,IAAA,EAA2B;AAClC,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AAAA,IAE7C,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+CAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAa,OACT,UAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,mBAAA,EAAqB,SAAS,CAAA;AACtD,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAI,MAAA;AAEJ,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAE3B,UAAA,MAAA,GAAS,IAAI,QAAA,CAAS;AAAA,YAClB,IAAA,GAAO;AACH,cAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,gBAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,EAAM;AAC/B,gBAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,cAC9E,CAAA,MAAO;AACH,gBAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,cAClB;AAAA,YACJ;AAAA,WACH,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAA,MAAA,GAAS,UAAA;AAAA,QACb;AAEA,QAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,QAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACzB,UAAA,YAAA,IAAgB,KAAA,CAAM,MAAA;AAAA,QAC1B,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,OAAO,OAAO,CAAA;AAExB,QAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAEzB,QAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,CAAC,KAAA,KAAU;AACvC,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UAChB;AAAA,QACJ,CAAC,CAAA;AAAA,MAEL,CAAC,CAAA;AAAA,IACL,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+EAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,SACT,GAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AAEpB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAAA,IAEjD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiB,iBAAA,GAAoB,KAAA,GAAQ,IAAI,iBAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,mDAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,OAAA,GAAgB;AACnB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,QAAA,CAAS,UAAU,GAAA,EAAK;AAAA,MACzB,cAAA,EAAgB,mBAAA;AAAA,MAChB,eAAA,EAAiB,wBAAA;AAAA,MACjB,YAAA,EAAc,YAAA;AAAA,MACd,mBAAA,EAAqB;AAAA,KACxB,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAM,SAAS,CAAA;AAE7B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,MAAM;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,QAAA,CAAS,OAAe,IAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,QAAA,CAAS,WAAW,OAAO,KAAA;AAC1D,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAA,OAAA,EAAU,KAAK;AAAA,MAAA,EAAW,IAAA,CAAK,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAC;;AAAA,CAAM,CAAA;AAAA,IACzF,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIO,QAAA,GAAiB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,SAAS,SAAA,EAAW;AACnD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,YAAoB,OAAA,EAAoE;AACrG,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,IAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,SAAS,UAAA,GAAa,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,KAAa,KAAA,EAAyC;AACnE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,UAAU,GAAA,EAAqD;AAClE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAIO,aAAa,GAAA,EAAmB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,GAAG,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CACH,IAAA,EACA,KAAA,EACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,SAAS,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,WAAA,CAAY,MAAc,OAAA,EAA0C;AACvE,IAAA,MAAM,YAAA,GAAe;AAAA,MACjB,GAAG,OAAA;AAAA,MACH,OAAA,kBAAS,IAAI,IAAA,CAAK,CAAC,CAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,EAAM,EAAE,OAAO,EAAA,EAAI,OAAA,EAAS,cAAc,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,GAAA,CAAI,KAAa,IAAA,EAA2B;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,GAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAwC;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAsB;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,YAAA,GAA8B;AACpC,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QACnC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,uBAAA,EAA0B,KAAA,YAAiBF,OAAAA,GAAU,KAAA,CAAM,UAAU,iDAAiD,CAAA,CAAA;AAAA,QACnI,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAgB,WAAA,GAA6B;AACzC,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAAA,IAE9C,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,iBAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,sEAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,EAAA,CAAG,OAA+B,QAAA,EAA+B;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,OAA+B,QAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAA,EAA+B;AAChC,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAM,QAAA,KAAY;AAClD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACL;AAAA,EAWA,OAAOM,GAAAA,GAAA,kBAAA,CAAmB,MAAM,CAAA,CACU,YACnC,IAAA,EACL;AAEE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA,EAAW;AAE3D,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,6BAA6B,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAC5F,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAKvC,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAC9C,QAAA;AAAA,MAEJ,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,uBAAuB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACtF,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA,MAEJ;AACI,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA;AACR,EACJ;AAAA,EAKA,OAAOD,GAAAA,GAAA,kBAAA,CAAmB,UAAU,CAAA,CACM,YACnC,IAAA,EACL;AAEE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,YAAa,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,GAAa,GAAA,IAAO,KAAK,UAAA,GAAa,GAAA,CAAA;AAChE,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAEnB,IAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EACtB;AAAA,EAKA,OAAOD,MAAA,kBAAA,CAAmB,OAAO,EACA,KAAA,EACS,OAAA,EACjB,YAClB,IAAA,EACL;AAEE,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,IAAU,GAAA;AACnC,IAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAa,MAAM,WAAA,IAAe;AAAA;AACtC,KACJ;AAEA,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,yBAAA,GAAkC;AAExC,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,wBAAA,EAA0B,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,iBAAA,EAAmB,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,kBAAA,EAAoB,eAAe,CAAA;AAG3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,cAAA,EAAgB,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAIU,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAiB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAE9D,IAAA,MAAM,gBAA0B,EAAC;AAEjC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,CAAC,EAAE,KAAA,EAAO,OAAA,IAAW,IAAA,KAAS;AAChD,MAAA,IAAI,eAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAC9D,QAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,YAAA,IAAgB,CAAA,OAAA,EAAU,QAAQ,IAAI,CAAA,CAAA;AACxD,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,UAAA,EAAa,QAAQ,MAAM,CAAA,CAAA;AAC/D,QAAA,IAAI,QAAQ,OAAA,EAAS,YAAA,IAAgB,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,CAAA;AAC/E,QAAA,IAAI,OAAA,CAAQ,UAAU,YAAA,IAAgB,YAAA;AACtC,QAAA,IAAI,OAAA,CAAQ,QAAQ,YAAA,IAAgB,UAAA;AACpC,QAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,YAAA,IAAgB,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,MACxE;AAEA,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,YAAA,EAAc,aAAa,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAIU,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEzB,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,YAAA,CAAa,KAAK,QAAQ,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,YAAA,CAAa,KAAK,iBAAiB,CAAA;AAC1E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,YAAA,CAAa,KAAK,kBAAkB,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,YAAA,CAAa,KAAK,WAAW,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,MAAA,EAAW;AACzC,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,KAAY,MAAA,EAAW;AAC1C,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AACzB,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,YAAA,EAAc;AACjC,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,KAAK,aAAA,CAAc,YAAA,CAAa,aAAa,CAAA;AAAA,IAC1F;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,UAAA,GAA4B;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5E,MAAA,IAAI,iBAAiBG,QAAAA,EAAU;AAC3B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAO;AAAA,MAC5B,CAAA,MAAO;AACH,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,MACf;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,EAAG,EAAS,CAAA;AAEZ,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,MAAA,GAA+C;AAClD,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK,UAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,KAAK,UAAA,EAAW;AAAA,MACtB,aAAa,IAAA,CAAK;AAAA,KACtB;AAAA,EACJ;AACJ;AArMW,eAAA,CAAA;AAAA,EAHNE,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAzgB/B,UAAA,CAwgBF,WAAAJ,GAAAA,EAAA,CAAA,CAAA;AAuCA,eAAA,CAAA;AAAA,EAHNG,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAhjB/B,UAAA,CA+iBF,WAAAL,GAAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAHNI,UAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,iBAAiB,CAAA,CAAA;AAAA,EAC1B,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,eAAA,CAAA,CAAA,EAAAA,SAAS,SAAS,CAAA;AAAA,CAAA,EAnkBd,UAAA,CAgkBF,WAAAN,GAAAA,EAAA,CAAA,CAAA;ACzmBJ,IAAM,eAAA,GAAN,cAA8BJ,OAAAA,CAAQ;AAE7C;;;ACFO,IAAM,oBAAA,GAAuB;AAAA,EAChC,eAAA,EAAiB,+BAAA;AAAA,EACjB,SAAA,EAAW,yBAAA;AAAA,EACX,cAAA,EAAgB;AACpB;ACFO,IAAM,aAAA,GAAN,cAA4B,OAAA,CAAQ;AAAA,EAavC,WAAA,CACI,QACA,MAAA,EACF;AACE,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,MAAA,YAAkB,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,MAAA;AACtD,IAAA,IAAA,CAAK,SAAS,MAAA,IAAU,KAAA;AAAA,EAC5B;AAAA,EAGA,QAAA,GAAmB;AAGf,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,CAAA;AAAA,EAGvC;AAAA,EAEA,QAAA,GAAmB;AACf,IAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1F;AAAA,EAEA,mBAAA,CAAoB,cAAA,GAAgC,EAAC,EAAW;AAC5D,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,EAAI,cAAA,CAAe,SAC/B,CAAA,CAAA,EAAI,cAAA,CAAe,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAC5B,IACF,CAAA,GAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC9E;AACJ;ACpCO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAUzC,gBAAA,CACyB,OAAA,EACC,QAAA,EACgB,OAAA,EACxC;AAEE,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,sBAAA,EAAyB,SAAS,UAAU,CAAA,IAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,EACrJ;AAAA,EAOA,gBAAA,CACyB,OAAA,EACC,QAAA,EACgB,OAAA,EACnB,KAAA,EACrB;AACE,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,qBAAA,EAAwB,SAAS,UAAU,CAAA,IAAA,EAAO,OAAA,CAAQ,cAAA,IAAkB,KAAK,CAAA,EAAA,CAAI,CAAA;AAC9I,IAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,EACpB;AAAA,EA2BA,QACuB,KAAA,EACrB;AACE,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,QAAA,CAAU,CAAA;AAAA,EACnD;AAAA,EAKA,YACI,MAAA,EAQF;AACE,IAAA,MAAM,YAAY,OAAA,CAAQ,GAAA;AAE1B,IAAA,IAAA,CAAK,IAAA;AAAA,MAAK,MAAA;AAAA,MACN,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,OAAO,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAI,CAAA,CAAA;AAAA,MACvF,gBAAgB,SAAS,CAAA,CAAA;AAAA,MACzB,CAAA,mCAAA,EAAsC,OAAO,IAAI,CAAA,CAAA;AAAA,MACjD,CAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,4BAAA,CAAA;AAAA,MACA,CAAA,+BAAA;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MACI,MAAA,EAIF;AACE,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,SAAS,CAAA;AAAA,EACjE,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,QAAQ,CAAA,IAAA,EAAO,MAAA,CAAO,WAAW;AAAA,EAC7E,IAAI,MAAA,CAAO,IAAA,CAAK,WAAA,GAAc,CAAC,CAAC,CAAA,uCAAA,CAAyC,CAAA;AAAA,EACvE;AAEJ;AAnGI,eAAA,CAAA;AAAA,EAJCS,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,kBAAA,CAAmB,MAAA;AAAA,IACzB,KAAA,EAAO,CAAC,UAAU;AAAA,GACrB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA;AAAA,CAAA,EAb/B,cAAA,CAUT,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAcA,eAAA,CAAA;AAAA,EAJCD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,kBAAA,CAAmB,OAAA;AAAA,IACzB,KAAA,EAAO,CAAC,UAAU;AAAA,GACrB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,0BAA0B,CAAA,CAAA;AAAA,EACnC,eAAA,CAAA,CAAA,EAAAA,SAASV,OAAO,CAAA;AAAA,CAAA,EA5BZ,cAAA,CAwBT,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;AAmCA,eAAA,CAAA;AAAA,EAJCS,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,iBAAA,CAAkB,WAAA;AAAA,IACxB,KAAA,EAAO,CAAC,SAAS;AAAA,GACpB,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAASC,OAAO,CAAA;AAAA,CAAA,EA5DZ,cAAA,CA2DT,SAAA,EAAA,SAAA,EAAA,CAAA,CAAA;ACrEJ,IAAAP,GAAAA,EAAAC,GAAAA,EAAAC,GAAAA,EAAAM,GAAAA,EAAAC,GAAAA;AAwBO,IAAM,aAAA,GAAN,MAAM,aAAA,SAAqBC,SAAAA,CAAU;AAAA,EAKxC,WAAW,eAAA,GAAkB;AACzB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOL,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,eAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAEA,WAAW,SAAA,GAAY;AACnB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOA,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,SAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAEA,WAAW,cAAA,GAAiB;AACxB,IAAA,OAAO,CAAC,MAAA,EAAa,WAAA,EAAqB,UAAA,KAAmC;AACzE,MAAA,OAAOA,UAAU,MAAA,CAAO;AAAA,QACpB,MAAM,oBAAA,CAAqB,cAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,aAAY;AAAA,OACvB,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAAA,IACtC,CAAA;AAAA,EACJ;AAAA,EAKA,OAAiBI,GAAAA,GAAAE,iBAAAA,CAAkB,OAAO,CAAA,CAGhB,UAGF,MAAA,EAEP;AACb,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,YAAA,CAAa,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AAG7D,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,eAAe,CAAC,CAAA;AAAA,EACjD;AAAA,EAGA,OAAiBH,GAAAA,GAAAG,iBAAAA,CAAkB,YAAY,CAAA,CACvB,QACM,MAAA,EACb;AACb,IAAA,MAAA,CAAO,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAAA,MAChC,GAAA,EAAK;AAAA,QACD,IAAA,EAAM,KAAK,KAAA,CAAM;AAAA;AACrB,KACH,CAAA;AAAA,EACL;AAAA,EAEA,OAAiBA,iBAAAA,CAAkB,MAAM,CAAA,CAAA,GAAK,IAAA,EAA4B;AACtE,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,KAAA,GAAQ;AACJ,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM;AACpB,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,OAAO,IAAA,EAAc;AACjB,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,MAAM;AAC3B,QAAA,OAAA,EAAQ;AAAA,MACZ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAQA,OAAiBT,GAAAA,GAAA,oBAAA,CAAqB,eAAe,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA,EAGzE,OAAiBD,GAAAA,GAAA,oBAAA,CAAqB,SAAS,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA,EAGnE,OAAiBD,GAAAA,GAAA,oBAAA,CAAqB,cAAc,KAAK,IAAA,EAAa;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAOxE,MAAM,aAAA,CACF,OAAA,EACA,QAAA,EACF;AACE,IAAA,MAAM,QAAQ,IAAI,aAAA;AAAA,MACd,QAAQ,GAAA,IAAO,EAAA;AAAA,MACf,OAAA,CAAQ;AAAA,KACZ;AAEA,IAAA,MAAM,EAAA,GAAKH,iBAAiB,cAAA,EAAe;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAA;AAE/D,IAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AACxE,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAI,0BAAA,CAA2B,OAAA,EAAS,QAAQ,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,IAAIU,OAAAA,CAAQ;AAAA,MACtB,IAAA,EAAM,EAAA;AAAA,MACN,QAAA,EAAU,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,MACnB,SAAA,EAAW,CAAC,KAAA,EAAO,OAAO;AAAA,KAC7B,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAErB,IAAA,IAAI;AACA,MAAA,MAAM,sBAAA,GAAyB,IAAIF,SAAAA,CAAU;AAAA,QACzC,MAAM,oBAAA,CAAqB,eAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,gBAAA,GAAmB,IAAIA,SAAAA,CAAU;AAAA,QACnC,MAAM,oBAAA,CAAqB,SAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,qBAAA,GAAwB,IAAIA,SAAAA,CAAU;AAAA,QACxC,MAAM,oBAAA,CAAqB,cAAA;AAAA,QAC3B,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,IAAI,OAAA,CAAc,OAAO,OAAA,EAAS,MAAA,KAAW;AAE/C,QAAA,MAAM,UAAU,MAAM;AAClB,UAAA,sBAAA,CAAuB,SAAA,EAAU;AACjC,UAAA,gBAAA,CAAiB,SAAA,EAAU;AAC3B,UAAA,qBAAA,CAAsB,SAAA,EAAU;AAEhC,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA;AAC1C,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,OAAA,EAAS,OAAO,CAAA;AAC1C,UAAA,GAAA,CAAI,GAAA,CAAI,iBAAA,CAAkB,SAAA,EAAW,OAAO,CAAA;AAG5C,UAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQT,OAAO,CAAE,CAAA;AAAA,QAClC,CAAA;AAGA,QAAA,GAAA,CAAI,GAAG,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AACpD,QAAA,GAAA,CAAI,GAAG,iBAAA,CAAkB,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAEpD,QAAA,IAAI;AACA,UAAA,MAAM,IAAI,IAAA,EAAK;AACf,UAAA,MAAM,IAAI,IAAA,EAAK;AAGf,UAAA,MAAM,sBAAA,CAAuB,QAAQ,KAAK,CAAA;AAE1C,UAAA,MAAM,gBAAA,CAAiB,QAAQ,KAAK,CAAA;AAEpC,UAAA,MAAM,qBAAA,CAAsB,QAAQ,KAAK,CAAA;AAGzC,UAAA,GAAA,CAAI,YAAA,EAAa;AAIjB,UAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AAClB,YAAA,MAAM,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,UAC/B;AAEA,UAAA,OAAA,EAAQ;AAAA,QACZ,SAAS,KAAA,EAAO;AAEZ,UAAA,GAAA,CAAI,YAAA,EAAa;AACjB,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QAChB;AAAA,MACJ,CAAC,CAAA;AAAA,IAEL,SAAS,KAAA,EAAO;AAEZ,MAAA,IAAI,YAAA;AAEJ,MAAA,QAAQ,IAAA;AAAM,QACV,KAAK,KAAA,YAAiB,iBAAA;AAClB,UAAA,YAAA,GAAe,KAAA;AACf,UAAA;AAAA,QAEJ,MAAK,KAAA,YAAiBA,OAAAA,IAAW,KAAA,CAAM,aAAA,YAAyB,iBAAA;AAC5D,UAAA,YAAA,GAAe,KAAA,CAAM,aAAA;AACrB,UAAA;AAAA;AAAA;AAAA;AAAA,QAKJ,MAAK,iBAAiBA,OAAAA,IAClB,KAAA,CAAM,yBAAyB,KAAA,IAC/B,OAAQ,KAAA,CAAM,aAAA,CAAsB,UAAA,KAAe,QAAA;AACnD,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,MAAA,EAAS,MAAM,aAAA,CAAsB,UAAA;AAAA,YACrC,WAAA,EAAc,MAAM,aAAA,CAAwB,OAAA;AAAA,YAC5C,eAAe,KAAA,CAAM;AAAA,WACxB,CAAA;AACD,UAAA;AAAA;AAAA;AAAA;AAAA,QAKJ,MAAK,KAAA,YAAiB,KAAA,IAAS,OAAQ,MAAc,UAAA,KAAe,QAAA;AAChE,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,QAAS,KAAA,CAAc,UAAA;AAAA,YACvB,aAAa,KAAA,CAAM,OAAA;AAAA,YACnB,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QAEJ;AACI,UAAA,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,YACjC,MAAA,EAAQ,GAAA;AAAA,YACR,WAAA,EAAa,iDAAA;AAAA,YACb,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA;AAAA;AAIR,MAAA,KAAA,CAAM,SAAS,YAAY,CAAA;AAE3B,MAAA,MAAM,GAAA,CAAI,KAAK,YAAY,CAAA;AAE3B,MAAA,MAAM,IAAA,CAAK,IAAA,CAAKe,iBAAAA,CAAkB,OAAA,EAAS,KAAK,CAAA;AAAA,IACpD;AAEA,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClB;AAEJ,CAAA;AApNqB,eAAA,CAAA;AAAA,EADhBN,UAAU,MAAA,EAAO;AAAA,EAGb,gCAAa,QAAA,EAAS,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAC,SAAS,UAAU,CAAA,CAAA;AAAA,EAEnB,gCAAa,QAAA,EAAS,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAA,SAASM,QAAQ,CAAA;AAAA,CAAA,EAzCb,aAAA,CAmCQ,WAAAH,GAAAA,EAAA,CAAA,CAAA;AAmBA,eAAA,CAAA;AAAA,EADhBJ,UAAU,MAAA,EAAO;AAAA,EAEb,eAAA,CAAA,CAAA,EAAAC,SAASM,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAN,SAAS,cAAc,CAAA;AAAA,CAAA,EAxDnB,aAAA,CAsDQ,WAAAE,GAAAA,EAAA,CAAA,CAAA;AAsCA,eAAA,CAAA;AAAA,EADhBH,UAAU,MAAA;AAAO,CAAA,EA3FT,aAAA,CA4FQ,WAAAH,GAAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADhBG,UAAU,MAAA;AAAO,CAAA,EA9FT,aAAA,CA+FQ,WAAAJ,GAAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADhBI,UAAU,MAAA;AAAO,CAAA,EAjGT,aAAA,CAkGQ,WAAAL,GAAAA,EAAA,CAAA,CAAA;AAlGd,IAAM,YAAA,GAAN;ACnBA,IAAM,QAAA,GAAN,cAAuBa,UAAAA,CAAW;AAAA,EAMrC,YACI,MAAA,EAIF;AACE,IAAA,KAAA,CAAM,MAAM,CAAA;AARhB,IAAA,IAAA,CAAU,UAA2B,EAAC;AAUlC,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,IAAA;AAEjC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,MAAA,GAA0B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAEJ;AC9BO,IAAM,aAAA,GAAN,cAA4BjB,OAAAA,CAAkF;AAAA,EAA9G,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAEH,IAAA,IAAA,CAAA,MAAA,GAAiB,GAAA;AAAA,EAAA;AAAA,EAGP,gBAAgB,MAAA,EAAgD;AACtE,IAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAC5B,IAAA,IAAI,OAAO,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAAA,IACzB;AAAA,EACJ;AAAA,EAGA,MAAA,GAAiD;AAC7C,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK;AAAA,KACjB;AAAA,EACJ;AACJ;;;ACvBO,IAAM,wBAAA,GAA2B;AAAA,EACpC,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO;AACX;AAGO,IAAM,sBAAA,GAAyB;AAAA,EAClC,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK;AACT;;;ACjBO,IAAM,sBAAA,GAAyB;AAAA,EAClC,MAAA,EAAQ,4BAAA;AAAA,EACR,cAAA,EAAgB;AACpB;;;ACEO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAA6C;AAAA,EAGjF,IAAI,MAAA,GAA+B;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAAA,EAC5F;AAAA,EAGA,IAAI,WAAA,GAA0D;AAC1D,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AAAA,EACxJ;AAAA,EAGA,QAAA,CAAS,QAAgB,KAAA,EAAsC;AAC3D,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AACpK,IAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,MAAA,EAAQ,cAAc,CAAA;AAE3D,IAAA,MAAM,wBAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAC/G,IAAA,qBAAA,CAAsB,IAAA,CAAK,MAAM,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAA,EAAgB,qBAAqB,CAAA;AAAA,EAC9E;AAAA,EAGA,YAAY,KAAA,EAAsB;AAC9B,IAAA,MAAM,cAAA,GAAiB,KAAK,IAAA,CAAK,GAAA,CAAI,uBAAuB,MAAM,CAAA,wBAAuD,GAAA,EAA2C;AACpK,IAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACnC,MAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACvB,QAAA,cAAA,CAAe,OAAO,GAAG,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,MAAA,EAAQ,cAAc,CAAA;AAE3D,IAAA,MAAM,wBAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,sBAAA,CAAuB,cAAc,KAA6B,EAAC;AAC/G,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,qBAAA,CAAsB,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,sBAAA,CAAuB,cAAA,EAAgB,qBAAqB,CAAA;AAAA,EAC9E;AACJ;ACnCO,SAAS,8BAA8B,KAAA,EAAsB;AAChE,EAAA,OAAO,SACH,MAAA,EACA,WAAA,EACA,UAAA,EACF;AAEE,IAAA,MAAM,IAAA,GAA2BE,SAAAA,CAAU,IAAA,CAAyB,cAAc,CAAA;AAElF,IAAA,MAAM,YAAY,KAAA,CAAM,mBAAA,CAAoB,CAAC,gBAAA,EAAkB,WAAW,CAAC,CAAA;AAE3E,IAAA,IAAA,CAAK,SAAS,SAAA,EAAW;AAAA,MACrB,SAAA,EAAW,MAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACH,CAAA;AAED,IAAA,gBAAA,CAAiB;AAAA,MACb,MAAM,SAAA,CAAU,MAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACX,CAAA,CAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AAElC,IAAA,OAAO,gBAAA,CAAiB,SAAS,CAAA,CAAE,MAAA,EAAQ,aAAa,UAAU,CAAA;AAAA,EACtE,CAAA;AACJ;;;ACRO,IAAM,cAAA,GAAN,cAA6BgB,WAAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY5C,OAAO,KAAK,IAAA,EAAyG;AACjH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,IAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,IAAA,EAAyG;AAChH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,GAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,IAAA,EAAyG;AAChH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,GAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAO,IAAA,EAAyG;AACnH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,MAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAM,IAAA,EAAyG;AAClH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,KAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ,IAAA,EAAyG;AACpH,IAAA,OAAO,KAAK,WAAA,CAAY;AAAA,MACpB,QAAQ,wBAAA,CAAyB,OAAA;AAAA,MACjC,MAAM,OAAO,IAAA,KAAS,YAAY,MAAA,IAAU,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAAA,MAC/D,OAAA,EAAS,OAAO,IAAA,KAAS,QAAA,IAAY,aAAa,IAAA,IAAQ,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,MACxF,MAAA,EAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS;AAAA,KACvF,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAe,YACX,MAAA,EACF;AACE,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,IAAA,KAAS,YAAY,MAAA,CAAO,IAAA,YAAgB,SAClE,IAAI,aAAA;AAAA,MACF,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,EAAG,MAAA,CAAO,IAAA,YAAgB,MAAA,GAAS,MAAA,CAAO,KAAK,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,OAAO,IAAA,GAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAA;AAAA,MACxJ,MAAA,CAAO;AAAA,QACT,MAAA,CAAO,IAAA;AAEb,IAAA,OAAO,8BAA8B,KAAK,CAAA;AAAA,EAC9C;AAAA,EAQA,MAAgB,KACc,MAAA,EACb;AACb,IAAA,MAAM,IAAA,GAAOhB,SAAAA,CAAU,IAAA,CAAyB,IAAA,CAAK,WAAkB,CAAA;AAEvE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA,EAAQ;AAC3B,MAAA,MAAA,CAAO,QAAQ,QAAA,EAAU,CAAA,sBAAA,EAAyB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AACzE,MAAA;AAAA,IACJ;AAGA,IAAA,MAAA,CAAO,IAAA;AAAA,MAAK,MAAA;AAAA,MACR,CAAA,kBAAA,CAAA;AAAA,MACA,CAAA;AAAA,CAAA;AAAA,MACA,GAAG,OACE,GAAA,CAAI,CAAA,KAAA,KAAS,IAAI,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,CAAA,GAAI,MAAM,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE;AAAA,KAE3G;AAAA,EACJ;AAAA,EAaA,MAAM,aAAA,CACmB,OAAA,EACC,UACH,KAAA,EACC,MAAA,EACA,QACK,KAAA,EAC3B;AACE,IAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAE5B,MAAA;AAAA,IACJ;AAUA,IAAA,MAAM,OAAA,GAAU,IAAIO,SAAAA,CAAU,EAAE,IAAA,EAAM,MAAM,QAAA,EAAS,EAAG,SAAA,EAAW,IAAA,EAAO,CAAA;AAE1E,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA;AACT,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,iBAAA;AAAA,QACP,aAAa,CAAA,mBAAA,EAAsB,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,OACnE,CAAA;AAGL,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAEzB,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,UAAA,CAAW,UAAA,CAAW,MAAA;AAEtD,MAAA,IAAI,YAAA,CAAa,sBAAA,CAAuB,iBAAiB,CAAA,EAAG;AAExD,QAAA,MAAM,IAAA,GAA2BP,SAAAA,CAAU,IAAA,CAAyB,IAAA,CAAK,WAAkB,CAAA;AAE3F,QAAA,MAAM,mBAAmB,IAAA,CAAK,WAAA;AAE9B,QAAA,MAAM,kBAAkB,gBAAA,EAAkB,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,EAAE,CAAA;AAKzE,QAAA,IAAI,eAAA,EAAiB;AACjB,UAAA,OAAA,CAAQ,QAAA,CAAS,gBAAgB,KAAK,CAAA;AAAA,QAC1C;AAAA,MACJ;AAEA,MAAA,MAAM,UAAA,GAAa,IAAIS,OAAAA,CAAQ;AAAA,QAC3B,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,EAAE,CAAA,EAAA,EAAK,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,OAC1D,EAAG;AAAA,QACC,MAAA,EAAQ;AAAA,OACX,CAAA;AAGD,MAAA,MAAM,KAAA,CAAM,QAAQ,UAAU,CAAA;AAAA,IAClC;AAAA,EAEJ;AACJ;AA/FoB,eAAA,CAAA;AAAA,EADf,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAD,SAAS,cAAc,CAAA;AAAA,CAAA,EA7HnB,cAAA,CA4HO,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAiCV,eAAA,CAAA;AAAA,EAHLD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,oBAAA,CAAqB;AAAA,GAC9B,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASC,OAAO,CAAA,CAAA;AAAA,EAChB,eAAA,CAAA,CAAA,EAAAD,SAASM,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAN,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,aAAa,CAAA;AAAA,CAAA,EAnKlB,cAAA,CA6JH,SAAA,EAAA,eAAA,EAAA,CAAA,CAAA;AA7JG,cAAA,GAAN,eAAA,CAAA;AAAA,EADN,MAAA,CAAO,OAAO,kBAAkB;AAAA,CAAA,EACpB,cAAA,CAAA;;;ACpBN,IAAM,kBAAA,GAAN,cAAiCQ,WAAAA,CAAY;AAAA,EAQhD,MAAM,gBAAA,CACmB,OAAA,EAIC,QAAA,EACH,KAAA,EACrB;AAEE,IAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,SAAS,CAAA;AACnC,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,WAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,WAAA;AAAA,OACtD,CAAA;AAEL,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,aAAa,OAAO,OAAA,CAAQ,OAAO,SAAA,KAAc,QAAA;AACjE,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa;AAAA,OAChB,CAAA;AAEL,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,SAAS,CAAA;AAEhE,IAAA,IACI,CAAC,iBAAA,IAED,CAAC,CAACA,WAAAA,EAAa,WAAW,CAAA,CACrB,IAAA,CAAK,CAAA,CAAA,KAAK,iBAAA,YAA6B,CAAC,CAAA;AAE7C,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,0BAAA;AAAA,OAC5C,CAAA;AAEL,IAAA,MAAM,SAAA,GAAY,iBAAA;AAElB,IAAA,MAAM,IAAA,GAAOhB,SAAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAErC,IAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA,EAAS,CAAE,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,CAAA,EAAG,SAAA,CAAU,YAAY,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAEtH,IAAA,IAAI,CAAC,aAAA;AACD,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,cAAc,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,0BAAA,EAA6B,OAAA,CAAQ,OAAO,SAAS,CAAA,CAAA;AAAA,OAC3G,CAAA;AAEL,IAAA,MAAM,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,WAAW,KAAK,CAAA;AAAA,EACxD;AACJ;AAhDU,eAAA,CAAA;AAAA,EALL,eAAe,IAAA,CAAK;AAAA,IACjB,IAAA,EAAM,wBAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAQ,SAAS,SAAS,CAAA,CAAA;AAAA,EAIlB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASC,OAAO,CAAA;AAAA,CAAA,EAdZ,kBAAA,CAQH,SAAA,EAAA,kBAAA,EAAA,CAAA,CAAA;ACRH,IAAM,4BAAA,GAAN,cAA2CM,UAAAA,CAA6D;AAAA,EAM3G,YAAY,IAAA,EAAwD;AAChE,IAAA,KAAA,EAAM;AALV,IAAA,IAAA,CAAU,MAAA,GAAiB,CAAA;AAC3B,IAAA,IAAA,CAAU,KAAA,GAAgB,CAAA;AAC1B,IAAA,IAAA,CAAU,SAAA,GAAoB,EAAA;AAI1B,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA;AACjD,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEA,IAAI,KAAA,GAAgB;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAAQ;AAAA,EAC1C,IAAI,IAAA,GAAe;AAAE,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAAO;AAAA,EACxC,IAAI,QAAA,GAAmB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAAW;AAAA,EAEhD,OAAO,IAAA,EAA6D;AAChE,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA;AACjD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA;AAAA,EAC3D;AAAA,EAEA,SAAS,UAAA,EAAoE;AACzE,IAAA,IAAA,CAAK,SAAS,UAAA,CAAW,KAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,IAAA;AACxB,IAAA,IAAA,CAAK,YAAY,UAAA,CAAW,QAAA;AAAA,EAChC;AAAA,EAEA,MAAA,GAA2D;AACvD,IAAA,OAAO;AAAA,MACH,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,IAAA,CAAK,MAAA;AAAA,MACZ,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,UAAU,IAAA,CAAK;AAAA,KACnB;AAAA,EACJ;AACJ;AC5CO,IAAM,4BAAA,GAAN,cAA2CA,UAAAA,CAAyC;AAAA,EAKvF,IAAI,KAAA,EAAqB;AACrB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AAAA,EAChB;AAAA,EAEA,UAAA,GAAmB;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AAAA,EAChB;AAAA,EAEA,OAAA,GAAmB;AACf,IAAA,IAAI,KAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,IAAA,KAAS,QAAW,OAAO,KAAA;AACrE,IAAA,OAAQ,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,aAAc,IAAA,CAAK,IAAA;AAAA,EACjD;AAAA,EAEA,MAAA,GAAuC;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK;AAAA,EAC7B;AACJ;;;ACAO,IAAM,kBAAA,GAAN,cAEGV,QAAAA,CAGR;AAAA,EALK,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAkBH;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAU,SAA4B,EAAC;AAAA,EAAA;AAAA,EAXvC,WAAW,KAAA,GAAgB;AACvB,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,IAAI,QAAA,GAAoB;AACpB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,MAAA,IAAA,CAAK,YAAYL,SAAAA,CAAU,QAAA;AAAA,QACvB,IAAA;AAAA,QACA,IAAIS,QAAQ,EAAE,IAAA,EAAM,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,MAAA,CAAA,EAAU;AAAA,OAClD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,IAAI,iBAAA,GAA6D;AAC7D,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EAChB;AAAA,EAEA,IAAI,KAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,UAAA,GAA2C;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,4BAA4B,CAAA;AAAA,EACrE;AAAA,EAEA,IAAY,UAAA,GAA2C;AACnD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,4BAA4B,CAAA;AAAA,EACrE;AAAA;AAAA,EAGA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACvB;AAAA;AAAA,EAKA,QAAQ,SAAA,EAAsE;AAC1E,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,aAAA,CAAc;AAAA,MAC5B,OAAA,EAAST,UAAU,IAAA,CAAK,IAAA;AAAA,MACxB,MAAA,EAAQ,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO;AAAA,KACxC,CAAA;AAED,IAAA,IAAA,CAAK,qBAAqB,SAAA,CAAU,MAAA;AAGpC,IAAA,IAAA,CAAK,SAAS,QAAA,CAAS,IAAI,4BAAA,CAA6B,SAAA,CAAU,UAAU,CAAC,CAAA;AAC7E,IAAA,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,IAAI,4BAAA,EAA8B,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,CACI,OACA,UAAA,EACF;AAEE,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,IAAA,KAAQ;AACxB,MAAA,IAAI;AAAE,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAqB;AAAA,IACvE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ;AAC5B,MAAA,MAAM,SAAS,IAAA,YAAgBK,QAAAA,GACzB,OACA,IAAI,IAAA,CAAK,mBAAmB,IAAW,CAAA;AAC7C,MAAA,IAAA,CAAK,QAAA,CAAS,SAAS,MAAM,CAAA;AAC7B,MAAA,OAAO,MAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,IACrC;AAAA,EACJ;AAAA;AAAA;AAAA,EAMA,GAAG,KAAA,EAAuC;AACtC,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAA,CAAQ,OAAe,IAAA,EAA2D;AAC9E,IAAA,MAAM,OAAO,IAAA,YAAgBA,QAAAA,GACvB,OACA,IAAI,IAAA,CAAK,mBAAmB,IAAW,CAAA;AAC7C,IAAA,IAAI;AAAE,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAW;AACvE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,KAAK,IAAA,EAA2D;AAC5D,IAAA,MAAM,OAAO,IAAA,YAAgBA,QAAAA,GACvB,OACA,IAAI,IAAA,CAAK,mBAAmB,IAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,QAAQ,IAAA,EAA2D;AAC/D,IAAA,MAAM,OAAO,IAAA,YAAgBA,QAAAA,GACvB,OACA,IAAI,IAAA,CAAK,mBAAmB,IAAW,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,OAAO,KAAA,EAAqB;AACxB,IAAA,MAAM,CAAC,OAAO,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAC7C,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,IAAI;AAAE,QAAA,IAAA,CAAK,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAW;AAAA,IAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,KAAK,SAAA,EAAiF;AAClF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,OAAO,SAAA,EAAuE;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,KAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,QAAA,GAAoB;AAChB,IAAA,OAAO,IAAA,CAAK,WAAW,OAAA,EAAQ;AAAA,EACnC;AAAA;AAAA,EAGA,eAAA,GAAwB;AACpB,IAAA,IAAA,CAAK,WAAW,UAAA,EAAW;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAKA,MAAA,GAA6D;AACzD,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,KAAa,IAAA,CAAK,UAAA;AACvC,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,MACtC,IAAA,EAAO,IAAA,CAAK,kBAAA,CAA2B,MAAA,IAAU,SAAA;AAAA,MACjD,UAAA,EAAY,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA;AAAS,KACxC;AAAA,EACJ;AACJ;;;ACnNO,IAAK,iCAAA,qBAAAa,kCAAAA,KAAL;AACH,EAAAA,mCAAA,MAAA,CAAA,GAAO,MAAA;AADC,EAAA,OAAAA,kCAAAA;AAAA,CAAA,EAAA,iCAAA,IAAA,EAAA;ACXL,IAAM,uBAAA,GAAN,cAAqEH,UAAAA,CAAW;AAAA,EAInF,YACc,MAAA,GAAiE,EAAC,EAClE,QAAA,GAA0D,EAAC,EACvE;AACE,IAAA,KAAA,EAAM;AAHI,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGV,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA;AAAA,EACnD;AAAA,EAGA,IAAI,KAAA,GAAQ;AACR,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA,EAGA,GAAA,CAAI,QAAA,EAAgC,YAAA,GAAuB,EAAA,EAAI;AAC3D,IAAA,OAAO,KAAK,WAAA,CAAY,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,YAAA;AAAA,EACpE;AAAA,EAEU,gBAAA,CAAiB,KAAA,GAAgE,EAAC,EAAyC;AACjI,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,MAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AAC1C,QAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACjC,QAAA,GAAA,CAAI,mBAAmB,GAAG,CAAC,CAAA,GAAI,kBAAA,CAAmB,OAAO,EAAE,CAAA;AAC3D,QAAA,OAAO,GAAA;AAAA,MACX,CAAA,EAAG,EAAE,CAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;ACpCO,IAAM,uCAAA,GAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,qBAAA,EAAuB,uBAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,yBAAA,EAA2B;AAC/B;ACtBO,IAAM,kBAAA,GAAN,cAAiCC,WAAAA,CAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYpD;;;ACdO,IAAM,qBAAA,GAAsE;AAAA,EAC/E,IAAA,EAAM,GAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,IAAA,EAAM,EAAA;AAAA,EACN,MAAA,EAAQ,KAAA;AAAA,EACR,SAAS,EAAC;AAAA,EACV,QAAA,EAAU;AACd;;;ACFO,IAAM,aAAA,GAAN,cAA4BD,UAAAA,CAAW;AAAA,EAI1C,WAAA,CAII,OAAA,GAAkD,EAAC,EACrD;AACE,IAAA,KAAA,EAAM;AAEN,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AAE5D,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAO,WAAW,QAAA,GAAW,MAAA,GAAS,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAErF,MAAA,MAAM,OACF,SAAA,CAAU,IAAA,KACT,SAAA,CAAU,QAAA,KAAa,WAAW,KAAA,GAAQ,IAAA,CAAA;AAG/C,MAAA,MAAM,QAAA,GAAW;AAAA,QACb,GAAG,qBAAA;AAAA,QACH,GAAI,OAAO,MAAA,KAAW,QAAA,GAAW;AAAA,UAC7B,IAAA;AAAA,UACA,IAAA,EAAM,SAAS,IAAI,CAAA;AAAA,UACnB,UAAU,SAAA,CAAU,QAAA;AAAA,UACpB,UAAU,SAAA,CAAU;AAAA,SACxB,GAAI;AAAA,OACR;AAEA,MAAA,OAAO;AAAA,QACH,OAAO,IAAI,aAAA,CAAc,QAAA,CAAS,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QACvD,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,UAAU,QAAA,CAAS;AAAA,OACvB;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAA,GAA+C;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,IAAA,EAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,QAAA,EAAS,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAA,EAAwD;AAG3D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,QAAA,EAAS,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACxE;AACJ;ACpEO,IAAM,aAAA,GAAN,cAA4BC,WAAAA,CAAY;AAAA,EAI3C,MAAM,IAAA,CACkB,MAAA,EACK,MAAA,EAC3B;AACE,IAAA,MAAA,CAAO,IAAA;AAAA,MACH,OAAA;AAAA,MACA,CAAA,wBAAA,CAAA;AAAA,MACA,GAAG,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAA,CAAM,QAAA,EAAU,CAAA,IAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,KAChG;AAAA,EACJ;AAAA,EAQA,MAAM,SAAA,CACmB,GAAA,EACC,KACG,WAAA,EACL,MAAA,EACE,UACD,OAAA,EACvB;AACE,IAAA,OAAO,IAAI,OAAA,CAAc,OAAO,OAAA,EAAS,MAAA,KAAW;AAChD,MAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,GAAA;AAExB,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAElD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAO,OAAA,EAAQ;AAAA,MACnB;AAEA,MAAA,MAAA,CAAO,GAAA;AAAA,QACH,QAAA;AAAA,QACA,oBAAoB,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,IAAA,EAAO,OAAO,QAAQ,CAAA,CAAA;AAAA,QACvD;AAAA,OACJ;AAEA,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO,QAAA,KAAa,WACpC,QAAA,CAAS,KAAA,EAAM,GACf,QAAA,CAAS,IAAA,EAAK,CAAA;AAEpB,MAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AAAA,QACpB;AAAA,UACI,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA;AAAA,UACrB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,KAAA,CAAM;AAAA,SAChB;AAAA,QACA,CAAC,QAAA,KAAa;AACV,UAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AAClB,YAAA,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,UAAA,IAAc,GAAA,EAAK,SAAS,OAAO,CAAA;AAAA,UAC9D;AACA,UAAA,QAAA,CAAS,EAAA,CAAG,OAAO,MAAM;AAErB,YAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAA,iBAAA,EAAoB,MAAA,EAAQ,QAAQ,CAAA,UAAA,CAAY,CAAA;AAEpE,YAAA,OAAA,EAAQ;AAAA,UACZ,CAAC,CAAA;AAED,UAAA,QAAA,CAAS,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,QAC9B;AAAA,OACJ;AAEA,MAAA,QAAA,CAAS,GAAG,OAAA,EAAS,CAAC,GAAA,KAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAEzC,MAAA,GAAA,CAAI,KAAK,QAAQ,CAAA;AAEjB,MAAA,OAAA,CAAQ,SAAA,EAAU;AAAA,IACtB,CAAC,CAAA;AAAA,EACL;AAEJ;AA5EU,eAAA,CAAA;AAAA,EADLG,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAX,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,aAAa,CAAA;AAAA,CAAA,EANlB,aAAA,CAIH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAJLD,UAAU,MAAA,CAAO;AAAA,IACd,MAAM,oBAAA,CAAqB,SAAA;AAAA,IAC3B,MAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAAS,aAAa,CAAA,CAAA;AAAA,EACtB,eAAA,CAAA,CAAA,EAAAA,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAASY,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAZ,SAASD,SAAS,CAAA;AAAA,CAAA,EA3Bd,aAAA,CAqBH,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AChBH,IAAM,cAAA,GAAN,cAA6BQ,UAAAA,CAAW;AAAA,EAM3C,YAII,WAAA,GAAwB,EAAC,EAIzB,gBAAA,GAA8C,EAAC,EACjD;AACE,IAAA,KAAA,EAAM;AAbV,IAAA,IAAA,CAAQ,QAAA,uBAA2C,GAAA,EAAI;AACvD,IAAA,IAAA,CAAQ,oBAA+C,EAAC;AAcpD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,gBAAA;AAGzB,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAG9B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,EACjC;AAAA,EAEQ,wBAAA,GAAiC;AACrC,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACrC,MAAA,MAAM,KAAA,GAAuB;AAAA,QACzB,KAAA,EAAO,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAA,GAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,QACvC,IAAA,EAAM,CAAA,OAAA,EAAU,KAAA,GAAQ,CAAA,GAAI,QAAQ,EAAE,CAAA,CAAA;AAAA,QACtC,SAAA,EAAW,GAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACb;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,uBAAA,GAAgC;AACpC,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAC,MAAA,KAAW;AACvC,MAAA,MAAM,KAAA,GAAuB;AAAA,QACzB,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,IAAA;AAAA,QAC9B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,OAAA,EAAS;AAAA,OACb;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAA,CAAS,KAAA,EAAe,SAAA,EAAmB,IAAA,EAAqB;AACnE,IAAA,MAAM,WAAA,GAA6B;AAAA,MAC/B,KAAA;AAAA,MACA,MAAM,IAAA,IAAQ,KAAA;AAAA,MACd,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,YAAY,SAAA,EAA4B;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,eAAA,CAAgB,WAAmB,OAAA,EAA2B;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAA8B;AACjC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAA,GAAqC;AACxC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,OAAA,KAAY,KAAK,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAkB,WAAA,EAA2C;AAChE,IAAA,IAAI,SAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAC1C,MAAA,IAAI,WAAA,CAAY,WAAW,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,YAAA,EAAc;AACxE,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA;AAAA,MAC9B;AAAA,IACJ;AAEA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,SAAA,EAA4B;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,SAAA,EAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,OAAA,EAA0C;AACxD,IAAA,OAAA,CAAQ,QAAQ,CAAA,MAAA,KAAU;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAA,IAAS,MAAA,CAAO,MAAM,MAAA,CAAO,SAAA,EAAW,OAAO,IAAI,CAAA;AAAA,IAC5E,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAqB;AACxB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAA,CAAY,WAAmB,OAAA,EAA0C;AAC5E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,OAAO,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,GAKL;AACE,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,KAAK,CAAA;AACvD,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,KAAK,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAE9D,IAAA,OAAO;AAAA,MACH,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAA,EAAuB;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AACzC,IAAA,OAAO,KAAA,GAAQ,CAAC,CAAC,KAAA,CAAM,SAAA,GAAY,KAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,IAAA,EAAkC;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AACzC,IAAA,OAAO,KAAA,GAAQ,MAAM,SAAA,GAAY,MAAA;AAAA,EACrC;AACJ;ACpOA,IAAAb,GAAAA;AAUO,IAAM,cAAA,GAAN,cAA6Bc,WAAAA,CAAY;AAAA,EAM5C,MAAM,IAAA,CACkB,MAAA,EACM,MAAA,EACJ,QAAA,EACxB;AAEE,IAAA,IAAA,CAAK,WAAA,GAAc,MAAM,QAAA,CAAS,EAAA,EAAG;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAGzC,IAAA,MAAM,OAAA,GAAU,OAAO,iBAAA,EAAkB;AACzC,IAAA,MAAA,CAAO,IAAA;AAAA,MAAK,MAAA;AAAA,MAER,CAAA,0BAAA,CAAA;AAAA,MACA,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS,CAAA,EAAG,MAAM,KAAK,CAAA,IAAA,EAAO,KAAA,CAAM,SAAS,CAAA,CAAE;AAAA,KAClE;AAAA,EACJ;AAAA,EAUA,OAAOd,MAAA,oBAAA,CAAqB,SAAS,EACZ,GAAA,EACC,GAAA,EACF,MAAA,EACM,MAAA,EACJ,QAAA,EACxB;AAEE,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,GAAA,CAAI,WAAW,MAAA,EAAQ;AAC/C,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,GAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAG3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AAEA,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,IAAe,MAAM,SAAS,EAAA,EAAG;AACjD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,IAAiB,MAAM,SAAS,IAAA,EAAK;AAEvD,MAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,MAAM,SAAS,CAAA;AAG7D,MAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,CAAA,iBAAA,EAAoB,SAAS,CAAA,gBAAA,CAAkB,CAAA;AACjE,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,EAAE,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,KAAK,YAAA,CAAa,SAAA,EAAW,cAAc,GAAA,CAAI,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AAEvF,MAAA,MAAM,KAAK,SAAA,CAAU,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,IAAI,IAAI,CAAA;AAEpD,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAE1D,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,QACxB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,2BAAA;AAAA,QACP,aAAa,CAAA,8BAAA,EAAiC,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,QAC1E,aAAA,EAAe;AAAA,OAClB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,QAAA,CACH,KAAA,EACA,SAAA,EACA,MAAA,EACA,QACA,IAAA,EACI;AACJ,IAAA,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,MAAA,EAAQ,CAAA,oBAAA,EAAuB,KAAK,CAAA,IAAA,EAAO,SAAS,CAAA,CAAE,CAAA;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAA,CAAY,SAAA,EAAmB,MAAA,EAAwB,MAAA,EAA4B;AACtF,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AAE5C,IAAA,IAAI,WAAW,MAAA,EAAQ;AACnB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,WAAW,MAAA,EAAyC;AACvD,IAAA,OAAO,OAAO,UAAA,EAAW;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CACH,SAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACO;AACP,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AAExD,IAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,aAAA,EAAgB,OAAA,GAAU,YAAY,UAAU,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEU,YAAY,GAAA,EAAqB;AACvC,IAAA,MAAM,SAAA,GAAoC;AAAA;AAAA,MAEtC,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,eAAA;AAAA,MACP,MAAA,EAAQ,iBAAA;AAAA;AAAA,MAGR,KAAA,EAAO,wBAAA;AAAA,MACP,MAAA,EAAQ,wBAAA;AAAA,MACR,MAAA,EAAQ,wBAAA;AAAA,MACR,KAAA,EAAO,wBAAA;AAAA,MACP,MAAA,EAAQ,wBAAA;AAAA;AAAA,MAGR,OAAA,EAAS,kBAAA;AAAA,MACT,SAAA,EAAW,qBAAA;AAAA;AAAA,MAGX,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,YAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,eAAA;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA;AAAA,MAGT,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,+BAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,YAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EAAQ,iBAAA;AAAA;AAAA,MAGR,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,mBAAA;AAAA,MACR,KAAA,EAAO,kBAAA;AAAA;AAAA,MAGP,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,oBAAA;AAAA,MACR,OAAA,EAAS,yEAAA;AAAA,MACT,MAAA,EAAQ,0BAAA;AAAA,MACR,OAAA,EAAS;AAAA,KACb;AAEA,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,CAAA,IAAK,0BAAA;AAAA,EAC3C;AAAA,EAGU,aAAa,SAAA,EAAmB,MAAA,EAAgB,IAAA,GAAe,WAAA,EAAa,cAAmB,UAAA,EAAyB;AAC9H,IAAA,MAAM,YAAY,IAAI,GAAA,CAAI,UAAU,GAAA,EAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,QAAA,GAAW,kBAAA,CAAmB,SAAA,CAAU,QAAQ,CAAA;AAGpD,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAE7C,IAAA,IAAI,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAEpD,IAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEU,SAAA,CACN,QAAA,EACA,GAAA,EACA,MAAA,EACA,YACA,YAAA,EACa;AACb,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC1C,MAAA,IAAI;AACA,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,EAAG;AACjC,UAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AACzC,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAGxC,UAAA,MAAM,OAAA,GAAkC;AAAA,YACpC,cAAA,EAAgB,WAAA;AAAA,YAChB,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAAA,YACzC,wBAAA,EAA0B;AAAA,WAC9B;AAEA,UAAA,GAAA,CAAI,SAAA,CAAU,KAAK,OAAO,CAAA;AAE1B,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,gBAAA,CAAiB,QAAQ,CAAA;AAEnD,UAAA,IAAI,MAAA,IAAU,IAAI,QAAA,EAAU;AACxB,YAAA,MAAA,CAAO,IAAA,CAAK,IAAI,QAAQ,CAAA;AAExB,YAAA,MAAA,CAAO,EAAA,CAAG,OAAO,MAAM;AACnB,cAAA,OAAA,EAAQ;AAAA,YACZ,CAAC,CAAA;AAED,YAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAa;AAC7B,cAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,gBACzB,MAAA,EAAQ,GAAA;AAAA,gBACR,KAAA,EAAO,mBAAA;AAAA,gBACP,WAAA,EAAa,CAAA,8BAAA,EAAiC,QAAQ,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAAA,gBACtE,aAAA,EAAe;AAAA,eAClB,CAAC,CAAA;AAAA,YACN,CAAC,CAAA;AAAA,UACL,CAAA,MAAO;AACH,YAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,cACzB,MAAA,EAAQ,GAAA;AAAA,cACR,KAAA,EAAO,uBAAA;AAAA,cACP,WAAA,EAAa,kCAAkC,QAAQ,CAAA;AAAA,aAC1D,CAAC,CAAA;AAAA,UACN;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,YACzB,MAAA,EAAQ,GAAA;AAAA,YACR,KAAA,EAAO,gBAAA;AAAA,YACP,WAAA,EAAa,mBAAmB,QAAQ,CAAA;AAAA,WAC3C,CAAC,CAAA;AAAA,QACN;AAAA,MACJ,SAAS,KAAA,EAAY;AACjB,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACnD,QAAA,MAAA,CAAO,IAAI,iBAAA,CAAkB;AAAA,UACzB,MAAA,EAAQ,GAAA;AAAA,UACR,KAAA,EAAO,uBAAA;AAAA,UACP,WAAA,EAAa,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,UACjD,aAAA,EAAe;AAAA,SAClB,CAAC,CAAA;AAAA,MACN;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEU,gBAAgB,GAAA,EAAqB;AAE3C,IAAA,MAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvH,IAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,MAAM,CAAA;AAEvC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AAC1C,MAAA,OAAO,0BAAA;AAAA,IACX,WAAW,cAAA,CAAe,QAAA,CAAS,GAAA,CAAI,WAAA,EAAa,CAAA,EAAG;AACnD,MAAA,OAAO,sBAAA;AAAA,IACX,CAAA,MAAO;AACH,MAAA,OAAO,uBAAA;AAAA,IACX;AAAA,EACJ;AAEJ;AAhTU,eAAA,CAAA;AAAA,EADLiB,UAAU,IAAA,EAAK;AAAA,EAEX,eAAA,CAAA,CAAA,EAAAX,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,cAAc,CAAA,CAAA;AAAA,EACvB,eAAA,CAAA,CAAA,EAAAA,SAASY,UAAU,CAAA;AAAA,CAAA,EATf,cAAA,CAMH,SAAA,EAAA,MAAA,EAAA,CAAA,CAAA;AA0BC,eAAA,CAAA;AAAA,EAHNb,UAAU,MAAA,CAAO;AAAA,IACd,MAAA,EAAQ;AAAA,GACX,CAAA;AAAA,EAEI,eAAA,CAAA,CAAA,EAAAC,SAAS,SAAS,CAAA,CAAA;AAAA,EAClB,eAAA,CAAA,CAAA,EAAAA,SAAS,UAAU,CAAA,CAAA;AAAA,EACnB,eAAA,CAAA,CAAA,EAAAA,SAASS,QAAQ,CAAA,CAAA;AAAA,EACjB,eAAA,CAAA,CAAA,EAAAT,SAAS,cAAc,CAAA,CAAA;AAAA,EACvB,eAAA,CAAA,CAAA,EAAAA,SAASY,UAAU,CAAA;AAAA,CAAA,EArCf,cAAA,CAgCF,WAAAlB,GAAAA,EAAA,CAAA,CAAA;;;AC1CJ,IAAM,yCAAA,GAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWrD,aAAA,EAAe;AAEnB;AAMO,IAAM,+CAAA,GAAkD;AAAA,EAC3D,yCAAA,CAA0C;AAC9C","file":"index.mjs","sourcesContent":["import { A_ExecutionContext } from \"@adaas/a-utils/a-execution\";\n\n\n\nexport class A_HttpRequestData extends A_ExecutionContext<{\n    data: Buffer;\n}> {\n\n\n    constructor(data: Buffer) {\n        super(\n            'a-http-request-data'\n        );\n        this._meta.set('data', data);\n    }\n\n    get length(): number {\n        return this.data?.length || 0;\n    }\n\n    get data(): Buffer {\n        return this._meta.get('data')!;\n    }\n\n\n    toString(encoding: BufferEncoding = 'utf-8'): string {\n        return this.data.toString(encoding);\n    }\n\n}\n","import { A_Context, A_Fragment, A_IdentityHelper } from \"@adaas/a-concept\";\nimport { IncomingMessage, request, ServerResponse } from \"http\";\nimport { A_Operation_Storage, A_OperationContext } from \"@adaas/a-utils/a-operation\";\n\n\nexport class A_HttpServerRequestContext<\n    _DataType extends any = any,\n> extends A_OperationContext<\n    'http-server-request',\n    {\n        request: IncomingMessage,\n        response: ServerResponse\n    },\n    {\n        buffers: Buffer[]\n        data: _DataType\n        files: Record<string, any[]>\n    },\n    {\n        buffers: Buffer[]\n        data: _DataType\n        files: Record<string, any[]>\n        params: {\n            request: IncomingMessage,\n            response: ServerResponse\n        }\n    } & A_Operation_Storage\n> {\n\n    protected _id!: string;\n\n    protected _startTime!: [number, number];\n    protected _endTime?: [number, number];\n    protected _ready?: Promise<void>;\n\n    protected get _request(): IncomingMessage {\n        return super.params.request;\n    }\n\n    protected get _response(): ServerResponse {\n        return super.params.response;\n    }\n\n    protected _customResponse: any;\n\n\n    constructor(\n        request: IncomingMessage,\n        response: ServerResponse\n    ) {\n        super('http-server-request', { request, response });\n\n\n        this._id = A_IdentityHelper.generateTimeId();\n    }\n\n    get id(): string {\n        return `[${this._request.method}]${this._request.url}-${this._id}`;\n    }\n\n    get buffers(): Buffer[] {\n        if (!this._meta.has('buffers')) {\n            this._meta.set('buffers', []);\n        }\n        return this._meta.get('buffers')!;\n    }\n\n    get contentType(): string | undefined {\n        return this._request.headers['content-type'] || undefined;\n    }\n\n\n    get data(): _DataType {\n        return this._meta.get('data')!;\n    }\n\n    set data(value: _DataType) {\n        this._meta.set('data', value);\n    }\n\n    get length(): number {\n        return this.buffers.reduce((acc, buf) => acc + buf.length, 0);\n    }\n\n    get processingTime(): number {\n        let endTime = this._endTime;\n        if (!endTime) {\n            endTime = process.hrtime();\n        }\n\n        const [seconds, nanoseconds] = process.hrtime(this._startTime);\n        return seconds * 1000 + nanoseconds / 1000000;\n    }\n\n\n    startProcessing() {\n        this._startTime = process.hrtime();\n    }\n\n    stopProcessing() {\n        this._endTime = process.hrtime();\n    }\n}","export const A_RequestFeatures = {\n\n    onError: 'A_Request_onError',\n\n    onInit: 'A_Request_onInit',\n\n    onAfterInit: 'A_Request_onAfterInit',\n\n    onParse: 'A_Request_onParse',\n\n    onValidate: 'A_Request_onValidate',\n\n    onClose: 'A_Request_onClose',\n\n    onAborted: 'A_Request_onAborted',\n\n    onTimeout: 'A_Request_onTimeout',\n\n    onData: 'A_Request_onData',\n\n    onEnd: 'A_Request_onEnd',\n\n    onBodyParse: 'A_Request_onBodyParse',\n\n    onQueryParse: 'A_Request_onQueryParse',\n\n    onParamsParse: 'A_Request_onParamsParse',\n\n    onCookiesParse: 'A_Request_onCookiesParse',\n} as const\n","import { A_Error } from '@adaas/a-concept';\nimport { A_HttpServerError_Init, A_HttpServerError_Serialized } from './A-HttpServer.types';\n\n\nexport class A_HttpServerError extends A_Error<A_HttpServerError_Init, A_HttpServerError_Serialized> {\n\n    static readonly NotFoundErrorStatus: number = 404;\n    static readonly NotFoundError = 'Resource Not Found';\n\n    static readonly InternalServerErrorStatus: number = 500;\n    static readonly InternalServerError = 'Internal Server Error';\n\n    /**\n     * HTTP status code to title mapping\n     */\n    private static readonly HTTP_STATUS_TITLES: Record<number, string> = {\n        // 4xx Client Errors\n        400: 'Bad Request',\n        401: 'Unauthorized',\n        402: 'Payment Required',\n        403: 'Forbidden',\n        404: 'Not Found',\n        405: 'Method Not Allowed',\n        406: 'Not Acceptable',\n        407: 'Proxy Authentication Required',\n        408: 'Request Timeout',\n        409: 'Conflict',\n        410: 'Gone',\n        411: 'Length Required',\n        412: 'Precondition Failed',\n        413: 'Payload Too Large',\n        414: 'URI Too Long',\n        415: 'Unsupported Media Type',\n        416: 'Range Not Satisfiable',\n        417: 'Expectation Failed',\n        418: 'I\\'m a teapot',\n        421: 'Misdirected Request',\n        422: 'Unprocessable Entity',\n        423: 'Locked',\n        424: 'Failed Dependency',\n        425: 'Too Early',\n        426: 'Upgrade Required',\n        428: 'Precondition Required',\n        429: 'Too Many Requests',\n        431: 'Request Header Fields Too Large',\n        451: 'Unavailable For Legal Reasons',\n\n        // 5xx Server Errors\n        500: 'Internal Server Error',\n        501: 'Not Implemented',\n        502: 'Bad Gateway',\n        503: 'Service Unavailable',\n        504: 'Gateway Timeout',\n        505: 'HTTP Version Not Supported',\n        506: 'Variant Also Negotiates',\n        507: 'Insufficient Storage',\n        508: 'Loop Detected',\n        510: 'Not Extended',\n        511: 'Network Authentication Required'\n    };\n\n    status!: number;\n\n    /**\n     * Gets the appropriate title for a given HTTP status code\n     */\n    private static getHttpStatusTitle(status: number): string {\n        return this.HTTP_STATUS_TITLES[status] || 'Unknown Error';\n    }\n\n    constructor(\n        /**\n         * A_Error Constructor params with required title\n         */\n        params: A_HttpServerError_Init\n    )\n    constructor(\n        /**\n         * Simplified params with optional title - will auto-generate from status\n         */\n        params: { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown }\n    )\n    constructor(\n        /**\n         * HTTP Status Code of the error\n         */\n        status: number,\n        /**\n         * Error description\n         */\n        description: string\n    )\n    constructor(\n        /**\n         * Original JS Error\n         */\n        error: Error\n    )\n    constructor(\n        param1: A_HttpServerError_Init | { status?: number; description?: string; code?: string; scope?: string; link?: string; originalError?: Error | unknown } | Error | number,\n        param2?: string\n    ) {\n        // Handle the different constructor overloads\n        switch (true) {\n            // Pattern: new A_HttpServerError(404, 'The requested resource was not found')\n            case typeof param1 === 'number' && typeof param2 === 'string':\n                super({\n                    title: A_HttpServerError.getHttpStatusTitle(param1),\n                    description: param2\n                });\n                this.status = param1;\n                break;\n\n            // Pattern: new A_HttpServerError(someErrorObject)\n            case param1 instanceof Error:\n                super(param1);\n                this.status = 500; // Default status for Error objects\n                break;\n\n            // Pattern: new A_HttpServerError({ status: 500, description: '...', originalError: ... })\n            case typeof param1 === 'object' && param1 !== null && !(param1 instanceof Error):\n                const params = param1 as any;\n                \n                // If title is provided, use the full A_Error init\n                if ('title' in params && params.title) {\n                    super(params as A_HttpServerError_Init);\n                    this.status = params.status || 500;\n                } else {\n                    // Auto-generate title from status\n                    const title = params.status ? A_HttpServerError.getHttpStatusTitle(params.status) : 'Internal Server Error';\n                    super({\n                        title: title,\n                        description: params.description,\n                        code: params.code,\n                        scope: params.scope,\n                        link: params.link,\n                        originalError: params.originalError\n                    });\n                    this.status = params.status || 500;\n                }\n                break;\n\n            default:\n                // Fallback for any other case\n                throw new Error('Invalid parameters provided to A_HttpServerError constructor');\n        }\n    }\n\n\n    protected fromConstructor(params: A_HttpServerError_Init): void {\n        super.fromConstructor(params);\n        if (params.status) {\n            this.status = params.status;\n        }\n    }\n\n\n    toJSON(): A_HttpServerError_Serialized {\n        return {\n            ...super.toJSON(),\n            status: this.status\n        }\n    }\n}\n\n","import { A_Error } from \"@adaas/a-concept\";\n\nexport class A_RequestError extends A_Error {\n\n    static readonly RequestBodyParsingError = 'Unable to parse request body';\n    static readonly FileUploadError = 'File upload error';\n    static readonly RequestTimeoutError = 'Request timed out';\n    static readonly InvalidRequestError = 'Invalid request';\n    static readonly MissingParametersError = 'Missing required parameters';\n\n}","import { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_Request_BodyType, A_Request_FileUpload } from \"./A-Request.types\";\n\n/**\n * A_RequestHelper - Stateless utility class for HTTP request processing\n * \n * This helper class provides static methods for parsing and processing HTTP request data:\n * - URL parameter extraction from route patterns\n * - Query string parsing\n * - Request body parsing (JSON, form-data, multipart, raw)\n * - URL-encoded form data parsing\n * - Multipart form data parsing (including file uploads)\n * \n * All methods are stateless and only depend on input parameters.\n * \n * @example\n * ```typescript\n * // Extract URL parameters\n * const params = A_RequestHelper.extractParams('/users/123', '/users/:id');\n * // { id: '123' }\n * \n * // Parse query string\n * const query = A_RequestHelper.extractQuery('/api/users?page=1&limit=10');\n * // { page: '1', limit: '10' }\n * \n * // Parse request body\n * const result = await A_RequestHelper.parseRequestBody(req, { maxBodySize: 1024 * 1024 });\n * // { data: {...}, type: 'json' }\n * ```\n */\nexport class A_RequestHelper {\n\n    /**\n     * Extract URL parameters from a URL using a route pattern\n     * @param url - The actual URL to extract parameters from\n     * @param routePattern - The route pattern with parameters (e.g., \"/users/:id/posts/:postId\")\n     * @returns Object containing extracted parameters\n     */\n    static extractParams(url: string, routePattern: string): Record<string, string> {\n        // Remove query string (anything after ?)\n        const cleanUrl = url.split('?')[0];\n        const cleanPattern = routePattern.split('?')[0];\n\n        const urlSegments = cleanUrl.split('/').filter(Boolean);\n        const patternSegments = cleanPattern.split('/').filter(Boolean);\n\n        const params: Record<string, string> = {};\n\n        for (let i = 0; i < patternSegments.length; i++) {\n            const patternSegment = patternSegments[i];\n            const urlSegment = urlSegments[i];\n\n            if (patternSegment.startsWith(':')) {\n                const paramName = patternSegment.slice(1); // Remove ':' from pattern\n                if (urlSegment) {\n                    params[paramName] = decodeURIComponent(urlSegment);\n                }\n            } else if (patternSegment !== urlSegment) {\n                // If static segments don't match → fail\n                return {};\n            }\n        }\n\n        return params;\n    }\n\n\n\n    /**\n     * Extract query parameters from URL\n     * @param url - The URL to extract query parameters from\n     * @returns Object containing query parameters\n     */\n    static extractQuery<T = Record<string, string>>(url: string): T {\n        const query: Record<string, string> = {};\n\n        // Take only the part after \"?\"\n        const queryString = url.split('?')[1];\n        if (!queryString) return query as T;\n\n        // Remove fragment (#...) if present\n        const cleanQuery = queryString.split('#')[0];\n\n        // Split into key=value pairs\n        for (const pair of cleanQuery.split('&')) {\n            if (!pair) continue;\n            const [key, value = ''] = pair.split('=');\n            query[decodeURIComponent(key)] = decodeURIComponent(value);\n        }\n\n        return query as T;\n    }\n\n\n    /**\n     * Parse cookies from Cookie header\n     */\n    static parseCookies(\n        cookieHeader?: string\n    ): Record<string, string> {\n        const cookies: Record<string, string> = {};\n\n        if (!cookieHeader) return {};\n\n        cookieHeader.split(';').forEach(cookie => {\n            const [name, ...rest] = cookie.trim().split('=');\n            const value = rest.join('=');\n            if (name && value) {\n                cookies[name] = decodeURIComponent(value);\n            }\n        });\n\n        return cookies;\n    }\n\n    /**\n     * Parse request body based on Content-Type\n     * \n     * \n     * @param context - The HTTP server request context\n     * @returns Parsed body data and detected body type\n     */\n    static parseRequestBody<T extends any = any>(\n        context: A_HttpServerRequestContext\n    ): {\n        data: T;\n        type: A_Request_BodyType;\n    } {\n        let parsedBody: any;\n        let bodyType: A_Request_BodyType;\n\n        switch (true) {\n            case !!context.contentType && context.contentType.includes('application/json'):\n                parsedBody = JSON.parse(context.data || '{}');\n                bodyType = 'json';\n                break;\n            case !!context.contentType && context.contentType.includes('application/x-www-form-urlencoded'):\n                parsedBody = A_RequestHelper.parseFormUrlEncoded(context.data) as T;\n                bodyType = 'form';\n                break;\n            case !!context.contentType && context.contentType.includes('multipart/form-data'):\n                const multipartResult = A_RequestHelper.parseMultipartData(Buffer.concat(context.buffers), context.contentType);\n                // Return the entire multipart result (fields + files) as T\n                parsedBody = {\n                    ...multipartResult.fields,\n                    _files: multipartResult.files\n                } as T;\n                bodyType = 'multipart';\n                break;\n            case !!context.contentType && context.contentType.includes('text/'):\n                parsedBody = context.data as T;\n                bodyType = 'text';\n                break;\n            default:\n                parsedBody = Buffer.concat(context.buffers) as T;\n                bodyType = 'raw';\n                break;\n        }\n\n\n        return {\n            data: parsedBody,\n            type: bodyType\n        };\n    }\n\n    /**\n     * Parse URL-encoded form data (application/x-www-form-urlencoded)\n     * @param body - The URL-encoded body string\n     * @returns Object containing form data\n     */\n    static parseFormUrlEncoded(\n        /**\n         * The URL-encoded body string\n         */\n        body: string\n    ): Record<string, string | string[]> {\n        const result: Record<string, string | string[]> = {};\n\n        if (!body) return result;\n\n        const pairs = body.split('&');\n\n        for (const pair of pairs) {\n            if (!pair) continue;\n\n            const [key, value = ''] = pair.split('=');\n            const decodedKey = decodeURIComponent(key.replace(/\\+/g, ' '));\n            const decodedValue = decodeURIComponent(value.replace(/\\+/g, ' '));\n\n            // Handle multiple values for the same key (arrays)\n            if (decodedKey in result) {\n                const existing = result[decodedKey];\n                if (Array.isArray(existing)) {\n                    existing.push(decodedValue);\n                } else {\n                    result[decodedKey] = [existing, decodedValue];\n                }\n            } else {\n                result[decodedKey] = decodedValue;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Parse multipart form data (for file uploads and form data)\n     * @param buffer - The raw buffer containing multipart data\n     * @param contentType - The content type header\n     * @returns Object containing fields and files\n     */\n    static parseMultipartData(\n        /**\n         * The raw buffer containing multipart data\n         */\n        buffer: Buffer,\n        /**\n         * The content type header\n         */\n        contentType: string\n    ): {\n        fields: Record<string, string>;\n        files: A_Request_FileUpload[];\n    } {\n        // Extract boundary\n        const boundaryMatch = contentType.match(/boundary=(.+)/);\n        if (!boundaryMatch) {\n            throw new A_RequestError(\n                A_RequestError.RequestBodyParsingError,\n                'Missing boundary in multipart/form-data content type'\n            )\n        }\n\n        const boundary = '--' + boundaryMatch[1];\n        const textData = buffer.toString();\n        const parts = textData.split(boundary).filter(part => part.trim() && !part.includes('--'));\n\n        const fields: Record<string, string> = {};\n        const files: A_Request_FileUpload[] = [];\n\n        parts.forEach(part => {\n            const [headers, content] = part.split('\\r\\n\\r\\n');\n            if (!headers || content === undefined) return;\n\n            const nameMatch = headers.match(/name=\"([^\"]+)\"/);\n            const filenameMatch = headers.match(/filename=\"([^\"]+)\"/);\n            const contentTypeMatch = headers.match(/Content-Type: ([^\\r\\n]+)/);\n\n            if (nameMatch) {\n                const fieldName = nameMatch[1];\n                const cleanContent = content.replace(/\\r\\n$/, '');\n\n                if (filenameMatch) {\n                    // It's a file upload\n                    const file: A_Request_FileUpload = {\n                        fieldName,\n                        filename: filenameMatch[1],\n                        encoding: 'binary',\n                        mimetype: contentTypeMatch?.[1] || 'application/octet-stream',\n                        size: Buffer.byteLength(cleanContent),\n                        buffer: Buffer.from(cleanContent, 'binary')\n                    };\n                    files.push(file);\n                } else {\n                    // It's a regular field\n                    fields[fieldName] = cleanContent;\n                }\n            }\n        });\n\n        return { fields, files };\n    }\n\n}","\n\nexport const A_RequestEnvVariables = {\n\n    /**\n     * Default request timeout in milliseconds\n     */\n    A_SERVER_REQUEST_TIMEOUT: 5000,\n\n    /**\n     * Maximum request body size in bytes\n     */\n    A_SERVER_REQUEST_MAX_BODY_SIZE: 10 * 1024 * 1024, // 10MB\n\n    /**\n     * Default request encoding\n     */\n    A_SERVER_REQUEST_DEFAULT_ENCODING: 'utf8',\n\n    /**\n     * Enable automatic cookie parsing\n     */\n    A_SERVER_REQUEST_PARSE_COOKIES: true,\n\n    /**\n     * Enable automatic query parameter parsing\n     */\n    A_SERVER_REQUEST_PARSE_QUERY: true,\n\n    /**\n     * Enable automatic body parsing\n     */\n    A_SERVER_REQUEST_PARSE_BODY: true,\n\n    /**\n     * Enable file upload handling\n     */\n    A_SERVER_REQUEST_ENABLE_FILE_UPLOADS: false,\n\n} as const;\n\n\nexport const A_RequestEnvVariablesArray = Object.keys(A_RequestEnvVariables) as Array<keyof typeof A_RequestEnvVariables>;\n\n\n\n/**\n * Array of all possible fields in A_RequestEnvVariables\n */\nexport type A_RequestEnvVariablesType = Array<keyof typeof A_RequestEnvVariables>;","import type { IncomingHttpHeaders, IncomingMessage } from \"http\";\nimport {\n    A_Context,\n    A_Entity,\n    A_Error,\n    A_Feature,\n    A_IdentityHelper,\n    A_Inject,\n    A_Scope,\n    ASEID,\n} from '@adaas/a-concept';\nimport {\n    A_Request_BodyType,\n    A_Request_FileUpload,\n    A_Request_Init,\n    A_Request_Listener,\n    A_Request_Options,\n    A_Request_Serialized,\n    A_RequestFeatureNames,\n} from \"./A-Request.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\nimport { A_RequestHelper } from \"./A-Request.helper\";\nimport { A_RequestEnvVariables, A_RequestEnvVariablesType } from \"./A-Request.env\";\nimport { A_HttpServerRequestContext } from \"./A-HttpServerRequest.context\";\nimport { A_HttpRequestData } from \"./A-HttpRequestData.context\";\nimport { A_RequestError } from \"./A-Request.error\";\nimport { A_ScheduleObject } from \"@adaas/a-utils/a-schedule\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_Request<\n    _ReqBodyType = any,\n    _ParamsType extends Record<string, string> = any,\n    _QueryType = any,\n>\n    extends A_Entity<\n        A_Request_Init,\n        A_Request_Serialized<_ReqBodyType, _ParamsType, _QueryType>\n    > {\n\n    static get concept(): string {\n        return 'a-server';\n    }\n\n    // =============================================\n    // Core Properties\n    // =============================================\n\n    /**\n     * Request processing status\n     */\n    protected _listeners: Map<A_RequestFeatureNames, Set<A_Request_Listener>> = new Map();\n\n    // =============================================\n    // Cookie Management\n    // =============================================\n    /**\n     * Parsed cookies from request headers\n     */\n    private _cookies!: Record<string, string>;\n\n    // ============================================\n    // Data Management \n    // ============================================\n    /**\n     * Request body type\n     */\n    private _bodyType?: A_Request_BodyType;\n    /**\n     * Request body data\n     */\n    private _body!: _ReqBodyType;\n    private _req!: IncomingMessage;\n\n    private _timeout: A_ScheduleObject | undefined;\n\n    // =============================================\n    // File Upload Handling\n    // =============================================\n    /**\n     * Uploaded files from multipart requests\n     */\n    private _files!: A_Request_FileUpload[];\n\n    // =============================================\n    // Request Metadata\n    // =============================================\n\n    /**\n     * User agent string from request headers\n     */\n    private _userAgent?: string;\n\n    /**\n     * Content length in bytes\n     */\n    private _contentLength?: number;\n\n    // =============================================\n    // Configuration\n    // =============================================\n    /**\n     * Request processing configuration options\n     */\n    private _options!: Required<A_Request_Options>\n\n    private _routeDefinition?: A_ServerRoute;\n\n\n    /**\n     * A_Request - Comprehensive HTTP Request Processing Entity\n     * \n     * This class provides a complete wrapper around Node.js IncomingMessage with advanced features:\n     * - Automatic body parsing (JSON, form-data, multipart, raw)\n     * - Cookie and session management\n     * - File upload handling with easy access methods\n     * - Request validation\n     * - Middleware support\n     * - Type-safe parameter extraction\n     * - Request timing and metrics\n     * \n     * @example\n     * ```typescript\n     * const request = new A_Request({\n     *     id: 'req-123',\n     *     request: incomingMessage,\n     *     scope: 'api'\n     * }, {\n     *     enableFileUploads: true,\n     *     maxBodySize: 50 * 1024 * 1024 // 50MB for file uploads\n     * });\n     * \n     * await request.init();\n     * \n     * // Access parsed body\n     * const userData = request.body;\n     * \n     * // Get typed parameters\n     * const userId = request.params.id;\n     * \n     * // Handle file uploads\n     * if (request.hasFiles()) {\n     *     const avatar = request.getFile('avatar');\n     *     if (avatar) {\n     *         console.log(`Uploaded file: ${avatar.filename}`);\n     *         console.log(`File size: ${avatar.size} bytes`);\n     *         console.log(`File type: ${avatar.mimetype}`);\n     *         \n     *         // Access file buffer for processing\n     *         const fileBuffer = avatar.buffer;\n     *         // Save to disk, process, etc.\n     *     }\n     *     \n     *     // Get all files for a specific field\n     *     const documents = request.getFiles('documents');\n     *     for (const doc of documents) {\n     *         // Process each document...\n     *     }\n     * }\n     * \n     * // Check specific files\n     * if (request.hasFile('profilePicture')) {\n     *     const pic = request.getFile('profilePicture');\n     *     // Process profile picture...\n     * }\n     * ```\n     */\n    constructor(params: A_Request_Init, options?: A_Request_Options) {\n        super(params);\n        this._options = {\n            maxBodySize: 10 * 1024 * 1024, // 10MB default\n            timeout: 30000, // 30 seconds\n            encoding: 'utf8',\n            parseCookies: true,\n            parseQuery: true,\n            parseBody: true,\n            enableFileUploads: false,\n            strictValidation: false,\n            ...(options || {})\n        }\n    }\n\n    /**\n     * Creates A_Request entity from initialization data\n     * \n     * @param newEntity \n     */\n    fromNew(newEntity: A_Request_Init): void {\n        this.aseid = new ASEID({\n            concept: (this.constructor as typeof A_Request).concept,\n            scope: newEntity.scope,\n            entity: (this.constructor as typeof A_Request).entity,\n            shard: newEntity.shard,\n            id: newEntity.id\n        });\n\n        this._req = newEntity.request;\n    }\n\n\n    /**\n     * Core HTTP request object from Node.js\n     */\n    get original(): IncomingMessage {\n        return this._req;\n    }\n    /**\n     * Parsed request body data\n     */\n    get body(): _ReqBodyType {\n        return this._body;\n    }\n    /**\n     * URL route parameters (e.g., /users/:id)\n     */\n    get params(): _ParamsType {\n\n        console.log('Extracting params using route definition:', this.url);\n        console.log('Extracting params using route definition:', this._routeDefinition?.path);\n\n        return A_RequestHelper.extractParams(this.url,\n            this._routeDefinition?.path || ''\n\n        ) as _ParamsType;\n    }\n    /**\n     * Query string parameters\n     */\n    get query(): _QueryType {\n        return A_RequestHelper.extractQuery(this.url) as _QueryType;\n    }\n    /**\n     * Gets the parsed cookies\n     */\n    get cookies(): Record<string, string> {\n        if (!this._cookies) {\n            this._cookies = A_RequestHelper.parseCookies(this.headers['cookie']);\n        }\n\n        return this._cookies;\n    }\n    /**\n     * Gets the request URL\n     */\n    get url(): string {\n        return this.original.url!;\n    }\n    /**\n     * Gets the HTTP method\n     */\n    get method(): A_HttpServerRequestMethod {\n        return (String(this.original.method).toUpperCase() as A_HttpServerRequestMethod) || 'DEFAULT';\n    }\n    /**\n     * Gets the request headers\n     */\n    get headers(): IncomingHttpHeaders {\n        return this.original.headers;\n    }\n    /**\n     * Gets the timestamp when the request was started\n     */\n    get startedAt(): Date | undefined {\n        const timeId = A_IdentityHelper.parseTimeId(this.aseid.id.split('-')[0]);\n        return timeId ? new Date(timeId.timestamp) : undefined;\n    }\n    /**\n     * Gets uploaded files\n     */\n    get files(): A_Request_FileUpload[] {\n        return this._files || [];\n    }\n    /**\n     * Gets user agent string\n     */\n    get userAgent(): string | undefined {\n        return this.headers?.['user-agent'] || ''\n    }\n    /**\n     * Gets content length\n     */\n    get contentLength(): number {\n        return this.headers?.['content-length'] ? parseInt(this.headers['content-length'], 10) : 0;\n    }\n    /**\n     * Check if request is secure (HTTPS)\n     */\n    get isSecure(): boolean {\n        return this.original.socket && 'encrypted' in this.original.socket;\n    }\n    /**\n     * Check if request is from mobile device\n     */\n    get isMobile(): boolean {\n        const userAgent = this._userAgent?.toLowerCase() || '';\n        return /mobile|android|iphone|ipad|phone/i.test(userAgent);\n    }\n    /**\n     * Get request size in bytes\n     */\n    get size(): number {\n        return this._contentLength || 0;\n    }\n    /**\n     * Gets content type from headers\n     */\n    get contentType(): string | undefined {\n        return this.headers['content-type'] || undefined;\n    }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    /**\n     * Pipes request stream to destination\n     */\n    pipe(\n        destination: NodeJS.WritableStream,\n        options?: { end?: boolean | undefined; }\n    ): NodeJS.WritableStream {\n        return this.original.pipe(destination, options);\n    }\n    /**\n     * Get a file by field name\n     */\n    getFile(fieldName: string): A_Request_FileUpload | undefined {\n        return this._files?.find(file => file.fieldName === fieldName);\n    }\n\n    /**\n     * Get all files for a specific field name\n     */\n    getFiles(fieldName: string): A_Request_FileUpload[] {\n        return this._files?.filter(file => file.fieldName === fieldName) || [];\n    }\n\n    /**\n     * Check if request has any files\n     */\n    hasFiles(): boolean {\n        return this._files && this._files.length > 0;\n    }\n\n    /**\n     * Check if request has a file with specific field name\n     */\n    hasFile(fieldName: string): boolean {\n        return this._files?.some(file => file.fieldName === fieldName) || false;\n    }\n\n    /**\n     * Get total size of all uploaded files\n     */\n    getTotalFileSize(): number {\n        return this._files?.reduce((total, file) => total + file.size, 0) || 0;\n    }\n\n    /**\n     * Get a cookie value\n     */\n    getCookie(name: string): string | undefined {\n        return this._cookies[name];\n    }\n    /**\n     * Check if request has a specific cookie\n     */\n    hasCookie(name: string): boolean {\n        return name in this._cookies;\n    }\n    /**\n     * Check if request accepts specific content type\n     */\n    accepts(contentType: string): boolean {\n        const acceptHeader = this.headers.accept || '';\n        return acceptHeader.includes(contentType) || acceptHeader.includes('*/*');\n    }\n    /**\n     * Get request fingerprint for caching/identification\n     */\n    getFingerprint(): string {\n        const components = [\n            this.method,\n            this.url,\n            this._userAgent,\n            JSON.stringify(this.body)\n        ];\n\n        return Buffer.from(components.join('|')).toString('base64');\n    }\n\n    // --------------------------------------------------------------------------   \n    // A-Request Event-Emitter methods\n    // --------------------------------------------------------------------------\n    /**\n     * Registers an event listener for a specific event\n     * \n     * @param event \n     * @param listener \n     */\n    on(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n        if (!this._listeners.has(event)) {\n            this._listeners.set(event, new Set());\n        }\n        this._listeners.get(event)!.add(listener);\n    }\n    /**\n     * Removes an event listener for a specific event\n     * \n     * @param event \n     * @param listener \n     */\n    off(event: A_RequestFeatureNames, listener: A_Request_Listener) {\n        this._listeners.get(event)?.delete(listener);\n    }\n    /**\n     * Emits an event to all registered listeners\n     * \n     * @param event \n     */\n    emit(event: A_RequestFeatureNames) {\n        this._listeners.get(event)?.forEach(async listener => {\n            listener(this);\n        });\n    }\n\n    /**\n     * Allows to use a route definition for this request\n     * \n     * @param route \n     */\n    useRoute(route: A_ServerRoute): void {\n        this._routeDefinition = route;\n    }\n\n\n    clearTimeout(): void {\n        this._timeout?.clear();\n    }\n\n    /**\n     * Initialize the request - parse cookies, query, body etc.\n     */\n    async load(): Promise<void> {\n\n        // this.original.on('close', this.handleClose.bind(this));\n\n        try {\n\n            await this.call(A_RequestFeatures.onInit);\n\n            await new Promise<void>((resolve, reject) => {\n                const onData = this.handleData.bind(this);\n                const onEnd = () => {\n                    cleanup();\n                    resolve();\n                };\n                const onError = (err: Error) => {\n                    cleanup();\n                    reject(err);\n                };\n\n                const cleanup = () => {\n                    this.original.off('data', onData);\n                    this.original.off('end', onEnd);\n                    this.original.off('error', onError);\n                };\n\n                this.original.on('data', onData);\n                this.original.on('end', onEnd);\n                this.original.on('error', onError);\n            });\n\n            await this.handleEnd();\n\n        } catch (error) {\n\n            const targetError = error instanceof A_HttpServerError\n                ? error\n                : new A_HttpServerError({\n                    status: 500,\n                    description: 'An error occurred while processing the request.',\n                    originalError: error\n                });\n\n            await this.fail(targetError);\n        }\n\n        this.original.on('error', err => {\n            this.fail(new A_HttpServerError({\n                status: 500,\n                description: `Request error: ${err.message}`,\n                originalError: err\n            }));\n        });\n    }\n\n\n    async validate(): Promise<void> {\n        try {\n            await this.call(A_RequestFeatures.onValidate);\n        } catch (error) {\n            const targetError = error instanceof A_HttpServerError\n                ? error\n                : new A_HttpServerError({\n                    status: 400,\n                    description: ` Request Validation Failed: ${error instanceof A_Error ? error.message : 'Invalid request.'}`,\n                    originalError: error\n                });\n\n            await this.fail(targetError);\n        }\n    }\n    /**\n     * Destroy the request A-Entity with cleanup\n     * \n     * @returns \n     */\n    async destroy(): Promise<any> {\n        const targetError = A_Context.scope(this)?.resolve(A_Error);\n\n        if (!this.original.destroyed) {\n            this.original.destroy(targetError);\n            this.original.removeAllListeners();\n\n            this._listeners.clear();\n\n            return super.destroy();\n        }\n    }\n\n    /**\n     * Handles request failure - registers error, emits event, and destroys request\n     * \n     * [!] Destroys the request after handling the failure.\n     * \n     * @param err \n     */\n    async fail(err?: A_HttpServerError): Promise<void> {\n        console.log('Request failed with error:', this.method, this.url, err?.message);\n\n        if (err)\n            A_Context\n                .scope(this)\n                .register(err);\n\n        this._timeout?.clear();\n\n        await this.call(A_RequestFeatures.onError);\n\n        await this.destroy();\n    }\n\n\n    // ======================================================================================\n    // Internal handlers for request events\n    // ======================================================================================\n    /**\n     * Internal helper method to handle incoming data chunks\n     * It creates a new scope for each data chunk, inherits the parent scope,\n     * and calls the onData feature with the new scope.\n     * \n     * [!] This method ensures that each data chunk is processed in isolation, \n     * preventing side effects between chunks.\n     * \n     * @param data \n     */\n    protected async handleData(data: Buffer): Promise<void> {\n        const chunk = new A_HttpRequestData(data);\n\n        const scope = new A_Scope({\n            name: `${this.aseid.toString()}-data-chunk`,\n            fragments: [chunk],\n        })\n        .inherit(A_Context.scope(this));\n\n        try {\n\n            scope.inherit(A_Context.scope(this));\n\n            await this.call(A_RequestFeatures.onData, scope);\n\n            scope.destroy();\n\n        } catch (error) {\n\n            scope.destroy();\n\n            await this.fail(new A_HttpServerError({\n                status: 500,\n                description: `Request data chunk error: ${error instanceof A_Error ? error.message : 'Unable to process request data chunk.'}`,\n                originalError: error\n            }));\n        }\n    }\n\n    /**\n     * Handles request close event\n     * \n     * This method is called when the request is closed prematurely.\n     * It triggers the onClose feature and handles any errors that occur during processing.\n     * \n     */\n    protected async handleClose(): Promise<void> {\n        try {\n            await this.call(A_RequestFeatures.onClose);\n        } catch (error) {\n\n            await this.fail(new A_HttpServerError({\n                status: 499,\n                description: `Request closed error: ${error instanceof A_Error ? error.message : 'Request was closed.'}`,\n                originalError: error\n            }));\n        }\n    }\n\n    /**\n     * Handles request end event\n     * \n     * This method is called when the request has finished sending data.\n     * It triggers the onEnd feature and handles any errors that occur during processing.\n     */\n    protected async handleEnd(): Promise<void> {\n        try {\n\n            await this.call(A_RequestFeatures.onEnd);\n\n        } catch (error) {\n            await this.fail(new A_HttpServerError({\n                status: 500,\n                description: `Request processing error: ${error instanceof A_Error ? error.message : 'Unable to process request.'}`,\n                originalError: error\n            }));\n        }\n    }\n\n    /**\n     * Handles request timeout event\n     * \n     * This method is called when the request processing exceeds the configured timeout.\n     * It triggers the onTimeout feature and fails the request with a timeout error.\n     */\n    protected async handleTimeout(): Promise<void> {\n        try {\n            await this.call(A_RequestFeatures.onTimeout);\n\n            throw new A_HttpServerError({\n                status: 503,\n                description: `Request processing take too long and timed out. Current timeout is set to ${this._options.timeout} ms.`,\n            })\n\n        } catch (error) {\n\n            const targetError = error instanceof A_HttpServerError\n                ? error\n                : new A_HttpServerError({\n                    status: 503,\n                    description: `Request timeout error: ${error instanceof A_Error ? error.message : 'Request timed out.'}`,\n                    originalError: error\n                });\n\n            await this.fail(targetError);\n        }\n    }\n\n\n\n\n    // ======================================================================================\n    // A-Request Feature Extensions\n    // ======================================================================================\n\n    @A_Feature.Extend()\n    /**\n     * Hook called during initialization\n     * \n     * Default Behavior: Starts request processing timer and sets up timeout handling.\n     */\n    async [A_RequestFeatures.onInit](\n        @A_Inject(A_Config) config: A_Config<['A_SERVER_REQUEST_TIMEOUT']>,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n\n        context.startProcessing();\n\n        const ms = Number(config?.get('A_SERVER_REQUEST_TIMEOUT')\n            || A_RequestEnvVariables.A_SERVER_REQUEST_TIMEOUT);\n\n        this._timeout = new A_ScheduleObject(ms, this.handleTimeout.bind(this), { resolveOnClear: true });\n    }\n\n\n    @A_Feature.Extend({\n        before: /.*/\n    })\n    /**\n     * Hook called on receiving data chunk\n     * \n     * Default Behavior: Accumulates data chunks into context buffers and checks for max body size.\n     */\n    async [A_RequestFeatures.onData](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        @A_Inject(A_HttpRequestData) chunk: A_HttpRequestData,\n        ...args: any[]\n    ): Promise<void> {\n\n        if (context.length + chunk.length > this._options.maxBodySize!) {\n            throw new A_RequestError(\n                A_RequestError.RequestBodyParsingError,\n                `Request body too large. Max size is ${this._options.maxBodySize} bytes.`\n            );\n        }\n\n        context.buffers.push(chunk.data);\n        if (!context.data)\n            context.data = '';\n\n        context.data += chunk.toString(this._options.encoding as BufferEncoding);\n    }\n\n    @A_Feature.Extend({\n        before: /.*/\n    })\n    /**\n     * Hook called on request timeout\n     * \n     * Default Behavior: Stops request processing and emits timeout event.\n     * \n     * @param context \n     * @param args \n     */\n    async [A_RequestFeatures.onTimeout](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n        context.stopProcessing();\n\n        this._timeout?.clear();\n\n        this.emit(A_RequestFeatures.onTimeout);\n    }\n\n    @A_Feature.Extend({\n        before: /.*/\n    })\n    /**\n     * Hook called on request close\n     */\n    async [A_RequestFeatures.onClose](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n\n        this.emit(A_RequestFeatures.onClose);\n    }\n\n\n    @A_Feature.Extend({\n        after: /.*/\n    })\n    /**\n     * Hook called on request error\n     */\n    async [A_RequestFeatures.onError](\n        @A_Inject(A_Error) error: A_Error,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n        context.stopProcessing();\n\n        this.emit(A_RequestFeatures.onError);\n    }\n\n    @A_Feature.Extend()\n    /**\n     * Hook called to parse request data\n     */\n    async [A_RequestFeatures.onEnd](\n        @A_Inject(A_Config) config: A_Config<A_RequestEnvVariablesType>,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n\n        const { data, type } = A_RequestHelper.parseRequestBody(context);\n\n        this._body = data;\n        this._bodyType = type;\n    }\n\n\n\n    @A_Feature.Extend()\n    /**\n     * Hook called to validate request data\n     */\n    async [A_RequestFeatures.onValidate](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ): Promise<void> {\n        // Validate file uploads if multipart data detected\n        if (!!this.contentType && this.contentType.includes('multipart/form-data') && !this._options.enableFileUploads) {\n            throw new A_HttpServerError({\n                status: 400,\n                description: 'File uploads detected but not enabled. Set enableFileUploads: true in options.',\n            });\n        }\n    }\n\n\n    /**\n     * Serialize request for logging/debugging\n     */\n    toJSON(): A_Request_Serialized {\n        return {\n            ...super.toJSON(),\n            method: this.method,\n            url: this.url,\n            headers: this.headers,\n            params: this.params,\n            query: this.query,\n            cookies: this._cookies,\n            userAgent: this.userAgent,\n            bodyType: this._bodyType,\n            body: this._body,\n            filesCount: this._files?.length || 0,\n            totalFileSize: this.getTotalFileSize(),\n        };\n    }\n}","import type { IncomingMessage } from \"http\";\nimport { A_Request } from \"./A-Request.entity\";\nimport { A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\nimport { A_HttpServerRequestMethod } from \"@adaas/a-server/server/A-HttpServer.types\";\nimport { A_RequestFeatures } from \"./A-Request.constants\";\n\n\n// =============================================\n// Core Request Types\n// =============================================\n/**\n * Constructor parameters for A_Request entity\n */\nexport type A_Request_Init = {\n    /**\n     * Unique identifier for the request (should correspond to Response id)\n     */\n    id: string;\n\n    /**\n     * ASEID Shard for the request.  \n     * it's some sort of request fingerprint\n     */\n    shard: string\n    /**\n     * Node.js IncomingMessage object\n     */\n    request: IncomingMessage;\n    /**\n     * Request scope for context resolution\n     */\n    scope: string;\n};\n\n/**\n * Serialized representation of A_Request entity\n */\nexport type A_Request_Serialized<\n    _ReqBodyType = any,\n    _ParamsType extends Record<string, string> = any,\n    _QueryType = any,\n> = A_TYPES__Entity_Serialized & {\n    method: A_HttpServerRequestMethod;\n    url: string;\n    headers: Record<string, string | string[] | undefined>;\n    params?: _ParamsType;\n    query?: _QueryType;\n    cookies: Record<string, string>;\n    body?: _ReqBodyType;\n    userAgent?: string;\n    isValid: boolean;\n    bodyType?: A_Request_BodyType;\n    filesCount?: number;\n    fileFieldNames?: string[];\n    totalFileSize?: number;\n}\n\n/**\n * Supported HTTP request methods\n */\nexport type A_Request_Methods =\n    | 'GET'\n    | 'POST'\n    | 'PUT'\n    | 'DELETE'\n    | 'PATCH'\n    | 'OPTIONS'\n    | 'HEAD'\n    | 'CONNECT'\n    | 'TRACE'\n    | 'DEFAULT'; // Default is used for routes that do not have a method specified\n\n/**\n * Request lifecycle events\n */\nexport enum A_Request_Event {\n    Error = 'error',\n    Finish = 'finish',\n    Data = 'data',\n    End = 'end',\n    Close = 'close',\n}\n\n\nexport type A_RequestFeatureNames = typeof A_RequestFeatures[keyof typeof A_RequestFeatures];\n\n/**\n * Request event callback function type\n */\nexport type A_Request_EventCallback = (request: A_Request) => void;\n\n\n// =============================================\n// Body Parsing Types\n// =============================================\n\n/**\n * Supported body content types for parsing\n */\nexport type A_Request_BodyType = 'json' | 'form' | 'multipart' | 'raw' | 'text';\n\n/**\n * Result of body parsing operation\n */\nexport type A_Request_ParsedBody = {\n    /**\n     * Type of parsed content\n     */\n    type: A_Request_BodyType;\n    /**\n     * Parsed data\n     */\n    data: any;\n    /**\n     * Size of the body in bytes\n     */\n    size: number;\n    /**\n     * Character encoding used\n     */\n    encoding?: string;\n    /**\n     * Multipart boundary (for multipart content)\n     */\n    boundary?: string;\n};\n\n\n\n// =============================================\n// Session Management Types\n// =============================================\n\n/**\n * Session data structure for user session management\n */\nexport type A_Request_SessionData = {\n    /**\n     * Unique session identifier\n     */\n    id?: string;\n    /**\n     * Associated user ID\n     */\n    userId?: string;\n    /**\n     * Session creation timestamp\n     */\n    createdAt?: Date;\n    /**\n     * Last access timestamp\n     */\n    lastAccess?: Date;\n    /**\n     * Session data storage\n     */\n    data?: Record<string, any>;\n    /**\n     * Whether session is expired\n     */\n    isExpired?: boolean;\n    /**\n     * Maximum session age in milliseconds\n     */\n    maxAge?: number;\n};\n\n\n// =============================================\n// File Upload Types\n// =============================================\n\n/**\n * File upload information for multipart requests\n */\nexport type A_Request_FileUpload = {\n    /**\n     * Form field name\n     */\n    fieldName: string;\n    /**\n     * Original filename\n     */\n    filename: string;\n    /**\n     * File encoding\n     */\n    encoding: string;\n    /**\n     * MIME type\n     */\n    mimetype: string;\n    /**\n     * File size in bytes\n     */\n    size: number;\n    /**\n     * File buffer data\n     */\n    buffer: Buffer;\n    /**\n     * Path if saved to disk\n     */\n    path?: string;\n    /**\n     * File hash for integrity verification\n     */\n    hash?: string;\n};\n\n\n// =============================================\n// Validation Types\n// =============================================\n\n/**\n * Request validation result with detailed feedback\n */\nexport type A_Request_ValidationResult = {\n    /**\n     * Whether validation passed\n     */\n    isValid: boolean;\n    /**\n     * Validation error messages\n     */\n    errors: string[];\n    /**\n     * Warning messages\n     */\n    warnings: string[];\n    /**\n     * Sanitized data after validation\n     */\n    sanitized?: any;\n};\n\n\n// =============================================\n// Configuration Types\n// =============================================\n\n/**\n * Request processing configuration options\n */\nexport type A_Request_Options = {\n    /**\n     * Maximum request body size in bytes (default: 10MB)\n     */\n    maxBodySize?: number;\n    /**\n     * Request timeout in milliseconds (default: 30s)\n     */\n    timeout?: number;\n    /**\n     * Default character encoding (default: 'utf8')\n     */\n    encoding?: string;\n    /**\n     * Automatically parse cookies (default: true)\n     */\n    parseCookies?: boolean;\n    /**\n     * Automatically parse query parameters (default: true)\n     */\n    parseQuery?: boolean;\n    /**\n     * Automatically parse request body (default: true)\n     */\n    parseBody?: boolean;\n    /**\n     * Enable file upload handling (default: false)\n     */\n    enableFileUploads?: boolean;\n    /**\n     * Enable strict validation mode (default: false)\n     */\n    strictValidation?: boolean;\n};\n\n/**\n * Request Event Listener Function\n */\nexport type A_Request_Listener = (req?: A_Request) => void;","\n\nexport const A_ResponseFeatures = {\n    /**\n     * Event fired when an error occurs while sending the response\n     */\n    onError: '_A_Response_onError',\n    /**\n     * Event fired when the response is closed\n     */\n    onClose: '_A_Response_onClose',\n    /**\n     * Event fired when the response is finished\n     */\n    onFinish: '_A_Response_onFinish',\n    /**\n     * Event fired when the response is sent\n     */\n    onSend: '_A_Response_onSend',\n    /**\n     * Event fired when the response is redirected\n     */\n    onRedirect: '_A_Response_onRedirect',\n} as const;","import {\n    A_Context,\n    A_Entity,\n    A_Error,\n    A_Feature,\n    A_Inject,\n    ASEID,\n} from \"@adaas/a-concept\";\nimport type {\n    IncomingHttpHeaders,\n    ServerResponse\n} from \"http\";\nimport {\n    A_Response_Constructor,\n    A_Response_CacheOptions,\n    A_Response_Options,\n    A_Response_Serialized,\n    A_Response_CookieOptions,\n    A_ResponseFeatureNames,\n} from \"./A-Response.types\";\nimport { pipeline, Readable } from 'stream';\nimport { A_ResponseFeatures } from \"./A-Response.constants\";\nimport { A_Response_Listener } from \"./A-Response.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\n\n/**\n * A_Response - Comprehensive HTTP Response Processing Entity\n * \n * This class provides a complete wrapper around Node.js ServerResponse with advanced features:\n * - Response data accumulation and value management\n * - Error collection and standardized error responses\n * - Response streaming with progress tracking\n * - Template rendering and view engine support\n * - Cookie management and secure cookie handling\n * - Response compression (gzip, deflate, brotli)\n * - File downloads and static file serving\n * - Response caching and ETags\n * - Performance metrics and timing\n * - Response validation and content negotiation\n * \n * @example\n */\nexport class A_Response<_ResponseType = any> extends A_Entity<\n    A_Response_Constructor,\n    A_Response_Serialized<_ResponseType>\n> {\n\n    // =============================================\n    // Static Properties\n    // =============================================\n    static get namespace(): string {\n        return 'a-server';\n    }\n\n    // =============================================\n    // Core Properties\n    // =============================================\n    /**\n     * Original ServerResponse object\n     */\n    private _res!: ServerResponse;\n    /**\n     * Internal object to store all response data\n     */\n    private _data!: Map<string, _ResponseType>;\n    /**\n     * uses in case the response isn't an object \n     */\n    private _dataOverride?: _ResponseType\n    /**\n     * Redirect URL for handling redirects\n     */\n    private _redirectURL?: string;\n    /**\n     * Cookies map for managing response cookies\n     */\n    private _cookies!: Map<string, { value: string, options?: A_Response_CookieOptions }>;\n    /**\n     * Indicates if the response has finished\n     */\n    private _cacheOptions?: A_Response_CacheOptions;\n    /**\n     * Indicates if the response has finished\n     */\n    private _options!: Required<A_Response_Options>\n    /**\n     * Event listeners map for A_Response events\n     */\n    private _listeners: Map<A_ResponseFeatureNames, Set<A_Response_Listener>> = new Map();\n    /**\n     * Whether this response is operating as a persistent SSE stream\n     */\n    private _isStreaming: boolean = false;\n\n\n    constructor(params: A_Response_Constructor, options?: A_Response_Options) {\n        super(params);\n        this._options = {\n            autoCompress: true,\n            compressionThreshold: 1024, // 1KB\n            enableCaching: true,\n            defaultCacheMaxAge: 3600, // 1 hour\n            enableMetrics: true,\n            enableEtag: true,\n            enableLastModified: true,\n            charset: 'utf-8',\n            defaultContentType: 'application/json',\n            maxRedirects: 5,\n            enableCookies: true,\n            enableSessions: true,\n            ...(options || {})\n        };\n    }\n\n    /**\n     * Initialize from new entity parameters\n     */\n    fromNew(newEntity: A_Response_Constructor): void {\n        this.aseid = new ASEID({\n            concept: A_Context.root.name,\n            scope: newEntity.scope,\n            entity: (this.constructor as typeof A_Response).entity,\n            shard: newEntity.shard,\n            id: newEntity.id\n        });\n\n        this._res = newEntity.response;\n        this._data = new Map<string, _ResponseType>();\n        this._cookies = new Map<string, { value: string, options?: A_Response_CookieOptions }>();\n\n\n    }\n    /**\n     * Gets the response data map\n     */\n    get data(): Map<string, _ResponseType> {\n        return this._data;\n    }\n    /**\n     * Gets the original ServerResponse object\n     */\n    get original(): ServerResponse {\n        return this._res;\n    }\n    /**\n     * Gets whether headers have been sent\n     */\n    get headersSent(): boolean {\n        return this.original.headersSent;\n    }\n    /**\n     * Gets the current status code\n     */\n    get statusCode(): number {\n        return this.original.statusCode;\n    }\n    /**\n     * Gets response size in bytes\n     */\n    get size(): number {\n        return this.original.getHeader('Content-Length') as number || 0;\n    }\n    /**\n     * Whether this response is in SSE streaming mode.\n     * When true the server container will NOT auto-send and destroy() will\n     * leave the underlying socket open.\n     */\n    get isStreaming(): boolean {\n        return this._isStreaming;\n    }\n\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // A-Response Primary Methods\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n     * Initialize the response\n     */\n    async load(): Promise<void> {\n\n        // Track response completion\n        // this.original.on('finish', this.handleFinish.bind(this));\n\n        // this.original.on('close', this.handleClose.bind(this));\n\n\n        this.original.on('error', err => {\n            this.fail(new A_HttpServerError({\n                status: 500,\n                description: `Request error: ${err.message}`,\n                originalError: err\n            }));\n        });\n    }\n    /**\n     * Destroy the response\n     */\n    async destroy(): Promise<any> {\n\n        if (!this._isStreaming) {\n            // Only call end() if not already ended — avoids double-end which can\n            // interrupt an in-flight response body on keep-alive connections.\n            if (!this.original.writableEnded) {\n                this.original.end();\n            }\n\n            this._listeners.clear();\n\n            // Remove only the 'error' listener we added in load().\n            // Do NOT call removeAllListeners() — that strips Node.js HTTP's own\n            // internal keep-alive 'finish' handler, causing the socket to never\n            // re-enter the server's connection pool and hanging all subsequent\n            // requests on the same keep-alive connection.\n            this.original.removeAllListeners('error');\n        }\n\n        return super.destroy();\n    }\n    /**\n     * Handle response failure with error details\n     */\n    async fail(err?: A_HttpServerError): Promise<void> {\n        if (err)\n            A_Context\n                .scope(this)\n                .register(err);\n\n        await this.call(A_ResponseFeatures.onError);\n\n        await this.destroy();\n    }\n    /**\n     * Send a plain text or JSON response\n     */\n    async send(data?: any): Promise<void> {\n        if (this.headersSent)\n            return;\n\n        try {\n            this._dataOverride = data;\n\n            await this.call(A_ResponseFeatures.onSend);\n\n        } catch (error) {\n            await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n                status: 500,\n                description: 'An error occurred while sending the response.',\n                originalError: error\n            }));\n        }\n    }\n    /**\n      * Stream response data\n      */\n    public async stream(\n        dataStream: Readable | any[]\n    ): Promise<void> {\n        if (this.headersSent)\n            return;\n\n        try {\n            return new Promise((resolve, reject) => {\n                this.original.setHeader('Transfer-Encoding', 'chunked');\n                this.setDefaultResponseHeaders();\n                this.setCookieHeaders();\n                this.original.writeHead(this.statusCode);\n\n                let stream: Readable;\n\n                if (Array.isArray(dataStream)) {\n                    // Convert array to readable stream\n                    stream = new Readable({\n                        read() {\n                            if (dataStream.length > 0) {\n                                const chunk = dataStream.shift();\n                                this.push(typeof chunk === 'string' ? chunk : JSON.stringify(chunk) + '\\n');\n                            } else {\n                                this.push(null);\n                            }\n                        }\n                    });\n                } else {\n                    stream = dataStream;\n                }\n\n                let bytesWritten = 0;\n\n                stream.on('data', (chunk) => {\n                    bytesWritten += chunk.length;\n                });\n\n                stream.on('end', resolve);\n\n                stream.on('error', reject);\n\n                pipeline(stream, this.original, (error) => {\n                    if (error) {\n                        reject(error);\n                    }\n                });\n\n            });\n        } catch (error) {\n            await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n                status: 500,\n                description: 'An error occurred while streaming the response. Unable to process the stream.',\n                originalError: error\n            }));\n        }\n    }\n    /**\n     * Redirect response\n     * \n     * [!] Note: This method ends the response immediately.\n     */\n    public async redirect(\n        url: string\n    ): Promise<void> {\n        if (this.headersSent)\n            return;\n\n        try {\n            this._redirectURL = url;\n\n            await this.call(A_ResponseFeatures.onRedirect);\n\n        } catch (error) {\n            await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n                status: 500,\n                description: 'An error occurred while redirecting the response.',\n                originalError: error\n            }));\n        }\n    }\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // A-Response SSE (Server-Sent Events) Methods\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n     * Upgrade this response to a persistent SSE stream.\n     * Sends the required headers and writes the initial `:ok` comment to flush\n     * the connection. After calling this the response will NOT be auto-closed\n     * by the server container or by destroy().\n     */\n    public sseOpen(): void {\n        if (this.headersSent || this._isStreaming) return;\n        this._isStreaming = true;\n        this.original.writeHead(200, {\n            'Content-Type': 'text/event-stream',\n            'Cache-Control': 'no-cache, no-transform',\n            'Connection': 'keep-alive',\n            'X-Accel-Buffering': 'no',\n        });\n        this.original.write(':ok\\n\\n');\n        // Reset streaming flag when the client disconnects\n        this.original.once('close', () => {\n            this._isStreaming = false;\n        });\n    }\n    /**\n     * Write a named SSE event onto the open stream.\n     * Format: `event: <name>\\ndata: <JSON>\\n\\n`\n     *\n     * Compatible with browser EventSource `addEventListener(name, handler)`.\n     *\n     * @returns false when the channel is no longer writable\n     */\n    public sseWrite(event: string, data?: any): boolean {\n        if (!this._isStreaming || this.original.destroyed) return false;\n        try {\n            return this.original.write(`event: ${event}\\ndata: ${JSON.stringify(data ?? {})}\\n\\n`);\n        } catch {\n            return false;\n        }\n    }\n    /**\n     * Close the SSE stream gracefully.\n     */\n    public sseClose(): void {\n        if (!this._isStreaming || this.original.destroyed) return;\n        this._isStreaming = false;\n        this.original.end();\n    }\n    /**\n     * Write head with status and headers\n     */\n    public writeHead(statusCode: number, headers?: Record<string, string> | IncomingHttpHeaders | any): this {\n        this.original.writeHead(statusCode, headers);\n        return this;\n    }\n    /**\n     * Set HTTP status code\n     */\n    public status(code: number): this {\n        this.original.statusCode = code;\n        return this;\n    }\n    /**\n     * Set response header\n     */\n    public setHeader(key: string, value: string | number | string[]): this {\n        this.original.setHeader(key, value);\n        return this;\n    }\n    /**\n     * Get response header\n     */\n    public getHeader(key: string): string | number | string[] | undefined {\n        return this.original.getHeader(key);\n    }\n    /**\n     * Remove response header\n     */\n    public removeHeader(key: string): this {\n        this.original.removeHeader(key);\n        return this;\n    }\n    /**\n     * Set cookie\n     */\n    public setCookie(\n        name: string,\n        value: string,\n        options?: A_Response_CookieOptions\n    ): this {\n        this._cookies.set(name, { value, options });\n        return this;\n    }\n    /**\n     * Clear cookie\n     */\n    public clearCookie(name: string, options?: A_Response_CookieOptions): this {\n        const clearOptions = {\n            ...options,\n            expires: new Date(0),\n            maxAge: 0\n        };\n        this._cookies.set(name, { value: '', options: clearOptions });\n        return this;\n    }\n    // --------------------------------------------------------------------------\n    // Response Data manipulation methods\n    // --------------------------------------------------------------------------\n    /**\n     * Add data to response\n     */\n    public add(key: string, data: _ResponseType): this {\n        this._data.set(key, data);\n        return this;\n    }\n    /**\n     * Remove data from response\n     */\n    public remove(key: string): this {\n        this._data.delete(key);\n        return this;\n    }\n    /**\n     * Get data from response\n     */\n    public get(key: string): _ResponseType | undefined {\n        return this._data.get(key);\n    }\n    /**\n     * Check if response has data\n     */\n    public has(key: string): boolean {\n        return this._data.has(key);\n    }\n    /**\n     * Clear all response data\n     */\n    public clear(): this {\n        this._data.clear();\n        return this;\n    }\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // Internal handlers for request events\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n     * Handle response finish event\n     * \n     * @returns \n     */\n    protected handleFinish(): Promise<void> {\n        try {\n            return this.call(A_ResponseFeatures.onFinish) as Promise<void>;\n        } catch (error) {\n            return this.fail(new A_HttpServerError({\n                status: 500,\n                description: `Response finish error: ${error instanceof A_Error ? error.message : 'An error occurred while finishing the response.'}`,\n                originalError: error\n            }));\n        }\n    }\n    /**\n     * Handle response close event\n     */\n    protected async handleClose(): Promise<void> {\n        try {\n\n            await this.call(A_ResponseFeatures.onClose);\n\n        } catch (error) {\n\n            await this.fail(new A_HttpServerError({\n                status: 499,\n                description: 'Client closed the connection before the response could be completed.',\n                originalError: error\n            }));\n        }\n    }\n    // ======================================================================================\n    // --------------------------------------------------------------------------   \n    // A-Request Event-Emitter methods\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n     * Registers an event listener for a specific event\n     * \n     * @param event \n     * @param listener \n     */\n    on(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n        if (!this._listeners.has(event)) {\n            this._listeners.set(event, new Set());\n        }\n        this._listeners.get(event)!.add(listener);\n    }\n    /**\n     * Removes an event listener for a specific event\n     * \n     * @param event \n     * @param listener \n     */\n    off(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n        this._listeners.get(event)?.delete(listener);\n    }\n    /**\n     * Emits an event to all registered listeners\n     * \n     * @param event \n     */\n    emit(event: A_ResponseFeatureNames) {\n        this._listeners.get(event)?.forEach(async listener => {\n            listener(this);\n        });\n    }\n\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // A-Response Feature Default Extensions\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n\n    @A_Feature.Extend({\n        after: /.*/\n    })\n    async [A_ResponseFeatures.onSend](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ) {\n\n        const responseData = this._dataOverride || this.toResponse();\n\n        switch (true) {\n            case !!responseData && typeof responseData === 'object':\n                this.original.setHeader('Content-Type', `application/json; charset=${this._options.charset}`);\n                this.setDefaultResponseHeaders();\n                this.original.writeHead(this.statusCode);\n\n                // this.setCookieHeaders();\n                // this.setCacheHeaders();\n\n                this.original.end(JSON.stringify(responseData));\n                return;\n\n            case !!responseData && typeof responseData === 'string':\n                this.original.setHeader('Content-Type', `text/plain; charset=${this._options.charset}`);\n                this.setDefaultResponseHeaders();\n                this.original.writeHead(this.statusCode);\n\n                this.original.end(responseData);\n                return;\n\n            default:\n                this.setDefaultResponseHeaders();\n                this.original.writeHead(this.statusCode);\n\n                this.original.end(responseData);\n                return;\n        }\n    }\n\n    @A_Feature.Extend({\n        after: /.*/\n    })\n    async [A_ResponseFeatures.onRedirect](\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        ...args: any[]\n    ) {\n\n        if (!this._redirectURL) return;\n\n        this.original.setHeader('Location', this._redirectURL!);\n        if (!this.statusCode || (this.statusCode < 300 || this.statusCode > 399))\n            this.status(301);\n\n        this.original.end();\n    }\n\n    @A_Feature.Extend({\n        after: /.*/\n    })\n    async [A_ResponseFeatures.onError](\n        @A_Inject(A_HttpServerError) error: A_HttpServerError,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        @A_Inject(A_Request) request: A_Request,\n        ...args: any[]\n    ) {\n\n        if (this.headersSent) {\n            return;\n        }\n\n        const statusCode = error.status || 500;\n        this.status(statusCode);\n\n        const errorResponse = {\n            error: {\n                message: error.message,\n                status: statusCode,\n                description: error.description || '',\n            }\n        };\n\n        this.setDefaultResponseHeaders();\n        this.original.writeHead(this.statusCode);\n\n        this.original.end(JSON.stringify(errorResponse));\n    }\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // A-Response Helper Methods\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n  * Set standard response headers\n  */\n    protected setDefaultResponseHeaders(): void {\n        // Security headers\n        this.original.setHeader('X-Content-Type-Options', 'nosniff');\n        this.original.setHeader('X-Frame-Options', 'DENY');\n        this.original.setHeader('X-XSS-Protection', '1; mode=block');\n\n        // Request ID for tracking\n        this.original.setHeader('X-Request-ID', this.aseid.id);\n    }\n    /**\n     * Set cookie headers\n     */\n    protected setCookieHeaders(): void {\n        if (!this._options.enableCookies || this._cookies.size === 0) return;\n\n        const cookieStrings: string[] = [];\n\n        this._cookies.forEach(({ value, options }, name) => {\n            let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n            if (options) {\n                if (options.domain) cookieString += `; Domain=${options.domain}`;\n                if (options.path) cookieString += `; Path=${options.path}`;\n                if (options.maxAge) cookieString += `; Max-Age=${options.maxAge}`;\n                if (options.expires) cookieString += `; Expires=${options.expires.toUTCString()}`;\n                if (options.httpOnly) cookieString += '; HttpOnly';\n                if (options.secure) cookieString += '; Secure';\n                if (options.sameSite) cookieString += `; SameSite=${options.sameSite}`;\n            }\n\n            cookieStrings.push(cookieString);\n        });\n\n        this.original.setHeader('Set-Cookie', cookieStrings);\n    }\n    /**\n     * Set cache headers\n     */\n    protected setCacheHeaders(): void {\n        if (!this._cacheOptions) return;\n\n        const cacheControl: string[] = [];\n\n        if (this._cacheOptions.public) cacheControl.push('public');\n        if (this._cacheOptions.private) cacheControl.push('private');\n        if (this._cacheOptions.noCache) cacheControl.push('no-cache');\n        if (this._cacheOptions.noStore) cacheControl.push('no-store');\n        if (this._cacheOptions.mustRevalidate) cacheControl.push('must-revalidate');\n        if (this._cacheOptions.proxyRevalidate) cacheControl.push('proxy-revalidate');\n        if (this._cacheOptions.immutable) cacheControl.push('immutable');\n\n        if (this._cacheOptions.maxAge !== undefined) {\n            cacheControl.push(`max-age=${this._cacheOptions.maxAge}`);\n        }\n\n        if (this._cacheOptions.sMaxAge !== undefined) {\n            cacheControl.push(`s-maxage=${this._cacheOptions.sMaxAge}`);\n        }\n\n        if (cacheControl.length > 0) {\n            this.original.setHeader('Cache-Control', cacheControl.join(', '));\n        }\n\n        if (this._cacheOptions.etag) {\n            this.original.setHeader('ETag', this._cacheOptions.etag);\n        }\n\n        if (this._cacheOptions.lastModified) {\n            this.original.setHeader('Last-Modified', this._cacheOptions.lastModified.toUTCString());\n        }\n    }\n\n\n    // ======================================================================================\n    // --------------------------------------------------------------------------\n    // A-Response Serialization Methods\n    // --------------------------------------------------------------------------\n    // ======================================================================================\n    /**\n     * Convert accumulated data to response object\n     */\n    public toResponse(): _ResponseType {\n        const response = Array.from(this._data.entries()).reduce((acc, [key, value]) => {\n            if (value instanceof A_Entity) {\n                acc[key] = value.toJSON();\n            } else {\n                acc[key] = value;\n            }\n            return acc;\n        }, {} as any);\n\n        return response;\n    }\n    /**\n     * Enhanced JSON serialization for logging/debugging\n     */\n    public toJSON(): A_Response_Serialized<_ResponseType> {\n        return {\n            ...super.toJSON(),\n            status: this.statusCode,\n            headersSent: this.headersSent,\n            size: this.size,\n            data: this.toResponse(),\n            redirectURL: this._redirectURL,\n        };\n    }\n}","import { A_Error } from \"@adaas/a-concept\"\n\n\nexport class A_ResponseError extends A_Error {\n\n}","\n\n\nexport const A_HttpServerFeatures = {\n    onBeforeRequest: '_A_HTTPServer_onBeforeRequest',\n    onRequest: '_A_HTTPServer_onRequest',\n    onAfterRequest: '_A_HTTPServer_onAfterRequest',\n} as const\n\n","import { A_Route } from '@adaas/a-utils/a-route';\nimport { A_ServerRouteHttpMethodNames } from './A-ServerRoute.types';\n\n\n\nexport class A_ServerRoute extends A_Route {\n\n    public url!: string;\n    public method!: A_ServerRouteHttpMethodNames;\n\n\n    constructor(\n        url: string | RegExp,\n        method: A_ServerRouteHttpMethodNames\n    )\n    constructor(\n        url: string | RegExp,\n    )\n    constructor(\n        param1: string | RegExp,\n        param2?: A_ServerRouteHttpMethodNames\n    ) {\n        super(param1);\n        this.url = param1 instanceof RegExp ? param1.source : param1;\n        this.method = param2 || 'GET';\n    }\n\n\n    toString(): string {\n        // path can be like /api/v1/users/:id\n        // and because of that :id we need to replace it with regex that matches chars and numbers only   \n        return `${this.method}::${this.path}`;\n\n        // .replace(/\\/:([^\\/]+)/g, '\\\\/([^\\/]+)')\n    }\n\n    toRegExp(): RegExp {\n        return new RegExp(`^${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n    }\n\n    toAFeatureExtension(extensionScope: Array<string> = []): RegExp {\n        return new RegExp(`^${extensionScope.length\n            ? `(${extensionScope.join('|')})`\n            : '.*'\n            }\\\\.${this.method}::${this.path.replace(/\\/:([^\\/]+)/g, '/([^/]+)')}$`);\n    }\n}\n\n","import { A_Error, A_Feature, A_Inject, A_Scope, } from \"@adaas/a-concept\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ResponseFeatures } from \"@adaas/a-server/response/A-Response.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\n\n\nexport class A_ServerLogger extends A_Logger {\n\n    protected declare config: A_Config<any>\n\n\n\n    @A_Feature.Extend({\n        name: A_ResponseFeatures.onSend,\n        scope: [A_Response]\n    })\n    logRequestFinish(\n        @A_Inject(A_Request) request: A_Request,\n        @A_Inject(A_Response) response: A_Response,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n    ) {\n\n        this.info('green', `Request ${request.method} ${request.url} finished with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n    }\n\n\n    @A_Feature.Extend({\n        name: A_ResponseFeatures.onError,\n        scope: [A_Response]\n    })\n    logResponseError(\n        @A_Inject(A_Request) request: A_Request,\n        @A_Inject(A_Response) response: A_Response,\n        @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n        @A_Inject(A_Error) error: A_Error,\n    ) {\n        this.info('red', `Request ${request.method} ${request.url} errored with status ${response.statusCode} in ${context.processingTime ?? 'N/A'}ms`);\n        this.error(error);\n    }\n\n\n\n\n    // @A_Feature.Extend({\n    //     name: A_ServiceFeatures.onAfterStart,\n    //     scope: [A_Service]\n    // })\n    // logStart(\n    //     @A_Inject(A_Service) container: A_Service,\n    // ): void {\n    //     // this.serverReady({\n    //     //     port: container.port,\n    //     //     app: {\n    //     //         name: container.name,\n    //     //     }\n    //     // })\n    // }\n\n\n\n\n    @A_Feature.Extend({\n        name: A_ServiceFeatures.onAfterStop,\n        scope: [A_Service]\n    })\n    logStop(\n        @A_Inject(A_Scope) scope: A_Scope,\n    ) {\n        this.info('red', `Server ${scope.name} stopped`);\n    }\n\n\n\n\n    serverReady(\n        params: {\n            port: number,\n\n            app: {\n                name: string,\n                version?: string\n            }\n        }\n    ) {\n        const processId = process.pid;\n\n        this.info('cyan',\n            ` ${params.app.name} v${params.app.version || '0.0.1'} is running on port ${params.port}`,\n            ` Process ID: ${processId}`,\n            ` Open In Browser: http://localhost:${params.port}`,\n            ``,\n            `-------------------------------`,\n            ` ==============================`,\n            `          LISTENING...      `,\n            ` ==============================`\n        );\n    }\n\n\n    /**\n     * Displays a proxy routes \n     * \n     * @param params \n     */\n    proxy(\n        params: {\n            original: string,\n            destination: string,\n        }\n    ) {\n        console.log(`\\x1b[35m[${this.scope.name}] |${this.getTime()}| Proxy:\n${' '.repeat(this.scopeLength + 3)}| ${params.original} -> ${params.destination}\n${' '.repeat(this.scopeLength + 3)}|-------------------------------\\x1b[0m`);\n    }\n\n}","import type { IncomingMessage, Server, ServerResponse } from \"http\";\nimport { A_HttpServerFeatures } from \"./A-HttpServer.constants\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_TYPES__ServerENVVariables } from \"@adaas/a-server/constants/env.constants\";\nimport { A_Dependency, A_Error, A_Feature, A_IdentityHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_HttpServerRequestMethod } from \"./A-HttpServer.types\";\nimport { A_HttpServerError } from \"./A-HttpServer.error\";\nimport { A_RequestFeatures } from \"@adaas/a-server/request/A-Request.constants\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport { A_Service, A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\n\n\n\n\n/**\n * A-Service is a container that can run different types of services, such as HTTP servers, workers, etc.\n * Depending on the provided config and configuration, it will load the necessary components and start the service.\n * \n */\nexport class A_HttpServer extends A_Service {\n\n    protected server!: Server;\n\n\n    static get onBeforeRequest() {\n        return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n            return A_Feature.Extend({\n                name: A_HttpServerFeatures.onBeforeRequest,\n                scope: [A_HttpServer],\n            })(target, propertyKey, descriptor);\n        }\n    }\n\n    static get onRequest() {\n        return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n            return A_Feature.Extend({\n                name: A_HttpServerFeatures.onRequest,\n                scope: [A_HttpServer],\n            })(target, propertyKey, descriptor);\n        }\n    }\n\n    static get onAfterRequest() {\n        return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n            return A_Feature.Extend({\n                name: A_HttpServerFeatures.onAfterRequest,\n                scope: [A_HttpServer],\n            })(target, propertyKey, descriptor);\n        }\n    }\n\n\n\n    @A_Feature.Extend()\n    protected async [A_ServiceFeatures.onStart](\n\n        @A_Dependency.Required()\n        @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n\n        @A_Dependency.Required()\n        @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n\n    ): Promise<void> {\n        const http = await polyfill.http();\n\n        // Create the HTTP server\n        this.server = http.createServer(this.handleRequest.bind(this));\n\n        // Start listening on the specified port\n        await this.listen(config.get('A_SERVER_PORT'));\n    }\n\n    @A_Feature.Extend()\n    protected async [A_ServiceFeatures.onAfterStart](\n        @A_Inject(A_Config) config: A_Config<A_TYPES__ServerENVVariables>,\n        @A_Inject(A_ServerLogger) logger: A_ServerLogger,\n    ): Promise<void> {\n        logger.serverReady({\n            port: config.get('A_SERVER_PORT'),\n            app: {\n                name: this.scope.name,\n            }\n        });\n    }\n\n    protected async [A_ServiceFeatures.onStop](...args: any[]): Promise<void> {\n        await this.close();\n    }\n\n    close() {\n        return new Promise<void>((resolve, reject) => {\n            this.server.close(() => {\n                resolve();\n            });\n        });\n    }\n\n    listen(port: number) {\n        return new Promise<void>((resolve, reject) => {\n            this.server.listen(port, () => {\n                resolve();\n            });\n        });\n    }\n\n\n    // ======================================================================================\n    // ============================= A_HttpServer Lifecycle =================================\n    // ======================================================================================\n\n    @A_Feature.Extend()\n    protected async [A_HttpServerFeatures.onBeforeRequest](...args: any[]) { }\n\n    @A_Feature.Extend()\n    protected async [A_HttpServerFeatures.onRequest](...args: any[]) { }\n\n    @A_Feature.Extend()\n    protected async [A_HttpServerFeatures.onAfterRequest](...args: any[]) { }\n\n\n    // ======================================================================================\n    // ============================= A_HttpServer Methods =================================\n    // ======================================================================================\n\n    async handleRequest(\n        request: IncomingMessage,\n        response: ServerResponse\n    ) {\n        const route = new A_ServerRoute(\n            request.url || '',\n            request.method as A_HttpServerRequestMethod\n        );\n\n        const id = A_IdentityHelper.generateTimeId();\n        const shard = `${request.method}-${route.path.replace('/', '-')}`;\n\n        const req = new A_Request({ id, shard, request, scope: this.scope.name });\n        const res = new A_Response({ id, shard, response, scope: this.scope.name });\n        const context = new A_HttpServerRequestContext(request, response);\n\n        const scope = new A_Scope({\n            name: id,\n            entities: [req, res],\n            fragments: [route, context]\n        }).inherit(this.scope);\n\n        try {\n            const onBeforeRequestFeature = new A_Feature({\n                name: A_HttpServerFeatures.onBeforeRequest,\n                component: this\n            });\n\n            const onRequestFeature = new A_Feature({\n                name: A_HttpServerFeatures.onRequest,\n                component: this\n            });\n\n            const onAfterRequestFeature = new A_Feature({\n                name: A_HttpServerFeatures.onAfterRequest,\n                component: this\n            });\n\n            await new Promise<void>(async (resolve, reject) => {\n\n                const cleanup = () => {\n                    onBeforeRequestFeature.interrupt();\n                    onRequestFeature.interrupt();\n                    onAfterRequestFeature.interrupt();\n\n                    req.off(A_RequestFeatures.onError, cleanup);\n                    req.off(A_RequestFeatures.onClose, cleanup);\n                    req.off(A_RequestFeatures.onTimeout, cleanup);\n\n\n                    reject(scope.resolve(A_Error)!);\n                }\n\n\n                req.on(A_RequestFeatures.onError, cleanup.bind(this));\n                req.on(A_RequestFeatures.onClose, cleanup.bind(this));\n\n                try {\n                    await req.load();\n                    await res.load();\n\n\n                    await onBeforeRequestFeature.process(scope);\n\n                    await onRequestFeature.process(scope);\n\n                    await onAfterRequestFeature.process(scope);\n\n\n                    req.clearTimeout();\n\n                    // For SSE streams the controller calls response.sseOpen() which keeps\n                    // the socket alive; skip the auto-send so we don't close it here.\n                    if (!res.isStreaming) {\n                        await res.status(200).send();\n                    }\n\n                    resolve();\n                } catch (error) {\n\n                    req.clearTimeout();\n                    reject(error);\n                }\n            });\n\n        } catch (error) {\n\n            let wrappedError;\n\n            switch (true) {\n                case error instanceof A_HttpServerError:\n                    wrappedError = error;\n                    break;\n\n                case error instanceof A_Error && error.originalError instanceof A_HttpServerError:\n                    wrappedError = error.originalError;\n                    break;\n\n                // Duck-type: A_Error (e.g. A_FeatureError) wrapping an HttpError-like original.\n                // A_Error.fromConstructor() unwraps nested A_Error chains, so originalError is\n                // always the root non-A_Error cause — check it for a numeric statusCode.\n                case error instanceof A_Error &&\n                    error.originalError instanceof Error &&\n                    typeof (error.originalError as any).statusCode === 'number':\n                    wrappedError = new A_HttpServerError({\n                        status: (error.originalError as any).statusCode as number,\n                        description: (error.originalError as Error).message,\n                        originalError: error.originalError,\n                    });\n                    break;\n\n                // Duck-type: any Error with a numeric statusCode property (e.g. http-errors,\n                // Express-style errors, or plain project HttpError classes).  Honour the\n                // status code so the caller gets the right 4xx / 5xx rather than a blanket 500.\n                case error instanceof Error && typeof (error as any).statusCode === 'number':\n                    wrappedError = new A_HttpServerError({\n                        status: (error as any).statusCode as number,\n                        description: error.message,\n                        originalError: error,\n                    });\n                    break;\n\n                default:\n                    wrappedError = new A_HttpServerError({\n                        status: 500,\n                        description: 'An error occurred while processing the request.',\n                        originalError: error\n                    })\n                    break;\n            }\n\n\n            scope.register(wrappedError);\n\n            await res.fail(wrappedError);\n\n            await this.call(A_ServiceFeatures.onError, scope);\n        }\n\n        scope.destroy();\n    }\n\n}\n\n\n\n\n\n\n\n\n","import { A_Fragment, A_TYPES__Required } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ServerConstructor } from \"./A-Server.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\nexport class A_Server extends A_Fragment {\n\n    public port: number;\n    public version: string;\n    protected _routes: A_ServerRoute[] = [];\n\n    constructor(\n        params: A_TYPES__Required<Partial<A_SERVER_TYPES__ServerConstructor>, [\n            'port',\n            'name'\n        ]>\n    ) {\n        super(params);\n\n        this.port = params.port;\n        this._name = params.name;\n        this.version = params.version || 'v1';\n\n        this._routes = params.routes || this._routes;\n    }\n\n\n    /**\n     * A list of routes that the server will listen to\n     */\n    get routes(): A_ServerRoute[] {\n        return this._routes\n    }\n\n}\n\n\n","import { A_Error } from '@adaas/a-concept';\nimport { A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized } from './A-Server.types';\n\n\nexport class A_ServerError extends A_Error<A_SERVER_TYPES__ServerError_Init, A_SERVER_TYPES__ServerError_Serialized> {\n\n    status: number = 500;\n\n\n    protected fromConstructor(params: A_SERVER_TYPES__ServerError_Init): void {\n        super.fromConstructor(params);\n        if (params.status) {\n            this.status = params.status;\n        }\n    }\n\n\n    toJSON(): A_SERVER_TYPES__ServerError_Serialized {\n        return {\n            ...super.toJSON(),\n            status: this.status\n        }\n    }\n}\n\n\n","export const A_ServerRouteHttpMethods = {\n    DEFAULT: 'DEFAULT',\n    GET: 'GET',\n    POST: 'POST',\n    PUT: 'PUT',\n    DELETE: 'DELETE',\n    PATCH: 'PATCH',\n    OPTIONS: 'OPTIONS',\n    HEAD: 'HEAD',\n    CONNECT: 'CONNECT',\n    TRACE: 'TRACE',\n} as const\n\n\nexport const A_ServerRouteProtocols = {\n    HTTP: 'http',\n    HTTPS: 'https',\n    WS: 'ws',\n    WSS: 'wss',\n} as const","\n\nexport const A_ServerRouterMetaKeys = {\n    ROUTES: '_A_ServerRouterMeta_ROUTES',\n    ROUTES_CONFIGS: '_A_ServerRouterMeta_ROUTES_CONFIGS',\n} as const\n\n\n","import { A_ComponentMeta } from \"@adaas/a-concept\";\nimport { A_ServerRouterMetaStructure, A_ServerRouterRouteDefinition } from \"./A-ServerRouter.types\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouterMetaKeys } from \"./A-ServerRouter.constants\";\n\n\n\nexport class A_ServerRouterMeta extends A_ComponentMeta<A_ServerRouterMetaStructure> {\n\n\n    get routes(): Array<A_ServerRoute> {\n        return this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n    }\n\n\n    get definitions(): Map<string, A_ServerRouterRouteDefinition> {\n        return this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n    }\n\n\n    addRoute(regexp: RegExp, route: A_ServerRouterRouteDefinition) {\n        const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n        existingRoutes.set(regexp.source, route);\n        this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n        const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n        existingRoutesConfigs.push(route.route);\n        this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n    }\n\n\n    removeRoute(route: A_ServerRoute) {\n        const existingRoutes = this.meta.get(A_ServerRouterMetaKeys.ROUTES) as Map<string, A_ServerRouterRouteDefinition> || new Map<string, A_ServerRouterRouteDefinition>();\n        existingRoutes.forEach((value, key) => {\n            if (value.route === route) {\n                existingRoutes.delete(key);\n            }\n        });\n        this.meta.set(A_ServerRouterMetaKeys.ROUTES, existingRoutes);\n\n        const existingRoutesConfigs = this.meta.get(A_ServerRouterMetaKeys.ROUTES_CONFIGS) as Array<A_ServerRoute> || [];\n        const index = existingRoutesConfigs.indexOf(route);\n        if (index !== -1) {\n            existingRoutesConfigs.splice(index, 1);\n        }\n        this.meta.set(A_ServerRouterMetaKeys.ROUTES_CONFIGS, existingRoutesConfigs);\n    }\n}","import { A_Component, A_Context, A_Feature_Define, A_Feature_Extend, A_TYPES__MetaLinkedComponentConstructors } from \"@adaas/a-concept\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRoute } from \"../A-ServerRoute/A-ServerRoute.entity\";\nimport { A_ServerRouter } from \"./A-ServerRouter.component\";\n\n/**\n * \n * This decorator should allow to set a default meta type for the class, this helps to avoid\n * the need to create custom meta classes for each class.\n * \n * @returns \n */\nexport function A_ServerRouterDefineDecorator(route: A_ServerRoute) {\n    return function <TTarget extends A_TYPES__MetaLinkedComponentConstructors>(\n        target: A_Component,\n        propertyKey: string,\n        descriptor: PropertyDescriptor\n    ) {\n\n        const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(A_ServerRouter);\n\n        const searchKey = route.toAFeatureExtension(['A_ServerRouter', 'A_Service']);\n\n        meta.addRoute(searchKey, {\n            component: target,\n            handler: propertyKey,\n            route\n        });\n\n        A_Feature_Define({\n            name: searchKey.source,\n            invoke: false\n        })(target, propertyKey, descriptor)\n\n        return A_Feature_Extend(searchKey)(target, propertyKey, descriptor);\n    }\n}","import {\n    A_Component,\n    A_Concept,\n    A_Context,\n    A_Feature,\n    A_Inject,\n    A_Meta,\n    A_Scope,\n    A_TypeGuards,\n    A_TYPES__Required\n} from \"@adaas/a-concept\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_ServerLogger } from \"../A-ServerLogger/A-ServerLogger.component\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_ServerRouteHttpMethodNames } from \"@adaas/a-server/route/A-ServerRoute.types\";\nimport { A_ServerRouteHttpMethods } from \"@adaas/a-server/route/A-ServerRoute.constants\";\nimport { A_ServerRouterMeta } from \"./A-ServerRouter.meta\";\nimport { A_ServerRouterDefineDecorator } from \"./A-ServerRouterDefine.decorator\";\nimport { A_ServerRouterRouteConfig } from \"./A-ServerRouter.types\";\n\n\n\n@A_Meta.Define(A_ServerRouterMeta)\nexport class A_ServerRouter extends A_Component {\n\n    // =======================================================\n    // ================ Method Definition=====================\n    // =======================================================\n\n    /**\n     * Allows to define a custom route for POST requests\n     * \n     * @param path \n     * @returns \n     */\n    static Post(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.POST,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for GET requests\n     * \n     * @param path \n     * @returns \n     */\n    static Get(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.GET,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for PUT requests\n     * \n     * @param path \n     * @returns \n     */\n    static Put(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.PUT,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for DELETE requests\n     * \n     * @param path \n     * @returns \n     */\n    static Delete(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.DELETE,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for PATCH requests\n     * \n     * @param path \n     * @returns \n     */\n    static Patch(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.PATCH,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n    /**\n     * Allows to define a custom route for DEFAULT requests\n     * \n     * @param path \n     * @returns \n     */\n    static Default(path: string | A_ServerRoute | RegExp | A_TYPES__Required<Partial<A_ServerRouterRouteConfig>, ['path']>) {\n        return this.defineRoute({\n            method: A_ServerRouteHttpMethods.DEFAULT,\n            path: typeof path === 'object' && 'path' in path ? path.path : path,\n            version: typeof path === 'object' && 'version' in path && path.version ? path.version : 'v1',\n            prefix: typeof path === 'object' && 'prefix' in path && path.prefix ? path.prefix : 'api',\n        });\n    }\n\n\n    // static routes: Array<A_ServerRoute> = [];\n\n    /**\n     * Private method to have the same signature for all route methods\n     * \n     * @param method \n     * @param path \n     * @returns \n     */\n    private static defineRoute(\n        config: A_ServerRouterRouteConfig & { method: A_ServerRouteHttpMethodNames }\n    ) {\n        const route = typeof config.path === 'string' || config.path instanceof RegExp\n            ? new A_ServerRoute(\n                `/${config.prefix}/${config.version}${config.path instanceof RegExp ? config.path.source : config.path.startsWith('/') ? config.path : `/${config.path}`}`,\n                config.method)\n            : config.path;\n\n        return A_ServerRouterDefineDecorator(route);\n    }\n\n\n    // =====================================================\n    // ================ Concept Lifecycle ========================\n    // =====================================================\n\n    @A_Concept.Load()\n    protected async load(\n        @A_Inject(A_ServerLogger) logger: A_ServerLogger\n    ): Promise<void> {\n        const meta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n        const routes = meta.routes;\n\n        if (!routes || !routes.length) {\n            logger.warning('yellow', `No routes defined for ${this.constructor.name}`);\n            return;\n        }\n\n\n        logger.info('cyan',\n            `Registered Routes:`,\n            `------------------------------------\\n`,\n            ...routes\n                .map(route => `[${route.method.toUpperCase()}]${' '.repeat(7 - route.method.length)} ${route.path}`)\n\n        );\n    }\n\n\n\n    // =======================================================\n    // ================ Feature Definition=====================\n    // =======================================================\n    // @A_Feature.Define({\n    //     invoke: false\n    // })\n    @A_Feature.Extend({\n        name: A_HttpServerFeatures.onRequest,\n    })\n    async identifyRoute(\n        @A_Inject(A_Request) request: A_Request,\n        @A_Inject(A_Response) response: A_Response,\n        @A_Inject(A_Scope) scope: A_Scope,\n        @A_Inject(A_Config) config: A_Config,\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_ServerRoute) route: A_ServerRoute,\n    ) {\n        if (route.method === 'OPTIONS') {\n            // Ignore OPTIONS requests\n            return;\n        }\n        /**\n         * just execute all listeners on the Route\n         * url example: /api/v1/users/123\n         * OR\n         * url example: /api/v1/users\n         * => Then The feature will be \"GET::/api/v1/users\"\n         * And it will return all stages that are similar to the feature name \n         */\n\n        const feature = new A_Feature({ name: route.toString(), component: this, })\n\n        if (!feature.size)\n            throw new A_HttpServerError({\n                status: 404,\n                title: 'Route Not Found',\n                description: `No route found for ${request.method} ${request.url}`,\n            })\n\n\n        for (const stage of feature) {\n\n            const targetConstructor = stage.definition.dependency.target;\n\n            if (A_TypeGuards.isComponentConstructor(targetConstructor)) {\n\n                const meta: A_ServerRouterMeta = A_Context.meta<A_ServerRouterMeta>(this.constructor as any);\n\n                const routeDefinitions = meta.definitions;\n\n                const routeDefinition = routeDefinitions?.get(stage.definition.name || '');\n\n\n\n\n                if (routeDefinition) {\n                    request.useRoute(routeDefinition.route);\n                }\n            }\n\n            const stageScope = new A_Scope({\n                name: `a-route--${request.id}--${stage.definition.name}`,\n            }, {\n                parent: scope\n            });\n\n\n            await stage.process(stageScope);\n        }\n\n    }\n}","import { A_Component, A_Container, A_Context, A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerError } from \"../A-Server/A-HttpServer.error\";\n\n\n\nexport class A_ServerController extends A_Component {\n\n\n    @A_ServerRouter.Post({\n        path: '/:component/:operation',\n        version: 'v1',\n        prefix: 'a-component'\n    })\n    async callEntityMethod(\n        @A_Inject(A_Request) request: A_Request<any, any, {\n            component: string,\n            operation: string\n        }>,\n        @A_Inject(A_Response) response: A_Response,\n        @A_Inject(A_Scope) scope: A_Scope\n    ) {\n\n        if (!scope.has(request.params.component))\n            throw new A_HttpServerError({\n                status: 404,\n                description: `Component \"${request.params.component}\" not found`,\n            });\n\n        if (!request.params.operation || typeof request.params.operation !== 'string')\n            throw new A_HttpServerError({\n                status: 400,\n                description: 'Missing or invalid \"operation\" parameter',\n            });\n\n        const possibleComponent = scope.resolve(request.params.component);\n\n        if (\n            !possibleComponent\n            ||\n            ![A_Component, A_Container]\n                .some(c => possibleComponent instanceof c)\n        )\n            throw new A_HttpServerError({\n                status: 404,\n                description: `\"${request.params.component}\" is not a valid component`,\n            });\n\n        const component = possibleComponent as A_Component | A_Container;\n\n        const meta = A_Context.meta(component);\n\n        const targetFeature = meta.features().find(f => f.name === `${component.constructor.name}.${request.params.operation}`);\n\n        if (!targetFeature)\n            throw new A_HttpServerError({\n                status: 404,\n                description: `Operation \"${request.params.operation}\" not found on component \"${request.params.component}\"`,\n            });\n\n        await component.call(request.params.operation, scope);\n    }\n}","import { A_Fragment, A_TYPES__Fragment_Serialized } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__A_EntityListPagination } from \"./A-EntityList.types\";\n\n\nexport type A_SERVER_TYPES__A_EntityListPaginationSerialized =\n    A_SERVER_TYPES__A_EntityListPagination & A_TYPES__Fragment_Serialized;\n\n\nexport class A_ServerEntityListPagination extends A_Fragment<A_SERVER_TYPES__A_EntityListPaginationSerialized> {\n\n    protected _total: number = 0;\n    protected _page: number = 1;\n    protected _pageSize: number = 10;\n\n    constructor(init?: Partial<A_SERVER_TYPES__A_EntityListPagination>) {\n        super();\n        if (init) {\n            if (init.total !== undefined) this._total = init.total;\n            if (init.page !== undefined) this._page = init.page;\n            if (init.pageSize !== undefined) this._pageSize = init.pageSize;\n        }\n    }\n\n    get total(): number { return this._total; }\n    get page(): number { return this._page; }\n    get pageSize(): number { return this._pageSize; }\n\n    update(data: Partial<A_SERVER_TYPES__A_EntityListPagination>): void {\n        if (data.total !== undefined) this._total = data.total;\n        if (data.page !== undefined) this._page = data.page;\n        if (data.pageSize !== undefined) this._pageSize = data.pageSize;\n    }\n\n    fromJSON(serialized: A_SERVER_TYPES__A_EntityListPaginationSerialized): void {\n        this._total = serialized.total;\n        this._page = serialized.page;\n        this._pageSize = serialized.pageSize;\n    }\n\n    toJSON(): A_SERVER_TYPES__A_EntityListPaginationSerialized {\n        return {\n            name: this.name,\n            total: this._total,\n            page: this._page,\n            pageSize: this._pageSize,\n        };\n    }\n}\n","import { A_Fragment, A_TYPES__Fragment_Serialized } from \"@adaas/a-concept\";\n\n\nexport class A_ServerEntityListCacheState extends A_Fragment<A_TYPES__Fragment_Serialized> {\n\n    protected _timestamp?: number;\n    protected _ttl?: number;\n\n    set(ttlMs: number): void {\n        this._timestamp = Date.now();\n        this._ttl = ttlMs;\n    }\n\n    invalidate(): void {\n        this._timestamp = undefined;\n        this._ttl = undefined;\n    }\n\n    isValid(): boolean {\n        if (this._timestamp === undefined || this._ttl === undefined) return false;\n        return (Date.now() - this._timestamp) < this._ttl;\n    }\n\n    toJSON(): A_TYPES__Fragment_Serialized {\n        return { name: this.name };\n    }\n}\n","import {\n    A_Context, A_Entity, A_Scope,\n    A_TYPES__Entity_Constructor,\n    ASEID,\n} from \"@adaas/a-concept\";\nimport {\n    A_SERVER_TYPES__A_EntityListConstructor,\n    A_SERVER_TYPES__A_EntityListPagination,\n    A_SERVER_TYPES__A_EntityListSerialized\n} from \"./A-EntityList.types\";\nimport { A_ServerEntityListPagination } from \"./A-EntityListPagination.context\";\nimport { A_ServerEntityListCacheState } from \"./A-EntityListCacheState.context\";\n\n\n\n/**\n * A-EntityList\n *\n * Typed, paginated list of A-Concept entities.\n *\n * Construction (user-facing):\n *   new A_ServerEntityList<User>({ entity: User, pagination: { page: 1, pageSize: 20 } })\n *\n * Construction (controller-internal, backward-compat):\n *   new A_ServerEntityList({ name: 'user', scope: 'my-scope', constructor: User })\n */\nexport class A_ServerEntityList<\n    EntityType extends A_Entity = A_Entity,\n> extends A_Entity<\n    A_SERVER_TYPES__A_EntityListConstructor<EntityType>,\n    A_SERVER_TYPES__A_EntityListSerialized<EntityType>\n> {\n\n    static get scope(): string {\n        return 'a-server';\n    }\n\n    protected _entityConstructor!: A_TYPES__Entity_Constructor<EntityType>;\n\n    /**\n     * Ordered item references for O(1) positional access.\n     * The list's own scope is the authoritative store (enables @A_Inject and\n     * feature chains on items); this array mirrors the same items in order.\n     */\n    protected _items: Array<EntityType> = [];\n\n    /** Lazily allocated private scope — pagination and cache state live here. */\n    private _ownScope?: A_Scope;\n\n\n    // ── Getters ──────────────────────────────────────────────────────────────\n\n    /**\n     * The list's own scope, created on first access and bound to this entity\n     * via A_Context.allocate.  Items, pagination and cache state are registered\n     * here so they participate in feature chains and @A_Inject resolution.\n     */\n    get ownScope(): A_Scope {\n        if (!this._ownScope) {\n            this._ownScope = A_Context.allocate(\n                this,\n                new A_Scope({ name: `${this.aseid.id}-scope` })\n            );\n        }\n        return this._ownScope;\n    }\n\n    get entityConstructor(): A_TYPES__Entity_Constructor<EntityType> {\n        return this._entityConstructor;\n    }\n\n    get items(): Array<EntityType> {\n        return this._items;\n    }\n\n    /** Pagination state — lives as a Fragment in the list's own scope. */\n    get pagination(): A_ServerEntityListPagination {\n        return this.ownScope.resolveFlatOnce(A_ServerEntityListPagination)!;\n    }\n\n    private get cacheState(): A_ServerEntityListCacheState {\n        return this.ownScope.resolveFlatOnce(A_ServerEntityListCacheState)!;\n    }\n\n    /** Total number of items currently held in memory. */\n    get length(): number {\n        return this._items.length;\n    }\n\n\n    // ── Initialisation ───────────────────────────────────────────────────────\n\n    fromNew(newEntity: A_SERVER_TYPES__A_EntityListConstructor<EntityType>): void {\n        this.aseid = this.generateASEID({\n            concept: A_Context.root.name,\n            entity: 'a-list.' + newEntity.entity.name,\n        });\n\n        this._entityConstructor = newEntity.entity;\n\n        // Initialise state Fragments in the list's own scope\n        this.ownScope.register(new A_ServerEntityListPagination(newEntity.pagination));\n        this.ownScope.register(new A_ServerEntityListCacheState());\n    }\n\n\n    /**\n     * Populate the list from raw repository data.\n     * Items are registered in the list's own scope so they participate in\n     * feature chains and @A_Inject resolution.\n     */\n    fromList(\n        items: Array<EntityType> | Array<ReturnType<EntityType['toJSON']>>,\n        pagination?: A_SERVER_TYPES__A_EntityListPagination\n    ) {\n        // Deregister previous items from own scope\n        this._items.forEach(item => {\n            try { this.ownScope.deregister(item); } catch { /* already gone */ }\n        });\n\n        this._items = items.map(item => {\n            const entity = item instanceof A_Entity\n                ? item as EntityType\n                : new this._entityConstructor(item as any);\n            this.ownScope.register(entity);\n            return entity;\n        });\n\n        if (pagination) {\n            this.pagination.update(pagination);\n        }\n    }\n\n\n    // ── Collection access ────────────────────────────────────────────────────\n\n    /** Return the item at `index`, or `undefined` if out of range. */\n    at(index: number): EntityType | undefined {\n        return this._items[index];\n    }\n\n    /** Replace the item at `index` in place. Accepts a live entity or a plain serialised object. */\n    replace(index: number, item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        try { this.ownScope.deregister(this._items[index]); } catch { /* ok */ }\n        this.ownScope.register(next);\n        this._items[index] = next;\n        return this;\n    }\n\n    /** Append an item to the end of the list. */\n    push(item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        this.ownScope.register(next);\n        this._items.push(next);\n        return this;\n    }\n\n    /** Prepend an item to the beginning of the list. */\n    unshift(item: EntityType | ReturnType<EntityType['toJSON']>): this {\n        const next = item instanceof A_Entity\n            ? item as EntityType\n            : new this._entityConstructor(item as any);\n        this.ownScope.register(next);\n        this._items.unshift(next);\n        return this;\n    }\n\n    /** Remove the item at `index` from the list. */\n    remove(index: number): this {\n        const [removed] = this._items.splice(index, 1);\n        if (removed) {\n            try { this.ownScope.deregister(removed); } catch { /* ok */ }\n        }\n        return this;\n    }\n\n    /** Return the first item that satisfies `predicate`, or `undefined`. */\n    find(predicate: (item: EntityType, index: number) => boolean): EntityType | undefined {\n        return this._items.find(predicate);\n    }\n\n    /** Return all items that satisfy `predicate` without mutating the list. */\n    filter(predicate: (item: EntityType, index: number) => boolean): EntityType[] {\n        return this._items.filter(predicate);\n    }\n\n\n    // ── Caching ──────────────────────────────────────────────────────────────\n\n    /**\n     * Mark this list as cached for `ttlMs` milliseconds from now.\n     * Callers can check `isCached()` to decide whether to skip `load()`.\n     */\n    setCache(ttlMs: number): this {\n        this.cacheState.set(ttlMs);\n        return this;\n    }\n\n    /** Returns `true` if the cache is still valid. */\n    isCached(): boolean {\n        return this.cacheState.isValid();\n    }\n\n    /** Invalidate the cache so the next `load()` call fetches fresh data. */\n    invalidateCache(): this {\n        this.cacheState.invalidate();\n        return this;\n    }\n\n\n    // ── Serialisation ────────────────────────────────────────────────────────\n\n    toJSON(): A_SERVER_TYPES__A_EntityListSerialized<EntityType> {\n        const { total, page, pageSize } = this.pagination;\n        return {\n            ...super.toJSON(),\n            items: this._items.map(i => i.toJSON()) as ReturnType<EntityType['toJSON']>[],\n            type: (this._entityConstructor as any).entity ?? 'unknown',\n            pagination: { total, page, pageSize },\n        };\n    }\n}\n\n","import { A_Entity, A_TYPES__Entity_Constructor, A_TYPES__Entity_Serialized } from \"@adaas/a-concept\";\n\n\nexport type A_SERVER_TYPES__A_EntityListConstructor<\n    T extends A_Entity = A_Entity\n> = {\n    /** User-facing: the entity class (e.g. `User`). Name and scope are derived from its statics. */\n    entity: A_TYPES__Entity_Constructor<T>;\n    /** Initial pagination request parameters. Defaults to page 1, pageSize 10. */\n    pagination?: {\n        page?: number;\n        pageSize?: number;\n    };\n};\n\nexport enum A_SERVER_TYPES__A_EntityListEvent {\n    Load = 'load',\n}\n\nexport type A_SERVER_TYPES__A_EntityListSerialized<EntityTypes extends A_Entity = A_Entity> = {\n    items: Array<ReturnType<EntityTypes['toJSON']>>,\n    type: string,\n    pagination: A_SERVER_TYPES__A_EntityListPagination\n} & A_TYPES__Entity_Serialized;\n\n\nexport type A_SERVER_TYPES__A_EntityListPagination = {\n    total: number,\n    page: number,\n    pageSize: number,\n};\n\nexport type A_SERVER_TYPES__A_EntityListCacheEntry = {\n    timestamp: number;\n    ttl: number;\n};\n\n","import { A_Fragment } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerListQueryFilter<FilterFields extends string[]> extends A_Fragment {\n\n    protected parsedQuery!: Record<FilterFields[number], string>;\n\n    constructor(\n        protected _query: string | Partial<Record<FilterFields[number], string>> = {},\n        protected defaults: Partial<Record<FilterFields[number], string>> = {}\n    ) {\n        super();\n        this.parsedQuery = this.parseQueryString(_query);\n    }\n\n\n    get query() {\n        return this._query;\n    }\n\n\n    get(property: FilterFields[number], defaultValue: string = '') {\n        return this.parsedQuery[property] || this.defaults[property] || defaultValue;\n    }\n\n    protected parseQueryString(value: string | Partial<Record<FilterFields[number], string>> = {}): Record<FilterFields[number], string> {\n        if (typeof value === 'string') {\n            return value.split('&').reduce((acc, part) => {\n                const [key, val] = part.split('=');\n                acc[decodeURIComponent(key)] = decodeURIComponent(val || '');\n                return acc;\n            }, {}) as Record<FilterFields[number], string>;\n        }\n        return value as Record<FilterFields[number], string>;\n    }\n}","export const A_SERVER__A_SERVER_LOGGER_ENV_VARIABLES = {\n    // ----------------------------------------------------------\n    // A-ServerLogger Environment Variables\n    // ----------------------------------------------------------\n    // These environment variables are used by A-Concept core to configure the application\n    // ----------------------------------------------------------\n    /**\n     * Enable logging of 200 responses\n     */\n    SERVER_IGNORE_LOG_200: 'SERVER_IGNORE_LOG_200',\n    /**\n     * Enable logging of 404 responses\n     */\n    SERVER_IGNORE_LOG_404: 'SERVER_IGNORE_LOG_404',\n    /**\n     * Enable logging of 500 responses\n     */\n    SERVER_IGNORE_LOG_500: 'SERVER_IGNORE_LOG_500',\n    /**\n     * Enable logging of 400 responses\n     */\n    SERVER_IGNORE_LOG_400: 'SERVER_IGNORE_LOG_400',\n    /**\n     * Enable logging of default responses\n     */\n    SERVER_IGNORE_LOG_DEFAULT: 'SERVER_IGNORE_LOG_DEFAULT',\n} as const","import { A_Component } from \"@adaas/a-concept\";\n\n\n\nexport class A_ServerMiddleware extends A_Component {\n\n\n    // static get features() {\n    //     // return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n    //     //     return A_Feature.Extend({\n    //     //         name: A_ServerMiddlewareFeatures.onBeforeInit,\n    //     //         scope: [target.constructor],\n    //     //     })(target, propertyKey, descriptor);\n    //     // }\n    // }\n\n}","import { A_SERVER_TYPES__ProxyConfigConstructorConfig } from \"./A-ServerProxy.types\";\n\nexport const PROXY_CONFIG_DEFAULTS: A_SERVER_TYPES__ProxyConfigConstructorConfig = {\n    path: '/',\n    hostname: 'localhost',\n    port: 80,\n    method: 'GET',\n    headers: {},\n    protocol: 'http'\n};\n","import { A_Fragment } from \"@adaas/a-concept\";\nimport { A_SERVER_TYPES__ProxyConfigConstructor, A_SERVER_TYPES__ProxyConfigConstructorConfig, A_SERVER_TYPES__RoutesConfig } from \"./A-ServerProxy.types\";\nimport { PROXY_CONFIG_DEFAULTS } from \"./A-ServerProxy.constants\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\n\n\nexport class A_ProxyConfig extends A_Fragment {\n\n    protected readonly _configs: Array<A_SERVER_TYPES__RoutesConfig>\n\n    constructor(\n        /**\n         * Setup proxy configs, where key is the path to match, and value is either a full URL or a partial config object\n         */\n        configs: A_SERVER_TYPES__ProxyConfigConstructor = {}\n    ) {\n        super();\n\n        this._configs = Object.entries(configs).map(([path, config]) => {\n\n            const targetUrl = new URL(typeof config === 'string' ? config : config.hostname || ''); // parse hostname, may include scheme\n\n            const port =\n                targetUrl.port ||\n                (targetUrl.protocol === \"https:\" ? '443' : '80');\n\n\n            const prepared = {\n                ...PROXY_CONFIG_DEFAULTS,\n                ...(typeof config === 'string' ? {\n                    path,\n                    port: parseInt(port),\n                    protocol: targetUrl.protocol,\n                    hostname: targetUrl.hostname\n                } : config)\n            }\n\n            return {\n                route: new A_ServerRoute(prepared.path, prepared.method),\n                hostname: prepared.hostname,\n                port: prepared.port,\n                headers: prepared.headers,\n                protocol: prepared.protocol\n            }\n        });\n    }\n\n    /**\n     * Returns all configured proxy configs\n     * \n     */\n    get configs(): Array<A_SERVER_TYPES__RoutesConfig> {\n        return this._configs;\n    }\n\n\n    /**\n     * Checks if a given path is configured in the proxy\n     * \n     * @param path \n     * @returns \n     */\n    has(path: string): boolean {\n        return this._configs.some(route => route.route.toRegExp().test(path));\n    }\n\n    /**\n     * Returns the proxy configuration for a given path, if exists\n     *\n     * @param path \n     * @returns \n     */\n    config(path: string): A_SERVER_TYPES__RoutesConfig | undefined {\n        \n\n        return this._configs.find(route => route.route.toRegExp().test(path));\n    }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_ProxyConfig } from \"./A-ServerProxy.context\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\nimport { A_Logger, A_LOGGER_COLORS } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\n\n\nexport class A_ServerProxy extends A_Component {\n\n\n    @A_Concept.Load()\n    async load(\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_ProxyConfig) config: A_ProxyConfig\n    ) {\n        logger.info(\n            'green',\n            `Proxy routes configured:`,\n            ...config.configs.map(c => `${c.route.toString()} -> ${c.protocol}//${c.hostname}:${c.port}`)\n        );\n    }\n\n\n\n    @A_Feature.Extend({\n        name: A_HttpServerFeatures.onRequest,\n        before:/.*/\n    })\n    async onRequest(\n        @A_Inject(A_Request) req: A_Request,\n        @A_Inject(A_Response) res: A_Response,\n        @A_Inject(A_ProxyConfig) proxyConfig: A_ProxyConfig,\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_Polyfill) polyfill: A_Polyfill,\n        @A_Inject(A_Feature) feature: A_Feature\n    ) {\n        return new Promise<void>(async (resolve, reject) => {\n            const { method, url } = req;\n\n            const route = new A_ServerRoute(url, method);\n            const config = proxyConfig.config(route.toString());\n\n            if (!config) {\n                return resolve(); // nothing to proxy\n            }\n\n            logger.log(\n                \"yellow\",\n                `Proxying request ${method} ${url} to ${config.hostname}`,\n                config\n            );\n\n            const client = await (config.protocol === \"https:\"\n                ? polyfill.https()\n                : polyfill.http());\n\n            const proxyReq = client.request(\n                {\n                    method: config.route.method,\n                    hostname: config.hostname,\n                    port: config.port,\n                    headers: config.headers,\n                    path: route.path,\n                },\n                (proxyRes) => {\n                    if (!res.headersSent) {\n                        res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n                    }\n                    proxyRes.on(\"end\", () => {\n\n                        logger.log(\"green\", `Proxy request to ${config?.hostname} completed`);\n\n                        resolve();\n                    });\n\n                    proxyRes.pipe(res.original);\n                }\n            );\n\n            proxyReq.on(\"error\", (err) => reject(err));\n\n            req.pipe(proxyReq);\n\n            feature.interrupt();\n        });\n    }\n\n}","import { A_Fragment } from \"@adaas/a-concept\";\n\nexport interface A_StaticAlias {\n    alias: string;\n    path: string;\n    directory: string;\n    enabled?: boolean;\n}\n\nexport interface A_StaticDirectoryConfig {\n    path: string;\n    directory: string;\n    alias?: string;\n}\n\nexport class A_StaticConfig extends A_Fragment {\n\n    readonly directories: Array<string>;\n    private _aliases: Map<string, A_StaticAlias> = new Map();\n    private _directoryConfigs: A_StaticDirectoryConfig[] = [];\n\n    constructor(\n        /**\n         * Setup directories to serve static files from, comma separated\n         */\n        directories: string[] = [],\n        /**\n         * Custom directory configurations with aliases\n         */\n        directoryConfigs: A_StaticDirectoryConfig[] = []\n    ) {\n        super();\n\n        this.directories = directories;\n        this._directoryConfigs = directoryConfigs;\n\n        // Initialize default aliases from directories\n        this.initializeDefaultAliases();\n\n        // Initialize custom aliases from directoryConfigs\n        this.initializeCustomAliases();\n    }\n\n    private initializeDefaultAliases(): void {\n        this.directories.forEach((dir, index) => {\n            const alias: A_StaticAlias = {\n                alias: `/static${index > 0 ? index : ''}`,\n                path: `/static${index > 0 ? index : ''}`,\n                directory: dir,\n                enabled: true\n            };\n            this._aliases.set(alias.path, alias);\n        });\n    }\n\n    private initializeCustomAliases(): void {\n        this._directoryConfigs.forEach((config) => {\n            const alias: A_StaticAlias = {\n                alias: config.alias || config.path,\n                path: config.path,\n                directory: config.directory,\n                enabled: true\n            };\n            this._aliases.set(alias.path, alias);\n        });\n    }\n\n    /**\n     * Add a custom static file alias\n     * @param alias - The URL path alias (e.g., '/assets')\n     * @param directory - The local directory path\n     * @param path - Optional custom path (defaults to alias)\n     */\n    public addAlias(alias: string, directory: string, path?: string): void {\n        const staticAlias: A_StaticAlias = {\n            alias,\n            path: path || alias,\n            directory,\n            enabled: true\n        };\n\n        this._aliases.set(staticAlias.path, staticAlias);\n    }\n\n    /**\n     * Remove a static file alias\n     * @param aliasPath - The path of the alias to remove\n     */\n    public removeAlias(aliasPath: string): boolean {\n        return this._aliases.delete(aliasPath);\n    }\n\n    /**\n     * Enable or disable an alias\n     * @param aliasPath - The path of the alias\n     * @param enabled - Whether to enable or disable\n     */\n    public setAliasEnabled(aliasPath: string, enabled: boolean): boolean {\n        const alias = this._aliases.get(aliasPath);\n        if (alias) {\n            alias.enabled = enabled;\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Get all configured aliases\n     */\n    public getAliases(): A_StaticAlias[] {\n        return Array.from(this._aliases.values());\n    }\n\n    /**\n     * Get enabled aliases only\n     */\n    public getEnabledAliases(): A_StaticAlias[] {\n        return Array.from(this._aliases.values()).filter(alias => alias.enabled !== false);\n    }\n\n    /**\n     * Find the best matching alias for a given request path\n     * @param requestPath - The request path to match\n     */\n    public findMatchingAlias(requestPath: string): A_StaticAlias | null {\n        let bestMatch: A_StaticAlias | null = null;\n        let longestMatch = 0;\n\n        for (const alias of this.getEnabledAliases()) {\n            if (requestPath.startsWith(alias.path) && alias.path.length > longestMatch) {\n                bestMatch = alias;\n                longestMatch = alias.path.length;\n            }\n        }\n\n        return bestMatch;\n    }\n\n    /**\n     * Check if an alias exists\n     * @param aliasPath - The path to check\n     */\n    public hasAlias(aliasPath: string): boolean {\n        return this._aliases.has(aliasPath);\n    }\n\n    /**\n     * Get a specific alias by path\n     * @param aliasPath - The path of the alias\n     */\n    public getAlias(aliasPath: string): A_StaticAlias | undefined {\n        return this._aliases.get(aliasPath);\n    }\n\n    /**\n     * Add multiple aliases at once\n     * @param aliases - Array of alias configurations\n     */\n    public addAliases(aliases: A_StaticDirectoryConfig[]): void {\n        aliases.forEach(config => {\n            this.addAlias(config.alias || config.path, config.directory, config.path);\n        });\n    }\n\n    /**\n     * Clear all aliases\n     */\n    public clearAliases(): void {\n        this._aliases.clear();\n    }\n\n    /**\n     * Update an existing alias\n     * @param aliasPath - The path of the alias to update\n     * @param updates - Partial updates to apply\n     */\n    public updateAlias(aliasPath: string, updates: Partial<A_StaticAlias>): boolean {\n        const alias = this._aliases.get(aliasPath);\n        if (alias) {\n            Object.assign(alias, updates);\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Get statistics about configured aliases\n     */\n    public getStats(): {\n        total: number;\n        enabled: number;\n        disabled: number;\n        directories: string[];\n    } {\n        const aliases = this.getAliases();\n        const enabled = aliases.filter(a => a.enabled !== false);\n        const disabled = aliases.filter(a => a.enabled === false);\n        const directories = [...new Set(aliases.map(a => a.directory))];\n\n        return {\n            total: aliases.length,\n            enabled: enabled.length,\n            disabled: disabled.length,\n            directories\n        };\n    }\n\n    /**\n     * Checks if a given path is configured in the proxy (legacy method)\n     * @deprecated Use findMatchingAlias instead\n     * @param path \n     * @returns \n     */\n    has(path: string): boolean {\n        const alias = this.findMatchingAlias(path);\n        return alias ? !!alias.directory : false;\n    }\n\n    /**\n     * Gets the directory for a given path if configured (legacy method)\n     * \n     * @param path \n     * @returns \n     */\n    get(path: string): string | undefined {\n        const alias = this.findMatchingAlias(path);\n        return alias ? alias.directory : undefined;\n    }\n}","import { A_Component, A_Concept, A_Feature, A_Inject } from \"@adaas/a-concept\"\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_StaticConfig, A_StaticAlias } from \"./A-ServerStatic.context\";\nimport { A_HttpServerFeatures } from \"@adaas/a-server/server/A-HttpServer.constants\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Polyfill } from \"@adaas/a-utils/a-polyfill\";\nimport { A_ServerRoute } from \"@adaas/a-server/route/A-ServerRoute.entity\";\n\nexport class A_StaticLoader extends A_Component {\n\n    private _fsPolyfill: any;\n    private _pathPolyfill: any;\n\n    @A_Concept.Load()\n    async load(\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_StaticConfig) config: A_StaticConfig,\n        @A_Inject(A_Polyfill) polyfill: A_Polyfill\n    ) {\n        // Initialize polyfills\n        this._fsPolyfill = await polyfill.fs();\n        this._pathPolyfill = await polyfill.path();\n\n        // Log configured aliases\n        const aliases = config.getEnabledAliases();\n        logger.info('cyan',\n\n            `Static aliases configured:`,\n            ...aliases.map(alias => `${alias.alias} -> ${alias.directory}`)\n        );\n    }\n\n\n    // =======================================================\n    // ================ Method Definition=====================\n    // =======================================================\n\n    @A_Feature.Extend({\n        before: /.*/\n    })\n    async [A_HttpServerFeatures.onRequest](\n        @A_Inject(A_Request) req: A_Request,\n        @A_Inject(A_Response) res: A_Response,\n        @A_Inject(A_Logger) logger: A_Logger,\n        @A_Inject(A_StaticConfig) config: A_StaticConfig,\n        @A_Inject(A_Polyfill) polyfill: A_Polyfill\n    ) {\n\n        if (req.method !== 'GET' && req.method !== 'HEAD') {\n            return; // Only handle GET and HEAD requests\n        }\n\n        const { method, url } = req;\n        const route = new A_ServerRoute(url, method);\n\n        // Check if this request matches any of our configured aliases\n        const alias = config.findMatchingAlias(route.path);\n        if (!alias) {\n            return; // No static config for this path\n        }\n\n        try {\n            // Ensure polyfills are available\n            const fs = this._fsPolyfill || await polyfill.fs();\n            const path = this._pathPolyfill || await polyfill.path();\n\n            const staticDir = path.resolve(process.cwd(), alias.directory);\n\n            // Validate static directory exists\n            if (!fs.existsSync(staticDir)) {\n                logger.log(\"red\", `Static directory ${staticDir} does not exist.`);\n                return;\n            }\n\n            // Get the file path relative to the alias\n            const relativePath = route.path.replace(alias.path, '');\n            const safePath = this.safeFilePath(staticDir, relativePath, req.headers?.host, path, fs);\n\n            await this.serveFile(safePath, res, logger, fs, path);\n\n            logger.log('green', `Successfully served: ${safePath}`);\n\n        } catch (error: any) {\n            throw new A_HttpServerError({\n                status: 500,\n                title: 'Static File Serving Error',\n                description: `Error serving static file for ${route.path}: ${error.message}`,\n                originalError: error\n            });\n        }\n    }\n\n    /**\n     * Add a custom static file alias through the config\n     * @param alias - The URL path alias (e.g., '/assets')\n     * @param directory - The local directory path\n     * @param path - Optional custom path (defaults to alias)\n     * @param config - Static config instance\n     * @param logger - Logger instance for logging\n     */\n    public addAlias(\n        alias: string,\n        directory: string,\n        config: A_StaticConfig,\n        logger?: A_Logger,\n        path?: string\n    ): void {\n        config.addAlias(alias, directory, path);\n\n        if (logger) {\n            logger.log('cyan', `Static alias added: ${alias} -> ${directory}`);\n        }\n    }\n\n    /**\n     * Remove a static file alias through the config\n     * @param aliasPath - The path of the alias to remove\n     * @param config - Static config instance\n     * @param logger - Logger instance for logging\n     */\n    public removeAlias(aliasPath: string, config: A_StaticConfig, logger?: A_Logger): boolean {\n        const removed = config.removeAlias(aliasPath);\n\n        if (removed && logger) {\n            logger.log('yellow', `Static alias removed: ${aliasPath}`);\n        }\n\n        return removed;\n    }\n\n    /**\n     * Get all configured aliases from config\n     * @param config - Static config instance\n     */\n    public getAliases(config: A_StaticConfig): A_StaticAlias[] {\n        return config.getAliases();\n    }\n\n    /**\n     * Enable or disable an alias\n     * @param aliasPath - The path of the alias\n     * @param enabled - Whether to enable or disable\n     * @param config - Static config instance\n     * @param logger - Logger instance for logging\n     */\n    public setAliasEnabled(\n        aliasPath: string,\n        enabled: boolean,\n        config: A_StaticConfig,\n        logger?: A_Logger\n    ): boolean {\n        const result = config.setAliasEnabled(aliasPath, enabled);\n\n        if (result && logger) {\n            logger.log('blue', `Static alias ${enabled ? 'enabled' : 'disabled'}: ${aliasPath}`);\n        }\n\n        return result;\n    }\n\n    protected getMimeType(ext: string): string {\n        const mimeTypes: Record<string, string> = {\n            // Text\n            \".html\": \"text/html\",\n            \".htm\": \"text/html\",\n            \".css\": \"text/css\",\n            \".txt\": \"text/plain\",\n            \".md\": \"text/markdown\",\n            \".xml\": \"application/xml\",\n\n            // JavaScript\n            \".js\": \"application/javascript\",\n            \".mjs\": \"application/javascript\",\n            \".jsx\": \"application/javascript\",\n            \".ts\": \"application/typescript\",\n            \".tsx\": \"application/typescript\",\n\n            // JSON\n            \".json\": \"application/json\",\n            \".jsonld\": \"application/ld+json\",\n\n            // Images\n            \".png\": \"image/png\",\n            \".jpg\": \"image/jpeg\",\n            \".jpeg\": \"image/jpeg\",\n            \".gif\": \"image/gif\",\n            \".svg\": \"image/svg+xml\",\n            \".ico\": \"image/x-icon\",\n            \".webp\": \"image/webp\",\n            \".bmp\": \"image/bmp\",\n            \".tiff\": \"image/tiff\",\n\n            // Fonts\n            \".woff\": \"font/woff\",\n            \".woff2\": \"font/woff2\",\n            \".ttf\": \"font/ttf\",\n            \".otf\": \"font/otf\",\n            \".eot\": \"application/vnd.ms-fontobject\",\n\n            // Audio/Video\n            \".mp3\": \"audio/mpeg\",\n            \".wav\": \"audio/wav\",\n            \".mp4\": \"video/mp4\",\n            \".webm\": \"video/webm\",\n            \".ogg\": \"application/ogg\",\n\n            // Archives\n            \".zip\": \"application/zip\",\n            \".tar\": \"application/x-tar\",\n            \".gz\": \"application/gzip\",\n\n            // Documents\n            \".pdf\": \"application/pdf\",\n            \".doc\": \"application/msword\",\n            \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n            \".xls\": \"application/vnd.ms-excel\",\n            \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n        };\n\n        return mimeTypes[ext.toLowerCase()] || \"application/octet-stream\";\n    }\n\n\n    protected safeFilePath(staticDir: string, reqUrl: string, host: string = 'localhost', pathPolyfill: any, fsPolyfill: any): string {\n        const parsedUrl = new URL(reqUrl || \"/\", `http://${host}`);\n        let pathname = decodeURIComponent(parsedUrl.pathname);\n\n        // Prevent path traversal attacks\n        pathname = pathname.replace(/\\.\\.[\\/\\\\]/g, \"\");\n\n        let filePath = pathPolyfill.join(staticDir, pathname);\n\n        if (!fsPolyfill.existsSync(filePath)) {\n            throw new Error(`File not found: ${filePath}`);\n        }\n\n        return filePath;\n    }\n\n    protected serveFile(\n        filePath: string,\n        res: A_Response,\n        logger: A_Logger,\n        fsPolyfill: any,\n        pathPolyfill: any\n    ): Promise<void> {\n        return new Promise<void>((resolve, reject) => {\n            try {\n                if (fsPolyfill.existsSync(filePath)) {\n                    const ext = pathPolyfill.extname(filePath);\n                    const contentType = this.getMimeType(ext);\n\n                    // Set appropriate headers\n                    const headers: Record<string, string> = {\n                        \"Content-Type\": contentType,\n                        \"Cache-Control\": this.getCacheControl(ext),\n                        \"X-Content-Type-Options\": \"nosniff\"\n                    };\n\n                    res.writeHead(200, headers);\n\n                    const stream = fsPolyfill.createReadStream(filePath);\n\n                    if (stream && res.original) {\n                        stream.pipe(res.original);\n\n                        stream.on('end', () => {\n                            resolve();\n                        });\n\n                        stream.on(\"error\", (err: any) => {\n                            reject(new A_HttpServerError({\n                                status: 500,\n                                title: 'File Stream Error',\n                                description: `Error reading file stream for ${filePath}: ${err.message}`,\n                                originalError: err\n                            }));\n                        });\n                    } else {\n                        reject(new A_HttpServerError({\n                            status: 500,\n                            title: 'Response Stream Error',\n                            description: `Unable to pipe file stream for ${filePath}`,\n                        }));\n                    }\n                } else {\n                    reject(new A_HttpServerError({\n                        status: 404,\n                        title: 'File Not Found',\n                        description: `File not found: ${filePath}`,\n                    }));\n                }\n            } catch (error: any) {\n                logger.error(`Error serving file: ${error.message}`);\n                reject(new A_HttpServerError({\n                    status: 500,\n                    title: 'Internal Server Error',\n                    description: `Error serving file: ${error.message}`,\n                    originalError: error\n                }));\n            }\n        });\n    }\n\n    protected getCacheControl(ext: string): string {\n        // Different cache strategies for different file types\n        const staticAssets = ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.otf'];\n        const dynamicContent = ['.html', '.htm'];\n\n        if (staticAssets.includes(ext.toLowerCase())) {\n            return \"public, max-age=31536000\"; // 1 year for static assets\n        } else if (dynamicContent.includes(ext.toLowerCase())) {\n            return \"public, max-age=3600\"; // 1 hour for HTML\n        } else {\n            return \"public, max-age=86400\"; // 1 day for other files\n        }\n    }\n\n}\n\n\n","export const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES = {\n    // ----------------------------------------------------------\n    // A-Server Environment Variables\n    // ----------------------------------------------------------\n    // These environment variables are used by A-Server to configure the application\n    // ----------------------------------------------------------\n    /**\n     * Port for the server to listen on\n     * [!] Default is 3000\n     * @default 3000\n     */\n    A_SERVER_PORT: 'A_SERVER_PORT',\n\n} as const;\n\nexport type A_TYPES__ServerENVVariables = (typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES)[keyof typeof A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES][];\n\n\n\nexport const A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES_ARRAY = [\n    A_SERVER_CONSTANTS__DEFAULT_ENV_VARIABLES.A_SERVER_PORT,\n] as const;\n\n\n\n\n"]}