@testdino/playwright 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reporter/errors.ts","../src/streaming/websocket.ts","../src/streaming/http.ts","../src/streaming/buffer.ts","../src/metadata/base.ts","../src/metadata/git.ts","../src/metadata/ci.ts","../src/metadata/system.ts","../src/metadata/playwright.ts","../src/metadata/index.ts","../src/uploads/sas-token-client.ts","../src/uploads/artifact-uploader.ts","../src/reporter/index.ts"],"names":["osType","osRelease","version","readFile","axios"],"mappings":";;;;;;;;;;;;;;;;;;AAUO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7B,IAAA;AAAA,EAEhB,WAAA,CAAY,MAAc,OAAA,EAAiB;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF,CAAA;AAMO,IAAM,mBAAA,GAAN,cAAkC,mBAAA,CAAoB;AAAA,EAC3C,OAAA;AAAA,EAOhB,WAAA,CACE,SACA,OAAA,EAMA;AACA,IAAA,KAAA,CAAM,mBAAmB,OAAO,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;AAMO,IAAM,kBAAA,GAAN,cAAiC,mBAAA,CAAoB;AAAA,EAC1C,OAAA;AAAA,EAWhB,WAAA,CACE,SACA,OAAA,EAUA;AACA,IAAA,KAAA,CAAM,kBAAkB,OAAO,CAAA;AAC/B,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF,CAAA;AAqCO,SAAS,cAAc,KAAA,EAAsC;AAClE,EAAA,OAAO,KAAA,YAAiB,mBAAA;AAC1B;AAOO,SAAS,aAAa,KAAA,EAAmE;AAC9F,EAAA,OAAO,KAAA,YAAiB,uBAAuB,KAAA,YAAiB,kBAAA;AAClE;;;ACzHA,IAAM,oBAAA,GAAuB,GAAA;AAatB,IAAM,kBAAN,MAAsB;AAAA,EACnB,EAAA,GAAuB,IAAA;AAAA,EACvB,OAAA;AAAA,EACA,iBAAA,GAAoB,CAAA;AAAA,EACpB,cAAA,GAAwC,IAAA;AAAA,EACxC,YAAA,GAAe,KAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAsC,IAAA;AAAA,EAE9C,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,aAAa,MAAM;AAAA,MAAC,CAAA;AAAA,MACpB,gBAAgB,MAAM;AAAA,MAAC,CAAA;AAAA,MACvB,SAAS,MAAM;AAAA,MAAC,CAAA;AAAA,MAChB,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,YAAA,IAAgB,IAAA,CAAK,EAAA,EAAI,UAAA,KAAe,UAAU,IAAA,EAAM;AAC/D,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAI;AAEF,QAAA,IAAI,KAAA,GAAQ,GAAG,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,QAAQ,KAAK,CAAA,CAAA;AACxE,QAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,UAAA,KAAA,IAAS,CAAA,WAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,QAC/C;AACA,QAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,KAAK,CAAA;AAG7B,QAAA,IAAI,WAAA,GAAc,KAAA;AAElB,QAAA,MAAM,gBAAA,GAAmB,WAAW,MAAM;AACxC,UAAA,IAAI,CAAC,WAAA,EAAa;AAIhB,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,qGAAsF,oBAAoB,CAAA,qBAAA;AAAA,aAC5G;AACA,YAAA,WAAA,GAAc,IAAA;AACd,YAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,YAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,GAAG,oBAAoB,CAAA;AAEvB,QAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,MAAA,EAAQ,MAAM;AACvB,UAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,UAAA,IAAA,CAAK,SAAA,EAAU;AAAA,QACjB,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAS;AAC9B,UAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAG1B,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,IAAI;AACF,cAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,cAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,gBAAA,WAAA,GAAc,IAAA;AACd,gBAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,gBAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,gBAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,gBAAA,OAAA,EAAQ;AACR,gBAAA;AAAA,cACF;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,QACxB,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,MAAM,MAAA,KAAW;AACpC,UAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,YAAA,MAAA,CAAO,IAAI,MAAM,CAAA,2CAAA,EAA8C,IAAI,WAAW,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,CAAC,CAAA;AAClG,YAAA;AAAA,UACF;AACA,UAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,QAC1C,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC7B,UAAA,YAAA,CAAa,gBAAgB,CAAA;AAC7B,UAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,UAAA,IAAA,CAAK,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC1B,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,EAAA,CAAG,MAAA,EAAQ,MAAM;AAAA,QAEzB,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,KAAA,EAAiC;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,IAAA,CAAK,GAAI,IAAA,CAAK,IAAA,CAAK,UAAU,KAAK,CAAA,EAAG,CAAC,KAAA,KAAU;AAC9C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAA,CAAO,KAAK,CAAA;AAAA,QACd,CAAA,MAAO;AACL,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAAoC;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAGA,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,UAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,EAAI,UAAA,KAAe,SAAA,CAAU,IAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,IAAA,EAAoB;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE/B,MAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAAA,MAElC,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,KAAA,EAAO;AAAA,MAEnC,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ;AAElC,QAAA,MAAM,IAAA,GAAO,OAAA;AAIb,QAAA,IAAI,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,EAAG;AAE7B,UAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAAA,QACjC,WAAW,OAAO,IAAA,CAAK,UAAU,QAAA,IAAY,IAAA,CAAK,UAAU,IAAA,EAAM;AAEhE,UAAA,MAAM,WAAW,IAAA,CAAK,KAAA;AACtB,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,KAAA;AAE5C,UAAA,IAAI,cAAc,gBAAA,IAAoB,QAAA,CAAS,WAAW,OAAO,QAAA,CAAS,YAAY,QAAA,EAAU;AAE9F,YAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,YAAA,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,cACX,IAAI,kBAAA,CAAmB,QAAA,CAAS,OAAA,EAAS,QAAA,MAAc,gBAAA,EAAkB;AAAA,gBACvE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAS,IAAK,SAAA;AAAA,gBAC1C,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,IAAK,CAAA;AAAA,gBAC1C,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,IAAK,CAAA;AAAA,gBACxC,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA;AAAA,gBAC9B,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AAAA,gBAChC,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAS;AAAA,gBACvC,gBAAA,EAAkB,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,gBAClD,YAAA,EAAc,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,IAAK;AAAA,eAC/C;AAAA,aACH;AAAA,UACF,CAAA,MAAA,IAAW,cAAc,iBAAA,IAAqB,QAAA,CAAS,WAAW,OAAO,QAAA,CAAS,YAAY,QAAA,EAAU;AAEtG,YAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,YAAA,IAAA,CAAK,OAAA,CAAQ,OAAA;AAAA,cACX,IAAI,mBAAA,CAAoB,QAAA,CAAS,OAAA,EAAS,QAAA,MAAc,iBAAA,EAAmB;AAAA,gBACzE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,QAAA,EAAS,IAAK,SAAA;AAAA,gBAC1C,UAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,IAAK,CAAA;AAAA,gBAC1C,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA;AAAA,gBAC9B,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,QAAA;AAAS,eACxC;AAAA,aACH;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,MAAM,YAAA,GACJ,QAAA,CAAS,OAAA,EAAS,QAAA,EAAS,IAAK,QAAA,CAAS,KAAA,EAAO,QAAA,EAAS,IAAK,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACzF,YAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAI,MAAM,CAAA,gBAAA,EAAmB,YAAY,EAAE,CAAC,CAAA;AAAA,UACnE;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACpF,UAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAI,MAAM,CAAA,gBAAA,EAAmB,YAAY,EAAE,CAAC,CAAA;AAAA,QACnE;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,OAAe,OAAA,EAAuB;AACxD,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,QAAQ,cAAA,EAAe;AAG5B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY;AACpD,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAA,CAAQ,QAAQ,IAAI,KAAA,CAAM,qCAAqC,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,SAAA,CAAW,CAAC,CAAA;AAAA,IACzG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAC1E,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,MAAA,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9B,QAAA,OAAA,CAAQ,KAAA,CAAM,wBAAwB,KAAK,CAAA;AAAA,MAC7C,CAAC,CAAA;AAAA,IACH,GAAG,KAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,YAAY,MAAM;AACpC,MAAA,IAAI,IAAA,CAAK,EAAA,EAAI,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC1C,QAAA,IAAA,CAAK,GAAG,IAAA,EAAK;AAAA,MACf;AAAA,IACF,GAAG,GAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAAiB;AACvB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAA;ACrTO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,OAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,MACzB,OAAA,EAAS,KAAK,OAAA,CAAQ,SAAA;AAAA,MACtB,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,OAC7C;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA8D;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAC/C,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,MAAM,YAAA,CAAa,KAAK,KAAK,KAAA,CAAM,QAAA,EAAU,WAAW,GAAA,EAAK;AAC/D,QAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA;AAGlC,QAAA,MAAM,IAAI,mBAAA,CAAoB,UAAA,CAAW,OAAA,EAAS,WAAW,OAAO,CAAA;AAAA,MACtE;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,MAAA,EAAoC;AACnD,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,YAAY,OAAA,EAAA,EAAW;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,EAAE,QAAQ,CAAA;AAC5C,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAI,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAEjD,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AAEzC,UAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,aAAa,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC3D,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,gCAAgC,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,KAAA,EAAiC;AAC/C,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,KAAK,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,IAAI,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,OAAA,IAAW,KAAA,CAAM,OAAA;AAAA,IAChD;AACA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF,CAAA;;;AC/FO,IAAM,cAAN,MAAkB;AAAA,EACf,SAAsB,EAAC;AAAA,EACvB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EAErB,YAAY,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,EAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,KAAY,YAAY;AAAA,IAAC,CAAA,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,KAAA,EAAiC;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAEtB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACtC,MAAA,MAAM,KAAK,KAAA,EAAM;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,SAAS,EAAC;AACf,MAAA,MAAM,IAAA,CAAK,QAAQ,aAAa,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,KAAW,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,EAAC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB;AACF,CAAA;;;AC1EO,IAAe,wBAAf,MAAkG;AAAA,EAC7F,IAAA;AAAA,EAEV,YAAY,IAAA,EAAc;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAsB;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,EAAgB;AACxC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,wBAAA,EAAiB,KAAK,IAAI,CAAA,4BAAA,CAAA;AAAA,QAC1B,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAA0D;AAC9D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,EAAQ;AAE/B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,eAAA,EAAgB;AACxC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAG1E,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAiB,SAAS,CAAA,4BAAA,CAAA,EAAgC,YAAY,CAAA;AAEnF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAK,gBAAA,EAAiB;AAAA,QAC5B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,YAAA;AAAA,QACP,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAeA,MAAgB,WAAA,CAAe,OAAA,EAAqB,SAAA,EAAmB,SAAA,EAA+B;AACpG,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,iBAAA,EAAoB,SAAS,IAAI,CAAC,CAAA;AAAA,MACjE,GAAG,SAAS,CAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKU,aAAA,CAAiB,YAAoB,QAAA,EAAgB;AAC7D,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAiB,KAAA,EAAiC;AAC1D,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AAAA,EAC5D;AACF,CAAA;;;AC9DO,IAAM,oBAAA,GAAN,cAAmC,qBAAA,CAAmC;AAAA,EACnE,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,CAAA;AACX,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,MAC5B,GAAA,EAAK,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AAAI,KAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,eAAA,GAAwC;AAEtD,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAG7B,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC7C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,MAChC,KAAK,SAAA,EAAU;AAAA,MACf,KAAK,aAAA,EAAc;AAAA,MACnB,KAAK,gBAAA,EAAiB;AAAA,MACtB,KAAK,aAAA,EAAc;AAAA,MACnB,KAAK,cAAA,EAAe;AAAA,MACpB,KAAK,kBAAA,EAAmB;AAAA,MACxB,KAAK,UAAA,EAAW;AAAA,MAChB,KAAK,kBAAA;AAAmB,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,EAAM,SAAS,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA,GAAI,OAAA;AACxD,IAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AACzB,IAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AAGzB,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,iBAAA,KAAsB,cAAA,EAAgB;AACpD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,mBAAA,EAAoB;AAEjD,MAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,QAAA,UAAA,GAAa,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAG7C,QAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,eAAA;AAC5B,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAClC,UAAA,MAAA,GAAS,OAAA;AAAA,QACX;AAGA,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,YAAA,CAAa,IAAA,EAAM,GAAA;AAC7C,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAClC,UAAA,IAAA,GAAO,OAAA;AACP,UAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAC1D,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,OAAA,GAAU,WAAW,OAAA,IAAW,OAAA;AAChC,YAAA,MAAA,GAAS,WAAW,MAAA,IAAU,MAAA;AAC9B,YAAA,KAAA,GAAQ,WAAW,KAAA,IAAS,KAAA;AAC5B,YAAA,SAAA,GAAY,WAAW,SAAA,IAAa,SAAA;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,aAAa,WAAA,IAAe,MAAA;AAAA,QACpC,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,KAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAAA,QAClC,GAAA,EAAK;AAAA,OACP;AAAA,MACA,GAAI,UAAA,GAAa,EAAE,EAAA,EAAI,UAAA,KAAe;AAAC,KACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAAgC;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,cAAA,KAAmB,MAAA;AACzE,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,QAAA,EAAU,UAAA,EAAY,SAAS,gBAAA,EAAkB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG;AAAA,QACtF,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QACtB,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,GAA4D;AACxE,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,iBAAA;AAC9B,IAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA;AAAA,QACzB,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,QAC3B,KAAK,OAAA,CAAQ,OAAA;AAAA,QACb;AAAA,OACF;AACA,MAAA,OAAO,IAAA,CAAK,aAAA,CAA+B,OAAA,EAAS,EAAE,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,2DAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAA,EAAoD;AAC5E,IAAA,MAAM,cAAc,SAAA,EAAW,YAAA;AAC/B,IAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AAEzB,IAAA,MAAM,aAAyB,EAAC;AAGhC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5C,MAAA,UAAA,CAAW,QAAQ,WAAA,CAAY,KAAA;AAAA,IACjC;AAEA,IAAA,IAAI,OAAO,WAAA,CAAY,MAAA,KAAW,QAAA,EAAU;AAC1C,MAAA,UAAA,CAAW,SAAS,WAAA,CAAY,MAAA;AAAA,IAClC;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5C,MAAA,UAAA,CAAW,SAAS,WAAA,CAAY,KAAA;AAAA,IAClC;AAGA,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,iBAAA;AAC9B,IAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,iBAAA;AAC/B,IAAA,IAAI,UAAA,CAAW,MAAA,IAAU,SAAA,IAAa,UAAA,EAAY;AAChD,MAAA,UAAA,CAAW,MAAM,CAAA,EAAG,SAAS,IAAI,UAAU,CAAA,MAAA,EAAS,WAAW,MAAM,CAAA,CAAA;AAAA,IACvE;AAGA,IAAA,IAAI,WAAA,CAAY,MAAM,GAAA,IAAO,IAAA,CAAK,iBAAiB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,EAAG;AACxE,MAAA,UAAA,CAAW,MAAA,GAAS,YAAY,IAAA,CAAK,GAAA;AAAA,IACvC;AAEA,IAAA,IAAI,WAAA,CAAY,MAAM,GAAA,IAAO,IAAA,CAAK,iBAAiB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA,EAAG;AACxE,MAAA,UAAA,CAAW,YAAA,GAAe,YAAY,IAAA,CAAK,GAAA;AAAA,IAC7C;AAGA,IAAA,IAAI,WAAA,CAAY,MAAM,KAAA,IAAS,IAAA,CAAK,iBAAiB,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5E,MAAA,UAAA,CAAW,MAAA,GAAS,YAAY,IAAA,CAAK,KAAA;AAAA,IACvC;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,CAAY,MAAM,KAAK,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,EAAG;AACtE,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,CACxB,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,EAAO,IAAI,CAAA,CAC1B,OAAO,CAAC,IAAA,KAAyB,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAE/D,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,UAAA,CAAW,MAAA,GAAS,MAAA;AAAA,MACtB;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,WAAA,CAAY,MAAA,KAAW,SAAA,EAAW;AAC3C,MAAA,UAAA,CAAW,SAAS,WAAA,CAAY,MAAA;AAAA,IAClC;AAEA,IAAA,IAAI,OAAO,WAAA,CAAY,SAAA,KAAc,SAAA,EAAW;AAC9C,MAAA,UAAA,CAAW,YAAY,WAAA,CAAY,SAAA;AAAA,IACrC;AAEA,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,gBAAgB,CAAA,EAAG;AACvD,MAAA,UAAA,CAAW,iBAAiB,WAAA,CAAY,gBAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,UAAU,EAAE,MAAA,GAAS,CAAA;AACjD,IAAA,OAAO,UAAU,UAAA,GAAa,MAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,qBAAqB,GAAA,EAQjC;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,MAAA,EAAQ,IAAA,EAAM,4BAAA,EAA8B,GAAG,CAAC,CAAA;AACnF,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA,CAAA;AAE7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAK,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAA;AAAA,QACtD,MAAA,EAAQ,KAAK,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAA;AAAA,QACrD,KAAA,EAAO,KAAK,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAA;AAAA,QACpD,SAAA,EAAW,KAAK,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAAA,OAC1D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,6DAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,oBAAoB,UAAA,EAA2D;AAC3F,IAAA,MAAM,KAAA,GAA0B,EAAE,QAAA,EAAU,EAAA,EAAG;AAE/C,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,cAAA,KAAmB,MAAA,EAAQ;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,QAAQ,GAAA,CAAI,iBAAA;AAC/B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,6BAAA,EAAgC,UAAU,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,MAAA,EAAQ,gCAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAEA,MAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,YAAA;AAC1B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,aAAA,GAAgB,SAAS,KAAK,CAAA,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,SAAS,oBAAoB,CAAA;AAE3G,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAIlC,MAAA,IAAI,IAAA,EAAM,QAAQ,EAAA,EAAI;AACpB,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AACtC,QAAA,MAAM,WAAA,GAAc,KAAK,gBAAA,CAAiB,IAAA,CAAK,OAAO,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAA;AACnF,QAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,MACjC;AAEA,MAAA,OAAO,KAAK,4BAAA,EAA6B;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,2EAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,KAAK,4BAAA,EAA6B;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,4BAAA,GAA0D;AACtE,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAA,CAAI,YAAA;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,UAAU,EAAA,EAAG;AAAA,IACxB;AAEA,IAAA,MAAM,GAAA,GAAM,gCAAgC,KAAK,CAAA,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA;AAAA,QAC1B,MAAM,GAAA,EAAK;AAAA,UACT,OAAA,EAAS;AAAA,YACP,MAAA,EAAQ,gCAAA;AAAA,YACR,YAAA,EAAc;AAAA;AAChB,SACD,CAAA;AAAA,QACD,KAAK,OAAA,CAAQ,OAAA;AAAA,QACb;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,EAAE,UAAU,EAAA,EAAG;AAAA,MACxB;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAKlC,MAAA,MAAM,WAAW,IAAA,EAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,EAAA;AAC9C,MAAA,MAAM,cAAc,IAAA,CAAK,gBAAA,CAAiB,MAAM,KAAK,CAAA,GAAI,KAAK,KAAA,GAAQ,KAAA;AAEtE,MAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,4EAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,EAAE,UAAU,EAAA,EAAG;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,GAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,SAAA,GAAyC;AACrD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,WAAA,EAAa,cAAA,EAAgB,MAAM,CAAC,CAAA;AACvE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,GAAgD;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,oBAAoB,CAAC,CAAA;AACrE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,GAA6C;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,GAA8C;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBAAA,GAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,qBAAqB,CAAC,CAAA;AACtE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UAAA,GAA0C;AACtD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,mBAAmB,CAAC,CAAA;AAC1E,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,GAAI,MAAA,GAAS,KAAA,CAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,kBAAA,GAAmD;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAQ,CAAC,QAAA,EAAU,aAAa,CAAC,CAAA;AAE3D,MAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,OAAA,EAAiD;AACvE,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,OAAO,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,KAAI,EAAG,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,MAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAQ,IAAA,EAAiC;AACrD,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,IAAA,CAAK,WAAA;AAAA,MAC5B,KAAA,CAAM,OAAO,IAAA,EAAM;AAAA,QACjB,GAAA,EAAK,KAAK,OAAA,CAAQ,GAAA;AAAA,QAClB,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,QACtB,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,MACD,KAAK,OAAA,CAAQ,OAAA;AAAA,MACb,CAAA,IAAA,EAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,KACvB;AAEA,IAAA,OAAO,OAAO,IAAA,EAAK;AAAA,EACrB;AACF,CAAA;AC7gBO,IAAM,mBAAA,GAAN,cAAkC,qBAAA,CAAkC;AAAA,EACzE,WAAA,CAAY,QAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,KAAA,CAAM,IAAI,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,eAAA,GAAuC;AACrD,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,EAAiB;AAEvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,WAAA,EAAa,KAAK,kBAAA;AAAmB,OACvC;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,MAAA,OAAO,KAAK,4BAAA,EAA6B;AAAA,IAC3C;AAGA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,WAAA,EAAa,KAAK,kBAAA;AAAmB,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAA+B;AACvC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAuC;AAC7C,IAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAGhB,IAAA,IAAI,GAAA,CAAI,mBAAmB,MAAA,EAAQ;AACjC,MAAA,OAAO,gBAAA;AAAA,IACT;AAMA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAA,GAA2C;AACjD,IAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAEhB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAU;AAAA,QACR,IAAI,GAAA,CAAI,aAAA;AAAA,QACR,MAAM,GAAA,CAAI,eAAA;AAAA,QACV,GAAA,EAAK,KAAK,gBAAA;AAAiB,OAC7B;AAAA,MACA,KAAA,EAAO;AAAA,QACL,QAAQ,GAAA,CAAI,iBAAA;AAAA,QACZ,SAAS,GAAA,CAAI;AAAA,OACf;AAAA,MACA,WAAA,EAAa,KAAK,kBAAA;AAAmB,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAuC;AAC7C,IAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAChB,IAAA,MAAM,YAAY,GAAA,CAAI,iBAAA;AACtB,IAAA,MAAM,aAAa,GAAA,CAAI,iBAAA;AACvB,IAAA,MAAM,QAAQ,GAAA,CAAI,aAAA;AAElB,IAAA,IAAI,SAAA,IAAa,cAAc,KAAA,EAAO;AACpC,MAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,UAAU,iBAAiB,KAAK,CAAA,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,GAAgD;AACtD,IAAA,IAAI;AACF,MAAA,OAAO;AAAA,QACL,MAAMA,IAAA,EAAO;AAAA,QACb,MAAM,OAAA,CAAQ,QAAA;AAAA,QACd,IAAI,CAAA,EAAGA,IAAA,EAAQ,CAAA,CAAA,EAAIC,SAAW,CAAA,CAAA;AAAA,QAC9B,MAAM,OAAA,CAAQ;AAAA,OAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF,CAAA;AC5GO,IAAM,uBAAA,GAAN,cAAsC,qBAAA,CAAsC;AAAA,EACjF,WAAA,CAAY,QAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,eAAA,GAA2C;AAGzD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,MAAM,QAAA,GAA2B;AAAA,QAC/B,EAAA,EAAI,KAAK,kBAAA,EAAmB;AAAA,QAC5B,GAAA,EAAK,KAAK,UAAA,EAAW;AAAA,QACrB,MAAA,EAAQ,KAAK,aAAA,EAAc;AAAA,QAC3B,WAAA,EAAa,KAAK,cAAA,EAAe;AAAA,QACjC,QAAA,EAAU,KAAK,WAAA,EAAY;AAAA,QAC3B,QAAA,EAAU,KAAK,WAAA;AAAY,OAC7B;AAEA,MAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAAmC;AAC3C,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,GAA6B;AACnC,IAAA,IAAI,YAAA,GAAe,SAAA;AACnB,IAAA,IAAI,cAAA,GAAiB,SAAA;AAErB,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,QAAA,EAAS;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI;AACF,MAAA,cAAA,GAAiB,OAAA,EAAQ;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAA,GAAqB;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,IAAA,EAAK;AACrB,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAM,IAAA,EAAK;AACpC,MAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAE1B,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,SAAS,CAAA,OAAA,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAA,GAAwB;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,QAAA,EAAS;AAC5B,MAAA,MAAM,OAAA,GAAU,UAAA,IAAc,IAAA,GAAO,IAAA,GAAO,IAAA,CAAA;AAG5C,MAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAAyB;AAC/B,IAAA,IAAI;AACF,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,GAAsB;AAC5B,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,EAAS;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,GAAsB;AAC5B,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,EAAS;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;AC9CO,IAAM,2BAAA,GAAN,cAA0C,qBAAA,CAA0C;AAAA,EACjF,OAAA;AAAA,EAGR,WAAA,CAAY,OAAA,GAAsC,EAAC,EAAG;AACpD,IAAA,KAAA,CAAM,YAAY,CAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,MAC5B,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,iBAAiB,OAAA,CAAQ;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,eAAA,GAA+C;AAC7D,IAAA,MAAM,WAA+B,EAAC;AAGtC,IAAA,MAAMC,QAAAA,GAAU,MAAM,IAAA,CAAK,oBAAA,EAAqB;AAChD,IAAA,IAAIA,QAAAA,EAAS;AACX,MAAA,QAAA,CAAS,OAAA,GAAUA,QAAAA;AAAA,IACrB;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,QAAQ,MAAM,CAAA;AACrE,MAAA,MAAA,CAAO,MAAA,CAAO,UAAU,cAAc,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,KAAA,EAAmD;AACvE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,GAAuC;AAC/C,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,GAAoD;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,CAAQ,eAAA,IAAmB,KAAK,4BAAA,EAA6B;AAE1F,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAEA,MAAA,MAAM,kBAAA,GAAqB,MAAM,IAAA,CAAK,WAAA;AAAA,QACpCC,QAAAA,CAAS,iBAAiB,OAAO,CAAA;AAAA,QACjC,KAAK,OAAA,CAAQ,OAAA;AAAA,QACb;AAAA,OACF;AAEA,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,CAAoC,kBAAA,EAAoB,EAAE,CAAA;AAEnF,MAAA,OAAO,KAAK,gBAAA,CAAiB,WAAA,CAAY,OAAO,CAAA,GAAI,YAAY,OAAA,GAAU,KAAA,CAAA;AAAA,IAC5E,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,4DAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OACvD;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAA,GAAmD;AACzD,IAAA,IAAI;AAEF,MAAA,OAAO,SAAA,CAAQ,QAAQ,+BAA+B,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAA,EAA2D;AACvF,IAAA,MAAM,WAAwC,EAAC;AAG/C,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAA,EAAG;AAC5C,MAAA,QAAA,CAAS,aAAa,MAAA,CAAO,UAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,UAAA,KAAe,SAAA,EAAW;AAC1C,MAAA,QAAA,CAAS,aAAa,MAAA,CAAO,UAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,aAAA,KAAkB,SAAA,EAAW;AAC7C,MAAA,QAAA,CAAS,gBAAgB,MAAA,CAAO,aAAA;AAChC,MAAA,QAAA,CAAS,WAAW,MAAA,CAAO,aAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,aAAA,KAAkB,QAAA,EAAU;AAC5C,MAAA,QAAA,CAAS,gBAAgB,MAAA,CAAO,aAAA;AAAA,IAClC;AAGA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,IAAI,MAAA,CAAO,IAAA,GAAO,CAAC,MAAA,CAAO,IAAI,CAAA;AACxE,MAAA,QAAA,CAAS,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,EAAU;AAC1C,MAAA,QAAA,CAAS,cAAc,MAAA,CAAO,WAAA;AAAA,IAChC;AAGA,IAAA,IAAI,MAAA,CAAO,QAAA,IAAY,OAAO,MAAA,CAAO,aAAa,QAAA,EAAU;AAC1D,MAAA,QAAA,CAAS,WAAW,MAAA,CAAO,QAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU;AACtC,MAAA,QAAA,CAAS,UAAU,MAAA,CAAO,OAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,CAAO,QAAQ,KAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAChE,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CACzB,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAI,CAAA,CAC7B,OAAO,CAAC,IAAA,KAAyB,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAE/D,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,QAAA,CAAS,QAAA,GAAW,YAAA;AAAA,MACtB;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,eAAA,IAAmB,OAAO,MAAA,CAAO,oBAAoB,QAAA,EAAU;AACxE,MAAA,QAAA,CAAS,eAAA,GAAkB;AAAA,QACzB,GAAA,EAAK,OAAO,eAAA,CAAgB,GAAA;AAAA,QAC5B,SAAA,EAAW,OAAO,eAAA,CAAgB;AAAA,OACpC;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA,EAAG;AACzC,MAAA,QAAA,CAAS,UAAU,MAAA,CAAO,OAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,OAAO,MAAA,CAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU;AACtG,MAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,QACf,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA;AAAA,QACtB,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA,OACtB;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,CAAO,IAAI,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACxD,MAAA,QAAA,CAAS,OAAO,MAAA,CAAO,IAAA;AAAA,IACzB;AAGA,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,OAAO,MAAA,CAAO,cAAc,QAAA,EAAU;AAC5D,MAAA,QAAA,CAAS,YAAY,MAAA,CAAO,SAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAqC;AACjD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,QAAA,EAAS,CAAE,MAAA;AACpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAAyC;AAC9D,IAAA,MAAM,SAA0B,EAAC;AAGjC,IAAA,KAAA,MAAW,UAAA,IAAc,MAAM,MAAA,EAAQ;AACrC,MAAA,MAAM,aAAA,GAA+B;AAAA,QACnC,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,IAAA,EAAM,UAAA,CAAW,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,UAAA;AAAA,QAC5C,KAAA,EAAO,WAAW,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAC;AAAA,OACpE;AAGA,MAAA,IAAI,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,CAAW,QAAA,EAAU;AACrD,QAAA,aAAA,CAAc,IAAA,GAAO,WAAW,QAAA,CAAS,IAAA;AAAA,MAC3C;AAGA,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,aAAA,CAAc,QAAA,GAAW;AAAA,UACvB,IAAA,EAAM,WAAW,QAAA,CAAS,IAAA;AAAA,UAC1B,IAAA,EAAM,WAAW,QAAA,CAAS,IAAA;AAAA,UAC1B,MAAA,EAAQ,WAAW,QAAA,CAAS;AAAA,SAC9B;AAAA,MACF;AAGA,MAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChC,QAAA,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAAA,MACvD;AAEA,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAwC;AAChE,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,QAAA,CAAS;AAAA;AACxB,KACF;AAGA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,MAAA,YAAA,CAAa,OAAO,IAAA,CAAK,IAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,iBAAiB,IAAA,CAAK,cAAA;AAAA,IACrC;AAGA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AACnD,MAAA,YAAA,CAAa,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACxD,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,aAAa,GAAA,CAAI;AAAA,OACnB,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AACF,CAAA;;;AC5VA,IAAM,wBAAA,GAAgE;AAAA,EACpE,OAAA,EAAS,GAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAwDO,IAAM,qBAAN,MAAyB;AAAA,EACtB,OAAA;AAAA;AAAA,EAEA,aAAyF,EAAC;AAAA,EAC1F,mBAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAqC,EAAC,EAAG;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,wBAAA,EAA0B,GAAG,OAAA,EAAQ;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,SAAA,EAAsF;AACtG,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAG9B,IAAA,IAAI,qBAAqB,2BAAA,EAA6B;AACpD,MAAA,IAAA,CAAK,mBAAA,GAAsB,SAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAAA,EAAsD;AAClE,IAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC7B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,aAAA,CAAc,KAAK,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAAiD;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sDAAA,EAAkD,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,IACnG;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,UAAA;AAAA,MACnC,KAAK,UAAA,CAAW,GAAA;AAAA,QAAI,CAAC,SAAA,KACnB,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,mBAAkB,EAAG,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,qBAAqB;AAAA;AAC7F,KACF;AAGA,IAAA,MAAM,UAAsC,EAAC;AAC7C,IAAA,MAAM,WAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,iBAAiB,cAAA,EAAgB;AAC1C,MAAA,IAAI,aAAA,CAAc,WAAW,WAAA,EAAa;AACxC,QAAA,MAAM,SAAS,aAAA,CAAc,KAAA;AAC7B,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAGnB,QAAA,IAAA,CAAK,iBAAA,CAAkB,UAAU,MAAM,CAAA;AAAA,MACzC,CAAA,MAAO;AAEL,QAAA,MAAM,QAAQ,aAAA,CAAc,MAAA;AAC5B,QAAA,OAAA,CAAQ,IAAA,CAAK,gEAAsD,KAAK,CAAA;AAExE,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,MAAM,EAAC;AAAA,UACP,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC5D,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACnC,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACtD,IAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,GAAS,YAAA;AAEtC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,qDAAgD,aAAa,CAAA,IAAA,EAAO,YAAY,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,YAAA;AAAA,OACpG;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CAAkB,UAA4B,MAAA,EAAwC;AAC5F,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AAE5B,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,KAAA;AACH,QAAA,QAAA,CAAS,GAAA,GAAM,IAAA;AACf,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,QAAA,CAAS,EAAA,GAAK,IAAA;AACd,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,QAAA,CAAS,MAAA,GAAS,IAAA;AAClB,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,QAAA,CAAS,UAAA,GAAa,IAAA;AACtB,QAAA;AAAA,MACF;AACE,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oDAAA,EAA6C,SAAS,CAAA,CAAE,CAAA;AAAA,QACvE;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,CAAe,OAAA,EAAqB,SAAA,EAAmB,SAAA,EAA+B;AAClG,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,iBAAA,EAAoB,SAAS,IAAI,CAAC,CAAA;AAAA,MACjE,GAAG,SAAS,CAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,EAC/C;AACF,CAAA;AAoCO,SAAS,uBAAA,CACd,kBACA,eAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAa,IAAI,kBAAA,EAAmB;AAG1C,EAAA,UAAA,CAAW,iBAAA,CAAkB,IAAI,oBAAA,EAAsB,CAAA;AACvD,EAAA,UAAA,CAAW,iBAAA,CAAkB,IAAI,mBAAA,EAAqB,CAAA;AACtD,EAAA,UAAA,CAAW,iBAAA,CAAkB,IAAI,uBAAA,EAAyB,CAAA;AAC1D,EAAA,UAAA,CAAW,iBAAA;AAAA,IACT,IAAI,2BAAA,CAA4B;AAAA,MAC9B,MAAA,EAAQ,gBAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAEA,EAAA,OAAO,UAAA;AACT;AC9PO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,OAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA,MACZ,GAAG;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,MAAA,GAASC,MAAM,MAAA,CAAO;AAAA,MACzB,OAAA,EAAS,KAAK,OAAA,CAAQ,SAAA;AAAA,MACtB,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,OAC5B;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,CAAa,WAAA,GAAsB,EAAA,EAA+B;AACtE,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,YAAY,OAAA,EAAA,EAAW;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAA6B,sBAAsB,KAAA,CAAA,EAAW;AAAA,UAC/F,MAAA,EAAQ;AAAA,YACN,WAAA;AAAA,YACA,WAAA,EAAa;AAAA;AACf,SACD,CAAA;AAED,QAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS;AAC1B,UAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,WAAW,0BAA0B,CAAA;AAAA,QACrE;AAEA,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,IAAI,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAEjD,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AAEzC,UAAA,MAAM,QAAQ,IAAA,CAAK,OAAA,CAAQ,aAAa,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAC3D,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,6BAA6B,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,IAAIA,KAAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG;AAE7B,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,QAAA,OAAO,sCAAA;AAAA,MACT;AACA,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,QAAA,OAAO,oDAAA;AAAA,MACT;AACA,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,QAAA,OAAO,4CAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,OAAA,IAAW,KAAA,CAAM,OAAA;AAAA,IAChD;AACA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACf;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AACF,CAAA;AClFO,IAAM,mBAAN,MAAuB;AAAA,EACpB,QAAA;AAAA,EACA,OAAA;AAAA,EAER,WAAA,CAAY,QAAA,EAA4B,OAAA,GAAmC,EAAC,EAAG;AAC7E,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,OAAA,EAAS,GAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,KAAA,EAAO,KAAA;AAAA,MACP,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,UAAA,EAAiC,MAAA,EAAuC;AACvF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAEzC,IAAA,IAAI;AAEF,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AACtC,MAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AAGvB,MAAA,IAAI,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS;AACpC,QAAA,OAAO;AAAA,UACL,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,CAAA,UAAA,EAAa,QAAQ,CAAA,uBAAA,EAA0B,IAAA,CAAK,SAAS,OAAO,CAAA,MAAA,CAAA;AAAA,UAC3E,QAAA;AAAA,UACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACzB;AAAA,MACF;AAGA,MAAA,MAAM,YAAY,OAAA,CAAQ,QAAQ,EAAE,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AACzD,MAAA,MAAM,YAAA,GAAe,KAAK,QAAA,CAAS,gBAAA;AACnC,MAAA,IAAI,aAAa,MAAA,GAAS,CAAA,IAAK,CAAC,YAAA,CAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AAChE,QAAA,OAAO;AAAA,UACL,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,CAAA,iBAAA,EAAoB,SAAS,2BAA2B,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACtF,QAAA;AAAA,UACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACzB;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAGtD,MAAA,MAAM,KAAK,eAAA,CAAgB,UAAA,CAAW,IAAA,EAAM,SAAA,EAAW,WAAW,WAAW,CAAA;AAG7E,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAQ,CAAA;AAEtD,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,OAAA,CAAQ,IAAI,CAAA,oBAAA,EAAgB,UAAA,CAAW,IAAI,CAAA,QAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,MAC9D;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,OAAA,EAAS,IAAA;AAAA,QACT,SAAA,EAAW,SAAA;AAAA,QACX,QAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,OAAA,CAAQ,KAAK,CAAA,6BAAA,EAAsB,UAAA,CAAW,IAAI,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAAA,MACxE;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,YAAA;AAAA,QACP,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAA,CAAU,WAAA,EAAoC,MAAA,EAAyC;AAC3F,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,mBAAmB,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAEzD,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,gBAAA,CAAiB,GAAA,CAAI,CAAC,UAAA,KAAe,IAAA,CAAK,UAAA,CAAW,UAAA,EAAY,MAAM,CAAC,CAAC,CAAA;AAGlH,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AACpC,MAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,MAAA,CAAO,KAAA;AAAA,MAChB;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,gBAAA,CAAiB,KAAK,CAAA,CAAE,IAAA;AAAA,QAC9B,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,OAAA,IAAW;AAAA,OACnC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,QAAgB,QAAA,EAA0B;AAC/D,IAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,QAAA,KAAa,IAAA,CAAK,QAAA;AAC5D,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC/E,IAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,IAAI,IAAI,QAAQ,CAAA,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,CAAe,QAAgB,QAAA,EAA0B;AAC/D,IAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAU,QAAA,KAAa,IAAA,CAAK,QAAA;AAClD,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,cAAA,CAAe,MAAM,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC/E,IAAA,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAA,EAAwB;AAE7C,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CAAgB,QAAA,EAAkB,SAAA,EAAmB,WAAA,EAAoC;AACrG,IAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,IAAS,UAAU,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,YAAY,OAAA,EAAA,EAAW;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,SAAA,EAAW,WAAW,CAAA;AACpD,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAEpE,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AAEzC,UAAA,MAAM,KAAA,GAAQ,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AACxC,UAAA,MAAM,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,6BAA6B,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAA,CAAS,QAAA,EAAkB,SAAA,EAAmB,WAAA,EAAoC;AAC9F,IAAA,MAAM,UAAA,GAAa,iBAAiB,QAAQ,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAE/B,IAAA,MAAMA,KAAAA,CAAM,GAAA,CAAI,SAAA,EAAW,UAAA,EAAY;AAAA,MACrC,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,WAAA;AAAA,QAChB,kBAAkB,KAAA,CAAM,IAAA;AAAA,QACxB,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,gBAAA,EAAkB,QAAA;AAAA,MAClB,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAwB;AACtB,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAK,QAAA,CAAS,SAAS,EAAE,OAAA,EAAQ;AAC5D,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,OAAO,SAAA,GAAY,GAAA,GAAM,CAAA,GAAI,EAAA,GAAK,GAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,QAAA;AAAA,EACvB;AACF,CAAA;;;ACzMA,IAAM,sBAAA,GAAyB,GAAA;AAG/B,IAAM,eAAA,GAAkB,EAAA;AAEjB,IAAM,mBAAN,MAA2C;AAAA,EACxC,MAAA;AAAA,EACA,QAAA,GAAmC,IAAA;AAAA,EACnC,UAAA,GAAgC,IAAA;AAAA,EAChC,MAAA,GAA6B,IAAA;AAAA,EAC7B,KAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,cAAA,GAAiB,CAAA;AAAA;AAAA,EAGjB,SAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAGA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA;AAAA,EAGjB,aAAA,GAAgB,KAAA;AAAA;AAAA,EAGhB,SAAA,GAA2B,IAAA;AAAA;AAAA,EAG3B,gBAAA,GAA4C,IAAA;AAAA,EAC5C,gBAAA,GAAmB,IAAA;AAAA;AAAA;AAAA,EAGnB,WAAA,GAAuC,IAAA;AAAA,EACvC,UAAA,GAAa,KAAA;AAAA,EAErB,WAAA,CAAY,MAAA,GAAyB,EAAC,EAAG;AAEvC,IAAA,MAAM,SAAA,GAAY,KAAK,aAAA,EAAc;AAGrC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,SAAA,EAAU;AAExC,IAAA,IAAA,CAAK,QAAQ,UAAA,EAAW;AAGxB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,MAC5B,OAAA,EAAS,eAAA;AAAA,MACT,OAAA,EAAS,OAAO,MAAA,KAAW;AACzB,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA;AAC3B,UAAA,IAAI,CAAC,OAAA,EAAS;AAAA,QAChB;AACA,QAAA,MAAM,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,MAC9B;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAgC;AACtC,IAAA,MAAM,aAAA,GAAgB,QAAQ,GAAA,CAAI,wBAAA;AAElC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,UAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,aAAA,EAAe,OAAO,CAAA;AACzD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAG1C,MAAA,MAAM,eAA+B,EAAC;AAEtC,MAAA,IAAI,UAAU,KAAA,KAAU,KAAA,CAAA,IAAa,OAAO,SAAA,CAAU,UAAU,QAAA,EAAU;AACxE,QAAA,YAAA,CAAa,QAAQ,SAAA,CAAU,KAAA;AAAA,MACjC;AAEA,MAAA,IAAI,UAAU,SAAA,KAAc,KAAA,CAAA,IAAa,OAAO,SAAA,CAAU,cAAc,QAAA,EAAU;AAChF,QAAA,YAAA,CAAa,YAAY,SAAA,CAAU,SAAA;AAAA,MACrC;AAEA,MAAA,IAAI,UAAU,KAAA,KAAU,KAAA,CAAA,IAAa,OAAO,SAAA,CAAU,UAAU,SAAA,EAAW;AACzE,QAAA,YAAA,CAAa,QAAQ,SAAA,CAAU,KAAA;AAAA,MACjC;AAGA,MAAA,IAAI,UAAU,OAAA,KAAY,KAAA,CAAA,IAAa,OAAO,SAAA,CAAU,YAAY,QAAA,EAAU;AAC5E,QAAA,YAAA,CAAa,YAAY,SAAA,CAAU,OAAA;AAAA,MACrC;AAGA,MAAA,IAAI,UAAU,SAAA,KAAc,KAAA,CAAA,IAAa,OAAO,SAAA,CAAU,cAAc,SAAA,EAAW;AACjF,QAAA,YAAA,CAAa,YAAY,SAAA,CAAU,SAAA;AAAA,MACrC;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,QAAQ,GAAA,CAAI,cAAA,KAAmB,UAAU,OAAA,CAAQ,GAAA,CAAI,mBAAmB,GAAA,EAAK;AAC/E,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,oDAAA;AAAA,UACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SACvD;AAAA,MACF;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,MAAA,EAAoB,KAAA,EAA6B;AAE7D,IAAA,IAAI,MAAA,IAAU,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,QAAQ,CAAA,EAAG;AACvD,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAI,uGAA6F,CAAA;AAAA,MAC3G;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAE5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAA,CAAK,wBAAwB,oCAAA,EAAsC;AAAA,QACjE,4DAAA;AAAA,QACA,kDAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,SAAA,GAAY;AAAA,QACf,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA;AAAA,QACtB,KAAA,EAAO,OAAO,KAAA,CAAM;AAAA,OACtB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAG7B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,OAAO,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAc,gBAAA,CAAiB,MAAA,EAAoB,KAAA,EAAc,KAAA,EAAiC;AAChG,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AAEpC,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAGzD,MAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,EAAE,KAAA,EAAO,WAAW,CAAA;AACrD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAChD,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,MAAA,OAAA,CAAQ,IAAI,6CAAwC,CAAA;AACpD,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAAwB,IAAA,CAAK,SAAS,CAAA,6BAAA,CAA0B,CAAA;AAAA,MAC9E;AAGA,MAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB;AAAA,QAClC,KAAA;AAAA,QACA,SAAA,EAAW,KAAK,SAAA,IAAa,KAAA,CAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,eAAA,EAAgB;AAAA,QAChC,aAAa,MAAM;AACjB,UAAA,OAAA,CAAQ,IAAI,yCAAkC,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,gBAAgB,MAAM;AACpB,UAAA,OAAA,CAAQ,IAAI,4CAAqC,CAAA;AAAA,QACnD,CAAA;AAAA,QACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAElB,UAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AAEvB,YAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,cAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,cAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,cAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,YAC5B;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,OAAA,CAAQ,KAAA,CAAM,mCAAA,EAAgC,KAAA,CAAM,OAAO,CAAA;AAAA,UAC7D;AAAA,QACF;AAAA,OACD,CAAA;AAGD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,0EAAgE,CAAA;AAC7E,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAGA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,KAAA;AAClD,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,MAAM,IAAA,CAAK,0BAAA,CAA2B,KAAA,EAAO,SAAS,CAAA;AAAA,MACxD;AAKA,MAAA,MAAM,UAAA,GAAgC;AAAA,QACpC,IAAA,EAAM,WAAA;AAAA,QACN,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA;AAAA,QACA,GAAG,KAAK,gBAAA;AAAiB,OAC3B;AACA,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,UAAU,CAAC,CAAA;AAGlC,MAAA,IAAA,CAAK,sBAAA,EAAuB;AAE5B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAGlB,MAAA,IAAI,iBAAiB,KAAA,IAAS,MAAA,IAAU,KAAA,IAAS,YAAA,CAAa,KAAK,CAAA,EAAG;AACpE,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,MAC5B,CAAA,MAAA,IACE,YAAA,CAAa,QAAA,CAAS,uBAAuB,CAAA,IAC7C,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,IAC3B,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,EACpC;AACA,QAAA,IAAA,CAAK,wBAAwB,kDAAA,EAAoD;AAAA,UAC/E,8BAAA;AAAA,UACA,gCAAA;AAAA,UACA,8CAAA;AAAA,UACA,eAAe,SAAS,CAAA;AAAA,SACzB,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,uBAAA,CAAwB,CAAA,wCAAA,EAA2C,YAAY,CAAA,CAAA,EAAI;AAAA,UACtF,oDAAA;AAAA,UACA,iCAAiC,SAAS,CAAA,CAAA;AAAA,UAC1C,4BAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,IAAA,EAAgB,MAAA,EAAmC;AACnE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAE1C,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,IAAA,EAAM,YAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,SAAA,EAAU;AAAA;AAAA,MAG1B,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,QAAA,CAAS;AAAA,OACxB;AAAA;AAAA,MAGA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AAAA;AAAA,MAGF,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA;AAAA,MAGtB,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AAAA;AAAA,MAGhD,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA;AAAQ,KACtC;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,IAAA,EAAgB,MAAA,EAAoB,IAAA,EAA+B;AACnF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAE1C,IAAA,MAAM,KAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,YAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,SAAA,EAAU,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MAChD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,SAAA,EAAU;AAAA;AAAA,MAG1B,UAAU,IAAA,CAAK,QAAA;AAAA;AAAA,MAGf,QAAA,EAAU,KAAK,QAAA,GACX;AAAA,QACE,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,QAAA,CAAS;AAAA,OACxB,GACA,MAAA;AAAA;AAAA,MAGJ,YAAY,IAAA,CAAK,MAAA,GAAS,KAAK,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AAAA;AAAA,MAGhE,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ;AAAA;AAAA,MAGlC,OAAO,MAAA,CAAO,KAAA;AAAA;AAAA,MAGd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CAAU,IAAA,EAAgB,MAAA,EAAoB,IAAA,EAA+B;AACjF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAG1C,IAAA,MAAM,MAAA,GAA8B,IAAA,CAAK,KAAA,GAAQ,QAAA,GAAW,QAAA;AAE5D,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,IAAA,EAAM,UAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,KAAK,SAAA,EAAU,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,MAChD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,SAAA,EAAU;AAAA;AAAA,MAG1B,UAAU,IAAA,CAAK,QAAA;AAAA;AAAA,MAGf,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA,MAGnC,MAAA;AAAA;AAAA,MAGA,UAAA,EAAY,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAAA;AAAA,MAGvC,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAAA;AAAA,MAGzC,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AAAA;AAAA,MAGF,OAAO,MAAA,CAAO,KAAA;AAAA;AAAA,MAGd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CAAU,IAAA,EAAgB,MAAA,EAAmC;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAG1C,IAAA,MAAM,sBAAsB,MAAM,IAAA,CAAK,kBAAkB,MAAA,CAAO,WAAA,EAAa,KAAK,EAAE,CAAA;AAEpF,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,QAAQ,IAAA,CAAK,EAAA;AAAA;AAAA,MAGb,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,KAAK,OAAA,EAAQ;AAAA;AAAA,MAGtB,UAAU,MAAA,CAAO,QAAA;AAAA;AAAA,MAGjB,OAAO,MAAA,CAAO,KAAA;AAAA;AAAA,MAGd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO,aAAA;AAAA;AAAA,MAGtB,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACxC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE;AAAA,OACjB,CAAE,CAAA;AAAA;AAAA,MAGF,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,MAAS,CAAA;AAAA;AAAA,MAGhH,KAAA,EAAO,IAAA,CAAK,uBAAA,CAAwB,MAAM,CAAA;AAAA;AAAA,MAG1C,WAAA,EAAa,mBAAA;AAAA;AAAA,MAGb,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,GAAS,IAAI,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AAAA,MAC9E,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA,GAAS,IAAI,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,MAAM,CAAA,GAAI;AAAA,KAChF;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAA,EAAmC;AAE7C,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,OAAA,CAAQ,IAAI,kFAA6E,CAAA;AACzF,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAGvB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEZ,MAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,QAAQ,MAAA,CAAO,MAAA;AAAA;AAAA,MAGf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA,EAAQ;AAAA;AAAA,MAGpC,OAAO,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAG5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAQ,KAAA,EAAM;AACzB,MAAA,OAAA,CAAQ,IAAI,+CAA0C,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kDAA6C,KAAK,CAAA;AAAA,IAClE;AAGA,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,KAAA,EAAiC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAE1C,IAAA,MAAM,KAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,WAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,KAAA,EAAO,IAAA,CAAK,kBAAA,CAAmB,KAAK;AAAA,KACtC;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,EAAwB,IAAA,EAAiB,MAAA,EAAoC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAE1C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,IAAA,CAAK,cAAc,KAAK,CAAA;AAEpD,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,aAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,IAAA;AAAA;AAAA,MAGA,QAAQ,IAAA,EAAM,EAAA;AAAA,MACd,OAAO,MAAA,EAAQ,KAAA;AAAA;AAAA,MAGf;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,EAAwB,IAAA,EAAiB,MAAA,EAAoC;AAC1F,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,UAAA,EAAY;AAE1C,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,IAAA,CAAK,cAAc,KAAK,CAAA;AAEpD,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,aAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA;AAAA,MAGzB,IAAA;AAAA;AAAA,MAGA,QAAQ,IAAA,EAAM,EAAA;AAAA,MACd,OAAO,MAAA,EAAQ,KAAA;AAAA;AAAA,MAGf;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAAyB;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,MAAA,EAAoC;AAC3D,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,cAAA,GAAiB,KAAA;AACvB,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,uCAAA,EAAmC,MAAM,IAAI,CAAA,UAAA,EAAa,MAAM,QAAQ,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA,QAAA,EAAW,eAAe,MAAM,CAAA,OAAA,EAAU,eAAe,KAAK,CAAA,eAAA,EAAkB,eAAe,aAAa,CAAA,OAAA,EAAU,eAAe,KAAK,CAAA;AAAA,WACzO;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,UAAA,MAAM,YAAA,GAAe,KAAA;AACrB,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,0CAAmC,KAAA,CAAM,IAAI,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,aAAa,MAAM,CAAA,OAAA,EAAU,aAAa,KAAK,CAAA,eAAA,EAAkB,aAAa,aAAa,CAAA;AAAA,WACrM;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uCAAA,EAAmC,KAAA,CAAM,IAAI,CAAA,UAAA,EAAa,MAAM,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QAC7G;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,QAAA,EAAU,aAAY,EAAG;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAM,CAAA;AACpC,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,KAAK,2EAAiE,CAAA;AAC9E,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,MACzC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oDAA+C,KAAK,CAAA;AAClE,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAA+B;AACrC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,cAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAuB;AAC7B,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,OAAA,CAAQ,IAAI,mBAAA,IAAuB,0BAAA;AAG5E,IAAA,OAAO,QAAQ,QAAA,CAAS,eAAe,CAAA,GAAI,OAAA,GAAU,GAAG,OAAO,CAAA,aAAA,CAAA;AAAA,EACjE;AAAA,EAEQ,eAAA,GAA0B;AAChC,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,OAAA,CAAQ,IAAI,mBAAA,IAAuB,0BAAA;AAG5E,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA;AACrD,IAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CAAgB,gBAAA,EAA8B,eAAA,EAA8C;AACxG,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,GAAoB,uBAAA,CAAwB,gBAAA,EAAkB,eAAe,CAAA;AACnF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,UAAA,EAAW;AAElD,MAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,QAAA,OAAA,CAAQ,IAAA,CAAK,2BAAiB,MAAA,CAAO,YAAY,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAAA,MACzG;AAGA,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,aAAA,CAAc,eAAe,CAAA;AAGhE,MAAA,OAAO;AAAA,QACL,GAAG,MAAA,CAAO,QAAA;AAAA,QACV;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,uDAA6C,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAChH,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAmB;AACzB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,EAAE,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAA,EAA8C;AACvE,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,OAAO,QAAA,GACb;AAAA,QACE,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OAC1B,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAA,EAAoD;AAC5E,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAA,EAAU,OAAO,QAAA,GACb;AAAA,QACE,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,IAAA,EAAM,OAAO,QAAA,CAAS,IAAA;AAAA,QACtB,MAAA,EAAQ,OAAO,QAAA,CAAS;AAAA,OAC1B,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAgD;AACxE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,KAAA,CAAM,MAAA;AAAA,MAClB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAChC,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,MAAA,EAAQ,KAAA,CAAM,KAAA,GAAQ,QAAA,GAAW;AAAA,OACnC,CAAE;AAAA,KACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAA,EAAyD;AAC5E,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAAA,MACtC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA,EAAU,MAAM,QAAA,GACZ;AAAA,QACE,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,QACrB,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,QACrB,MAAA,EAAQ,MAAM,QAAA,CAAS;AAAA,OACzB,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,KAAA,EAA8C;AACvE,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA,EAAU,MAAM,QAAA,GACZ;AAAA,QACE,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,QACrB,IAAA,EAAM,MAAM,QAAA,CAAS,IAAA;AAAA,QACrB,MAAA,EAAQ,MAAM,QAAA,CAAS;AAAA,OACzB,GACA,MAAA;AAAA;AAAA,MAEJ,KAAA,EAAO,MAAM,KAAA,GACT;AAAA,QACE,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QACrB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,QACnB,OAAA,EAAS,MAAM,KAAA,CAAM,OAAA;AAAA,QACrB,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,QACnB,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,QAAA,GAClB;AAAA,UACE,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,IAAA;AAAA,UAC3B,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,IAAA;AAAA,UAC3B,MAAA,EAAQ,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS;AAAA,SAC/B,GACA;AAAA,OACN,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,CAAwB,SAAiB,SAAA,EAA2B;AAC1E,IAAA,MAAM,MAAA,GAAS,QAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,MAAM,gDAA2C,CAAA;AACzD,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,MAAM,cAAc,CAAA;AAC5B,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AACrC,MAAA,OAAA,CAAQ,MAAM,CAAA,IAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/C,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,KAAA,EAAsB;AAC5C,IAAA,MAAM,MAAA,GAAS,QAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,IAAA,MAAM,QAAA,GAAY,SAAS,QAAA,IAAuB,SAAA;AAClD,IAAA,MAAM,YAAY,OAAA,EAAS,SAAA;AAG3B,IAAA,IAAI,OAAA,GAAU,0BAAA;AACd,IAAA,OAAA,IAAW;;AAAA,gBAAA,EAAuB,QAAQ,CAAA,CAAA;AAE1C,IAAA,IAAI,SAAA,CAAU,SAAS,iBAAA,EAAmB;AACxC,MAAA,OAAA,IAAW;AAAA,iBAAA,EAAsB,OAAA,CAAQ,cAAc,SAAS,CAAA,WAAA,CAAA;AAChE,MAAA,OAAA,IAAW;AAAA,QAAA,EAAa,OAAA,CAAQ,QAAQ,SAAS,CAAA,WAAA,CAAA;AACjD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAA,IAAW;AAAA,gBAAA,EAAqB,IAAI,IAAA,CAAK,SAAmB,CAAA,CAAE,oBAAoB,CAAA,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,KAAS,gBAAA,EAAkB;AAC9C,MAAA,MAAM,QAAA,GAAW,OAAA;AAMjB,MAAA,OAAA,IAAW;AAAA,iBAAA,EAAsB,QAAA,CAAS,SAAS,SAAS,CAAA,WAAA,CAAA;AAC5D,MAAA,OAAA,IAAW;AAAA,QAAA,EAAa,QAAA,CAAS,QAAQ,SAAS,CAAA,WAAA,CAAA;AAGlD,MAAA,MAAM,SAAA,GAAA,CAAa,QAAA,CAAS,KAAA,IAAS,CAAA,KAAM,SAAS,IAAA,IAAQ,CAAA,CAAA;AAE5D,MAAA,OAAA,IAAW;AAAA,aAAA,EAAkB,SAAS,CAAA,WAAA,CAAA;AACtC,MAAA,OAAA,IAAW;AAAA,qBAAA,EAA0B,QAAA,CAAS,cAAc,SAAS,CAAA,CAAA;AACrE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAA,IAAW;AAAA,gBAAA,EAAqB,IAAI,IAAA,CAAK,SAAmB,CAAA,CAAE,oBAAoB,CAAA,CAAA;AAAA,MACpF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,MAAM,2CAAsC,CAAA;AACpD,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,MAAM,cAAc,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAM,oDAAoD,CAAA;AAClE,IAAA,OAAA,CAAQ,MAAM,qCAAqC,CAAA;AACnD,IAAA,OAAA,CAAQ,MAAM,4DAA4D,CAAA;AAC1E,IAAA,OAAA,CAAQ,MAAM,MAAM,CAAA;AACpB,IAAA,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAA+D;AAEnF,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,MAAA,aAAA,GAAgB,KAAA,CAAM,SAAS,OAAO,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,KAAA;AAAA,IAClB;AAGA,IAAA,IAAI,aAAA,CAAc,SAAS,sBAAA,EAAwB;AACjD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA,CAAc,SAAA,CAAU,CAAA,EAAG,sBAAsB,CAAA,GAAI,eAAA;AAAA,QAC3D,SAAA,EAAW;AAAA,OACb;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,MAAM,aAAA,EAAc;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,IAAA,EAAiD;AAC1E,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAClC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,MAAM,CAAA,CAAE;AAAA;AAAA,KACV,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,MAAA,EAA2C;AACzE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,MACpB,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AAAA,MAC7C,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE;AAAA,KAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAA,EAA0C;AACrE,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAU,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,QAAA,EAAW,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,oBAAoB,SAAA,EAA+B;AACzD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,sBAAA,CAAuB,SAAS,CAAA;AAMnD,IAAA,OAAO,KAAA,GAAQ,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,uBAAuB,SAAA,EAA4B;AAEzD,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAMhC,MAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAClD,QAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAC/B,QAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA,EAAG;AACzC,UAAA,KAAA,EAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmB,KAAA,EAAyB;AAClD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAMA,IAAA,OACE,KAAA,CAAM,QAAA,CAAS,sBAAsB,CAAA,IACrC,KAAA,CAAM,SAAS,kBAAkB,CAAA,IACjC,KAAA,CAAM,QAAA,CAAS,qBAAqB,CAAA;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,GAA+B;AAIrC,IAAA,IAAA,CAAK,gBAAgB,MAAM;AAEzB,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,OAAA,CAAQ,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,OAAA,CAAQ,cAAA,CAAe,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,MACvD;AAEA,MAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,GAAG,CAAA;AAAA,IACvC,CAAA;AAEA,IAAA,IAAA,CAAK,iBAAiB,MAAM;AAE1B,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,OAAA,CAAQ,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AAAA,MACrD;AACA,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,OAAA,CAAQ,cAAA,CAAe,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,MACvD;AAEA,MAAA,IAAA,CAAK,kBAAA,CAAmB,WAAW,GAAG,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AACvC,IAAA,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,OAAA,CAAQ,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAA,CAAQ,cAAA,CAAe,SAAA,EAAW,IAAA,CAAK,cAAc,CAAA;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,CAAmB,QAAgB,QAAA,EAAwB;AAEjE,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAEtB,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,iCAAA,EAA4B,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAE/E,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB;AAGA,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,SAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,GAAG,KAAK,gBAAA,EAAiB;AAAA,MACzB,MAAA,EAAQ,aAAA;AAAA,MACR,UAAU,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI,GAAI,KAAK,YAAA,GAAe,CAAA;AAAA,MAC/D,SAAA,EAAW,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,GAAA,EAAI;AAAA,MACzC,OAAO,IAAA,CAAK;AAAA,KACd;AAGA,IAAA,MAAM,SAAA,GAAY,YAAY,MAAM;AAAA,IAEpC,GAAG,GAAG,CAAA;AAGN,IAAA,MAAM,cAAA,GAAiB,WAAW,MAAM;AACtC,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,OAAA,CAAQ,MAAM,qDAAgD,CAAA;AAC9D,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB,GAAG,GAAI,CAAA;AAGP,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,IAAI;AAEF,QAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA,EAAG,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,cAAc,CAAC,CAAC,CAAA;AAEjG,QAAA,OAAA,CAAQ,IAAI,0CAAqC,CAAA;AAAA,MACnD,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oDAAA,EAAkD,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC5E,CAAA,SAAE;AAEA,QAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,QAAA,aAAA,CAAc,SAAS,CAAA;AACvB,QAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAGA,IAAA,WAAA,EAAY,CAAE,MAAM,MAAM;AACxB,MAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,MAAA,aAAA,CAAc,SAAS,CAAA;AACvB,MAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBAAsB,KAAA,EAAuC;AAEzE,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,QAAA,EAAU,aAAY,EAAG;AACzD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC9B,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAA,CAAQ,KAAK,kDAAwC,CAAA;AAAA,MACvD;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAK,CAAA;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAA,CAAe,IAAY,OAAA,EAAiC;AAClE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG,WAAW,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,0BAAA,CAA2B,KAAA,EAAe,SAAA,EAAkC;AACxF,IAAA,IAAI;AAEF,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AAErD,MAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe;AAAA,QACxC,KAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,YAAA,EAAa;AAEnD,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,QAAA,EAAU;AAAA,QACrD,KAAA,EAAO,KAAK,MAAA,CAAO;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAI,8CAAuC,CAAA;AAAA,MACrD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,IAAA,CAAK,uDAA6C,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAChH,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBAAA,CACZ,WAAA,EACA,MAAA,EACsE;AAEtE,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,KAAK,gBAAA,EAAkB;AACpD,MAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,MAAM,CAAA,CAAE;AAAA,OACV,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,MAAM,eAAA,GAAyC,WAAA,CAC5C,MAAA,CAAO,CAAC,CAAA,KAAgE,CAAC,CAAC,CAAA,CAAE,IAAI,CAAA,CAChF,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,MAAM,CAAA,CAAE;AAAA,KACV,CAAE,CAAA;AAGJ,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,MAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,MAAM,CAAA,CAAE;AAAA,OACV,CAAE,CAAA;AAAA,IACJ;AAGA,IAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAU,iBAAiB,MAAM,CAAA;AAGnF,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5B,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACzC,MAAA,IAAI,YAAA,EAAc,OAAA,IAAW,YAAA,CAAa,SAAA,EAAW;AAEnD,QAAA,OAAO;AAAA,UACL,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAM,YAAA,CAAa;AAAA,SACrB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,MAAM,CAAA,CAAE;AAAA,OACV;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAA,EAA2B;AAElD,IAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAAA,EACjD;AACF","file":"index.mjs","sourcesContent":["/**\n * Server error classes for quota and infrastructure errors\n * These are received from the TestDino server and handled gracefully in the reporter\n * Follows the same Error class pattern as cli/errors.ts\n */\n\n/**\n * Base class for all TestDino server errors\n * Extends Error to work with standard error handling\n */\nexport class TestDinoServerError extends Error {\n public readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = 'TestDinoServerError';\n this.code = code;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Quota exhausted error (session creation)\n * HTTP 402 response when organization pool is exhausted\n */\nexport class QuotaExhaustedError extends TestDinoServerError {\n public readonly details: {\n planName: string;\n totalLimit: number;\n used: number;\n resetDate?: string;\n };\n\n constructor(\n message: string,\n details: {\n planName: string;\n totalLimit: number;\n used: number;\n resetDate?: string;\n }\n ) {\n super('QUOTA_EXHAUSTED', message);\n this.name = 'QuotaExhaustedError';\n this.details = details;\n }\n}\n\n/**\n * Quota exceeded error (run:begin)\n * WebSocket NACK when test count exceeds available quota\n */\nexport class QuotaExceededError extends TestDinoServerError {\n public readonly details: {\n planName: string;\n totalTests: number;\n remaining: number;\n used: number;\n total: number;\n resetDate?: string;\n canPartialSubmit: boolean;\n allowedCount: number;\n };\n\n constructor(\n message: string,\n details: {\n planName: string;\n totalTests: number;\n remaining: number;\n used: number;\n total: number;\n resetDate?: string;\n canPartialSubmit: boolean;\n allowedCount: number;\n }\n ) {\n super('QUOTA_EXCEEDED', message);\n this.name = 'QuotaExceededError';\n this.details = details;\n }\n}\n\n/**\n * Queue full error (backpressure)\n * WebSocket NACK when event queue is full\n */\nexport class QueueFullError extends TestDinoServerError {\n constructor(message: string) {\n super('QUEUE_FULL', message);\n this.name = 'QueueFullError';\n }\n}\n\n/**\n * Circuit breaker error (Redis unavailable)\n * WebSocket NACK when circuit breaker is open\n */\nexport class CircuitBreakerError extends TestDinoServerError {\n public readonly retryAfter?: number;\n\n constructor(message: string, retryAfter?: number) {\n super('CIRCUIT_BREAKER_OPEN', message);\n this.name = 'CircuitBreakerError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Union type for all server error classes\n */\nexport type ServerError = QuotaExhaustedError | QuotaExceededError | QueueFullError | CircuitBreakerError;\n\n/**\n * Type guard to check if error is a server error instance\n * @param error - Unknown error value to check\n * @returns true if error is an instance of TestDinoServerError\n */\nexport function isServerError(error: unknown): error is ServerError {\n return error instanceof TestDinoServerError;\n}\n\n/**\n * Type guard to check if error is a quota-related error\n * @param error - Unknown error value to check\n * @returns true if error is QuotaExhaustedError or QuotaExceededError\n */\nexport function isQuotaError(error: unknown): error is QuotaExhaustedError | QuotaExceededError {\n return error instanceof QuotaExhaustedError || error instanceof QuotaExceededError;\n}\n\n/**\n * Type guard to check if error is a retryable infrastructure error\n * @param error - Unknown error value to check\n * @returns true if error is QueueFullError or CircuitBreakerError\n */\nexport function isRetryableError(error: unknown): error is QueueFullError | CircuitBreakerError {\n return error instanceof QueueFullError || error instanceof CircuitBreakerError;\n}\n","/**\n * WebSocket client for real-time event streaming\n */\n\nimport WebSocket from 'ws';\nimport type { TestEvent, NackMessage } from '../types/index.js';\nimport { isServerError, QuotaExceededError, QuotaExhaustedError } from '../reporter/errors.js';\n\nconst HANDSHAKE_TIMEOUT_MS = 10_000;\n\nexport interface WebSocketClientOptions {\n token: string;\n serverUrl: string;\n sessionId?: string;\n maxRetries?: number;\n retryDelay?: number;\n onConnected?: () => void;\n onDisconnected?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport class WebSocketClient {\n private ws: WebSocket | null = null;\n private options: Required<WebSocketClientOptions>;\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private isConnecting = false;\n private isClosed = false;\n private pingInterval: NodeJS.Timeout | null = null;\n\n constructor(options: WebSocketClientOptions) {\n this.options = {\n sessionId: '',\n maxRetries: 5,\n retryDelay: 1000,\n onConnected: () => {},\n onDisconnected: () => {},\n onError: () => {},\n ...options,\n };\n }\n\n /**\n * Establish WebSocket connection.\n * Resolves only after the server sends its 'connected' handshake message,\n * guaranteeing the server's message handler is registered before events are sent.\n * Passes sessionId from HTTP auth so the server reuses the existing session.\n */\n async connect(): Promise<void> {\n if (this.isConnecting || this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n this.isConnecting = true;\n\n return new Promise((resolve, reject) => {\n try {\n // Include sessionId in URL if available from prior HTTP auth\n let wsUrl = `${this.options.serverUrl}/stream?token=${this.options.token}`;\n if (this.options.sessionId) {\n wsUrl += `&sessionId=${this.options.sessionId}`;\n }\n this.ws = new WebSocket(wsUrl);\n\n // Track whether we've received the server's 'connected' handshake\n let serverReady = false;\n\n const handshakeTimeout = setTimeout(() => {\n if (!serverReady) {\n // Server didn't send 'connected' in time — resolve anyway to avoid blocking\n // the test run indefinitely. The early message buffer on the server will\n // catch any messages sent before the handler is ready.\n console.warn(\n `āš ļø TestDino: WebSocket handshake timeout — server did not send 'connected' within ${HANDSHAKE_TIMEOUT_MS}ms. Resolving anyway.`\n );\n serverReady = true;\n this.isConnecting = false;\n this.options.onConnected();\n resolve();\n }\n }, HANDSHAKE_TIMEOUT_MS);\n\n this.ws.on('open', () => {\n this.reconnectAttempts = 0;\n this.startPing();\n });\n\n this.ws.on('message', (data) => {\n const raw = data.toString();\n\n // Intercept the 'connected' handshake message\n if (!serverReady) {\n try {\n const msg = JSON.parse(raw) as Record<string, unknown>;\n if (msg.type === 'connected') {\n serverReady = true;\n clearTimeout(handshakeTimeout);\n this.isConnecting = false;\n this.options.onConnected();\n resolve();\n return;\n }\n } catch {\n // Not JSON — fall through to normal handling\n }\n }\n\n this.handleMessage(raw);\n });\n\n this.ws.on('close', (code, reason) => {\n clearTimeout(handshakeTimeout);\n if (!serverReady) {\n this.isConnecting = false;\n reject(new Error(`WebSocket closed before server ready: code=${code} reason=${reason.toString()}`));\n return;\n }\n this.handleClose(code, reason.toString());\n });\n\n this.ws.on('error', (error) => {\n clearTimeout(handshakeTimeout);\n this.isConnecting = false;\n this.options.onError(error);\n reject(error);\n });\n\n this.ws.on('pong', () => {\n // Keep-alive response received\n });\n } catch (error) {\n this.isConnecting = false;\n reject(error);\n }\n });\n }\n\n /**\n * Send event through WebSocket\n */\n async send(event: TestEvent): Promise<void> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected');\n }\n\n return new Promise((resolve, reject) => {\n this.ws!.send(JSON.stringify(event), (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n\n /**\n * Send multiple events in batch (parallel for speed)\n */\n async sendBatch(events: TestEvent[]): Promise<void> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected');\n }\n\n // Send all events in parallel for better performance\n await Promise.all(events.map((event) => this.send(event)));\n }\n\n /**\n * Check if WebSocket is connected\n */\n isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Close WebSocket connection\n */\n close(): void {\n this.isClosed = true;\n this.stopPing();\n this.clearReconnectTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Handle incoming messages\n */\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as Record<string, unknown>;\n\n if (message.type === 'connected') {\n // Server acknowledged connection\n } else if (message.type === 'ack') {\n // Server acknowledged event receipt\n } else if (message.type === 'nack') {\n // Server rejected event - convert to Error and notify via onError\n const nack = message as unknown as NackMessage;\n\n // Convert NACK to Error and notify via lifecycle callback\n // Reporter will handle all error display (quota errors with special banner)\n if (isServerError(nack.error)) {\n // Pass the server error directly (it's already an Error instance)\n this.options.onError(nack.error);\n } else if (typeof nack.error === 'object' && nack.error !== null) {\n // Check if this is a structured quota error object\n const errorObj = nack.error as Record<string, unknown>;\n const errorCode = errorObj.code || errorObj.error;\n\n if (errorCode === 'QUOTA_EXCEEDED' && errorObj.details && typeof errorObj.details === 'object') {\n // Construct QuotaExceededError instance\n const details = errorObj.details as Record<string, unknown>;\n this.options.onError(\n new QuotaExceededError(errorObj.message?.toString() || 'Quota exceeded', {\n planName: details.planName?.toString() || 'Unknown',\n totalTests: Number(details.totalTests) || 0,\n remaining: Number(details.remaining) || 0,\n used: Number(details.used) || 0,\n total: Number(details.total) || 0,\n resetDate: details.resetDate?.toString(),\n canPartialSubmit: Boolean(details.canPartialSubmit),\n allowedCount: Number(details.allowedCount) || 0,\n })\n );\n } else if (errorCode === 'QUOTA_EXHAUSTED' && errorObj.details && typeof errorObj.details === 'object') {\n // Construct QuotaExhaustedError instance\n const details = errorObj.details as Record<string, unknown>;\n this.options.onError(\n new QuotaExhaustedError(errorObj.message?.toString() || 'Quota exhausted', {\n planName: details.planName?.toString() || 'Unknown',\n totalLimit: Number(details.totalLimit) || 0,\n used: Number(details.used) || 0,\n resetDate: details.resetDate?.toString(),\n })\n );\n } else {\n // Generic structured error\n const errorMessage =\n errorObj.message?.toString() || errorObj.error?.toString() || JSON.stringify(nack.error);\n this.options.onError(new Error(`Event rejected: ${errorMessage}`));\n }\n } else {\n // String or primitive error\n const errorMessage = typeof nack.error === 'string' ? nack.error : String(nack.error);\n this.options.onError(new Error(`Event rejected: ${errorMessage}`));\n }\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n\n /**\n * Handle connection close\n */\n private handleClose(_code: number, _reason: string): void {\n this.stopPing();\n this.options.onDisconnected();\n\n // Don't reconnect if explicitly closed\n if (this.isClosed) {\n return;\n }\n\n // Attempt reconnection with exponential backoff\n if (this.reconnectAttempts < this.options.maxRetries) {\n this.scheduleReconnect();\n } else {\n this.options.onError(new Error(`WebSocket connection failed after ${this.options.maxRetries} attempts`));\n }\n }\n\n /**\n * Schedule reconnection with exponential backoff\n */\n private scheduleReconnect(): void {\n this.clearReconnectTimer();\n\n const delay = this.options.retryDelay * Math.pow(2, this.reconnectAttempts);\n this.reconnectAttempts++;\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n console.error('Reconnection failed:', error);\n });\n }, delay);\n }\n\n /**\n * Clear reconnection timer\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n /**\n * Start ping interval for keep-alive\n */\n private startPing(): void {\n this.stopPing();\n this.pingInterval = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.ping();\n }\n }, 30000); // Ping every 30 seconds\n }\n\n /**\n * Stop ping interval\n */\n private stopPing(): void {\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n }\n}\n","/**\n * HTTP client for fallback event transmission\n */\n\nimport axios, { type AxiosInstance } from 'axios';\nimport type { TestEvent, SessionCreationQuotaResponse } from '../types/index.js';\nimport { QuotaExhaustedError } from '../reporter/errors.js';\n\nexport interface HttpClientOptions {\n token: string;\n serverUrl: string;\n maxRetries?: number;\n retryDelay?: number;\n}\n\nexport class HttpClient {\n private client: AxiosInstance;\n private options: Required<HttpClientOptions>;\n\n constructor(options: HttpClientOptions) {\n this.options = {\n maxRetries: 3,\n retryDelay: 1000,\n ...options,\n };\n\n this.client = axios.create({\n baseURL: this.options.serverUrl,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.options.token}`,\n },\n timeout: 10000,\n });\n }\n\n /**\n * Authenticate with server\n */\n async authenticate(): Promise<{ sessionId: string; wsUrl: string }> {\n try {\n const response = await this.client.post('/auth');\n return response.data;\n } catch (error) {\n // Handle quota exhausted error (402)\n if (axios.isAxiosError(error) && error.response?.status === 402) {\n const quotaError = error.response.data as SessionCreationQuotaResponse;\n\n // Throw proper Error class instance\n throw new QuotaExhaustedError(quotaError.message, quotaError.details);\n }\n\n throw new Error(`Authentication failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n /**\n * Send events via HTTP (fallback)\n */\n async sendEvents(events: TestEvent[]): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.maxRetries; attempt++) {\n try {\n await this.client.post('/events', { events });\n return;\n } catch (error) {\n lastError = new Error(this.getErrorMessage(error));\n\n if (attempt < this.options.maxRetries - 1) {\n // Wait before retry with exponential backoff\n const delay = this.options.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError || new Error('Failed to send events via HTTP');\n }\n\n /**\n * Send single event via HTTP\n */\n async sendEvent(event: TestEvent): Promise<void> {\n await this.sendEvents([event]);\n }\n\n /**\n * Extract error message from various error types\n */\n private getErrorMessage(error: unknown): string {\n if (axios.isAxiosError(error)) {\n return error.response?.data?.message || error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n\n /**\n * Sleep utility for retry delays\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Event buffer for batching and managing event transmission\n */\n\nimport type { TestEvent } from '../types/index.js';\n\nexport interface BufferOptions {\n maxSize?: number;\n onFlush?: (events: TestEvent[]) => Promise<void>;\n}\n\nexport class EventBuffer {\n private events: TestEvent[] = [];\n private maxSize: number;\n private onFlush: (events: TestEvent[]) => Promise<void>;\n private isFlushing = false;\n\n constructor(options: BufferOptions) {\n this.maxSize = options.maxSize || 10;\n this.onFlush = options.onFlush || (async () => {});\n }\n\n /**\n * Add event to buffer\n * Automatically flushes if buffer reaches max size\n */\n async add(event: TestEvent): Promise<void> {\n this.events.push(event);\n\n if (this.events.length >= this.maxSize) {\n await this.flush();\n }\n }\n\n /**\n * Flush all buffered events\n */\n async flush(): Promise<void> {\n if (this.isFlushing || this.events.length === 0) {\n return;\n }\n\n this.isFlushing = true;\n\n try {\n const eventsToFlush = [...this.events];\n this.events = [];\n await this.onFlush(eventsToFlush);\n } catch (error) {\n // If flush fails, keep events in buffer for retry\n console.error('Failed to flush events:', error);\n throw error;\n } finally {\n this.isFlushing = false;\n }\n }\n\n /**\n * Get current buffer size\n */\n size(): number {\n return this.events.length;\n }\n\n /**\n * Check if buffer is empty\n */\n isEmpty(): boolean {\n return this.events.length === 0;\n }\n\n /**\n * Clear buffer without flushing\n */\n clear(): void {\n this.events = [];\n }\n\n /**\n * Get all events without removing them\n */\n getEvents(): TestEvent[] {\n return [...this.events];\n }\n}\n","/**\n * Base metadata collector implementation\n */\n\nimport type { MetadataCollector, MetadataCollectionResult } from './types.js';\n\n/**\n * Abstract base class for metadata collectors\n * Provides common functionality and error handling patterns\n */\nexport abstract class BaseMetadataCollector<T = Record<string, unknown>> implements MetadataCollector<T> {\n protected name: string;\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Get collector name\n */\n getName(): string {\n return this.name;\n }\n\n /**\n * Collect metadata with error handling and timing\n */\n async collect(): Promise<T> {\n try {\n const data = await this.collectMetadata();\n return data;\n } catch (error) {\n // Log error but don't throw - graceful degradation\n console.warn(\n `āš ļø TestDino: ${this.name} metadata collection failed:`,\n error instanceof Error ? error.message : String(error)\n );\n return this.getEmptyMetadata();\n }\n }\n\n /**\n * Collect metadata with result tracking\n */\n async collectWithResult(): Promise<MetadataCollectionResult<T>> {\n const startTime = Date.now();\n const collector = this.getName();\n\n try {\n const data = await this.collectMetadata();\n const duration = Date.now() - startTime;\n\n return {\n data,\n success: true,\n duration,\n collector,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Log error but return empty data for graceful degradation\n console.warn(`āš ļø TestDino: ${collector} metadata collection failed:`, errorMessage);\n\n return {\n data: this.getEmptyMetadata(),\n success: false,\n error: errorMessage,\n duration,\n collector,\n };\n }\n }\n\n /**\n * Abstract method to be implemented by concrete collectors\n */\n protected abstract collectMetadata(): Promise<T>;\n\n /**\n * Abstract method to provide empty metadata on errors\n */\n protected abstract getEmptyMetadata(): T;\n\n /**\n * Utility method to run command with timeout\n */\n protected async withTimeout<R>(promise: Promise<R>, timeoutMs: number, operation: string): Promise<R> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`${operation} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]);\n }\n\n /**\n * Utility method to safely parse JSON\n */\n protected safeJsonParse<R>(jsonString: string, fallback: R): R {\n try {\n return JSON.parse(jsonString);\n } catch {\n return fallback;\n }\n }\n\n /**\n * Utility method to check if a value is non-empty string\n */\n protected isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n }\n}\n","/**\n * Git metadata collector\n * Collects git repository information using git commands\n */\n\nimport { readFile } from 'fs/promises';\nimport { execa } from 'execa';\nimport { BaseMetadataCollector } from './base.js';\nimport type { GitMetadata, PRMetadata } from './types.js';\n\n/**\n * Minimal GitHub event data interface for type safety\n */\ninterface GitHubEventData {\n pull_request?: {\n title?: unknown;\n number?: unknown;\n state?: unknown;\n head?: { ref?: unknown; sha?: unknown };\n base?: { ref?: unknown };\n user?: { login?: unknown };\n labels?: Array<{ name?: unknown }>;\n merged?: unknown;\n mergeable?: unknown;\n merge_commit_sha?: unknown;\n };\n}\n\n/**\n * Resolved GitHub author information for deduplication and canonical naming\n */\ninterface GitHubAuthorInfo {\n authorId: string;\n authorLogin?: string;\n}\n\nexport interface GitCollectorOptions {\n /**\n * Timeout for git commands in milliseconds\n * @default 3000\n */\n timeout?: number;\n\n /**\n * Working directory for git commands\n * @default process.cwd()\n */\n cwd?: string;\n}\n\n/**\n * Collects git repository metadata\n */\nexport class GitMetadataCollector extends BaseMetadataCollector<GitMetadata> {\n private options: Required<GitCollectorOptions>;\n\n constructor(options: GitCollectorOptions = {}) {\n super('git');\n this.options = {\n timeout: options.timeout || 3000,\n cwd: options.cwd || process.cwd(),\n };\n }\n\n /**\n * Collect git metadata\n */\n protected async collectMetadata(): Promise<GitMetadata> {\n // Fix git ownership issues in CI containers\n await this.configureGitForCI();\n\n // Check if we're in a git repository\n const isGitRepo = await this.isGitRepository();\n if (!isGitRepo) {\n return this.getEmptyMetadata();\n }\n\n // Collect all git metadata in parallel\n const results = await Promise.all([\n this.getBranch(),\n this.getCommitHash(),\n this.getCommitMessage(),\n this.getAuthorName(),\n this.getAuthorEmail(),\n this.getCommitTimestamp(),\n this.getRepoUrl(),\n this.isDirtyWorkingTree(),\n ]);\n\n let [branch, hash, message, author, email, timestamp] = results;\n const repoUrl = results[6];\n const isDirty = results[7];\n\n // Handle PR context — override merge commit data with real PR data\n let prMetadata: PRMetadata | undefined;\n\n if (process.env.GITHUB_EVENT_NAME === 'pull_request') {\n const eventData = await this.readGitHubEventFile();\n\n if (eventData?.pull_request) {\n prMetadata = this.extractPRMetadata(eventData);\n\n // Override branch with real source branch\n const headRef = process.env.GITHUB_HEAD_REF;\n if (this.isNonEmptyString(headRef)) {\n branch = headRef;\n }\n\n // Override commit data with real PR head commit\n const headSha = eventData.pull_request.head?.sha;\n if (this.isNonEmptyString(headSha)) {\n hash = headSha;\n const realCommit = await this.getCommitInfoFromSha(headSha);\n if (realCommit) {\n message = realCommit.message ?? message;\n author = realCommit.author ?? author;\n email = realCommit.email ?? email;\n timestamp = realCommit.timestamp ?? timestamp;\n }\n }\n }\n }\n\n // Resolve GitHub author info: numeric ID for deduplication, login for canonical name\n const githubAuthor = await this.resolveGitHubAuthor(hash);\n\n return {\n branch,\n commit: {\n hash,\n message,\n author: githubAuthor.authorLogin || author,\n authorId: githubAuthor.authorId,\n email,\n timestamp,\n isDirty,\n },\n repository: {\n name: this.extractRepoName(repoUrl),\n url: repoUrl,\n },\n ...(prMetadata ? { pr: prMetadata } : {}),\n };\n }\n\n /**\n * Get empty metadata\n */\n protected getEmptyMetadata(): GitMetadata {\n return {};\n }\n\n /**\n * Configure git for CI environments\n * Fixes \"dubious ownership\" errors when workspace is mounted with different ownership\n */\n private async configureGitForCI(): Promise<void> {\n const isCI = process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true';\n if (!isCI) return;\n\n try {\n await execa('git', ['config', '--global', '--add', 'safe.directory', this.options.cwd], {\n timeout: this.options.timeout,\n reject: true,\n });\n } catch {\n // Silently continue — this is a best-effort fix\n }\n }\n\n /**\n * Read and parse the GitHub Actions event file\n */\n private async readGitHubEventFile(): Promise<GitHubEventData | undefined> {\n const eventPath = process.env.GITHUB_EVENT_PATH;\n if (!eventPath) return undefined;\n\n try {\n const content = await this.withTimeout(\n readFile(eventPath, 'utf-8'),\n this.options.timeout,\n 'GitHub event file read'\n );\n return this.safeJsonParse<GitHubEventData>(content, {});\n } catch (error) {\n console.warn(\n 'āš ļø TestDino: Failed to read GitHub event data:',\n error instanceof Error ? error.message : String(error)\n );\n return undefined;\n }\n }\n\n /**\n * Extract PR metadata from GitHub event data\n */\n private extractPRMetadata(eventData: GitHubEventData): PRMetadata | undefined {\n const pullRequest = eventData?.pull_request;\n if (!pullRequest) return undefined;\n\n const prMetadata: PRMetadata = {};\n\n // Basic PR information\n if (this.isNonEmptyString(pullRequest.title)) {\n prMetadata.title = pullRequest.title;\n }\n\n if (typeof pullRequest.number === 'number') {\n prMetadata.number = pullRequest.number;\n }\n\n if (this.isNonEmptyString(pullRequest.state)) {\n prMetadata.status = pullRequest.state;\n }\n\n // Build PR URL\n const serverUrl = process.env.GITHUB_SERVER_URL;\n const repository = process.env.GITHUB_REPOSITORY;\n if (prMetadata.number && serverUrl && repository) {\n prMetadata.url = `${serverUrl}/${repository}/pull/${prMetadata.number}`;\n }\n\n // Branch information\n if (pullRequest.head?.ref && this.isNonEmptyString(pullRequest.head.ref)) {\n prMetadata.branch = pullRequest.head.ref;\n }\n\n if (pullRequest.base?.ref && this.isNonEmptyString(pullRequest.base.ref)) {\n prMetadata.targetBranch = pullRequest.base.ref;\n }\n\n // Author information\n if (pullRequest.user?.login && this.isNonEmptyString(pullRequest.user.login)) {\n prMetadata.author = pullRequest.user.login;\n }\n\n // Labels\n if (Array.isArray(pullRequest.labels) && pullRequest.labels.length > 0) {\n const labels = pullRequest.labels\n .map((label) => label?.name)\n .filter((name): name is string => this.isNonEmptyString(name));\n\n if (labels.length > 0) {\n prMetadata.labels = labels;\n }\n }\n\n // Merge status\n if (typeof pullRequest.merged === 'boolean') {\n prMetadata.merged = pullRequest.merged;\n }\n\n if (typeof pullRequest.mergeable === 'boolean') {\n prMetadata.mergeable = pullRequest.mergeable;\n }\n\n if (this.isNonEmptyString(pullRequest.merge_commit_sha)) {\n prMetadata.mergeCommitSha = pullRequest.merge_commit_sha;\n }\n\n // Return undefined if no meaningful data was extracted\n const hasData = Object.keys(prMetadata).length > 0;\n return hasData ? prMetadata : undefined;\n }\n\n /**\n * Get commit details for a specific SHA using git show\n * Used to resolve real commit data in PR context (instead of merge commit)\n */\n private async getCommitInfoFromSha(sha: string): Promise<\n | {\n message?: string;\n author?: string;\n email?: string;\n timestamp?: string;\n }\n | undefined\n > {\n try {\n const result = await this.execGit(['show', '-s', '--format=%s%n%an%n%ae%n%aI', sha]);\n const lines = result.split('\\n');\n if (lines.length < 4) return undefined;\n\n return {\n message: this.isNonEmptyString(lines[0]) ? lines[0] : undefined,\n author: this.isNonEmptyString(lines[1]) ? lines[1] : undefined,\n email: this.isNonEmptyString(lines[2]) ? lines[2] : undefined,\n timestamp: this.isNonEmptyString(lines[3]) ? lines[3] : undefined,\n };\n } catch (error) {\n console.warn(\n 'āš ļø TestDino: Failed to get commit info from SHA:',\n error instanceof Error ? error.message : String(error)\n );\n return undefined;\n }\n }\n\n /**\n * Resolve GitHub author info via the Commits API\n * Only runs on GitHub Actions where GITHUB_REPOSITORY is available\n */\n private async resolveGitHubAuthor(commitHash: string | undefined): Promise<GitHubAuthorInfo> {\n const empty: GitHubAuthorInfo = { authorId: '' };\n\n if (process.env.GITHUB_ACTIONS !== 'true') {\n return empty;\n }\n\n if (!commitHash) {\n return empty;\n }\n\n const repository = process.env.GITHUB_REPOSITORY;\n if (!repository) {\n return empty;\n }\n\n const url = `https://api.github.com/repos/${repository}/commits/${commitHash}`;\n\n try {\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'testdino-playwright',\n };\n\n const token = process.env.GITHUB_TOKEN;\n if (token) {\n headers.Authorization = `token ${token}`;\n }\n\n const response = await this.withTimeout(fetch(url, { headers }), this.options.timeout, 'GitHub Commits API');\n\n if (!response.ok) {\n return empty;\n }\n\n const data = (await response.json()) as {\n author?: { id?: number; login?: string } | null;\n };\n\n if (data?.author?.id) {\n const authorId = String(data.author.id);\n const authorLogin = this.isNonEmptyString(data.author.login) ? data.author.login : undefined;\n return { authorId, authorLogin };\n }\n\n return this.resolveGitHubAuthorFromActor();\n } catch (error) {\n console.warn(\n 'āš ļø TestDino: Failed to resolve GitHub author from Commits API:',\n error instanceof Error ? error.message : String(error)\n );\n return this.resolveGitHubAuthorFromActor();\n }\n }\n\n /**\n * Fallback: resolve GitHub author info from GITHUB_ACTOR via the Users API\n */\n private async resolveGitHubAuthorFromActor(): Promise<GitHubAuthorInfo> {\n const actor = process.env.GITHUB_ACTOR;\n if (!actor) {\n return { authorId: '' };\n }\n\n const url = `https://api.github.com/users/${actor}`;\n\n try {\n const response = await this.withTimeout(\n fetch(url, {\n headers: {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'testdino-playwright',\n },\n }),\n this.options.timeout,\n 'GitHub Users API'\n );\n\n if (!response.ok) {\n return { authorId: '' };\n }\n\n const data = (await response.json()) as {\n id?: number;\n login?: string;\n };\n\n const authorId = data?.id ? String(data.id) : '';\n const authorLogin = this.isNonEmptyString(data?.login) ? data.login : actor;\n\n return { authorId, authorLogin };\n } catch (error) {\n console.warn(\n 'āš ļø TestDino: Failed to resolve GitHub author from GITHUB_ACTOR:',\n error instanceof Error ? error.message : String(error)\n );\n return { authorId: '' };\n }\n }\n\n /**\n * Check if current directory is a git repository\n */\n private async isGitRepository(): Promise<boolean> {\n try {\n await this.execGit(['rev-parse', '--git-dir']);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get current branch name\n * Uses: git rev-parse --abbrev-ref HEAD\n */\n private async getBranch(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['rev-parse', '--abbrev-ref', 'HEAD']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get current commit hash (full SHA)\n * Uses: git rev-parse HEAD\n */\n private async getCommitHash(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['rev-parse', 'HEAD']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get commit message of current HEAD\n * Uses: git log -1 --pretty=format:%s\n */\n private async getCommitMessage(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['log', '-1', '--pretty=format:%s']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get commit author name\n * Uses: git log -1 --pretty=format:%an\n */\n private async getAuthorName(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['log', '-1', '--pretty=format:%an']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get commit author email\n * Uses: git log -1 --pretty=format:%ae\n */\n private async getAuthorEmail(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['log', '-1', '--pretty=format:%ae']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get commit timestamp (ISO format)\n * Uses: git log -1 --pretty=format:%aI\n */\n private async getCommitTimestamp(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['log', '-1', '--pretty=format:%aI']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get remote origin URL\n * Uses: git config --get remote.origin.url\n */\n private async getRepoUrl(): Promise<string | undefined> {\n try {\n const result = await this.execGit(['config', '--get', 'remote.origin.url']);\n return this.isNonEmptyString(result) ? result : undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Check if working tree has uncommitted changes\n * Uses: git status --porcelain\n * Returns true if there are any changes (staged, unstaged, or untracked)\n */\n private async isDirtyWorkingTree(): Promise<boolean | undefined> {\n try {\n const result = await this.execGit(['status', '--porcelain']);\n // If output is non-empty, there are changes\n return result.trim().length > 0;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Extract repository name from remote URL\n * e.g., \"https://github.com/user/repo.git\" → \"repo\"\n */\n private extractRepoName(repoUrl: string | undefined): string | undefined {\n if (!repoUrl) return undefined;\n return repoUrl.split('/').pop()?.replace('.git', '') || undefined;\n }\n\n /**\n * Execute git command with timeout\n */\n private async execGit(args: string[]): Promise<string> {\n const { stdout } = await this.withTimeout(\n execa('git', args, {\n cwd: this.options.cwd,\n timeout: this.options.timeout,\n reject: true,\n }),\n this.options.timeout,\n `git ${args.join(' ')}`\n );\n\n return stdout.trim();\n }\n}\n","/**\n * CI metadata collector\n * Collects CI environment information, focusing on GitHub Actions\n */\n\nimport { type as osType, release as osRelease } from 'os';\nimport { BaseMetadataCollector } from './base.js';\nimport type { CIMetadata } from './types.js';\n\nexport interface CICollectorOptions {\n /**\n * Timeout for CI metadata collection in milliseconds\n * @default 3000\n */\n timeout?: number;\n}\n\n/**\n * Collects CI environment metadata\n */\nexport class CIMetadataCollector extends BaseMetadataCollector<CIMetadata> {\n constructor(_options: CICollectorOptions = {}) {\n super('ci');\n }\n\n /**\n * Collect CI metadata\n */\n protected async collectMetadata(): Promise<CIMetadata> {\n const provider = this.detectCIProvider();\n\n if (!provider) {\n return {\n provider: 'local',\n environment: this.collectEnvironment(),\n };\n }\n\n if (provider === 'github-actions') {\n return this.collectGitHubActionsMetadata();\n }\n\n // Fallback for unknown CI providers\n return {\n provider,\n environment: this.collectEnvironment(),\n };\n }\n\n /**\n * Get empty metadata\n */\n protected getEmptyMetadata(): CIMetadata {\n return {};\n }\n\n /**\n * Detect CI provider from environment variables\n */\n private detectCIProvider(): string | undefined {\n const { env } = process;\n\n // GitHub Actions detection\n if (env.GITHUB_ACTIONS === 'true') {\n return 'github-actions';\n }\n\n // Could add other CI providers here in the future\n // if (env.GITLAB_CI) return 'gitlab';\n // if (env.CIRCLECI) return 'circleci';\n\n return undefined;\n }\n\n /**\n * Collect GitHub Actions specific metadata\n */\n private collectGitHubActionsMetadata(): CIMetadata {\n const { env } = process;\n\n return {\n provider: 'github-actions',\n pipeline: {\n id: env.GITHUB_RUN_ID,\n name: env.GITHUB_WORKFLOW,\n url: this.buildPipelineUrl(),\n },\n build: {\n number: env.GITHUB_RUN_NUMBER,\n trigger: env.GITHUB_EVENT_NAME,\n },\n environment: this.collectEnvironment(),\n };\n }\n\n /**\n * Build the pipeline URL from GitHub Actions environment variables\n */\n private buildPipelineUrl(): string | undefined {\n const { env } = process;\n const serverUrl = env.GITHUB_SERVER_URL;\n const repository = env.GITHUB_REPOSITORY;\n const runId = env.GITHUB_RUN_ID;\n\n if (serverUrl && repository && runId) {\n return `${serverUrl}/${repository}/actions/runs/${runId}`;\n }\n\n return undefined;\n }\n\n /**\n * Collect runner environment information\n */\n private collectEnvironment(): CIMetadata['environment'] {\n try {\n return {\n name: osType(),\n type: process.platform,\n os: `${osType()} ${osRelease()}`,\n node: process.version,\n };\n } catch {\n return {};\n }\n }\n}\n","/**\n * System metadata collector\n * Collects system information using Node.js built-in modules\n */\n\nimport { platform, release, cpus, totalmem, hostname } from 'os';\nimport { version } from 'process';\nimport { BaseMetadataCollector } from './base.js';\nimport type { SystemMetadata } from './types.js';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SystemCollectorOptions {\n // Reserved for future options\n}\n\n/**\n * Collects system metadata using Node.js built-in modules\n */\nexport class SystemMetadataCollector extends BaseMetadataCollector<SystemMetadata> {\n constructor(_options: SystemCollectorOptions = {}) {\n super('system');\n // System metadata collection is synchronous and doesn't need configuration\n }\n\n /**\n * Collect system metadata\n */\n protected async collectMetadata(): Promise<SystemMetadata> {\n // System metadata collection is synchronous and fast\n // but we wrap it in a promise for consistency with other collectors\n return new Promise((resolve) => {\n const metadata: SystemMetadata = {\n os: this.getOperatingSystem(),\n cpu: this.getCpuInfo(),\n memory: this.getMemoryInfo(),\n nodeVersion: this.getNodeVersion(),\n platform: this.getPlatform(),\n hostname: this.getHostname(),\n };\n\n resolve(metadata);\n });\n }\n\n /**\n * Get empty metadata\n */\n protected getEmptyMetadata(): SystemMetadata {\n return {};\n }\n\n /**\n * Get operating system information\n * Format: \"platform release\" (e.g., \"darwin 23.1.0\", \"linux 5.4.0\")\n */\n private getOperatingSystem(): string {\n let platformName = 'unknown';\n let releaseVersion = 'unknown';\n\n try {\n platformName = platform();\n } catch {\n // Keep default 'unknown'\n }\n\n try {\n releaseVersion = release();\n } catch {\n // Keep default 'unknown'\n }\n\n return `${platformName} ${releaseVersion}`;\n }\n\n /**\n * Get CPU information\n * Format: \"model (X cores)\" (e.g., \"Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz (12 cores)\")\n */\n private getCpuInfo(): string {\n try {\n const cpuList = cpus();\n if (cpuList.length === 0) {\n return 'unknown';\n }\n\n const model = cpuList[0].model.trim();\n const coreCount = cpuList.length;\n\n return `${model} (${coreCount} cores)`;\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get memory information\n * Format: \"X.X GB\" (e.g., \"16.0 GB\", \"8.5 GB\")\n */\n private getMemoryInfo(): string {\n try {\n const totalBytes = totalmem();\n const totalGB = totalBytes / (1024 * 1024 * 1024);\n\n // Round to 1 decimal place\n return `${totalGB.toFixed(1)} GB`;\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get Node.js version\n * Returns process.version (e.g., \"v18.17.0\")\n */\n private getNodeVersion(): string {\n try {\n return version;\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get platform identifier\n * Returns os.platform() (e.g., \"darwin\", \"linux\", \"win32\")\n */\n private getPlatform(): string {\n try {\n return platform();\n } catch {\n return 'unknown';\n }\n }\n\n /**\n * Get hostname\n * Returns os.hostname() (e.g., \"MacBook-Pro.local\")\n */\n private getHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n }\n}\n","/**\n * Playwright metadata collector\n * Collects Playwright configuration and version information\n */\n\nimport { readFile } from 'fs/promises';\nimport { BaseMetadataCollector } from './base.js';\nimport type { PlaywrightMetadata, RunSkeleton, SkeletonSuite, SkeletonTest } from './types.js';\n\n/**\n * Playwright FullConfig interface (extended)\n */\ninterface PlaywrightFullConfig {\n fullyParallel?: boolean;\n workers?: number;\n shard?: {\n current: number;\n total: number;\n } | null;\n projects?: Array<{\n name?: string;\n }>;\n version?: string;\n configFile?: string;\n forbidOnly?: boolean;\n globalTimeout?: number;\n grep?: RegExp | RegExp[];\n maxFailures?: number;\n metadata?: Record<string, unknown>;\n reportSlowTests?: {\n max: number;\n threshold: number;\n } | null;\n rootDir?: string;\n tags?: string[];\n webServer?: Record<string, unknown> | null;\n}\n\n/**\n * Playwright Suite interface (minimal)\n */\ninterface PlaywrightSuite {\n title: string;\n type: 'root' | 'project' | 'file' | 'describe';\n location?: {\n file: string;\n line: number;\n column: number;\n };\n suites: PlaywrightSuite[];\n tests: PlaywrightTestCase[];\n allTests(): PlaywrightTestCase[];\n}\n\n/**\n * Playwright TestCase interface (minimal)\n */\ninterface PlaywrightTestCase {\n id: string;\n title: string;\n location: {\n file: string;\n line: number;\n column: number;\n };\n tags: string[];\n expectedStatus: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted';\n annotations: Array<{\n type: string;\n description?: string;\n }>;\n}\n\nexport interface PlaywrightCollectorOptions {\n /**\n * Timeout for Playwright metadata collection in milliseconds\n * @default 3000\n */\n timeout?: number;\n\n /**\n * Playwright FullConfig object (when available from reporter context)\n */\n config?: PlaywrightFullConfig;\n\n /**\n * Playwright Suite object (when available from reporter context)\n */\n suite?: PlaywrightSuite;\n\n /**\n * Custom path to @playwright/test package.json for testing\n */\n packageJsonPath?: string;\n}\n\n/**\n * Collects Playwright metadata including version and configuration\n */\nexport class PlaywrightMetadataCollector extends BaseMetadataCollector<PlaywrightMetadata> {\n private options: Required<Omit<PlaywrightCollectorOptions, 'config' | 'suite' | 'packageJsonPath'>> &\n Pick<PlaywrightCollectorOptions, 'config' | 'suite' | 'packageJsonPath'>;\n\n constructor(options: PlaywrightCollectorOptions = {}) {\n super('playwright');\n this.options = {\n timeout: options.timeout || 3000,\n config: options.config,\n suite: options.suite,\n packageJsonPath: options.packageJsonPath,\n };\n }\n\n /**\n * Collect Playwright metadata\n */\n protected async collectMetadata(): Promise<PlaywrightMetadata> {\n const metadata: PlaywrightMetadata = {};\n\n // Collect version (always attempt this)\n const version = await this.getPlaywrightVersion();\n if (version) {\n metadata.version = version;\n }\n\n // Collect config metadata if FullConfig is available\n if (this.options.config) {\n const configMetadata = this.extractConfigMetadata(this.options.config);\n Object.assign(metadata, configMetadata);\n }\n\n return metadata;\n }\n\n /**\n * Build skeleton from Suite and include it in CompleteMetadata\n */\n buildSkeletonMetadata(suite: PlaywrightSuite): { skeleton: RunSkeleton } {\n const skeleton = this.buildSkeleton(suite);\n return { skeleton };\n }\n\n /**\n * Get empty metadata\n */\n protected getEmptyMetadata(): PlaywrightMetadata {\n return {};\n }\n\n /**\n * Get Playwright version from @playwright/test package.json\n */\n private async getPlaywrightVersion(): Promise<string | undefined> {\n try {\n const packageJsonPath = this.options.packageJsonPath || this.resolvePlaywrightPackageJson();\n\n if (!packageJsonPath) {\n return undefined;\n }\n\n const packageJsonContent = await this.withTimeout(\n readFile(packageJsonPath, 'utf-8'),\n this.options.timeout,\n 'Playwright package.json read'\n );\n\n const packageJson = this.safeJsonParse<{ version?: string }>(packageJsonContent, {});\n\n return this.isNonEmptyString(packageJson.version) ? packageJson.version : undefined;\n } catch (error) {\n // Log error but don't fail the entire collection\n console.warn(\n 'āš ļø TestDino: Failed to read Playwright version:',\n error instanceof Error ? error.message : String(error)\n );\n return undefined;\n }\n }\n\n /**\n * Resolve @playwright/test package.json path\n */\n private resolvePlaywrightPackageJson(): string | undefined {\n try {\n // Try to resolve @playwright/test package.json\n return require.resolve('@playwright/test/package.json');\n } catch {\n // @playwright/test not found\n return undefined;\n }\n }\n\n /**\n * Extract metadata from Playwright FullConfig\n */\n private extractConfigMetadata(config: PlaywrightFullConfig): Partial<PlaywrightMetadata> {\n const metadata: Partial<PlaywrightMetadata> = {};\n\n // Config file path\n if (this.isNonEmptyString(config.configFile)) {\n metadata.configFile = config.configFile;\n }\n\n // Forbid only\n if (typeof config.forbidOnly === 'boolean') {\n metadata.forbidOnly = config.forbidOnly;\n }\n\n // Fully parallel mode\n if (typeof config.fullyParallel === 'boolean') {\n metadata.fullyParallel = config.fullyParallel;\n metadata.parallel = config.fullyParallel; // Keep for backward compatibility\n }\n\n // Global timeout\n if (typeof config.globalTimeout === 'number') {\n metadata.globalTimeout = config.globalTimeout;\n }\n\n // Grep pattern(s)\n if (config.grep) {\n const patterns = Array.isArray(config.grep) ? config.grep : [config.grep];\n metadata.grep = patterns.map((p) => p.source);\n }\n\n // Max failures\n if (typeof config.maxFailures === 'number') {\n metadata.maxFailures = config.maxFailures;\n }\n\n // Custom metadata\n if (config.metadata && typeof config.metadata === 'object') {\n metadata.metadata = config.metadata;\n }\n\n // Workers\n if (typeof config.workers === 'number') {\n metadata.workers = config.workers;\n }\n\n // Project names\n if (Array.isArray(config.projects) && config.projects.length > 0) {\n const projectNames = config.projects\n .map((project) => project.name)\n .filter((name): name is string => this.isNonEmptyString(name));\n\n if (projectNames.length > 0) {\n metadata.projects = projectNames;\n }\n }\n\n // Report slow tests\n if (config.reportSlowTests && typeof config.reportSlowTests === 'object') {\n metadata.reportSlowTests = {\n max: config.reportSlowTests.max,\n threshold: config.reportSlowTests.threshold,\n };\n }\n\n // Root directory\n if (this.isNonEmptyString(config.rootDir)) {\n metadata.rootDir = config.rootDir;\n }\n\n // Shard information\n if (config.shard && typeof config.shard.current === 'number' && typeof config.shard.total === 'number') {\n metadata.shard = {\n current: config.shard.current,\n total: config.shard.total,\n };\n }\n\n // Tags\n if (Array.isArray(config.tags) && config.tags.length > 0) {\n metadata.tags = config.tags;\n }\n\n // Web server\n if (config.webServer && typeof config.webServer === 'object') {\n metadata.webServer = config.webServer;\n }\n\n return metadata;\n }\n\n /**\n * Build skeleton from Suite\n */\n buildSkeleton(suite: PlaywrightSuite): RunSkeleton {\n const totalTests = suite.allTests().length;\n const suites = this.buildSuiteTree(suite);\n\n return {\n totalTests,\n suites,\n };\n }\n\n /**\n * Recursively build suite tree\n */\n private buildSuiteTree(suite: PlaywrightSuite): SkeletonSuite[] {\n const suites: SkeletonSuite[] = [];\n\n // Process child suites\n for (const childSuite of suite.suites) {\n const skeletonSuite: SkeletonSuite = {\n title: childSuite.title,\n type: childSuite.type === 'file' ? 'file' : 'describe',\n tests: childSuite.tests.map((test) => this.buildSkeletonTest(test)),\n };\n\n // Add file for file-type suites\n if (childSuite.type === 'file' && childSuite.location) {\n skeletonSuite.file = childSuite.location.file;\n }\n\n // Add location if available\n if (childSuite.location) {\n skeletonSuite.location = {\n file: childSuite.location.file,\n line: childSuite.location.line,\n column: childSuite.location.column,\n };\n }\n\n // Recursively build nested suites\n if (childSuite.suites.length > 0) {\n skeletonSuite.suites = this.buildSuiteTree(childSuite);\n }\n\n suites.push(skeletonSuite);\n }\n\n return suites;\n }\n\n /**\n * Build skeleton test from TestCase\n */\n private buildSkeletonTest(test: PlaywrightTestCase): SkeletonTest {\n const skeletonTest: SkeletonTest = {\n testId: test.id,\n title: test.title,\n location: {\n file: test.location.file,\n line: test.location.line,\n column: test.location.column,\n },\n };\n\n // Add tags if present\n if (test.tags && test.tags.length > 0) {\n skeletonTest.tags = test.tags;\n }\n\n // Add expected status\n if (test.expectedStatus) {\n skeletonTest.expectedStatus = test.expectedStatus;\n }\n\n // Add annotations if present\n if (test.annotations && test.annotations.length > 0) {\n skeletonTest.annotations = test.annotations.map((ann) => ({\n type: ann.type,\n description: ann.description,\n }));\n }\n\n return skeletonTest;\n }\n}\n","/**\n * Metadata collection main exports and aggregator\n */\n\nimport type {\n MetadataCollectionOptions,\n MetadataCollectionResult,\n MetadataCollectionSummary,\n CompleteMetadata,\n GitMetadata,\n CIMetadata,\n SystemMetadata,\n PlaywrightMetadata,\n} from './types.js';\nimport { GitMetadataCollector } from './git.js';\nimport { CIMetadataCollector } from './ci.js';\nimport { SystemMetadataCollector } from './system.js';\nimport { PlaywrightMetadataCollector } from './playwright.js';\n\n/**\n * Default metadata collection options\n * @internal\n */\nconst DEFAULT_METADATA_OPTIONS: Required<MetadataCollectionOptions> = {\n timeout: 5000,\n debug: false,\n};\n\n/**\n * Playwright FullConfig interface (minimal subset for metadata collection)\n */\ninterface PlaywrightFullConfig {\n fullyParallel?: boolean;\n workers?: number;\n shard?: {\n current: number;\n total: number;\n } | null;\n projects?: Array<{\n name?: string;\n }>;\n}\n\n/**\n * Playwright Suite interface (minimal subset for skeleton building)\n */\ninterface PlaywrightSuite {\n title: string;\n type: 'root' | 'project' | 'file' | 'describe';\n location?: {\n file: string;\n line: number;\n column: number;\n };\n suites: PlaywrightSuite[];\n tests: PlaywrightTestCase[];\n allTests(): PlaywrightTestCase[];\n}\n\n/**\n * Playwright TestCase interface (minimal subset for skeleton building)\n */\ninterface PlaywrightTestCase {\n id: string;\n title: string;\n location: {\n file: string;\n line: number;\n column: number;\n };\n tags: string[];\n expectedStatus: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted';\n annotations: Array<{\n type: string;\n description?: string;\n }>;\n}\n\n/**\n * Main metadata aggregator class\n * Orchestrates collection from all metadata collectors\n */\nexport class MetadataAggregator {\n private options: Required<MetadataCollectionOptions>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private collectors: Array<{ collectWithResult: () => Promise<MetadataCollectionResult<any>> }> = [];\n private playwrightCollector?: PlaywrightMetadataCollector;\n\n constructor(options: MetadataCollectionOptions = {}) {\n this.options = { ...DEFAULT_METADATA_OPTIONS, ...options };\n }\n\n /**\n * Register a metadata collector\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerCollector(collector: { collectWithResult: () => Promise<MetadataCollectionResult<any>> }): void {\n this.collectors.push(collector);\n\n // Keep reference to PlaywrightMetadataCollector for skeleton building\n if (collector instanceof PlaywrightMetadataCollector) {\n this.playwrightCollector = collector;\n }\n }\n\n /**\n * Build skeleton from Suite (if PlaywrightMetadataCollector is registered with a suite)\n */\n buildSkeleton(suite: PlaywrightSuite): CompleteMetadata['skeleton'] {\n if (!this.playwrightCollector) {\n return undefined;\n }\n\n return this.playwrightCollector.buildSkeleton(suite);\n }\n\n /**\n * Collect metadata from all registered collectors\n * Uses Promise.allSettled for error isolation\n */\n async collectAll(): Promise<MetadataCollectionSummary> {\n const startTime = Date.now();\n\n if (this.options.debug) {\n console.log(`šŸ” TestDino: Starting metadata collection with ${this.collectors.length} collectors`);\n }\n\n // Collect from all collectors in parallel with error isolation\n const settledResults = await Promise.allSettled(\n this.collectors.map((collector) =>\n this.withTimeout(collector.collectWithResult(), this.options.timeout, 'Metadata collection')\n )\n );\n\n // Process results\n const results: MetadataCollectionResult[] = [];\n const metadata: CompleteMetadata = {};\n\n for (const settledResult of settledResults) {\n if (settledResult.status === 'fulfilled') {\n const result = settledResult.value;\n results.push(result);\n\n // Aggregate metadata by collector type\n this.aggregateMetadata(metadata, result);\n } else {\n // Handle rejected promises (shouldn't happen due to error handling in collectors)\n const error = settledResult.reason;\n console.warn('āš ļø TestDino: Metadata collector promise rejected:', error);\n\n results.push({\n data: {},\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration: 0,\n collector: 'unknown',\n });\n }\n }\n\n const totalDuration = Date.now() - startTime;\n const successCount = results.filter((r) => r.success).length;\n const failureCount = results.length - successCount;\n\n if (this.options.debug) {\n console.log(\n `āœ… TestDino: Metadata collection completed in ${totalDuration}ms (${successCount}/${results.length} successful)`\n );\n }\n\n return {\n metadata,\n results,\n totalDuration,\n successCount,\n failureCount,\n };\n }\n\n /**\n * Aggregate individual collector results into complete metadata\n */\n private aggregateMetadata(metadata: CompleteMetadata, result: MetadataCollectionResult): void {\n const { collector, data } = result;\n\n switch (collector) {\n case 'git':\n metadata.git = data as GitMetadata;\n break;\n case 'ci':\n metadata.ci = data as CIMetadata;\n break;\n case 'system':\n metadata.system = data as SystemMetadata;\n break;\n case 'playwright':\n metadata.playwright = data as PlaywrightMetadata;\n break;\n default:\n if (this.options.debug) {\n console.warn(`āš ļø TestDino: Unknown metadata collector: ${collector}`);\n }\n }\n }\n\n /**\n * Utility method to run operation with timeout\n */\n private async withTimeout<T>(promise: Promise<T>, timeoutMs: number, operation: string): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`${operation} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n return Promise.race([promise, timeoutPromise]);\n }\n}\n\n// Re-export types\nexport type {\n MetadataCollectionOptions,\n MetadataCollectionResult,\n MetadataCollectionSummary,\n CompleteMetadata,\n GitMetadata,\n CIMetadata,\n SystemMetadata,\n PlaywrightMetadata,\n PRMetadata,\n ShardMetadata,\n MetadataCollector,\n RunSkeleton,\n SkeletonSuite,\n SkeletonTest,\n} from './types.js';\n\n// Re-export base class\nexport { BaseMetadataCollector } from './base.js';\n\n// Re-export collectors\nexport { GitMetadataCollector } from './git.js';\nexport { CIMetadataCollector } from './ci.js';\nexport { SystemMetadataCollector } from './system.js';\nexport { PlaywrightMetadataCollector } from './playwright.js';\n\n/**\n * Factory function to create a metadata aggregator with all collectors registered\n *\n * @param playwrightConfig Optional Playwright FullConfig for enhanced metadata collection\n * @param playwrightSuite Optional Playwright Suite for skeleton building\n * @returns MetadataAggregator instance with all collectors registered\n */\nexport function createMetadataCollector(\n playwrightConfig?: PlaywrightFullConfig,\n playwrightSuite?: PlaywrightSuite\n): MetadataAggregator {\n const aggregator = new MetadataAggregator();\n\n // Register all collectors\n aggregator.registerCollector(new GitMetadataCollector());\n aggregator.registerCollector(new CIMetadataCollector());\n aggregator.registerCollector(new SystemMetadataCollector());\n aggregator.registerCollector(\n new PlaywrightMetadataCollector({\n config: playwrightConfig,\n suite: playwrightSuite,\n })\n );\n\n return aggregator;\n}\n","/**\n * SAS Token client for requesting Azure Blob Storage upload tokens\n */\n\nimport axios, { type AxiosInstance } from 'axios';\nimport type { SASTokenResponse, SASTokenServerResponse } from './types.js';\n\nexport interface SASTokenClientOptions {\n token: string;\n serverUrl: string;\n maxRetries?: number;\n retryDelay?: number;\n}\n\n/**\n * Client for requesting SAS tokens from TestDino server\n */\nexport class SASTokenClient {\n private client: AxiosInstance;\n private options: Required<SASTokenClientOptions>;\n\n constructor(options: SASTokenClientOptions) {\n this.options = {\n maxRetries: 2,\n retryDelay: 1000,\n ...options,\n };\n\n // Use x-api-key header for storage endpoint (different from Bearer token)\n this.client = axios.create({\n baseURL: this.options.serverUrl,\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.options.token,\n },\n timeout: 10000,\n });\n }\n\n /**\n * Request SAS token for artifact uploads\n * @param expiryHours - Token validity duration (1-48 hours, default 48)\n * @returns SAS token response with upload instructions\n */\n async requestToken(expiryHours: number = 48): Promise<SASTokenResponse> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.maxRetries; attempt++) {\n try {\n const response = await this.client.post<SASTokenServerResponse>('/api/storage/token', undefined, {\n params: {\n expiryHours,\n permissions: 'write,create',\n },\n });\n\n if (!response.data.success) {\n throw new Error(response.data.message || 'SAS token request failed');\n }\n\n return response.data.data;\n } catch (error) {\n lastError = new Error(this.getErrorMessage(error));\n\n if (attempt < this.options.maxRetries - 1) {\n // Wait before retry with exponential backoff\n const delay = this.options.retryDelay * Math.pow(2, attempt);\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError || new Error('Failed to request SAS token');\n }\n\n /**\n * Extract error message from various error types\n */\n private getErrorMessage(error: unknown): string {\n if (axios.isAxiosError(error)) {\n // Handle specific HTTP status codes\n if (error.response?.status === 401) {\n return 'Invalid API key for artifact uploads';\n }\n if (error.response?.status === 403) {\n return 'API key does not have write permission for uploads';\n }\n if (error.response?.status === 429) {\n return 'Rate limit exceeded for SAS token requests';\n }\n return error.response?.data?.message || error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n }\n\n /**\n * Sleep utility for retry delays\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","/**\n * Artifact uploader for Azure Blob Storage\n * Uploads test artifacts (screenshots, videos, traces) using SAS tokens\n */\n\nimport { createReadStream, statSync } from 'fs';\nimport { basename, extname } from 'path';\nimport axios from 'axios';\nimport type { SASTokenResponse, UploadResult, AttachmentForUpload } from './types.js';\n\nexport interface ArtifactUploaderOptions {\n /** Upload timeout per file in milliseconds */\n timeout?: number;\n /** Maximum retries per file */\n maxRetries?: number;\n /** Debug mode for logging */\n debug?: boolean;\n}\n\n/**\n * Uploads artifacts to Azure Blob Storage using SAS tokens\n */\nexport class ArtifactUploader {\n private sasToken: SASTokenResponse;\n private options: Required<ArtifactUploaderOptions>;\n\n constructor(sasToken: SASTokenResponse, options: ArtifactUploaderOptions = {}) {\n this.sasToken = sasToken;\n this.options = {\n timeout: 60000,\n maxRetries: 2,\n debug: false,\n ...options,\n };\n }\n\n /**\n * Upload a single file to Azure Blob Storage\n * @param attachment - Attachment with path and content type\n * @param testId - Test identifier for organizing uploads\n * @returns Upload result with Azure URL or error\n */\n async uploadFile(attachment: AttachmentForUpload, testId: string): Promise<UploadResult> {\n const startTime = Date.now();\n const fileName = basename(attachment.path);\n\n try {\n // Validate file exists and get size\n const stats = statSync(attachment.path);\n const fileSize = stats.size;\n\n // Check file size limit\n if (fileSize > this.sasToken.maxSize) {\n return {\n name: attachment.name,\n success: false,\n error: `File size ${fileSize} bytes exceeds maximum ${this.sasToken.maxSize} bytes`,\n fileSize,\n duration: Date.now() - startTime,\n };\n }\n\n // Check file type is allowed\n const extension = extname(fileName).slice(1).toLowerCase();\n const allowedTypes = this.sasToken.allowedFileTypes;\n if (allowedTypes.length > 0 && !allowedTypes.includes(extension)) {\n return {\n name: attachment.name,\n success: false,\n error: `File extension '.${extension}' not in allowed types: ${allowedTypes.join(', ')}`,\n fileSize,\n duration: Date.now() - startTime,\n };\n }\n\n // Build upload URL: baseUrl/pathPrefix/testId/fileName\n const uploadUrl = this.buildUploadUrl(testId, fileName);\n\n // Upload with retries\n await this.uploadWithRetry(attachment.path, uploadUrl, attachment.contentType);\n\n // Build public URL (without SAS token query params)\n const publicUrl = this.buildPublicUrl(testId, fileName);\n\n if (this.options.debug) {\n console.log(`šŸ“¤ Uploaded: ${attachment.name} → ${publicUrl}`);\n }\n\n return {\n name: attachment.name,\n success: true,\n uploadUrl: publicUrl,\n fileSize,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (this.options.debug) {\n console.warn(`āš ļø Upload failed: ${attachment.name} - ${errorMessage}`);\n }\n\n return {\n name: attachment.name,\n success: false,\n error: errorMessage,\n duration: Date.now() - startTime,\n };\n }\n }\n\n /**\n * Upload multiple attachments in parallel\n * @param attachments - Array of attachments to upload\n * @param testId - Test identifier for organizing uploads\n * @returns Array of upload results\n */\n async uploadAll(attachments: AttachmentForUpload[], testId: string): Promise<UploadResult[]> {\n if (attachments.length === 0) {\n return [];\n }\n\n // Filter to only attachments with valid paths\n const validAttachments = attachments.filter((a) => a.path);\n\n if (validAttachments.length === 0) {\n return [];\n }\n\n // Upload all in parallel using Promise.allSettled\n const results = await Promise.allSettled(validAttachments.map((attachment) => this.uploadFile(attachment, testId)));\n\n // Convert settled results to upload results\n return results.map((result, index) => {\n if (result.status === 'fulfilled') {\n return result.value;\n }\n // Promise rejection (shouldn't happen as uploadFile catches errors)\n return {\n name: validAttachments[index].name,\n success: false,\n error: result.reason?.message || 'Upload failed',\n };\n });\n }\n\n /**\n * Build the full upload URL with SAS token\n * Format: containerUrl/blobPath/uniqueId/testId/fileName?sasToken\n */\n private buildUploadUrl(testId: string, fileName: string): string {\n const { containerUrl, blobPath, uniqueId, sasToken } = this.sasToken;\n const path = `${blobPath}/${uniqueId}/${this.sanitizeTestId(testId)}/${fileName}`;\n return `${containerUrl}/${path}?${sasToken}`;\n }\n\n /**\n * Build public URL without SAS token (for storage in events)\n * Format: containerUrl/blobPath/uniqueId/testId/fileName\n */\n private buildPublicUrl(testId: string, fileName: string): string {\n const { containerUrl, blobPath, uniqueId } = this.sasToken;\n const path = `${blobPath}/${uniqueId}/${this.sanitizeTestId(testId)}/${fileName}`;\n return `${containerUrl}/${path}`;\n }\n\n /**\n * Sanitize test ID for use in URL path\n */\n private sanitizeTestId(testId: string): string {\n // Replace characters that are problematic in URLs\n return testId.replace(/[^a-zA-Z0-9-_]/g, '_');\n }\n\n /**\n * Upload file with retry logic\n */\n private async uploadWithRetry(filePath: string, uploadUrl: string, contentType: string): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.maxRetries; attempt++) {\n try {\n await this.doUpload(filePath, uploadUrl, contentType);\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < this.options.maxRetries - 1) {\n // Wait before retry with exponential backoff\n const delay = 1000 * Math.pow(2, attempt);\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError || new Error('Upload failed after retries');\n }\n\n /**\n * Perform actual file upload to Azure\n */\n private async doUpload(filePath: string, uploadUrl: string, contentType: string): Promise<void> {\n const fileStream = createReadStream(filePath);\n const stats = statSync(filePath);\n\n await axios.put(uploadUrl, fileStream, {\n headers: {\n 'Content-Type': contentType,\n 'Content-Length': stats.size,\n 'x-ms-blob-type': 'BlockBlob',\n },\n timeout: this.options.timeout,\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n });\n }\n\n /**\n * Sleep utility for retry delays\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Check if SAS token is still valid\n */\n isTokenValid(): boolean {\n const expiresAt = new Date(this.sasToken.expiresAt).getTime();\n const now = Date.now();\n // Consider token invalid if it expires within 5 minutes\n return expiresAt > now + 5 * 60 * 1000;\n }\n\n /**\n * Get the unique ID for this upload session\n */\n getSessionId(): string {\n return this.sasToken.uniqueId;\n }\n}\n","/**\n * TestDino Playwright Reporter\n * Streams test execution data in real-time\n */\n\nimport type {\n Reporter,\n FullConfig,\n Suite,\n TestCase,\n TestResult,\n TestStep,\n FullResult,\n TestError,\n} from '@playwright/test/reporter';\nimport { randomUUID } from 'crypto';\nimport { readFileSync, existsSync } from 'fs';\nimport { WebSocketClient } from '../streaming/websocket.js';\nimport { HttpClient } from '../streaming/http.js';\nimport { EventBuffer } from '../streaming/buffer.js';\nimport { createMetadataCollector } from '../metadata/index.js';\nimport type {\n TestdinoConfig,\n TestEvent,\n TestRunBeginEvent,\n TestBeginEvent,\n TestStepBeginEvent,\n TestStepEndEvent,\n TestEndEvent,\n TestRunEndEvent,\n TestRunErrorEvent,\n TestConsoleOutEvent,\n TestConsoleErrEvent,\n RunMetadata,\n} from '../types/index.js';\nimport { isQuotaError } from './errors.js';\nimport { SASTokenClient, ArtifactUploader, type UploadResult, type AttachmentForUpload } from '../uploads/index.js';\n\n// Maximum console chunk size (10KB in characters)\nconst MAX_CONSOLE_CHUNK_SIZE = 10_000;\n\n// Maximum number of events to buffer\nconst MAX_BUFFER_SIZE = 10;\n\nexport class TestdinoReporter implements Reporter {\n private config: TestdinoConfig;\n private wsClient: WebSocketClient | null = null;\n private httpClient: HttpClient | null = null;\n private buffer: EventBuffer | null = null;\n private runId: string;\n private useHttpFallback = false;\n private sequenceNumber = 0;\n\n // Shard and timing info for interruption handling\n private shardInfo?: { current: number; total: number };\n private runStartTime?: number;\n\n // Signal handler management\n private sigintHandler?: () => void;\n private sigtermHandler?: () => void;\n private isShuttingDown = false;\n\n // Quota tracking\n private quotaExceeded = false;\n\n // Session ID from HTTP auth, passed to WebSocket for session reuse\n private sessionId: string | null = null;\n\n // Artifact upload\n private artifactUploader: ArtifactUploader | null = null;\n private artifactsEnabled = true; // Default: enabled\n\n // Deferred initialization - resolves true on success, false on failure\n private initPromise: Promise<boolean> | null = null;\n private initFailed = false;\n\n constructor(config: TestdinoConfig = {}) {\n // Load CLI config if available\n const cliConfig = this.loadCliConfig();\n\n // Merge configs: CLI config takes precedence over constructor config\n this.config = { ...config, ...cliConfig };\n\n this.runId = randomUUID();\n\n // Create buffer early to collect events before async init; flush waits for initPromise.\n this.buffer = new EventBuffer({\n maxSize: MAX_BUFFER_SIZE,\n onFlush: async (events) => {\n if (this.initPromise) {\n const success = await this.initPromise;\n if (!success) return; // Init failed - discard events\n }\n await this.sendEvents(events);\n },\n });\n }\n\n /**\n * Load configuration from CLI temp file if available\n */\n private loadCliConfig(): TestdinoConfig {\n const cliConfigPath = process.env.TESTDINO_CLI_CONFIG_PATH;\n\n if (!cliConfigPath) {\n return {};\n }\n\n try {\n if (!existsSync(cliConfigPath)) {\n return {};\n }\n\n const configContent = readFileSync(cliConfigPath, 'utf-8');\n const cliConfig = JSON.parse(configContent) as Record<string, unknown>;\n\n // Map ciRunId to ciBuildId for backward compatibility\n const mappedConfig: TestdinoConfig = {};\n\n if (cliConfig.token !== undefined && typeof cliConfig.token === 'string') {\n mappedConfig.token = cliConfig.token;\n }\n\n if (cliConfig.serverUrl !== undefined && typeof cliConfig.serverUrl === 'string') {\n mappedConfig.serverUrl = cliConfig.serverUrl;\n }\n\n if (cliConfig.debug !== undefined && typeof cliConfig.debug === 'boolean') {\n mappedConfig.debug = cliConfig.debug;\n }\n\n // Map ciRunId to ciBuildId\n if (cliConfig.ciRunId !== undefined && typeof cliConfig.ciRunId === 'string') {\n mappedConfig.ciBuildId = cliConfig.ciRunId;\n }\n\n // Handle artifacts flag\n if (cliConfig.artifacts !== undefined && typeof cliConfig.artifacts === 'boolean') {\n mappedConfig.artifacts = cliConfig.artifacts;\n }\n\n return mappedConfig;\n } catch (error) {\n // Silently fail - CLI config is optional\n if (process.env.TESTDINO_DEBUG === 'true' || process.env.TESTDINO_DEBUG === '1') {\n console.warn(\n 'āš ļø TestDino: Failed to load CLI config:',\n error instanceof Error ? error.message : String(error)\n );\n }\n return {};\n }\n }\n\n /**\n * Called once before running tests\n */\n async onBegin(config: FullConfig, suite: Suite): Promise<void> {\n // Check if we're a duplicate instance (CLI-injected when already in config)\n if (config && this.isDuplicateInstance(config.reporter)) {\n if (this.config.debug) {\n console.log('āš ļø TestDino: Reporter already configured in playwright.config, skipping duplicate instance');\n }\n return;\n }\n\n const token = this.getToken();\n\n if (!token) {\n this.printConfigurationError('Token is required but not provided', [\n 'Set environment variable: export TESTDINO_TOKEN=your-token',\n 'Add to playwright.config.ts: token: \"your-token\"',\n 'Use CLI wrapper: npx tdpw test --token your-token',\n ]);\n return;\n }\n\n // Store shard info and run start time for potential interruption handling\n if (config?.shard) {\n this.shardInfo = {\n current: config.shard.current,\n total: config.shard.total,\n };\n }\n this.runStartTime = Date.now();\n\n // Kick off async initialization without awaiting - Playwright does not await onBegin. Events will be buffered and transmitted once init completes.\n this.initPromise = this.performAsyncInit(config, suite, token);\n }\n\n /**\n * Perform all async initialization: metadata, auth, WebSocket, artifacts, run:begin\n *\n * Buffer's onFlush callback awaits this promise before transmitting events,\n * ensuring no data is sent before authentication and connection are established.\n *\n * @param config - Playwright FullConfig for metadata collection\n * @param suite - Playwright Suite for skeleton building\n * @param token - Authentication token\n * @returns true on success, false on failure\n */\n private async performAsyncInit(config: FullConfig, suite: Suite, token: string): Promise<boolean> {\n const serverUrl = this.getServerUrl();\n\n try {\n // Collect metadata before initializing streaming\n const metadata = await this.collectMetadata(config, suite);\n\n // Initialize HTTP client and authenticate\n this.httpClient = new HttpClient({ token, serverUrl });\n const auth = await this.httpClient.authenticate();\n this.sessionId = auth.sessionId;\n console.log('āœ… TestDino: Authenticated successfully');\n if (this.config.debug) {\n console.log(`šŸ”Œ TestDino: Session ${this.sessionId} — reusing for WebSocket`);\n }\n\n // Initialize WebSocket client\n this.wsClient = new WebSocketClient({\n token,\n sessionId: this.sessionId ?? undefined,\n serverUrl: this.getWebSocketUrl(),\n onConnected: () => {\n console.log('šŸ”Œ TestDino: WebSocket connected');\n },\n onDisconnected: () => {\n console.log('šŸ”Œ TestDino: WebSocket disconnected');\n },\n onError: (error) => {\n // Handle quota errors from WebSocket (run:begin rejection)\n if (isQuotaError(error)) {\n // Display error banner only once\n if (!this.quotaExceeded) {\n this.quotaExceeded = true;\n this.initFailed = true;\n this.printQuotaError(error);\n }\n } else {\n // Log other WebSocket errors\n console.error('āŒ TestDino: WebSocket error:', error.message);\n }\n },\n });\n\n // Try to connect WebSocket\n try {\n await this.wsClient.connect();\n } catch {\n console.warn('āš ļø TestDino: WebSocket connection failed, using HTTP fallback');\n this.useHttpFallback = true;\n }\n\n // Initialize artifact uploader if enabled (default: true)\n this.artifactsEnabled = this.config.artifacts !== false;\n if (this.artifactsEnabled) {\n await this.initializeArtifactUploader(token, serverUrl);\n }\n\n // Send run:begin directly (not via buffer) to guarantee it arrives before\n // any buffered test events. initPromise resolves only after this send,\n // so buffer's onFlush will transmit buffered events after run:begin.\n const beginEvent: TestRunBeginEvent = {\n type: 'run:begin',\n runId: this.runId,\n metadata,\n ...this.getEventMetadata(),\n };\n await this.sendEvents([beginEvent]);\n\n // Register signal handlers for graceful shutdown on interruption\n this.registerSignalHandlers();\n\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.initFailed = true;\n\n // Check if this is a quota exhausted error (402)\n if (error instanceof Error && 'code' in error && isQuotaError(error)) {\n this.quotaExceeded = true;\n this.printQuotaError(error);\n } else if (\n errorMessage.includes('Authentication failed') ||\n errorMessage.includes('401') ||\n errorMessage.includes('Unauthorized')\n ) {\n this.printConfigurationError('Authentication failed - Invalid or expired token', [\n 'Verify your token is correct',\n 'Check if the token has expired',\n 'Generate a new token from TestDino dashboard',\n `Server URL: ${serverUrl}`,\n ]);\n } else {\n // Generic initialization error\n this.printConfigurationError(`Failed to initialize TestDino reporter: ${errorMessage}`, [\n 'Check if TestDino server is running and accessible',\n `Verify server URL is correct: ${serverUrl}`,\n 'Check network connectivity',\n 'Review server logs for details',\n ]);\n }\n\n return false;\n }\n }\n\n /**\n * Called for each test before it starts\n */\n async onTestBegin(test: TestCase, result: TestResult): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n const event: TestBeginEvent = {\n type: 'test:begin',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Test identification\n testId: test.id,\n title: test.title,\n titlePath: test.titlePath(),\n\n // Location information\n location: {\n file: test.location.file,\n line: test.location.line,\n column: test.location.column,\n },\n\n // Test configuration\n tags: test.tags,\n expectedStatus: test.expectedStatus,\n timeout: test.timeout,\n retries: test.retries,\n annotations: test.annotations.map((a) => ({\n type: a.type,\n description: a.description,\n })),\n\n // Execution context\n retry: result.retry,\n workerIndex: result.workerIndex,\n parallelIndex: result.parallelIndex,\n repeatEachIndex: test.repeatEachIndex,\n\n // Hierarchy information\n parentSuite: this.extractParentSuite(test.parent),\n\n // Timing\n startTime: result.startTime.getTime(),\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called when a test step begins\n */\n async onStepBegin(test: TestCase, result: TestResult, step: TestStep): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n const event: TestStepBeginEvent = {\n type: 'step:begin',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Step Identification\n testId: test.id,\n stepId: `${test.id}-${step.titlePath().join('-')}`,\n title: step.title,\n titlePath: step.titlePath(),\n\n // Step Classification\n category: step.category,\n\n // Location Information\n location: step.location\n ? {\n file: step.location.file,\n line: step.location.line,\n column: step.location.column,\n }\n : undefined,\n\n // Hierarchy Information\n parentStep: step.parent ? this.extractParentStep(step.parent) : undefined,\n\n // Timing\n startTime: step.startTime.getTime(),\n\n // Retry Information\n retry: result.retry,\n\n // Worker Information\n workerIndex: result.workerIndex,\n parallelIndex: result.parallelIndex,\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called when a test step ends\n */\n async onStepEnd(test: TestCase, result: TestResult, step: TestStep): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n // Derive status from error presence\n const status: 'passed' | 'failed' = step.error ? 'failed' : 'passed';\n\n const event: TestStepEndEvent = {\n type: 'step:end',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Step Identification\n testId: test.id,\n stepId: `${test.id}-${step.titlePath().join('-')}`,\n title: step.title,\n titlePath: step.titlePath(),\n\n // Timing\n duration: step.duration,\n\n // Error Information\n error: this.extractError(step.error),\n\n // Status Information\n status,\n\n // Child Steps Summary\n childSteps: this.extractChildSteps(step),\n\n // Attachments Metadata\n attachments: this.extractAttachments(step),\n\n // Annotations\n annotations: test.annotations.map((a) => ({\n type: a.type,\n description: a.description,\n })),\n\n // Retry Information\n retry: result.retry,\n\n // Worker Information\n workerIndex: result.workerIndex,\n parallelIndex: result.parallelIndex,\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called after each test completes\n */\n async onTestEnd(test: TestCase, result: TestResult): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n // Upload attachments and get Azure URLs (if upload enabled)\n const attachmentsWithUrls = await this.uploadAttachments(result.attachments, test.id);\n\n const event: TestEndEvent = {\n type: 'test:end',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Test Identification\n testId: test.id,\n\n // Status Information\n status: result.status as 'passed' | 'failed' | 'skipped' | 'timedOut' | 'interrupted',\n outcome: test.outcome(),\n\n // Timing\n duration: result.duration,\n\n // Execution Context\n retry: result.retry,\n\n // Worker Information\n workerIndex: result.workerIndex,\n parallelIndex: result.parallelIndex,\n\n // Test Metadata\n annotations: test.annotations.map((a) => ({\n type: a.type,\n description: a.description,\n })),\n\n // Error Information\n errors: result.errors.map((e) => this.extractError(e)).filter((e): e is NonNullable<typeof e> => e !== undefined),\n\n // Step Summary\n steps: this.extractTestStepsSummary(result),\n\n // Attachments Metadata (with Azure URLs when uploaded)\n attachments: attachmentsWithUrls,\n\n // Console Output\n stdout: result.stdout.length > 0 ? this.extractConsoleOutput(result.stdout) : undefined,\n stderr: result.stderr.length > 0 ? this.extractConsoleOutput(result.stderr) : undefined,\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called after all tests complete\n */\n async onEnd(result: FullResult): Promise<void> {\n // If quota exceeded, skip event transmission but still cleanup\n if (this.quotaExceeded) {\n console.log('āœ… TestDino: Tests completed (quota limit reached; not streamed to TestDino)');\n this.wsClient?.close();\n this.removeSignalHandlers();\n return;\n }\n\n // If init was never started (no token, duplicate), nothing to do\n if (!this.initPromise) return;\n\n // Ensure initialization completes before flushing events\n const success = await this.initPromise;\n if (!success) {\n // Init failed - discard any buffered events, cleanup\n this.buffer?.clear();\n this.wsClient?.close();\n this.removeSignalHandlers();\n return;\n }\n\n const event: TestRunEndEvent = {\n type: 'run:end',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Run Status\n status: result.status as 'passed' | 'failed' | 'timedout' | 'interrupted',\n\n // Timing\n duration: result.duration,\n startTime: result.startTime.getTime(),\n\n // Shard information\n shard: this.shardInfo,\n };\n\n await this.buffer!.add(event);\n\n // Flush remaining events\n try {\n await this.buffer!.flush();\n console.log('āœ… TestDino: All events sent successfully');\n } catch (error) {\n console.error('āŒ TestDino: Failed to flush final events:', error);\n }\n\n // Close connections and remove signal handlers\n this.wsClient?.close();\n this.removeSignalHandlers();\n }\n\n /**\n * Called on global errors\n */\n async onError(error: TestError): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n const event: TestRunErrorEvent = {\n type: 'run:error',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Error Information (with cause support)\n error: this.extractGlobalError(error),\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called when standard output is produced in worker process\n */\n async onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n const { text, truncated } = this.truncateChunk(chunk);\n\n const event: TestConsoleOutEvent = {\n type: 'console:out',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Console Output\n text,\n\n // Test Association (optional)\n testId: test?.id,\n retry: result?.retry,\n\n // Truncation Indicator\n truncated,\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Called when standard error is produced in worker process\n */\n async onStdErr(chunk: string | Buffer, test?: TestCase, result?: TestResult): Promise<void> {\n if (!this.initPromise || this.initFailed) return;\n\n const { text, truncated } = this.truncateChunk(chunk);\n\n const event: TestConsoleErrEvent = {\n type: 'console:err',\n runId: this.runId,\n ...this.getEventMetadata(),\n\n // Console Error Output\n text,\n\n // Test Association (optional)\n testId: test?.id,\n retry: result?.retry,\n\n // Truncation Indicator\n truncated,\n };\n\n await this.buffer!.add(event);\n }\n\n /**\n * Indicates whether this reporter outputs to stdout/stderr\n * Returns false to allow Playwright to add its own terminal output\n */\n printsToStdio(): boolean {\n return false;\n }\n\n /**\n * Send events via WebSocket or HTTP fallback\n */\n private async sendEvents(events: TestEvent[]): Promise<void> {\n if (events.length === 0) return;\n\n if (this.config.debug) {\n for (const event of events) {\n if (event.type === 'test:begin') {\n const testBeginEvent = event as TestBeginEvent;\n console.log(\n `šŸ” TestDino: Sending event type=${event.type} sequence=${event.sequence} runId=${event.runId} testId=${testBeginEvent.testId} retry=${testBeginEvent.retry} parallelIndex=${testBeginEvent.parallelIndex} title=${testBeginEvent.title}`\n );\n } else if (event.type === 'test:end') {\n const testEndEvent = event as TestEndEvent;\n console.log(\n `šŸ” TestDino: Sending event type=${event.type} sequence=${event.sequence} runId=${event.runId} testId=${testEndEvent.testId} retry=${testEndEvent.retry} parallelIndex=${testEndEvent.parallelIndex}`\n );\n } else {\n console.log(`šŸ” TestDino: Sending event type=${event.type} sequence=${event.sequence} runId=${event.runId}`);\n }\n }\n }\n\n // Try WebSocket first if available\n if (!this.useHttpFallback && this.wsClient?.isConnected()) {\n try {\n await this.wsClient.sendBatch(events);\n return;\n } catch {\n console.warn('āš ļø TestDino: WebSocket send failed, switching to HTTP fallback');\n this.useHttpFallback = true;\n }\n }\n\n // Use HTTP fallback\n if (this.httpClient) {\n try {\n await this.httpClient.sendEvents(events);\n } catch (error) {\n console.error('āŒ TestDino: Failed to send events via HTTP:', error);\n throw error;\n }\n }\n }\n\n /**\n * Get token from config or environment\n */\n private getToken(): string | undefined {\n return this.config.token || process.env.TESTDINO_TOKEN;\n }\n\n /**\n * Get server URL from config or environment\n */\n private getServerUrl(): string {\n const baseUrl = this.config.serverUrl || process.env.TESTDINO_SERVER_URL || 'https://api.testdino.com';\n\n // Ensure the URL ends with /api/reporter for CLI endpoints\n return baseUrl.endsWith('/api/reporter') ? baseUrl : `${baseUrl}/api/reporter`;\n }\n\n private getWebSocketUrl(): string {\n const baseUrl = this.config.serverUrl || process.env.TESTDINO_SERVER_URL || 'https://api.testdino.com';\n\n // Remove /api/reporter suffix if present for WebSocket URL\n const wsBaseUrl = baseUrl.replace('/api/reporter', '');\n return wsBaseUrl.replace('http', 'ws');\n }\n\n /**\n * Collect metadata for the test run\n */\n private async collectMetadata(playwrightConfig: FullConfig, playwrightSuite: Suite): Promise<RunMetadata> {\n try {\n const metadataCollector = createMetadataCollector(playwrightConfig, playwrightSuite);\n const result = await metadataCollector.collectAll();\n\n if (result.failureCount > 0) {\n console.warn(`āš ļø TestDino: ${result.failureCount}/${result.results.length} metadata collectors failed`);\n }\n\n // Build skeleton from suite\n const skeleton = metadataCollector.buildSkeleton(playwrightSuite);\n\n // Add skeleton to metadata\n return {\n ...result.metadata,\n skeleton,\n };\n } catch (error) {\n console.warn('āš ļø TestDino: Metadata collection failed:', error instanceof Error ? error.message : String(error));\n return {}; // Return empty metadata as fallback\n }\n }\n\n /**\n * Get next sequence number and current timestamp\n */\n private getEventMetadata() {\n return {\n timestamp: Date.now(),\n sequence: ++this.sequenceNumber,\n };\n }\n\n /**\n * Extract parent suite information for skeleton mapping\n */\n private extractParentSuite(parent: Suite): TestBeginEvent['parentSuite'] {\n return {\n title: parent.title,\n type: parent.type,\n location: parent.location\n ? {\n file: parent.location.file,\n line: parent.location.line,\n column: parent.location.column,\n }\n : undefined,\n };\n }\n\n /**\n * Extract parent step information for step hierarchy mapping\n */\n private extractParentStep(parent: TestStep): TestStepBeginEvent['parentStep'] {\n return {\n title: parent.title,\n category: parent.category,\n location: parent.location\n ? {\n file: parent.location.file,\n line: parent.location.line,\n column: parent.location.column,\n }\n : undefined,\n };\n }\n\n /**\n * Extract child steps summary for step:end event\n */\n private extractChildSteps(step: TestStep): TestStepEndEvent['childSteps'] {\n return {\n count: step.steps.length,\n steps: step.steps.map((child) => ({\n title: child.title,\n status: child.error ? 'failed' : 'passed',\n })),\n };\n }\n\n /**\n * Extract error details from TestError (shared by step:end, test:end, and error events)\n */\n private extractError(error: TestError | undefined): TestStepEndEvent['error'] {\n if (!error) return undefined;\n\n return {\n message: error.message || String(error),\n stack: error.stack,\n snippet: error.snippet,\n value: error.value,\n location: error.location\n ? {\n file: error.location.file,\n line: error.location.line,\n column: error.location.column,\n }\n : undefined,\n };\n }\n\n /**\n * Extract global error details with cause support (for error events)\n */\n private extractGlobalError(error: TestError): TestRunErrorEvent['error'] {\n return {\n message: error.message,\n stack: error.stack,\n snippet: error.snippet,\n value: error.value,\n location: error.location\n ? {\n file: error.location.file,\n line: error.location.line,\n column: error.location.column,\n }\n : undefined,\n // Handle nested error cause (v1.49+)\n cause: error.cause\n ? {\n message: error.cause.message,\n stack: error.cause.stack,\n snippet: error.cause.snippet,\n value: error.cause.value,\n location: error.cause.location\n ? {\n file: error.cause.location.file,\n line: error.cause.location.line,\n column: error.cause.location.column,\n }\n : undefined,\n }\n : undefined,\n };\n }\n\n /**\n * Print a prominent configuration error banner\n */\n private printConfigurationError(message: string, solutions: string[]): void {\n const border = '═'.repeat(70);\n console.error('');\n console.error(border);\n console.error(' āŒ TestDino Reporter Configuration Error');\n console.error(border);\n console.error(` ${message}`);\n console.error('');\n console.error(' Solutions:');\n solutions.forEach((solution, index) => {\n console.error(` ${index + 1}. ${solution}`);\n });\n console.error(border);\n console.error('');\n }\n\n /**\n * Print quota error with plan details and upgrade information\n * @param error - Quota error (QUOTA_EXHAUSTED or QUOTA_EXCEEDED)\n */\n private printQuotaError(error: unknown): void {\n const border = '═'.repeat(70);\n const errorData = error as Record<string, unknown>;\n const details = errorData.details as Record<string, unknown>;\n const planName = (details?.planName as string) || 'Unknown';\n const resetDate = details?.resetDate;\n\n // Build detailed message with plan information\n let message = 'Execution quota exceeded';\n message += `\\n\\n Current Plan: ${planName}`;\n\n if (errorData.code === 'QUOTA_EXHAUSTED') {\n message += `\\n Monthly Limit: ${details.totalLimit || 'Unknown'} executions`;\n message += `\\n Used: ${details.used || 'Unknown'} executions`;\n if (resetDate) {\n message += `\\n Limit Resets: ${new Date(resetDate as string).toLocaleDateString()}`;\n }\n } else if (errorData.code === 'QUOTA_EXCEEDED') {\n const exceeded = details as {\n total?: number;\n used?: number;\n remaining?: number;\n totalTests?: number;\n };\n message += `\\n Monthly Limit: ${exceeded.total || 'Unknown'} executions`;\n message += `\\n Used: ${exceeded.used || 'Unknown'} executions`;\n\n // Always calculate remaining from total - used (don't trust server's remaining field)\n const remaining = (exceeded.total ?? 0) - (exceeded.used ?? 0);\n\n message += `\\n Remaining: ${remaining} executions`;\n message += `\\n Tests in this run: ${exceeded.totalTests || 'Unknown'}`;\n if (resetDate) {\n message += `\\n Limit Resets: ${new Date(resetDate as string).toLocaleDateString()}`;\n }\n }\n\n console.error('');\n console.error(border);\n console.error(' āŒ TestDino Execution Limit Reached');\n console.error(border);\n console.error(` ${message}`);\n console.error('');\n console.error(' Solutions:');\n console.error(' 1. Upgrade your plan to increase monthly limit');\n console.error(' 2. Wait for monthly limit reset');\n console.error(' 3. Visit https://testdino.com/pricing for plan options');\n console.error(border);\n console.error('');\n }\n\n /**\n * Truncate console chunk to max size and convert Buffer to string\n */\n private truncateChunk(chunk: string | Buffer): { text: string; truncated?: boolean } {\n // Convert Buffer to string (UTF-8)\n let convertedText: string;\n if (Buffer.isBuffer(chunk)) {\n convertedText = chunk.toString('utf-8');\n } else {\n convertedText = chunk;\n }\n\n // Check if truncation is needed\n if (convertedText.length > MAX_CONSOLE_CHUNK_SIZE) {\n return {\n text: convertedText.substring(0, MAX_CONSOLE_CHUNK_SIZE) + '\\n[truncated]',\n truncated: true,\n };\n }\n\n return { text: convertedText };\n }\n\n /**\n * Extract attachment metadata for step:end event\n */\n private extractAttachments(step: TestStep): TestStepEndEvent['attachments'] {\n return step.attachments.map((a) => ({\n name: a.name,\n contentType: a.contentType,\n path: a.path, // undefined for in-memory attachments\n }));\n }\n\n /**\n * Extract steps summary for test:end event\n */\n private extractTestStepsSummary(result: TestResult): TestEndEvent['steps'] {\n return {\n total: result.steps.length,\n passed: result.steps.filter((s) => !s.error).length,\n failed: result.steps.filter((s) => s.error).length,\n };\n }\n\n /**\n * Extract console output for test:end event\n */\n private extractConsoleOutput(output: Array<string | Buffer>): string[] {\n return output.map((item) => (typeof item === 'string' ? item : item.toString()));\n }\n\n /**\n * Check if this is a duplicate instance of TestdinoReporter\n * This happens when the CLI injects our reporter via --reporter flag,\n * but the user already has TestdinoReporter configured in playwright.config\n *\n * @param reporters - The resolved reporters array from FullConfig\n * @returns true if there are multiple TestdinoReporter instances, false otherwise\n */\n private isDuplicateInstance(reporters: unknown[]): boolean {\n const count = this.countTestdinoReporters(reporters);\n\n // If count > 1, it means we have both:\n // - One from playwright.config (user's manual config)\n // - One from CLI injection (our --reporter flag)\n // The config-based instance should handle reporting, so we exit\n return count > 1;\n }\n\n /**\n * Count how many TestdinoReporter instances are in the reporters array\n *\n * @param reporters - The resolved reporters array from FullConfig\n * @returns Number of TestdinoReporter instances found\n */\n private countTestdinoReporters(reporters: unknown): number {\n // Guard against undefined or non-array reporters\n if (!reporters || !Array.isArray(reporters)) {\n return 0;\n }\n\n let count = 0;\n\n for (const reporter of reporters) {\n // Reporters can be in multiple formats:\n // - ['@testdino/playwright'] - string in array\n // - ['@testdino/playwright', options] - string with options\n // - Class instance (when instantiated with new)\n\n if (Array.isArray(reporter) && reporter.length > 0) {\n const reporterName = reporter[0];\n if (this.isTestdinoReporter(reporterName)) {\n count++;\n }\n }\n }\n\n return count;\n }\n\n /**\n * Check if a reporter name/path matches TestdinoReporter\n *\n * @param value - Reporter name, path, or class reference\n * @returns true if this is our reporter, false otherwise\n */\n private isTestdinoReporter(value: unknown): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n // Check various forms our reporter might appear as:\n // - '@testdino/playwright' (npm package name)\n // - 'TestdinoReporter' (class name)\n // - Path ending with 'testdino-playwright'\n return (\n value.includes('@testdino/playwright') ||\n value.includes('TestdinoReporter') ||\n value.endsWith('testdino-playwright')\n );\n }\n\n /**\n * Register signal handlers for graceful shutdown on interruption\n */\n private registerSignalHandlers(): void {\n // Use a wrapper that properly handles async operations\n // Node.js signal handlers don't wait for async operations,\n // so we need to prevent immediate exit and handle manually\n this.sigintHandler = () => {\n // Remove handler immediately to prevent duplicate signals during shutdown\n if (this.sigintHandler) {\n process.removeListener('SIGINT', this.sigintHandler);\n }\n if (this.sigtermHandler) {\n process.removeListener('SIGTERM', this.sigtermHandler);\n }\n\n this.handleInterruption('SIGINT', 130);\n };\n\n this.sigtermHandler = () => {\n // Remove handler immediately to prevent duplicate signals during shutdown\n if (this.sigintHandler) {\n process.removeListener('SIGINT', this.sigintHandler);\n }\n if (this.sigtermHandler) {\n process.removeListener('SIGTERM', this.sigtermHandler);\n }\n\n this.handleInterruption('SIGTERM', 143);\n };\n\n process.on('SIGINT', this.sigintHandler);\n process.on('SIGTERM', this.sigtermHandler);\n }\n\n /**\n * Remove signal handlers (called on normal completion or after handling interruption)\n */\n private removeSignalHandlers(): void {\n if (this.sigintHandler) {\n process.removeListener('SIGINT', this.sigintHandler);\n }\n if (this.sigtermHandler) {\n process.removeListener('SIGTERM', this.sigtermHandler);\n }\n }\n\n /**\n * Handle process interruption by sending run:end event with interrupted status\n * @param signal - The signal that triggered the interruption (SIGINT or SIGTERM)\n * @param exitCode - The exit code to use when exiting\n */\n private handleInterruption(signal: string, exitCode: number): void {\n // Prevent duplicate handling\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n\n console.log(`\\nāš ļø TestDino: Received ${signal}, sending interruption event...`);\n\n if (!this.initPromise) {\n // Init never started, just exit\n process.exit(exitCode);\n }\n\n // Create interruption event\n const event: TestRunEndEvent = {\n type: 'run:end',\n runId: this.runId,\n ...this.getEventMetadata(),\n status: 'interrupted',\n duration: this.runStartTime ? Date.now() - this.runStartTime : 0,\n startTime: this.runStartTime ?? Date.now(),\n shard: this.shardInfo,\n };\n\n // Keep event loop alive with interval - CRITICAL for ensuring async operations complete\n const keepAlive = setInterval(() => {\n // Empty interval to keep process alive\n }, 100);\n\n // Hard timeout to force exit if send hangs\n const forceExitTimer = setTimeout(() => {\n clearInterval(keepAlive);\n console.error('āŒ TestDino: Force exit - send timeout exceeded');\n this.wsClient?.close();\n process.exit(exitCode);\n }, 3000); // 3 second hard limit\n\n // Send interruption event directly (bypass buffer to avoid flush delays)\n const sendAndExit = async () => {\n try {\n // Send directly without buffering for speed\n await Promise.race([this.sendInterruptionEvent(event), this.timeoutPromise(2500, 'Send timeout')]);\n\n console.log('āœ… TestDino: Interruption event sent');\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.error(`āŒ TestDino: Failed to send interruption event: ${errorMsg}`);\n } finally {\n // Clean up\n clearTimeout(forceExitTimer);\n clearInterval(keepAlive);\n this.wsClient?.close();\n process.exit(exitCode);\n }\n };\n\n // Execute\n sendAndExit().catch(() => {\n clearTimeout(forceExitTimer);\n clearInterval(keepAlive);\n process.exit(exitCode);\n });\n }\n\n /**\n * Send interruption event directly without buffering\n * Uses optimized path for speed during shutdown\n */\n private async sendInterruptionEvent(event: TestRunEndEvent): Promise<void> {\n // Try WebSocket first if connected\n if (!this.useHttpFallback && this.wsClient?.isConnected()) {\n try {\n await this.wsClient.send(event);\n return;\n } catch {\n // Fall through to HTTP\n console.warn('āš ļø WebSocket send failed, trying HTTP');\n }\n }\n\n // Use HTTP with reduced retries for speed\n if (this.httpClient) {\n try {\n // Single attempt, no retries for interruption (speed is critical)\n await this.httpClient.sendEvent(event);\n } catch (error) {\n throw new Error(`HTTP send failed: ${error}`);\n }\n } else {\n throw new Error('No client available');\n }\n }\n\n /**\n * Create a promise that rejects after a timeout\n * @param ms - Timeout in milliseconds\n * @param message - Error message for timeout\n */\n private timeoutPromise(ms: number, message: string): Promise<never> {\n return new Promise((_, reject) => setTimeout(() => reject(new Error(message)), ms));\n }\n\n /**\n * Initialize artifact uploader by requesting SAS token\n * Gracefully handles failures - uploads disabled if SAS token request fails\n */\n private async initializeArtifactUploader(token: string, serverUrl: string): Promise<void> {\n try {\n // Get base server URL (without /api/reporter)\n const baseServerUrl = this.getBaseServerUrl(serverUrl);\n\n const sasTokenClient = new SASTokenClient({\n token,\n serverUrl: baseServerUrl,\n });\n\n const sasToken = await sasTokenClient.requestToken();\n\n this.artifactUploader = new ArtifactUploader(sasToken, {\n debug: this.config.debug,\n });\n\n if (this.config.debug) {\n console.log('šŸ“¤ TestDino: Artifact uploads enabled');\n }\n } catch (error) {\n // Graceful degradation - disable uploads but continue\n console.warn('āš ļø TestDino: Artifact uploads disabled -', error instanceof Error ? error.message : String(error));\n this.artifactsEnabled = false;\n this.artifactUploader = null;\n }\n }\n\n /**\n * Upload attachments and return with Azure URLs\n * If uploads disabled or failed, returns attachments with local paths\n */\n private async uploadAttachments(\n attachments: Array<{ name: string; contentType: string; path?: string; body?: Buffer }>,\n testId: string\n ): Promise<Array<{ name: string; contentType: string; path?: string }>> {\n // If uploads not enabled or no uploader, return original attachments\n if (!this.artifactsEnabled || !this.artifactUploader) {\n return attachments.map((a) => ({\n name: a.name,\n contentType: a.contentType,\n path: a.path,\n }));\n }\n\n // Filter to file-based attachments only (with path)\n const fileAttachments: AttachmentForUpload[] = attachments\n .filter((a): a is { name: string; contentType: string; path: string } => !!a.path)\n .map((a) => ({\n name: a.name,\n contentType: a.contentType,\n path: a.path,\n }));\n\n // If no file attachments, return original\n if (fileAttachments.length === 0) {\n return attachments.map((a) => ({\n name: a.name,\n contentType: a.contentType,\n path: a.path,\n }));\n }\n\n // Upload files in parallel\n const uploadResults = await this.artifactUploader.uploadAll(fileAttachments, testId);\n\n // Create a map of upload results by name\n const uploadMap = new Map<string, UploadResult>();\n for (const result of uploadResults) {\n uploadMap.set(result.name, result);\n }\n\n // Map attachments with Azure URLs where upload succeeded\n return attachments.map((a) => {\n const uploadResult = uploadMap.get(a.name);\n if (uploadResult?.success && uploadResult.uploadUrl) {\n // Replace local path with Azure URL\n return {\n name: a.name,\n contentType: a.contentType,\n path: uploadResult.uploadUrl,\n };\n }\n // Keep original path if upload failed or not applicable\n return {\n name: a.name,\n contentType: a.contentType,\n path: a.path,\n };\n });\n }\n\n /**\n * Get base server URL without /api/reporter suffix\n */\n private getBaseServerUrl(serverUrl: string): string {\n // Remove /api/reporter suffix if present\n return serverUrl.replace(/\\/api\\/reporter$/, '');\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@testdino/playwright",
3
+ "version": "1.0.1",
4
+ "description": "TestDino's real-time streaming reporter and CLI for Playwright test execution",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "tdpw": "bin/tdpw.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "require": "./dist/index.js",
15
+ "import": "./dist/index.mjs"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "bin"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsup",
24
+ "dev": "tsup --watch",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "test:unit": "vitest run tests/unit",
28
+ "test:integration": "vitest run tests/integration",
29
+ "test:coverage": "vitest run --coverage",
30
+ "typecheck": "tsc --noEmit",
31
+ "lint": "eslint .",
32
+ "lint:fix": "eslint . --fix",
33
+ "format": "prettier --write .",
34
+ "format:check": "prettier --check ."
35
+ },
36
+ "keywords": [
37
+ "playwright",
38
+ "reporter",
39
+ "testing",
40
+ "cli",
41
+ "streaming",
42
+ "testdino"
43
+ ],
44
+ "author": "TestDino",
45
+ "private": false,
46
+ "peerDependencies": {
47
+ "@playwright/test": "^1.50.0"
48
+ },
49
+ "dependencies": {
50
+ "axios": "^1.13.4",
51
+ "chalk": "^5.6.2",
52
+ "commander": "^14.0.3",
53
+ "dotenv": "^17.2.3",
54
+ "execa": "^9.6.1",
55
+ "jiti": "^2.6.1",
56
+ "ws": "^8.19.0"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.0.0"
60
+ },
61
+ "devDependencies": {
62
+ "@eslint/js": "^9.39.2",
63
+ "@playwright/test": "^1.58.1",
64
+ "@types/express": "^5.0.6",
65
+ "@types/node": "^25.1.0",
66
+ "@types/ws": "^8.18.1",
67
+ "@vitest/coverage-v8": "^4.0.18",
68
+ "eslint": "^9.39.2",
69
+ "eslint-config-prettier": "^10.1.8",
70
+ "express": "^5.2.1",
71
+ "prettier": "^3.8.0",
72
+ "tsup": "^8.5.1",
73
+ "typescript": "^5.9.3",
74
+ "typescript-eslint": "^8.54.0",
75
+ "vitest": "^4.0.18"
76
+ }
77
+ }