reac-mapper 0.1.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/utils/imageMetrics.ts","../src/components/ImageWithPoints.tsx","../src/components/FloorMapDrawer.tsx","../src/utils/closest-segment-point.ts","../src/components/MapperEditor/hooks/usePoints.ts","../src/components/MapperEditor/hooks/useZoom.ts","../src/components/MapperEditor/Mapper.style.tsx","../src/components/MapperEditor/Mapper.tsx"],"names":["React","jsx","jsxs","useState","useRef","useEffect","KonvaImage"],"mappings":";;;;;;;;;;;AAAA,eAAsB,oBAAoB,GAAA,EAAyD;AACjG,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,aAAA,EAAe,CAAA;AACjF,IAAA,GAAA,CAAI,OAAA,GAAU,MAAA;AACd,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;ACcO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAQ,EAAC;AAAA,EACT,WAAA,GAAc,CAAA;AAAA,EACd,SAAA,GAAY,SAAA;AAAA,EACZ,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa,MAAA;AAAA,EACb,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,MAAA,CAAA,QAAA,CAA6B,eAAe,IAAI,CAAA;AAE9E,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,CAAC,WAAA,IAAe,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,MAAM,mBAAA,CAAoB,KAAA,CAAM,GAAG,CAAA;AAC7C,UAAA,IAAI,KAAA,UAAe,CAAC,CAAA;AAAA,QACtB,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX,CAAA,MAAA,IAAW,CAAC,WAAA,IAAe,KAAA,CAAM,SAAS,MAAA,EAAQ;AAChD,QAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AAAE,MAAA,KAAA,GAAQ,KAAA;AAAA,IAAO,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAEvB,EAAA,IAAI,CAAC,IAAA,EAAM,uBAAO,GAAA,CAAC,SAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,WAAU,EAAG,CAAA;AAE9G,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA;AAE1B,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,MAC/B,IAAA,EAAK,KAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAM,4BAAA;AAAA,MAEL,QAAA,EAAA;AAAA,QAAA,KAAA,oBAAS,GAAA,CAAC,WAAO,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACvB,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACrB,GAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAM,KAAA,CAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAc,MAAA,EAAgB,mBAAA,EAAoB,MAAA,EAAO,CAAA;AAAA,wBAC7F,GAAA,CAAC,GAAA,EAAA,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW,aAAA,EAAc,OAAA,EAC1D,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,UAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,IAAI,CAAA;AAC5C,UAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,EAAE,CAAA;AAC1C,UAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACrB,UAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAgB,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAA,EAAvC,EAAE,EAAwC,CAAA;AAAA,QAC9D,CAAC,CAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,OAAE,IAAA,EAAM,SAAA,EACN,iBAAO,GAAA,CAAI,CAAC,sBAAM,GAAA,CAAC,QAAA,EAAA,EAAkB,IAAI,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA,EAAG,GAAG,WAAA,EAAA,EAA3B,CAAA,CAAE,EAAsC,CAAE,CAAA,EAC5E,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;ACtCO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IAAO,WAAA;AAAA,IAAa,MAAA;AAAA,IAAQ,KAAA;AAAA,IAAO,gBAAgB,EAAC;AAAA,IAAG,eAAe,EAAC;AAAA,IAAG,QAAA;AAAA,IAAU,YAAA;AAAA,IACpF,WAAA,GAAc,CAAA;AAAA,IAAG,iBAAA,GAAoB,GAAA;AAAA,IAAK,SAAA,GAAY,SAAA;AAAA,IAAW,eAAA,GAAkB,SAAA;AAAA,IACnF,SAAA,GAAY,CAAA;AAAA,IAAG,UAAA,GAAa,MAAA;AAAA,IAAQ,iBAAA,GAAoB,IAAA;AAAA,IAAM,UAAA,GAAa,IAAA;AAAA,IAAM,WAAA,GAAc,IAAA;AAAA,IAC/F,OAAA,GAAU,GAAA;AAAA,IAAK,OAAA,GAAU,CAAA;AAAA,IAAG,QAAA,GAAW,IAAA;AAAA,IAAM,eAAA,GAAkB,KAAA;AAAA,IAAO,WAAA,GAAc,IAAA;AAAA,IAAM,WAAA,GAAc,KAAA;AAAA,IACxG,SAAA;AAAA,IAAW,KAAA;AAAA,IAAO,YAAA;AAAA,IAAc,KAAA;AAAA,IAAO;AAAA,GACzC,GAAI,KAAA;AAEJ,EAAA,MAAM,UAAA,GAAmB,cAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAe,cAA6B,IAAI,CAAA;AAEtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,MAAA,CAAA,QAAA,CAA6B,eAAe,IAAI,CAAA;AAC9E,EAAA,MAAM,YAAA,GAAe,MAAA,KAAW,MAAA,IAAa,KAAA,KAAU,MAAA;AACvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,gBAAkB,aAAa,CAAA;AAC3E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,gBAAiB,YAAY,CAAA;AACvE,EAAA,MAAM,MAAM,MAAA,IAAU,WAAA;AACtB,EAAA,MAAM,MAAM,KAAA,IAAS,UAAA;AAErB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAU,gBAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAU,gBAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAU,gBAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,gBAAqB,WAAW,CAAA;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAChE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,gBAAoB,IAAI,CAAA;AACtD,EAAA,MAAM,eAAA,GAAwB,cAAO,KAAK,CAAA;AAE1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,MAAA,CAAA,QAAA,CAAyB,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,MAAA,CAAA,QAAA,CAAyB,EAAE,CAAA;AAGnE,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,CAAC,WAAA,IAAe,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AACxC,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,MAAM,mBAAA,CAAoB,KAAA,CAAM,GAAG,CAAA;AAC7C,UAAA,IAAI,KAAA,UAAe,CAAC,CAAA;AAAA,QACtB,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACX,CAAA,MAAA,IAAW,CAAC,WAAA,IAAe,KAAA,CAAM,SAAS,MAAA,EAAQ;AAChD,QAAA,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AAAE,MAAA,KAAA,GAAQ,KAAA;AAAA,IAAO,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AAGvB,EAAA,MAAM,QAAc,MAAA,CAAA,WAAA,CAAY,CAAC,CAAA,EAAW,CAAA,EAAW,MAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AAEpG,EAAA,MAAM,cAAA,GAAuB,MAAA,CAAA,WAAA;AAAA,IAAY,MACtC,OAAO,MAAA,KAAW,WAAA,IAAe,YAAA,IAAgB,SAAS,MAAA,CAAO,UAAA,EAAW,GAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACnH;AAAC,GACH;AAEA,EAAA,MAAM,aAAA,GAAsB,MAAA,CAAA,WAAA,CAAY,CAAC,OAAA,EAAiB,OAAA,KAAoB;AAC5E,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM,OAAO,IAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,IAAA,MAAM,EAAA,GAAK,UAAU,IAAA,CAAK,IAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA;AAC1B,IAAA,MAAM,CAAA,GAAA,CAAK,KAAK,EAAA,IAAM,KAAA;AACtB,IAAA,MAAM,CAAA,GAAA,CAAK,KAAK,EAAA,IAAM,KAAA;AACtB,IAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,EAChB,GAAG,CAAC,IAAA,EAAM,EAAA,EAAI,EAAA,EAAI,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,WAAA,GAAoB,MAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAAwB;AAC7D,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AACjC,IAAA,YAAA,CAAa,EAAE,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,MAAM,IAAA,GAAa,mBAAY,MAAM;AACnC,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,CAAa,CAAC,CAAA,KAAM;AAClB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAG3B,MAAA,YAAA,CAAa,CAAC,MAAM,CAAC;AAAA,QACnB,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACT,EAAG,GAAG,CAAC,CAAC,CAAA;AAER,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,MAAA,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAErD,MAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,YAAA,EAAc,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAC,CAAA;AAGpD,EAAA,MAAM,IAAA,GAAa,mBAAY,MAAM;AACnC,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,CAAa,CAAC,CAAA,KAAM;AAClB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAGhB,MAAA,YAAA,CAAa,CAAC,CAAA,KAAM,CAAC,GAAG,CAAA,EAAG;AAAA,QACzB,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR,CAAC,CAAA;AAEF,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAC1B,MAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,MAAA,QAAA,GAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAErD,MAAA,OAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,YAAA,EAAc,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAC,CAAA;AAGpD,EAAA,MAAM,cAAA,GAAuB,MAAA,CAAA,WAAA,CAAY,CAAC,CAAA,KAAkB;AAC1D,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,YAAA,GAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,MAAA,GAAe,MAAA,CAAA,WAAA,CAAY,CAAC,IAAA,KAA+C;AAC/E,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,IAAU,GAAA;AACjC,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,IAAS,GAAA;AAE/B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,WAAA,CAAY,EAAE,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACvC,MAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,cAAA,CAAe,SAAS,CAAA;AACzC,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA;AAAA,IACxC;AAEA,IAAA,QAAA,GAAW,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAA,EACnD,GAAG,CAAC,YAAA,EAAc,KAAK,GAAA,EAAK,QAAA,EAAU,WAAW,CAAC,CAAA;AAElD,EAAA,MAAM,WAAA,GAAoB,MAAA,CAAA,WAAA,CAAY,CAAC,EAAA,KAAe;AACpD,IAAA,MAAA,CAAO;AAAA,MACL,QAAQ,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,MACrC,KAAA,EAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,EAAA,IAAM,CAAA,CAAE,EAAA,KAAO,EAAE;AAAA,KACtD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,GAAA,EAAK,GAAA,EAAK,MAAM,CAAC,CAAA;AAErB,EAAA,MAAM,UAAA,GAAmB,MAAA,CAAA,WAAA,CAAY,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACzE,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAC1C,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AAEnB,IAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,KAAK,CAAA;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,MAAM,CAAA;AACrC,IAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,IAAA,MAAM,QAAA,GAAkB,EAAE,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AACnC,IAAA,MAAM,SAAA,GAAY,CAAC,GAAG,GAAA,EAAK,QAAQ,CAAA;AAEnC,IAAA,IAAI,QAAA,GAAW,GAAA;AACf,IAAA,IAAI,iBAAA,IAAqB,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAE/B,MAAA,MAAM,aAAa,GAAA,CAAI,IAAA;AAAA,QAAK,CAAA,CAAA,KACzB,CAAA,CAAE,IAAA,KAAS,IAAA,CAAK,EAAA,IAAM,CAAA,CAAE,EAAA,KAAO,EAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,EAAA,IAAM,CAAA,CAAE,OAAO,IAAA,CAAK;AAAA,OACzE;AACA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,QAAA,GAAW,CAAC,GAAG,GAAA,EAAK,EAAE,EAAA,EAAI,cAAA,EAAe,EAAG,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,UAAU,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,aAAA,EAAe,IAAA,EAAM,KAAA,EAAO,gBAAgB,GAAA,EAAK,GAAA,EAAK,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAGpF,EAAA,MAAM,SAAA,GAAkB,mBAAY,MAAM;AACxC,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,KAAA,CAAM,CAAC,CAAA;AACP,IAAA,KAAA,CAAM,CAAC,CAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAA,GAAuB,mBAAY,MAAM;AAC7C,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,IAAA,EAAM;AAClC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAsB;AACtD,IAAA,MAAM,GAAA,GAAM,EAAA;AACZ,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,GAAQ,MAAM,CAAC,CAAA;AAC/C,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,GAAS,MAAM,CAAC,CAAA;AAChD,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,GAAS,KAAK,KAAA,EAAO,MAAA,GAAS,KAAK,MAAM,CAAA;AAC5D,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,KAAA,CAAA,CAAO,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAC,CAAA;AACvC,IAAA,KAAA,CAAA,CAAO,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,KAAK,CAAC,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAM,iBAAU,MAAM;AACpB,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,eAAA,CAAgB,OAAA,GAAU,IAAA;AAClD,MAAA,IAAI,CAAA,CAAE,MAAA,IAAW,CAAA,CAAE,MAAA,CAAuB,YAAY,OAAA,EAAS;AAE/D,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AAC1B,QAAA,IAAI,EAAE,GAAA,CAAI,WAAA,OAAkB,GAAA,IAAO,CAAC,EAAE,QAAA,EAAU;AAC9C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAA,EAAK;AAAA,QACP;AACA,QAAA,IAAK,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,IAAO,CAAA,CAAE,QAAA,IAAa,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAC9E,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAA,EAAK;AAAA,QACP;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,cAAA,EAAe;AAAA,MAAG;AACzE,MAAA,IAAI,CAAA,CAAE,QAAQ,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,SAAA,EAAU;AAAA,MAAG;AACtD,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MAAG;AAC9E,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,cAAA,CAAe,MAAM,CAAA;AAAA,MAAG;AAC/E,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,cAAA,CAAe,OAAO,CAAA;AAAA,MAAG;AAAA,IAClF,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,eAAA,CAAgB,OAAA,GAAU,KAAA;AAAA,IACpD,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,MAAM,cAAA,EAAgB,SAAA,EAAW,cAAc,CAAC,CAAA;AAE1D,EAAA,MAAM,UAAA,GAAqD,CAAC,CAAA,KAAM;AAChE,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,SAAS,KAAA,EAAO,UAAA,CAAW,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,OAAA,GAAgB,MAAA,CAAA,WAAA;AAAA,IAAY,MAChC,UAAA,KAAe,IAAA,KAAS,KAAA,IAAS,eAAA,CAAgB,OAAA,CAAA;AAAA,IACjD,CAAC,YAAY,IAAI;AAAA,GACnB;AAEA,EAAA,MAAM,uBAAA,GAAqE,CAAC,CAAA,KAAM;AAChF,IAAA,IAAI,CAAC,SAAQ,EAAG;AAChB,IAAC,CAAA,CAAE,MAAA,CAAmB,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AACnD,IAAA,OAAA,CAAQ,EAAE,MAAM,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,EACjE,CAAA;AAEA,EAAA,MAAM,kBAAA,GAA2B,MAAA,CAAA,WAAA,CAAY,CAAC,CAAA,KAAa,CAAC,CAAA,KAA0B;AACpF,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,WAAA,CAAY,EAAE,EAAE,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,IAAC,CAAA,CAAE,MAAA,CAAmB,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AACnD,IAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAEtB,EAAA,MAAM,aAAA,GAA0D,CAAC,CAAA,KAAM;AACrE,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AAC9C,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AACnB,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,GAAA;AACjB,MAAA,MAAA,CAAO;AAAA,QACL,QAAQ,GAAA,CAAI,GAAA;AAAA,UAAI,CAAC,OACf,EAAA,CAAG,EAAA,KAAO,KAAK,EAAA,GACX,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAE,GACjE;AAAA;AACN,OACD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAClC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAC5B,MAAA,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,GAAI,EAAE,CAAA;AACnB,MAAA,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,GAAI,EAAE,CAAA;AACnB,MAAA,OAAA,CAAQ,EAAE,MAAM,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IACjE;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,WAAA,GAAwD,CAAC,CAAA,KAAM;AACnE,IAAA,IAAI,IAAA,EAAM;AACR,MAAC,CAAA,CAAE,MAAA,CAAmB,qBAAA,GAAwB,CAAA,CAAE,SAAS,CAAA;AAAA,IAC3D;AACA,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,OAAA,GAAkD,CAAC,CAAA,KAAM;AAC7D,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,IAAI,eAAA,IAAmB,CAAC,CAAA,CAAE,OAAA,EAAS;AACnC,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,EAAA;AACrC,IAAA,MAAM,MAAA,GAAS,SAAA,GAAY,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,QAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,MAAA,EAAQ,SAAS,OAAO,CAAA;AAEvD,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,qBAAA,EAAsB;AACvC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAG5B,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,KAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,KAAA;AAEzB,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,KAAA,CAAM,EAAA,GAAK,OAAO,QAAQ,CAAA;AAC1B,IAAA,KAAA,CAAM,EAAA,GAAK,OAAO,QAAQ,CAAA;AAAA,EAC5B,CAAA;AAGA,EAAM,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,OAAA,EAAS;AAClC,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,MAAM,cAAA,EAAgB,CAAA;AACvD,IAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,EACtC,GAAG,CAAC,IAAA,EAAM,OAAO,IAAA,EAAM,MAAA,EAAQ,cAAc,CAAC,CAAA;AAE9C,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACEC,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,WAAsB,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAG,KAAA,IAC5E,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,MAAA,EAAO,EAAG,CAAA,EAC7E,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,IAAA;AAE1B,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAA,EAAY,SAAA,EAAsB,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAG,KAAA,EAAM,EACjF,QAAA,EAAA;AAAA,IAAA,WAAA,oBACCD,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,YAAA,EAAc,cAAA;AAAA,QACd,KAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAS,SAAA;AAAA,QACT,MAAA,EAAQ,IAAA;AAAA,QACR,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,CAAC,YAAA,IAAgB,SAAA,CAAU,MAAA,GAAS,CAAA;AAAA,QAC7C,OAAA,EAAS,CAAC,YAAA,IAAgB,SAAA,CAAU,MAAA,GAAS;AAAA;AAAA,KAC/C;AAAA,oBAGFC,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAW,YAAA;AAAA,QACX,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,SAAS,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO;AAAA,QAC9E,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,QAC/B,OAAA,EAAS,UAAA;AAAA,QACT,aAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,EAAM,4BAAA;AAAA,QACN,IAAA,EAAK,KAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QAEX,QAAA,EAAA;AAAA,UAAA,KAAA,oBAASD,GAAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UACvB,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,0BAErBA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAG,CAAA;AAAA,cAAG,CAAA,EAAG,CAAA;AAAA,cAAG,KAAA;AAAA,cAAc,MAAA;AAAA,cAAgB,IAAA,EAAK,aAAA;AAAA,cAC/C,aAAA,EAAe,uBAAA;AAAA,cACf,KAAA,EAAO,EAAE,MAAA,EAAQ,OAAA,KAAY,MAAA,GAAU,IAAA,KAAS,KAAA,GAAQ,WAAA,GAAc,SAAA;AAAW;AAAA,WACnF;AAAA,0BAEAC,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,CAAA,OAAA,EAAU,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAA,EACpD,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAM,KAAA,CAAM,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAc,MAAA,EAAgB,mBAAA,EAAoB,MAAA,EAAO,CAAA;AAAA,4BAC7FA,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW,aAAA,EAAc,OAAA,EAC1D,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACd,cAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,IAAI,CAAA;AACzC,cAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,EAAE,CAAA;AACvC,cAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,OAAO,IAAA;AACrB,cAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAgB,EAAA,EAAI,CAAA,CAAE,GAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,CAAE,CAAA,EAAA,EAAvC,EAAE,EAAwC,CAAA;AAAA,YAC9D,CAAC,CAAA,EACH,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EACE,QAAA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM;AACd,cAAA,MAAM,MAAA,GAAS,YAAY,CAAA,CAAE,EAAA;AAC7B,cAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,MAAA;AACvC,cAAA,uBACEC,IAAAA;AAAA,gBAAC,GAAA;AAAA,gBAAA;AAAA,kBAEC,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAAA,kBACnC,YAAA,EAAc,MAAM,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAAA,kBACnC,YAAA,EAAc,MAAM,UAAA,CAAW,CAAC,SAAU,IAAA,KAAS,CAAA,CAAE,EAAA,GAAK,IAAA,GAAO,IAAK,CAAA;AAAA,kBACtE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,KAAS,SAAS,MAAA,GAAU,IAAA,KAAS,OAAA,GAAU,SAAA,GAAY,SAAA,EAAW;AAAA,kBAEvF,QAAA,EAAA;AAAA,oCAAAD,GAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAI,CAAA,CAAE,CAAA;AAAA,wBACN,IAAI,CAAA,CAAE,CAAA;AAAA,wBACN,CAAA,EAAG,SAAS,iBAAA,GAAoB,WAAA;AAAA,wBAChC,IAAA,EAAM,SAAS,eAAA,GAAkB;AAAA;AAAA,qBACnC;AAAA,oBACC,8BACCC,IAAAA;AAAA,sBAAC,GAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,0BAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,0BAAA,WAAA,CAAY,EAAE,EAAE,CAAA;AAAA,wBAClB,CAAA;AAAA,wBACA,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAU;AAAA,wBAE3B,QAAA,EAAA;AAAA,0CAAAD,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,8BACT,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,8BACT,KAAA,EAAO,EAAA;AAAA,8BACP,MAAA,EAAQ,EAAA;AAAA,8BACR,EAAA,EAAI,CAAA;AAAA,8BACJ,IAAA,EAAK,MAAA;AAAA,8BACL,MAAA,EAAO;AAAA;AAAA,2BACT;AAAA,0CACAA,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,8BACT,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,8BACT,UAAA,EAAW,QAAA;AAAA,8BACX,UAAA,EAAW,WAAA;AAAA,8BACX,QAAA,EAAU,EAAA;AAAA,8BACV,IAAA,EAAK,SAAA;AAAA,8BACN,QAAA,EAAA;AAAA;AAAA;AAAC;AAAA;AAAA;AACJ;AAAA,iBAAA;AAAA,gBArCG,CAAA,CAAE;AAAA,eAuCT;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAQ,KAAA,EASd;AACD,EAAA,MAAM,MAA+D,CAAC,EAAE,UAAU,GAAG,IAAA,uBACnFA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ,mBAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,QAAA,GAAW,SAAA,GAAY,MAAA;AAAA,QACxC,MAAA,EAAQ,IAAA,CAAK,QAAA,GAAW,aAAA,GAAgB,SAAA;AAAA,QACxC,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM,CAAA;AAAA,QAC/B,GAAG,IAAA,CAAK;AAAA,OACV;AAAA,MACA;AAAA;AAAA,GAAS;AAGb,EAAA,MAAM,MAAqF,CAAC,EAAE,QAAQ,OAAA,EAAS,QAAA,uBAC7GA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,YAAA,EAAc,CAAA;AAAA,QACd,MAAA,EAAQ,SAAS,mBAAA,GAAsB,mBAAA;AAAA,QACvC,UAAA,EAAY,SAAS,SAAA,GAAY,MAAA;AAAA,QACjC,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA;AAAA,GAAS;AAGb,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QAAY,GAAA,EAAK,CAAA;AAAA,QAAG,IAAA,EAAM,CAAA;AAAA,QAAG,OAAA,EAAS,MAAA;AAAA,QAAQ,GAAA,EAAK,CAAA;AAAA,QAAG,UAAA,EAAY,QAAA;AAAA,QAC5E,UAAA,EAAY,uBAAA;AAAA,QAAyB,OAAA,EAAS,CAAA;AAAA,QAAG,MAAA,EAAQ,mBAAA;AAAA,QACzD,YAAA,EAAc,EAAA;AAAA,QAAI,SAAA,EAAW,4BAAA;AAAA,QAA8B,MAAA,EAAQ;AAAA,OACrE;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,CAAa,KAAK,CAAA,EAAG,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAChFA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,CAAa,KAAK,GAAG,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAChFA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,CAAa,MAAM,GAAG,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACnFA,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,CAAa,OAAO,GAAG,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,wBACtFA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,SAAQ,EAAG,CAAA;AAAA,wBAC9EA,IAAC,GAAA,EAAA,EAAI,OAAA,EAAS,MAAM,KAAA,EAAO,KAAA,EAAM,WAAU,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAC9CA,IAAC,GAAA,EAAA,EAAI,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAM,WAAU,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAChDA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,MAAA,EAAQ,SAAQ,EAAG,CAAA;AAAA,wBAC9EA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,EAAM,mBAAA,EAAoB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACpFA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,CAAC,KAAA,CAAM,OAAA,EAAS,KAAA,EAAM,yBAAA,EAA0B,QAAA,EAAA,MAAA,EAAI;AAAA;AAAA;AAAA,GAC5F;AAEJ;;;AC9gBO,IAAM,2BAA2B,CAChC,EAAA,EAAY,IACZ,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,KACf;AACD,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAErC,EAAA,IAAI,aAAA,KAAkB,GAAG,OAAO,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAErD,EAAA,IAAI,MAAM,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,MAAM,EAAA,IAAM,aAAA;AAC5C,EAAA,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAE9B,EAAA,OAAO;AAAA,IACH,CAAA,EAAG,KAAK,CAAA,GAAI,EAAA;AAAA,IACZ,CAAA,EAAG,KAAK,CAAA,GAAI,EAAA;AAAA,IACZ;AAAA,GACJ;AACJ,CAAA;AChBO,IAAM,SAAA,GAAY,CAAC,aAAA,KAAuC;AAC7D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,QAAAA;AAAA,IAAiB,MACzC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,CAAE;AAAA,GAC/D;AAEA,EAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAC/B,CAAA;ACLO,IAAM,OAAA,GAAU,CAAC,KAAA,KAA6B;AACjD,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,SAAA,GAAY,CAAA;AAClB,EAAA,MAAM,aAAA,GAAgB,CAAA;AAEtB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,aAAa,CAAA;AAE1D,EAAA,OAAM;AAAA,IACF,UAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACJ;AACJ,CAAA;ACfO,IAAM,YAAY,MAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAUzB,IAAM,eAAe,MAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAe5B,IAAM,kBAAkB,MAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAM/B,IAAM,aAAa,MAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoB1B,IAAM,MAAA,GAAS,OAAO,UAAU,CAAA,CAAA,CAAA;ACnChC,IAAM,SAAS,CAAC;AAAA,EACrB,GAAA,GAAM,8CAAA;AAAA,EACN,gBAAgB,EAAC;AAAA,EACjB,QAAA,GAAW;AACb,CAAA,KAAmB;AACjB,EAAA,MAAM,QAAA,GAAWC,OAAoB,IAAI,CAAA;AACzC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,UAAU,aAAa,CAAA;AACrD,EAAA,MAAM,EAAE,YAAY,aAAA,EAAe,SAAA,EAAW,WAAU,GAAI,OAAA,CAAQ,UAAU,OAAO,CAAA;AACrF,EAAA,MAAM,QAAA,GAAW,GAAA;AAEjB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAID,QAAAA,CAAS,aAAA,CAAc,UAAU,CAAC,CAAA;AAE9D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAS,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA0C,IAAI,CAAA;AAChF,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG5D,EAAA,MAAM,CAAC,KAAK,CAAA,GAAI,QAAA,CAAS,KAAK,WAAW,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,IAAS,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,MAAA,IAAU,CAAA;AAC9B,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,YAAY,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,OAAO,KAAA,EAAM;AAG1D,EAAA,MAAM,cAAA,GAAiB,CAAA;AACvB,EAAA,MAAM,kBAAA,GAAqB,EAAA;AAE3B,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACnB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,QAAA,GAAW,UAAA;AACjB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,UAAU,SAAS,CAAA;AAExD,IAAA,IAAI,aAAa,QAAA,EAAU;AAE3B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,EAAM,GAAI,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,EAAO,GAAI,CAAA;AAEjC,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,CAAA,EAAA,CAAI,OAAA,GAAU,aAAA,CAAc,CAAA,IAAK,QAAA;AAAA,MACjC,CAAA,EAAA,CAAI,OAAA,GAAU,aAAA,CAAc,CAAA,IAAK;AAAA,KACrC;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACX,CAAA,EAAG,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI,QAAA;AAAA,MACzB,CAAA,EAAG,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI;AAAA,KAC7B;AAEA,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,MAAA,EAAQ,QAAQ,CAAA;AAC9D,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACrB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,QAAA,GAAW,UAAA;AACjB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,UAAU,SAAS,CAAA;AAExD,IAAA,IAAI,aAAa,QAAA,EAAU;AAE3B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,EAAM,GAAI,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,EAAO,GAAI,CAAA;AAEjC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAA,EAAA,CAAI,OAAA,GAAU,aAAA,CAAc,CAAA,IAAK,QAAA;AAAA,MACjC,CAAA,EAAA,CAAI,OAAA,GAAU,aAAA,CAAc,CAAA,IAAK;AAAA,KACnC;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,CAAA,EAAG,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI,QAAA;AAAA,MACzB,CAAA,EAAG,OAAA,GAAU,OAAA,CAAQ,CAAA,GAAI;AAAA,KAC3B;AAEA,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,MAAA,EAAQ,QAAQ,CAAA;AAC9D,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC1B,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,cAAA,GAAiB,uBAAuB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,IAAK,QAAQ,CAAA;AACtE,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAoC;AACrD,IAAA,CAAA,CAAE,IAAI,cAAA,EAAe;AAErB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,QAAA,GAAW,UAAA;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,EAAmB;AACzC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,CAAA,EAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA,IAAK,QAAA;AAAA,MACnC,CAAA,EAAA,CAAI,OAAA,CAAQ,CAAA,GAAI,aAAA,CAAc,CAAA,IAAK;AAAA,KACrC;AAEA,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,CAAI,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,SAAA,GAAY,CAAA,GACzB,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,QAAA,EAAU,SAAS,CAAA,GACvC,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,UAAU,SAAS,CAAA;AAE3C,IAAA,IAAI,aAAa,QAAA,EAAU;AAE3B,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,YAAA,CAAa,CAAA,GAAI,QAAA;AAAA,MAChC,CAAA,EAAG,OAAA,CAAQ,CAAA,GAAI,YAAA,CAAa,CAAA,GAAI;AAAA,KAClC;AAEA,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,MAAA,EAAQ,QAAQ,CAAA;AAC9D,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,EACnC,CAAA;AAGF,EAAA,MAAM,sBAAA,GAAyB,CAAC,GAAA,EAA+B,YAAA,KAAyB;AACtF,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,EAAM;AAC/B,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,EAAO;AACjC,IAAA,MAAM,UAAA,GAAa,UAAU,KAAA,GAAQ,YAAA;AACrC,IAAA,MAAM,WAAA,GAAc,UAAU,MAAA,GAAS,YAAA;AAEvC,IAAA,IAAI,OAAO,GAAA,CAAI,CAAA;AACf,IAAA,IAAI,OAAO,GAAA,CAAI,CAAA;AAGf,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,IAAI,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACrB,MAAA,IAAI,IAAA,GAAO,UAAA,GAAa,UAAA,EAAY,IAAA,GAAO,UAAA,GAAa,UAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,IAAA,GAAA,CAAQ,aAAa,UAAA,IAAc,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,MAAA,IAAI,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACrB,MAAA,IAAI,IAAA,GAAO,WAAA,GAAc,WAAA,EAAa,IAAA,GAAO,WAAA,GAAc,WAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,IAAA,GAAA,CAAQ,cAAc,WAAA,IAAe,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,EAC5B,CAAA;AAIA,EAAA,MAAM,wBAAA,GAA2B,CAAC,MAAA,EAAgB,MAAA,KAAmB;AACnE,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE9B,IAAA,MAAM,SAAA,GAAY,sBAAsB,KAAA,GAAQ,UAAA,CAAA;AAEhD,IAAA,MAAM,WAAW,EAAC;AAClB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,MAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,GAAG,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,CAAO,SAAS,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAAA,IACpD;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAE7B,MAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,MAAA,EAAQ,MAAA,EAAQ,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AAC/E,MAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElE,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,OAAO;AAAA,UACL,cAAc,OAAA,CAAQ,KAAA;AAAA,UACtB,gBAAgB,OAAA,CAAQ,CAAA;AAAA,UACxB,OAAO,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA;AAAE,SACtC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,UAAA,GAAa,uBAAuB,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,IAAK,CAAC,CAAA;AAC3D,MAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,EAAS;AAC1B,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,YAAA,EAAa;AAAA,QACf,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AACxB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,aAAA,EAAc;AAAA,QAChB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AACxB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,eAAA,EAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,UAAA,EAAY,aAAa,CAAC,CAAA;AAE9B,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAoC;AAEhE,IAAA,MAAM,eAAe,CAAA,CAAE,MAAA;AACvB,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,KAAM,OAAA,EAAS;AACnD,MAAA,CAAA,CAAE,OAAO,QAAA,EAAS;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,QAAA,EAAS;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,EAAmB;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,YAAA,CAAa,GAAG,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAmC;AAC7D,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAA,EAAE;AAAA,MACd,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAA;AAAE,KAChB;AACA,IAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,MAAA,EAAQ,UAAU,CAAA;AAChE,IAAA,gBAAA,CAAiB,cAAc,CAAA;AAC/B,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwD;AAC7E,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,EAAmB;AACrC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAE9B,IAAA,MAAM,CAAA,GAAA,CAAK,GAAA,CAAI,CAAA,GAAI,aAAA,CAAc,MAAM,KAAA,GAAQ,UAAA,CAAA;AAC/C,IAAA,MAAM,CAAA,GAAA,CAAK,GAAA,CAAI,CAAA,GAAI,aAAA,CAAc,MAAM,KAAA,GAAQ,UAAA,CAAA;AAE/C,IAAA,OAAO,EAAE,GAAG,CAAA,EAAE;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,CAAA,GAAI,KAAA,EAAO,CAAA,CAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAElB,EAAA,MAAM,MAAA,GAAS,CAAC,UAAA,KAAuB;AACrC,IAAA,SAAA,CAAU,UAAU,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAmC;AAC/D,IAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AACjB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,EAAA,EAAY,CAAA,KAAmC;AAC1E,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAA,EAAE,GAAI,KAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,CAAA,EAAE,GAAI,KAAA;AAE5B,IAAA,MAAM,gBAAgB,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,CAAA,KAChC,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK,GAAI;AAAA,KAC7C;AAEA,IAAA,SAAA,CAAU,aAAa,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAmC;AAC7D,IAAA,CAAA,CAAE,YAAA,GAAe,IAAA;AACjB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,CAAA,KAAoC;AAChE,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,eAAe,CAAA,CAAE,MAAA;AAGvB,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,KAAM,OAAA,EAAS;AACnD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,eAAe,MAAA,CAAO,SAAA;AAAA,UAAU,CAAC,MACrC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,KAAA,GAAQ,aAAa,CAAA,EAAG,IAAI,CAAA,IAC3C,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,GAAI,QAAQ,YAAA,CAAa,CAAA,EAAG,CAAA,GAAI;AAAA,SAC7C;AAEA,QAAA,IAAI,YAAA,KAAiB,CAAA,IAAK,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG;AAC5C,UAAA,SAAA,CAAU,IAAI,CAAA;AACd,UAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,QAAA,EAAS;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,GAAA,GAAM,MAAM,kBAAA,EAAmB;AACrC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,YAAA,CAAa,GAAG,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAoC;AAC9D,IAAA,IAAI,CAAC,SAAS,eAAA,EAAiB;AAE/B,IAAA,MAAM,eAAe,CAAA,CAAE,MAAA;AAGvB,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,IAAA,EAAK,KAAM,OAAA,EAAS;AACnD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,QAAA,EAAS;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,EAAmB;AAC5C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AACpC,QAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AACpC,QAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAG5C,QAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,UAAA,MAAM,CAAA,GAAI,cAAc,KAAK,CAAA;AAG7B,UAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAEjD,UAAA,IAAI,OAAA,EAAS;AAEX,YAAA,MAAM,QAAA,GAAW;AAAA,cACf,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,cACb,CAAA,EAAG,QAAQ,KAAA,CAAM,CAAA;AAAA,cACjB,CAAA,EAAG,QAAQ,KAAA,CAAM;AAAA,aACnB;AAEA,YAAA,MAAM,SAAA,GAAY,CAAC,GAAG,MAAM,CAAA;AAC5B,YAAA,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,CAAA,EAAG,GAAG,QAAQ,CAAA;AACtD,YAAA,MAAA,CAAO,SAAS,CAAA;AAAA,UAClB,CAAA,MAAA,IAAW,CAAC,MAAA,EAAQ;AAElB,YAAA,MAAM,IAAA,GAAO,CAAC,GAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAG,GAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAC3D,YAAA,MAAA,CAAO,IAAI,CAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAoC;AAC3D,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,QAAA,EAAS;AAChC,IAAA,MAAM,CAAA,GAAI,cAAc,KAAK,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAQ,UAAA;AAClC,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAQ,UAAA;AAClC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAE9B,IAAA,gBAAA,CAAiB,OAAO,EAAE,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,uBACEH,KAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,mBACC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,WAAA,EAAa,oBAAA;AAAA,QACb,SAAA,EAAW,kBAAA;AAAA,QACX,WAAA,EAAa,eAAA;AAAA,QACb,OAAA,EAAS,WAAA;AAAA,QACT,MAAA,EAAQ,UAAA;AAAA,QACR,MAAA,EAAQ,UAAA;AAAA,QACR,GAAG,aAAA,CAAc,CAAA;AAAA,QACjB,GAAG,aAAA,CAAc,CAAA;AAAA,QACjB,WAAW,CAAC,eAAA;AAAA,QACZ,WAAA,EAAa,oBAAA;AAAA,QACb,SAAA,EAAW,kBAAA;AAAA,QACX,aAAA,EAAe,CAAC,GAAA,KAAQ,sBAAA,CAAuB,KAAK,UAAU,CAAA;AAAA,QAE9D,QAAA,kBAAAC,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,GAAAA;AAAA,YAACK,OAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,OAAO,SAAA,CAAU,KAAA;AAAA,cACjB,QAAQ,SAAA,CAAU,MAAA;AAAA,cAClB,SAAA,EAAW;AAAA;AAAA,WACb;AAAA,UAEC,MAAA,CAAO,MAAA,IAAU,CAAA,oBAChBL,GAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,gBAAA;AAAA,cACR,MAAA;AAAA,cACA,MAAA,EAAO,SAAA;AAAA,cACP,aAAa,CAAA,GAAI,UAAA;AAAA,cACjB,OAAA,EAAQ,OAAA;AAAA,cACR,QAAA,EAAS,OAAA;AAAA,cACT,OAAA,EAAS,CAAA;AAAA,cACT,IAAA,EAAM,SAAS,wBAAA,GAA2B,MAAA;AAAA,cAC1C,gBAAgB,kBAAA,GAAqB;AAAA;AAAA,WACvC;AAAA,0BAGFA,IAAC,KAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,sBACdA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,OAAA;AAAA,cACL,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,cACT,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,cACT,MAAA,EAAA,CAAS,CAAA,KAAM,CAAA,IAAK,aAAA,GAAgB,KAAK,CAAA,IAAK,UAAA;AAAA,cAC9C,IAAA,EAAM,CAAA,KAAM,CAAA,GAAI,SAAA,GAAY,SAAA;AAAA,cAC5B,MAAA,EAAQ,CAAA,KAAM,CAAA,IAAK,aAAA,GAAgB,SAAA,GAAY,MAAA;AAAA,cAC/C,WAAA,EAAa,CAAA,KAAM,CAAA,IAAK,aAAA,GAAgB,IAAI,UAAA,GAAa,CAAA;AAAA,cACzD,SAAA,EAAW,IAAA;AAAA,cACX,WAAA,EAAa,oBAAA;AAAA,cACb,YAAY,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,cAC9C,SAAA,EAAW;AAAA,aAAA;AAAA,YAXN,CAAA,CAAE;AAAA,WAaV,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAC,KAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,YAAA;AAAA,UACT,UAAU,UAAA,IAAc,SAAA;AAAA,UACxB,KAAA,EAAM,wBAAA;AAAA,UAEN,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG;AAAA;AAAA,OACpD;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,aAAA;AAAA,UACT,UAAU,UAAA,IAAc,SAAA;AAAA,UACxB,KAAA,EAAM,yBAAA;AAAA,UAEN,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO,EAAG;AAAA;AAAA,OACrD;AAAA,sBACAC,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,eAAA;AAAA,UACT,KAAA,EAAM,2BAAA;AAAA,UAEL,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,KAAA,CAAM,aAAa,GAAG,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AAChC,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ","file":"index.mjs","sourcesContent":["export async function getImageNaturalSize(src: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve({ width: img.naturalWidth, height: img.naturalHeight });\n img.onerror = reject;\n img.src = src;\n });\n}\n","\"use client\";\nimport * as React from \"react\";\nimport type { Point, Edge, ImageSource, NaturalSize } from \"../types\";\nimport { getImageNaturalSize } from \"../utils/imageMetrics\";\n\nexport type ImageWithPointsProps = {\n image: ImageSource;\n naturalSize?: NaturalSize;\n edges?: Edge[];\n pointRadius?: number;\n pointFill?: string;\n lineWidth?: number;\n lineStroke?: string;\n className?: string;\n style?: React.CSSProperties;\n title?: string;\n desc?: string;\n children?: React.ReactNode;\n points: Point[];\n};\n\nexport function ImageWithPoints({\n image,\n naturalSize,\n edges = [],\n pointRadius = 5,\n pointFill = \"#1f6feb\",\n lineWidth = 2,\n lineStroke = \"#111\",\n className,\n style,\n title,\n desc,\n children,\n points\n}: ImageWithPointsProps) {\n const [size, setSize] = React.useState<NaturalSize | null>(naturalSize ?? null);\n\n React.useEffect(() => {\n let alive = true;\n (async () => {\n if (!naturalSize && image.type === \"img\") {\n try {\n const s = await getImageNaturalSize(image.src);\n if (alive) setSize(s);\n } catch {}\n } else if (!naturalSize && image.type === \"next\") {\n setSize({ width: image.width, height: image.height });\n }\n })();\n return () => { alive = false; };\n }, [image, naturalSize]);\n\n if (!size) return <div className={className} style={{ ...style, aspectRatio: \"16/9\", background: \"#f6f8fa\" }} />;\n\n const { width, height } = size;\n\n return (\n <svg\n className={className}\n style={style}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={title}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n {title && <title>{title}</title>}\n {desc && <desc>{desc}</desc>}\n <image href={image.src} x={0} y={0} width={width} height={height} preserveAspectRatio=\"none\" />\n <g stroke={lineStroke} strokeWidth={lineWidth} strokeLinecap=\"round\">\n {edges.map((e) => {\n const a = points.find((p) => p.id === e.from);\n const b = points.find((p) => p.id === e.to);\n if (!a || !b) return null;\n return <line key={e.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y} />;\n })}\n </g>\n <g fill={pointFill}>\n {points.map((p) => <circle key={p.id} cx={p.x} cy={p.y} r={pointRadius} />)}\n </g>\n {children}\n </svg>\n );\n}\n","\"use client\";\nimport * as React from \"react\";\nimport type { Point, Edge, ImageSource, NaturalSize } from \"../types\";\nimport { getImageNaturalSize } from \"../utils/imageMetrics\";\n\nexport type DrawerMode = \"pan\" | \"add\" | \"move\" | \"erase\";\n\nexport type FloorMapDrawerProps = {\n image: ImageSource;\n naturalSize?: NaturalSize;\n points?: Point[];\n edges?: Edge[];\n defaultPoints?: Point[];\n defaultEdges?: Edge[];\n onChange?: (data: { points: Point[]; edges: Edge[] }) => void;\n onModeChange?: (mode: DrawerMode) => void;\n pointRadius?: number;\n activePointRadius?: number;\n pointFill?: string;\n activePointFill?: string;\n lineWidth?: number;\n lineStroke?: string;\n connectSequential?: boolean;\n panEnabled?: boolean;\n zoomEnabled?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zoomStep?: number;\n zoomOnCtrlWheel?: boolean;\n showToolbar?: boolean;\n initialMode?: DrawerMode;\n className?: string;\n style?: React.CSSProperties;\n svgClassName?: string;\n title?: string;\n desc?: string;\n};\n\ntype DragState =\n | { kind: \"point\"; id: string }\n | { kind: \"panning\"; lastX: number; lastY: number }\n | null;\n\ntype HistoryEntry = { points: Point[]; edges: Edge[] };\n\nexport function FloorMapDrawer(props: FloorMapDrawerProps) {\n const {\n image, naturalSize, points, edges, defaultPoints = [], defaultEdges = [], onChange, onModeChange,\n pointRadius = 5, activePointRadius = 6.5, pointFill = \"#1f6feb\", activePointFill = \"#ff7b72\",\n lineWidth = 2, lineStroke = \"#111\", connectSequential = true, panEnabled = true, zoomEnabled = true,\n minZoom = 0.3, maxZoom = 6, zoomStep = 1.12, zoomOnCtrlWheel = false, showToolbar = true, initialMode = \"pan\",\n className, style, svgClassName, title, desc\n } = props;\n\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const svgRef = React.useRef<SVGSVGElement | null>(null);\n\n const [size, setSize] = React.useState<NaturalSize | null>(naturalSize ?? null);\n const isControlled = points !== undefined || edges !== undefined;\n const [localPoints, setLocalPoints] = React.useState<Point[]>(defaultPoints);\n const [localEdges, setLocalEdges] = React.useState<Edge[]>(defaultEdges);\n const pts = points ?? localPoints;\n const eds = edges ?? localEdges;\n\n const [scale, setScale] = React.useState(1);\n const [tx, setTx] = React.useState(0);\n const [ty, setTy] = React.useState(0);\n\n const [mode, setMode] = React.useState<DrawerMode>(initialMode);\n const [hoverId, setHoverId] = React.useState<string | null>(null);\n const [drag, setDrag] = React.useState<DragState>(null);\n const spacePanningRef = React.useRef(false);\n\n const [undoStack, setUndoStack] = React.useState<HistoryEntry[]>([]);\n const [redoStack, setRedoStack] = React.useState<HistoryEntry[]>([]);\n\n // Load image natural size\n React.useEffect(() => {\n let alive = true;\n (async () => {\n if (!naturalSize && image.type === \"img\") {\n try { \n const s = await getImageNaturalSize(image.src); \n if (alive) setSize(s); \n } catch {}\n } else if (!naturalSize && image.type === \"next\") {\n setSize({ width: image.width, height: image.height });\n }\n })();\n return () => { alive = false; };\n }, [image, naturalSize]);\n\n // Memoized helper functions\n const clamp = React.useCallback((n: number, a: number, b: number) => Math.max(a, Math.min(b, n)), []);\n \n const cryptoRandomId = React.useCallback(() => \n (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : Math.random().toString(36).slice(2)),\n []\n );\n\n const screenToImage = React.useCallback((clientX: number, clientY: number) => {\n const svg = svgRef.current; \n if (!svg || !size) return null;\n const rect = svg.getBoundingClientRect();\n const cx = clientX - rect.left;\n const cy = clientY - rect.top;\n const x = (cx - tx) / scale;\n const y = (cy - ty) / scale;\n return { x, y };\n }, [size, tx, ty, scale]);\n\n const pushHistory = React.useCallback((entry: HistoryEntry) => {\n if (isControlled) return;\n setUndoStack((s) => [...s, entry]);\n setRedoStack([]);\n }, [isControlled]);\n\n // Fixed: undo now uses callback to get current state\n const undo = React.useCallback(() => {\n if (isControlled) return;\n setUndoStack((s) => {\n if (s.length === 0) return s;\n const prev = s[s.length - 1];\n \n // Capture current state for redo\n setRedoStack((r) => [{\n points: localPoints,\n edges: localEdges\n }, ...r]);\n \n setLocalPoints(prev.points);\n setLocalEdges(prev.edges);\n onChange?.({ points: prev.points, edges: prev.edges });\n \n return s.slice(0, -1);\n });\n }, [isControlled, localPoints, localEdges, onChange]);\n\n // Fixed: redo now uses callback to get current state\n const redo = React.useCallback(() => {\n if (isControlled) return;\n setRedoStack((r) => {\n if (r.length === 0) return r;\n const next = r[0];\n \n // Capture current state for undo\n setUndoStack((s) => [...s, {\n points: localPoints,\n edges: localEdges\n }]);\n \n setLocalPoints(next.points);\n setLocalEdges(next.edges);\n onChange?.({ points: next.points, edges: next.edges });\n \n return r.slice(1);\n });\n }, [isControlled, localPoints, localEdges, onChange]);\n\n // Fixed: wrapped in useCallback\n const setAndEmitMode = React.useCallback((m: DrawerMode) => { \n setMode(m); \n onModeChange?.(m); \n }, [onModeChange]);\n\n const update = React.useCallback((next: { points?: Point[]; edges?: Edge[] }) => {\n const newPoints = next.points ?? pts;\n const newEdges = next.edges ?? eds;\n \n if (!isControlled) {\n pushHistory({ points: pts, edges: eds });\n if (next.points) setLocalPoints(newPoints);\n if (next.edges) setLocalEdges(newEdges);\n }\n \n onChange?.({ points: newPoints, edges: newEdges });\n }, [isControlled, pts, eds, onChange, pushHistory]);\n\n const removePoint = React.useCallback((id: string) => {\n update({ \n points: pts.filter((p) => p.id !== id), \n edges: eds.filter((e) => e.from !== id && e.to !== id) \n });\n }, [pts, eds, update]);\n\n const addPointAt = React.useCallback((clientX: number, clientY: number) => {\n const img = screenToImage(clientX, clientY);\n if (!img || !size) return;\n \n const x = clamp(img.x, 0, size.width);\n const y = clamp(img.y, 0, size.height);\n const id = cryptoRandomId();\n const newPoint: Point = { id, x, y };\n const newPoints = [...pts, newPoint];\n \n let newEdges = eds;\n if (connectSequential && pts.length > 0) {\n const last = pts[pts.length - 1];\n // Check if edge already exists\n const edgeExists = eds.some(e => \n (e.from === last.id && e.to === id) || (e.from === id && e.to === last.id)\n );\n if (!edgeExists) {\n newEdges = [...eds, { id: cryptoRandomId(), from: last.id, to: id }];\n }\n }\n \n update({ points: newPoints, edges: newEdges });\n }, [screenToImage, size, clamp, cryptoRandomId, pts, eds, connectSequential, update]);\n\n // Fixed: wrapped in useCallback\n const resetZoom = React.useCallback(() => { \n setScale(1); \n setTx(0); \n setTy(0); \n }, []);\n\n // Fixed: wrapped in useCallback\n const fitToContainer = React.useCallback(() => {\n if (!wrapperRef.current || !size) return;\n const rect = wrapperRef.current.getBoundingClientRect();\n const pad = 16;\n const availW = Math.max(1, rect.width - pad * 2);\n const availH = Math.max(1, rect.height - pad * 2);\n const s = Math.min(availW / size.width, availH / size.height);\n setScale(s);\n setTx((rect.width - size.width * s) / 2);\n setTy((rect.height - size.height * s) / 2);\n }, [size]);\n\n // Fixed: proper dependencies\n React.useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.code === \"Space\") spacePanningRef.current = true;\n if (e.target && (e.target as HTMLElement).tagName === \"INPUT\") return;\n \n if (e.metaKey || e.ctrlKey) {\n if (e.key.toLowerCase() === \"z\" && !e.shiftKey) { \n e.preventDefault(); \n undo(); \n }\n if ((e.key.toLowerCase() === \"z\" && e.shiftKey) || e.key.toLowerCase() === \"y\") { \n e.preventDefault(); \n redo(); \n }\n }\n \n if (e.key.toLowerCase() === \"f\") { e.preventDefault(); fitToContainer(); }\n if (e.key === \"1\") { e.preventDefault(); resetZoom(); }\n if (e.key.toLowerCase() === \"a\") { e.preventDefault(); setAndEmitMode(\"add\"); }\n if (e.key.toLowerCase() === \"m\") { e.preventDefault(); setAndEmitMode(\"move\"); }\n if (e.key.toLowerCase() === \"e\") { e.preventDefault(); setAndEmitMode(\"erase\"); }\n };\n \n const onKeyUp = (e: KeyboardEvent) => { \n if (e.code === \"Space\") spacePanningRef.current = false; \n };\n \n window.addEventListener(\"keydown\", onKeyDown);\n window.addEventListener(\"keyup\", onKeyUp);\n return () => { \n window.removeEventListener(\"keydown\", onKeyDown); \n window.removeEventListener(\"keyup\", onKeyUp); \n };\n }, [undo, redo, fitToContainer, resetZoom, setAndEmitMode]);\n\n const onSvgClick: React.MouseEventHandler<SVGSVGElement> = (e) => {\n if (!size) return;\n if (mode === \"add\") addPointAt(e.clientX, e.clientY);\n };\n\n const wantPan = React.useCallback(() => \n panEnabled && (mode === \"pan\" || spacePanningRef.current),\n [panEnabled, mode]\n );\n\n const onBackgroundPointerDown: React.PointerEventHandler<SVGRectElement> = (e) => {\n if (!wantPan()) return;\n (e.target as Element).setPointerCapture(e.pointerId);\n setDrag({ kind: \"panning\", lastX: e.clientX, lastY: e.clientY });\n };\n\n const onPointPointerDown = React.useCallback((p: Point) => (e: React.PointerEvent) => {\n if (mode === \"erase\") { \n e.stopPropagation(); \n removePoint(p.id); \n return; \n }\n if (mode !== \"move\") return;\n (e.target as Element).setPointerCapture(e.pointerId);\n setDrag({ kind: \"point\", id: p.id });\n }, [mode, removePoint]);\n\n const onPointerMove: React.PointerEventHandler<SVGSVGElement> = (e) => {\n if (!drag) return;\n \n if (drag.kind === \"point\") {\n const img = screenToImage(e.clientX, e.clientY);\n if (!img || !size) return;\n const { x, y } = img;\n update({\n points: pts.map((pp) => \n pp.id === drag.id \n ? { ...pp, x: clamp(x, 0, size.width), y: clamp(y, 0, size.height) } \n : pp\n )\n });\n } else if (drag.kind === \"panning\") {\n const dx = e.clientX - drag.lastX;\n const dy = e.clientY - drag.lastY;\n setTx((t) => t + dx);\n setTy((t) => t + dy);\n setDrag({ kind: \"panning\", lastX: e.clientX, lastY: e.clientY });\n }\n };\n\n // Fixed: release pointer capture\n const onPointerUp: React.PointerEventHandler<SVGSVGElement> = (e) => {\n if (drag) {\n (e.target as Element).releasePointerCapture?.(e.pointerId);\n }\n setDrag(null);\n };\n\n const onWheel: React.WheelEventHandler<SVGSVGElement> = (e) => {\n if (!zoomEnabled) return;\n if (zoomOnCtrlWheel && !e.ctrlKey) return;\n e.preventDefault();\n \n const direction = e.deltaY < 0 ? 1 : -1;\n const factor = direction > 0 ? zoomStep : 1 / zoomStep;\n const newScale = clamp(scale * factor, minZoom, maxZoom);\n\n const svg = svgRef.current!;\n const rect = svg.getBoundingClientRect();\n const cx = e.clientX - rect.left;\n const cy = e.clientY - rect.top;\n\n // Fixed: calculate with current scale, then apply new scale\n const imgX = (cx - tx) / scale;\n const imgY = (cy - ty) / scale;\n\n setScale(newScale);\n setTx(cx - imgX * newScale);\n setTy(cy - imgY * newScale);\n };\n\n // Fixed: proper dependencies and guard\n React.useEffect(() => {\n if (!size || !wrapperRef.current) return;\n const id = requestAnimationFrame(() => fitToContainer());\n return () => cancelAnimationFrame(id);\n }, [size?.width, size?.height, fitToContainer]);\n\n if (!size) {\n return (\n <div ref={wrapperRef} className={className} style={{ position: \"relative\", ...style }}>\n <div style={{ aspectRatio: \"16/9\", background: \"#f6f8fa\", width: \"100%\" }} />\n </div>\n );\n }\n\n const { width, height } = size;\n\n return (\n <div ref={wrapperRef} className={className} style={{ position: \"relative\", ...style }}>\n {showToolbar && (\n <Toolbar\n mode={mode}\n onModeChange={setAndEmitMode}\n onFit={fitToContainer}\n onReset={resetZoom}\n onUndo={undo}\n onRedo={redo}\n canUndo={!isControlled && undoStack.length > 0}\n canRedo={!isControlled && redoStack.length > 0}\n />\n )}\n\n <svg\n ref={svgRef}\n className={svgClassName}\n style={{ touchAction: \"none\", display: \"block\", width: \"100%\", height: \"auto\" }}\n viewBox={`0 0 ${width} ${height}`}\n onClick={onSvgClick}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onWheel={onWheel}\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label={title}\n >\n {title && <title>{title}</title>}\n {desc && <desc>{desc}</desc>}\n\n <rect\n x={0} y={0} width={width} height={height} fill=\"transparent\"\n onPointerDown={onBackgroundPointerDown}\n style={{ cursor: wantPan() ? \"grab\" : (mode === \"add\" ? \"crosshair\" : \"default\") }}\n />\n\n <g transform={`matrix(${scale},0,0,${scale},${tx},${ty})`}>\n <image href={image.src} x={0} y={0} width={width} height={height} preserveAspectRatio=\"none\" />\n <g stroke={lineStroke} strokeWidth={lineWidth} strokeLinecap=\"round\">\n {eds.map((e) => {\n const a = pts.find((p) => p.id === e.from);\n const b = pts.find((p) => p.id === e.to);\n if (!a || !b) return null;\n return <line key={e.id} x1={a.x} y1={a.y} x2={b.x} y2={b.y} />;\n })}\n </g>\n <g>\n {pts.map((p) => {\n const active = hoverId === p.id;\n const showDelete = mode === \"erase\" && active;\n return (\n <g\n key={p.id}\n onPointerDown={onPointPointerDown(p)}\n onMouseEnter={() => setHoverId(p.id)}\n onMouseLeave={() => setHoverId((curr) => (curr === p.id ? null : curr))}\n style={{ cursor: mode === \"move\" ? \"grab\" : (mode === \"erase\" ? \"pointer\" : \"default\") }}\n >\n <circle \n cx={p.x} \n cy={p.y} \n r={active ? activePointRadius : pointRadius}\n fill={active ? activePointFill : pointFill} \n />\n {showDelete && (\n <g \n onClick={(e) => { \n e.stopPropagation(); \n removePoint(p.id); \n }} \n style={{ cursor: \"pointer\" }}\n >\n <rect \n x={p.x + 8} \n y={p.y - 16} \n width={18} \n height={18} \n rx={3} \n fill=\"#fff\" \n stroke=\"#d0d7de\" \n />\n <text \n x={p.x + 17} \n y={p.y - 3} \n textAnchor=\"middle\" \n fontFamily=\"system-ui\" \n fontSize={12} \n fill=\"#cf222e\"\n >×</text>\n </g>\n )}\n </g>\n );\n })}\n </g>\n </g>\n </svg>\n </div>\n );\n}\n\nfunction Toolbar(props: {\n mode: DrawerMode;\n onModeChange: (m: DrawerMode) => void;\n onFit: () => void;\n onReset: () => void;\n onUndo: () => void;\n onRedo: () => void;\n canUndo: boolean;\n canRedo: boolean;\n}) {\n const Btn: React.FC<React.ButtonHTMLAttributes<HTMLButtonElement>> = ({ children, ...rest }) => (\n <button\n {...rest}\n style={{\n padding: \"6px 10px\",\n borderRadius: 8,\n border: \"1px solid #d0d7de\",\n background: rest.disabled ? \"#f6f8fa\" : \"#fff\",\n cursor: rest.disabled ? \"not-allowed\" : \"pointer\",\n font: \"600 12px system-ui\",\n opacity: rest.disabled ? 0.5 : 1,\n ...rest.style\n }}\n >{children}</button>\n );\n \n const Tab: React.FC<{ active: boolean; onClick: () => void; children: React.ReactNode }> = ({ active, onClick, children }) => (\n <button\n onClick={onClick}\n style={{\n padding: \"6px 10px\",\n borderRadius: 8,\n border: active ? \"2px solid #1f6feb\" : \"1px solid #d0d7de\",\n background: active ? \"#eff6ff\" : \"#fff\",\n font: \"600 12px system-ui\",\n cursor: \"pointer\"\n }}\n >{children}</button>\n );\n \n return (\n <div\n style={{\n position: \"absolute\", top: 8, left: 8, display: \"flex\", gap: 8, alignItems: \"center\",\n background: \"rgba(255,255,255,0.9)\", padding: 8, border: \"1px solid #d0d7de\",\n borderRadius: 12, boxShadow: \"0 2px 8px rgba(0,0,0,0.08)\", zIndex: 10\n }}\n >\n <Tab active={props.mode === \"pan\"} onClick={() => props.onModeChange(\"pan\")}>Pan</Tab>\n <Tab active={props.mode === \"add\"} onClick={() => props.onModeChange(\"add\")}>Add</Tab>\n <Tab active={props.mode === \"move\"} onClick={() => props.onModeChange(\"move\")}>Move</Tab>\n <Tab active={props.mode === \"erase\"} onClick={() => props.onModeChange(\"erase\")}>Erase</Tab>\n <div style={{ width: 1, height: 22, background: \"#d0d7de\", margin: \"0 6px\" }} />\n <Btn onClick={props.onFit} title=\"Fit (F)\">Fit</Btn>\n <Btn onClick={props.onReset} title=\"1:1 (1)\">1:1</Btn>\n <div style={{ width: 1, height: 22, background: \"#d0d7de\", margin: \"0 6px\" }} />\n <Btn onClick={props.onUndo} disabled={!props.canUndo} title=\"Undo (Ctrl/Cmd+Z)\">Undo</Btn>\n <Btn onClick={props.onRedo} disabled={!props.canRedo} title=\"Redo (Shift+Ctrl/Cmd+Z)\">Redo</Btn>\n </div>\n );\n}","export const getClosestPointOnSegment = (\n px: number, py: number,\n x1: number, y1: number,\n x2: number, y2: number\n) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lengthSquared = dx * dx + dy * dy;\n \n if (lengthSquared === 0) return { x: x1, y: y1, t: 0 };\n \n let t = ((px - x1) * dx + (py - y1) * dy) / lengthSquared;\n t = Math.max(0, Math.min(1, t));\n \n return {\n x: x1 + t * dx,\n y: y1 + t * dy,\n t\n };\n};","import { useState } from \"react\";\nimport { Point, Points } from \"../../../types/points.type\";\n\nexport const usePoints = (initialPoints: Omit<Point, \"id\">[]) => {\n const [points, setPoints] = useState<Points>(() =>\n initialPoints.map((p, i) => ({ id: i + 1, x: p.x, y: p.y }))\n );\n\n return { points, setPoints };\n}","import Konva from \"konva\";\nimport { KonvaEventObject } from \"konva/lib/Node\";\nimport { useState } from \"react\";\n\nexport const useZoom = (stage:Konva.Stage | null) => {\n const MIN_SCALE = 0.5;\n const MAX_SCALE = 5;\n const DEFAULT_SCALE = 1;\n \n const [stageScale, setStageScale] = useState(DEFAULT_SCALE);\n\n return{\n stageScale,\n setStageScale,\n MIN_SCALE,\n MAX_SCALE,\n }\n}","import styled from \"styled-components\";\n\nexport const Container = styled.div`\n overflow: hidden;\n width:1200px;\n height:1200px;\n display: flex;\n align-items: stretch;\n border:1px solid #ccc;\n border-radius:4px;\n`;\n\nexport const NavContainer = styled.div`\n width:80px;\n height:100%;\n background:red;\n flex-shrink:0;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n flex-direction:column;\n gap:20px;\n padding:20px 0;\n background:#ebebeb;\n border-left:1px solid #ccc;\n`\n\nexport const CanvasContainer = styled.div`\n width:calc(100% - 80px);\n height:100%;\n overflow: hidden;\n`\n\nexport const ButtonBase = styled.button`\n padding:2px;\n background:white;\n border:none;\n border-radius:8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n font-size:12px;\n min-width:50px;\n min-height:50px;\n border-left:1px solid #ccc;\n &:disabled:{\n opacity:0.5;\n cursor:not-allowed;\n }\n`\n\nexport const Button = styled(ButtonBase)``;","import { KonvaEventObject } from \"konva/lib/Node\";\nimport React, { useMemo, useState, useRef, useEffect } from \"react\";\nimport { Stage, Layer, Image as KonvaImage, Circle, Line, Group } from \"react-konva\";\nimport useImage from \"use-image\";\nimport Konva from \"konva\";\nimport { ZoomIn, ZoomOut } from \"lucide-react\";\nimport { getClosestPointOnSegment } from \"../../utils/closest-segment-point\";\nimport { usePoints } from \"./hooks/usePoints\";\nimport { Point, Points } from \"../../types/points.type\";\nimport { useZoom } from \"./hooks/useZoom\";\nimport { Button, CanvasContainer, Container, NavContainer } from \"./Mapper.style\";\n\nexport interface MapperProps {\n src?: string;\n initialPoints?: Omit<Point, \"id\">[];\n maxWidth?: number;\n}\n\nexport const Mapper = ({\n src = \"https://konvajs.org/assets/line-building.png\",\n initialPoints = [], \n maxWidth = 1200,\n}: MapperProps) => {\n const stageRef = useRef<Konva.Stage>(null);\n const { points, setPoints } = usePoints(initialPoints);\n const { stageScale, setStageScale, MAX_SCALE, MIN_SCALE } = useZoom(stageRef?.current);\n const SCALE_BY = 1.2;\n\n const [closed, setClosed] = useState(initialPoints.length >= 3);\n \n const [hoveringFirst, setHoveringFirst] = useState(false);\n const [stagePosition, setStagePosition] = useState({ x: 0, y: 0 });\n const [dragStart, setDragStart] = useState<{ x: number; y: number } | null>(null);\n const [isDraggingPoint, setIsDraggingPoint] = useState(false);\n \n \n const [image] = useImage(src, \"anonymous\");\n const imgW = image?.width || 1;\n const imgH = image?.height || 1;\n const scale = maxWidth / imgW;\n const stageSize = { width: maxWidth, height: imgH * scale } ;\n\n \n const DRAG_THRESHOLD = 5;\n const LINE_HIT_THRESHOLD = 10;\n\n const handleZoomIn = () => {\n const stage = stageRef.current;\n if (!stage) return;\n\n const oldScale = stageScale;\n const newScale = Math.min(oldScale * SCALE_BY, MAX_SCALE);\n\n if (newScale === oldScale) return;\n\n const centerX = stage.width() / 2;\n const centerY = stage.height() / 2;\n\n const pointTo = {\n x: (centerX - stagePosition.x) / oldScale,\n y: (centerY - stagePosition.y) / oldScale,\n };\n\n const newPos = {\n x: centerX - pointTo.x * newScale,\n y: centerY - pointTo.y * newScale,\n };\n\n const constrainedPos = getConstrainedPosition(newPos, newScale);\n setStageScale(newScale);\n setStagePosition(constrainedPos);\n };\n \n const handleZoomOut = () => {\n const stage = stageRef.current;\n if (!stage) return;\n \n const oldScale = stageScale;\n const newScale = Math.max(oldScale / SCALE_BY, MIN_SCALE);\n \n if (newScale === oldScale) return;\n \n const centerX = stage.width() / 2;\n const centerY = stage.height() / 2;\n \n const pointTo = {\n x: (centerX - stagePosition.x) / oldScale,\n y: (centerY - stagePosition.y) / oldScale,\n };\n \n const newPos = {\n x: centerX - pointTo.x * newScale,\n y: centerY - pointTo.y * newScale,\n };\n \n const constrainedPos = getConstrainedPosition(newPos, newScale);\n setStageScale(newScale);\n setStagePosition(constrainedPos);\n };\n \n const handleResetZoom = () => {\n const newScale = 1;\n const constrainedPos = getConstrainedPosition({ x: 0, y: 0 }, newScale);\n setStageScale(newScale);\n setStagePosition(constrainedPos);\n };\n \n const handleWheel = (e: KonvaEventObject<WheelEvent>) => {\n e.evt.preventDefault();\n \n const stage = stageRef.current;\n if (!stage) return;\n \n const oldScale = stageScale;\n const pointer = stage.getPointerPosition();\n if (!pointer) return;\n \n const mousePointTo = {\n x: (pointer.x - stagePosition.x) / oldScale,\n y: (pointer.y - stagePosition.y) / oldScale,\n };\n \n const direction = e.evt.deltaY > 0 ? -1 : 1;\n const newScale = direction > 0 \n ? Math.min(oldScale * SCALE_BY, MAX_SCALE)\n : Math.max(oldScale / SCALE_BY, MIN_SCALE);\n \n if (newScale === oldScale) return;\n \n const newPos = {\n x: pointer.x - mousePointTo.x * newScale,\n y: pointer.y - mousePointTo.y * newScale,\n };\n \n const constrainedPos = getConstrainedPosition(newPos, newScale);\n setStageScale(newScale);\n setStagePosition(constrainedPos);\n };\n\n // Function to constrain position within bounds\n const getConstrainedPosition = (pos: { x: number; y: number }, currentScale: number) => {\n const stage = stageRef.current;\n if (!stage) return pos;\n\n const stageWidth = stage.width();\n const stageHeight = stage.height();\n const imageWidth = stageSize.width * currentScale;\n const imageHeight = stageSize.height * currentScale;\n\n let newX = pos.x;\n let newY = pos.y;\n\n // Constrain X axis\n if (imageWidth > stageWidth) {\n if (newX > 0) newX = 0;\n if (newX < stageWidth - imageWidth) newX = stageWidth - imageWidth;\n } else {\n newX = (stageWidth - imageWidth) / 2;\n }\n\n // Constrain Y axis\n if (imageHeight > stageHeight) {\n if (newY > 0) newY = 0;\n if (newY < stageHeight - imageHeight) newY = stageHeight - imageHeight;\n } else {\n newY = (stageHeight - imageHeight) / 2;\n }\n\n return { x: newX, y: newY };\n };\n\n\n // Function to check if click is near a line segment\n const findLineSegmentNearClick = (clickX: number, clickY: number) => {\n if (points.length < 2) return null;\n\n const threshold = LINE_HIT_THRESHOLD / (scale * stageScale);\n \n const segments = [];\n for (let i = 0; i < points.length - 1; i++) {\n segments.push({ start: i, end: i + 1 });\n }\n \n // If closed, add segment from last to first\n if (closed) {\n segments.push({ start: points.length - 1, end: 0 });\n }\n\n for (const segment of segments) {\n const p1 = points[segment.start];\n const p2 = points[segment.end];\n \n const closest = getClosestPointOnSegment(clickX, clickY, p1.x, p1.y, p2.x, p2.y);\n const distance = Math.hypot(closest.x - clickX, closest.y - clickY);\n \n if (distance < threshold) {\n return {\n segmentIndex: segment.start,\n insertPosition: closest.t,\n point: { x: closest.x, y: closest.y }\n };\n }\n }\n \n return null;\n };\n\n // Initialize position on image load\n useEffect(() => {\n if (image) {\n const initialPos = getConstrainedPosition({ x: 0, y: 0 }, 1);\n setStagePosition(initialPos);\n }\n }, [image]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey || e.metaKey) {\n if (e.key === \"=\" || e.key === \"+\") {\n e.preventDefault();\n handleZoomIn();\n } else if (e.key === \"-\") {\n e.preventDefault();\n handleZoomOut();\n } else if (e.key === \"0\") {\n e.preventDefault();\n handleResetZoom();\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [stageScale, stagePosition]);\n\n const handleStageDragStart = (e: KonvaEventObject<MouseEvent>) => {\n // Only allow stage dragging if not clicking on a point\n const clickedShape = e.target;\n if (clickedShape && clickedShape.name() === \"point\") {\n e.target.stopDrag();\n return;\n }\n\n const stage = e.target.getStage();\n if (!stage) return;\n \n const pos = stage.getPointerPosition();\n if (pos) {\n setDragStart(pos);\n }\n };\n\n const handleStageDragEnd = (e: KonvaEventObject<DragEvent>) => {\n const newPos = {\n x: e.target.x(),\n y: e.target.y(),\n };\n const constrainedPos = getConstrainedPosition(newPos, stageScale);\n setStagePosition(constrainedPos);\n setDragStart(null);\n };\n\n const toImageCoords = (stage: Konva.Stage | null): { x: number; y: number } => {\n if (!stage) return { x: 0, y: 0 };\n const pos = stage.getPointerPosition();\n if (!pos) return { x: 0, y: 0 };\n \n const x = (pos.x - stagePosition.x) / (scale * stageScale);\n const y = (pos.y - stagePosition.y) / (scale * stageScale);\n \n return { x, y };\n };\n\n const linePointsScaled = useMemo(() => {\n const flat = points.flatMap((p) => [p.x * scale, p.y * scale]);\n return flat;\n }, [points, scale]);\n\n const commit = (nextPoints: Points) => {\n setPoints(nextPoints);\n };\n\n const handlePointDragStart = (e: KonvaEventObject<DragEvent>) => {\n e.cancelBubble = true; // Prevent stage from dragging\n setIsDraggingPoint(true);\n };\n\n const handlePointDragMove = (id: number, e: KonvaEventObject<DragEvent>) => {\n const newX = e.target.x() / scale;\n const newY = e.target.y() / scale;\n \n const updatedPoints = points.map((p) => \n p.id === id ? { ...p, x: newX, y: newY } : p\n );\n \n setPoints(updatedPoints);\n };\n\n const handlePointDragEnd = (e: KonvaEventObject<DragEvent>) => {\n e.cancelBubble = true; // Prevent stage from processing this event\n setIsDraggingPoint(false);\n };\n\n const handleStageMouseDown = (e: KonvaEventObject<MouseEvent>) => {\n if (!image) return;\n\n const clickedShape = e.target;\n \n // Check if we clicked on a point\n if (clickedShape && clickedShape.name() === \"point\") {\n if (!closed) {\n const clickedIndex = points.findIndex((p) => \n Math.abs(p.x * scale - clickedShape.x()) < 1 && \n Math.abs(p.y * scale - clickedShape.y()) < 1\n );\n \n if (clickedIndex === 0 && points.length >= 3) {\n setClosed(true);\n setHoveringFirst(false);\n }\n }\n return;\n }\n\n // Track drag start for stage\n const stage = e.target.getStage();\n if (!stage) return;\n \n const pos = stage.getPointerPosition();\n if (pos) {\n setDragStart(pos);\n }\n };\n\n const handleStageMouseUp = (e: KonvaEventObject<MouseEvent>) => {\n if (!image || isDraggingPoint) return;\n\n const clickedShape = e.target;\n \n // Don't add point if clicked on a point\n if (clickedShape && clickedShape.name() === \"point\") {\n return;\n }\n\n // Check if this was a drag or a click\n if (dragStart) {\n const stage = e.target.getStage();\n if (!stage) return;\n \n const currentPos = stage.getPointerPosition();\n if (currentPos) {\n const dx = currentPos.x - dragStart.x;\n const dy = currentPos.y - dragStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n \n // If moved less than threshold, it's a click\n if (distance < DRAG_THRESHOLD) {\n const p = toImageCoords(stage);\n \n // Check if click is near an existing line\n const lineHit = findLineSegmentNearClick(p.x, p.y);\n \n if (lineHit) {\n // Insert point into the line\n const newPoint = {\n id: Date.now(),\n x: lineHit.point.x,\n y: lineHit.point.y\n };\n \n const newPoints = [...points];\n newPoints.splice(lineHit.segmentIndex + 1, 0, newPoint);\n commit(newPoints);\n } else if (!closed) {\n // Add point to the end (only if not closed)\n const next = [...points, { id: Date.now(), x: p.x, y: p.y }];\n commit(next);\n }\n }\n }\n \n setDragStart(null);\n }\n };\n\n const handleMouseMove = (e: KonvaEventObject<MouseEvent>) => {\n if (closed || points.length < 3) {\n setHoveringFirst(false);\n return;\n }\n\n const stage = e.target.getStage();\n const p = toImageCoords(stage);\n const fp = points[0];\n const dx = (p.x - fp.x) * scale * stageScale;\n const dy = (p.y - fp.y) * scale * stageScale;\n const dist = Math.hypot(dx, dy);\n\n setHoveringFirst(dist < 15);\n };\n\n return (\n <Container>\n <CanvasContainer>\n <Stage\n ref={stageRef}\n width={1200}\n height={1200}\n onMouseDown={handleStageMouseDown}\n onMouseUp={handleStageMouseUp}\n onMouseMove={handleMouseMove}\n onWheel={handleWheel}\n scaleX={stageScale}\n scaleY={stageScale}\n x={stagePosition.x}\n y={stagePosition.y}\n draggable={!isDraggingPoint}\n onDragStart={handleStageDragStart}\n onDragEnd={handleStageDragEnd}\n dragBoundFunc={(pos) => getConstrainedPosition(pos, stageScale)}\n >\n <Layer>\n <KonvaImage \n image={image} \n width={stageSize.width} \n height={stageSize.height} \n listening={false} \n />\n\n {points.length >= 2 && (\n <Line\n points={linePointsScaled}\n closed={closed}\n stroke=\"#2563eb\"\n strokeWidth={2 / stageScale}\n lineCap=\"round\"\n lineJoin=\"round\"\n tension={0}\n fill={closed ? \"rgba(37, 99, 235, 0.3)\" : undefined}\n hitStrokeWidth={LINE_HIT_THRESHOLD / stageScale}\n />\n )}\n\n <Group>\n {points.map((p, i) => (\n <Circle\n key={p.id}\n name=\"point\"\n x={p.x * scale}\n y={p.y * scale}\n radius={(i === 0 && hoveringFirst ? 10 : 6) / stageScale}\n fill={i === 0 ? \"#ef4444\" : \"#7e9de1\"}\n stroke={i === 0 && hoveringFirst ? \"#fbbf24\" : undefined}\n strokeWidth={i === 0 && hoveringFirst ? 2 / stageScale : 0}\n draggable={true}\n onDragStart={handlePointDragStart}\n onDragMove={(e) => handlePointDragMove(p.id, e)}\n onDragEnd={handlePointDragEnd}\n />\n ))}\n </Group>\n </Layer>\n </Stage>\n </CanvasContainer>\n <NavContainer>\n <Button\n onClick={handleZoomIn}\n disabled={stageScale >= MAX_SCALE}\n title=\"Zoom In (Ctrl/Cmd + +)\"\n >\n <ZoomIn style={{ width: '20px', height: '20px' }} />\n </Button>\n <Button\n onClick={handleZoomOut}\n disabled={stageScale <= MIN_SCALE}\n title=\"Zoom Out (Ctrl/Cmd + -)\"\n >\n <ZoomOut style={{ width: '20px', height: '20px' }} />\n </Button>\n <Button\n onClick={handleResetZoom}\n title=\"Reset Zoom (Ctrl/Cmd + 0)\"\n >\n {Math.round(stageScale * 100)}%\n </Button>\n </NavContainer>\n </Container>\n );\n};"]}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "reac-mapper",
3
+ "version": "0.1.1",
4
+ "description": "Interactive image overlay (points/lines) with pan & zoom for React/Next.js",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "test": "vitest",
23
+ "typecheck": "tsc -p tsconfig.json --noEmit",
24
+ "storybook": "storybook dev -p 6006",
25
+ "build-storybook": "storybook build"
26
+ },
27
+ "peerDependencies": {
28
+ "react": ">=18",
29
+ "react-dom": ">=18"
30
+ },
31
+ "devDependencies": {
32
+ "@chromatic-com/storybook": "^4.1.2",
33
+ "@storybook/addon-a11y": "^10.0.4",
34
+ "@storybook/addon-docs": "^10.0.4",
35
+ "@storybook/addon-onboarding": "^10.0.4",
36
+ "@storybook/addon-vitest": "^10.0.4",
37
+ "@storybook/react-vite": "^10.0.4",
38
+ "@testing-library/jest-dom": "^6.9.1",
39
+ "@testing-library/react": "^16.3.0",
40
+ "@types/node": "^24.10.0",
41
+ "@types/react": "^19.2.2",
42
+ "@types/react-dom": "^19.2.2",
43
+ "@vitest/browser-playwright": "4.0.6",
44
+ "@vitest/coverage-v8": "4.0.6",
45
+ "eslint": "^9.39.1",
46
+ "eslint-plugin-storybook": "^10.0.4",
47
+ "jsdom": "^27.1.0",
48
+ "playwright": "^1.56.1",
49
+ "storybook": "^10.0.4",
50
+ "tsup": "^8.5.0",
51
+ "typescript": "^5.9.3",
52
+ "vitest": "^4.0.6"
53
+ },
54
+ "dependencies": {
55
+ "lucide-react": "^0.552.0",
56
+ "react": ">=18",
57
+ "react-dom": ">=18",
58
+ "react-konva": "^19.2.0",
59
+ "styled-components": "^6.1.19",
60
+ "use-image": "^1.1.4"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/you/react-floor-map-lib.git"
65
+ },
66
+ "license": "MIT",
67
+ "publishConfig": {
68
+ "access": "restricted"
69
+ },
70
+ "eslintConfig": {
71
+ "extends": [
72
+ "plugin:storybook/recommended"
73
+ ]
74
+ }
75
+ }