@sudobility/sudojo_lib 0.0.87 → 0.0.88

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.
@@ -1 +1 @@
1
- {"version":3,"file":"useSudoku.d.ts","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSudoku.d.ts","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"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"}
@@ -86,7 +86,7 @@ function sudokuReducer(state, action) {
86
86
  ...state,
87
87
  play: {
88
88
  ...state.play,
89
- selectedIndex: action.index,
89
+ selectedIndex: state.play.selectedIndex === action.index ? null : action.index,
90
90
  },
91
91
  };
92
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useSudoku.js","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,qBAAqB,EAErB,KAAK,GAKN,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,SAAS,GAEV,MAAM,0BAA0B,CAAC;AA6DlC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,SAAS,kBAAkB,CACzB,WAAwC;IAExC,OAAO;QACL,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,EAAE;QAClB,gBAAgB,EAAE,EAAE;QACpB,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE,GAAG,oBAAoB,EAAE,GAAG,WAAW,EAAE;QACxD,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,mBAAmB,EAAE,IAAI,GAAG,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,aAAa,CAAC,KAAkB,EAAE,MAAoB;IAC7D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,SAAS,EACT,SAAS,GACV,GAAG,MAAM,CAAC;YAEX,uCAAuC;YACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAElD,gCAAgC;YAChC,MAAM,SAAS,GAAsB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YACzE,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAEpE,0FAA0F;YAC1F,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACnD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;gBACtE,8CAA8C;gBAC9C,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,uBAAuB;YACvB,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,SAAS,EAAE,UAAU;gBACrB,QAAQ,EAAE,KAAK;gBACf,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,4BAA4B;YAC5B,MAAM,IAAI,GAAe;gBACvB,KAAK;gBACL,QAAQ,EAAE,EAAE,GAAG,qBAAqB,EAAE;gBACtC,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,OAAO;gBACL,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC;gBACxC,IAAI;gBACJ,cAAc,EAAE,MAAM;gBACtB,gBAAgB,EAAE,QAAQ;gBAC1B,MAAM;gBACN,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;gBACvD,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC,CAAC,8BAA8B;YAE5E,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,aAAa,EAAE,MAAM,CAAC,KAAK;iBAC5B;aACF,CAAC;QACJ,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,aAAa,EAAE,IAAI;iBACpB;aACF,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YACtD,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,kCAAkC;YAClC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YAEzB,6BAA6B;YAC7B,2DAA2D;YAC3D,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO,KAAK,CAAC,CAAC,uCAAuC;gBAEzE,6CAA6C;gBAC7C,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;gBAClD,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACvD,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;oBAC7C,CAAC,CAAC,CAAC,GAAG,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzD,MAAM,OAAO,GAAe;oBAC1B,GAAG,IAAI;oBACP,KAAK,EAAE,IAAI,EAAE,uCAAuC;oBACpD,WAAW,EAAE,cAAc;iBAC5B,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;gBAEF,MAAM,OAAO,GAAe;oBAC1B,GAAG,KAAK,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC,CAAC;gBAEF,OAAO;oBACL,GAAG,KAAK;oBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;oBACvC,IAAI,EAAE,OAAO;iBACd,CAAC;YACJ,CAAC;YAED,oBAAoB;YACpB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YAErC,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB;gBAElD,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;oBACxB,2BAA2B;oBAC3B,8EAA8E;oBAC9E,MAAM,QAAQ,GAAe;wBAC3B,GAAG,CAAC;wBACJ,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;qBACnD,CAAC;oBAEF,mBAAmB;oBACnB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBACzC,SAAS,GAAG,KAAK,CAAC;oBACpB,CAAC;oBACD,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,uCAAuC;gBACvC,2EAA2E;gBAC3E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAE7B,IAAI,OAAO,KAAK,GAAG,IAAI,UAAU,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;wBACpE,MAAM,QAAQ,GAAe;4BAC3B,GAAG,CAAC;4BACJ,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI;yBAC7D,CAAC;wBACF,mBAAmB;wBACnB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;4BACzC,SAAS,GAAG,KAAK,CAAC;wBACpB,CAAC;wBACD,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAED,wCAAwC;gBACxC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,KAAK,EAAE,QAAQ;oBACf,SAAS;iBACV;gBACD,aAAa,EAAE,IAAI,EAAE,uBAAuB;aAC7C,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,QAAQ,EAAE;wBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;wBACtB,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa;qBAClD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,QAAQ,EAAE;wBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;wBACtB,aAAa,EAAE,MAAM,CAAC,OAAO;qBAC9B;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAE7C,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY;gBAAE,OAAO,KAAK,CAAC;YAEhC,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,YAAY;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YACtD,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE/C,oCAAoC;YACpC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAErE,MAAM,OAAO,GAAe;oBAC1B,GAAG,IAAI;oBACP,WAAW,EAAE,EAAE;iBAChB,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;gBAEF,MAAM,OAAO,GAAe;oBAC1B,GAAG,KAAK,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC,CAAC;gBAEF,OAAO;oBACL,GAAG,KAAK;oBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;oBACvC,IAAI,EAAE,OAAO;iBACd,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,OAAO,GAAe;gBAC1B,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI;aACZ,CAAC;YAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;aACrC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,wCAAwC;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,uDAAuD;YACvD,qEAAqE;YACrE,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC1D,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC1D,MAAM,eAAe,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,wCAAwC;YACxC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;gBACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/C,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClD,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;gBACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,wDAAwD;oBACxD,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACxC,CAAC;gBAED,8CAA8C;gBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBACjE,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBACpE,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBAEvE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;qBAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzB,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;aAC5D,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,2EAA2E;YAC3E,MAAM,KAAK,GAAG,iBAAiB,CAC7B,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,gBAAgB,CACvB,CAAC;YACF,MAAM,SAAS,GAAsB,YAAY,CAAC,CAAC,6BAA6B;YAEhF,+BAA+B;YAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAChC,2DAA2D;gBAC3D,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9D,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;YAClC,CAAC;YAED,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,MAAM,IAAI,GAAe;gBACvB,KAAK;gBACL,QAAQ,EAAE,EAAE,GAAG,qBAAqB,EAAE;gBACtC,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI;gBACJ,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,oFAAoF;YACpF,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YAE7B,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;YAE3D,yDAAyD;YACzD,uEAAuE;YACvE,MAAM,gBAAgB,GAAwB,WAAW;gBACvD,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBACjC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE;wBAAE,OAAO,IAAI,CAAC;oBACxC,OAAO,KAAK;yBACT,KAAK,CAAC,EAAE,CAAC;yBACT,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;yBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC;gBACJ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzB,gDAAgD;YAChD,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC/C,2DAA2D;gBAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,UAAU,GACd,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAExE,gCAAgC;gBAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAEhD,4FAA4F;gBAC5F,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACxD,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;gBAED,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBACxB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,wFAAwF;gBACxF,OAAO;oBACL,GAAG,IAAI;oBACP,KAAK,EAAE,UAAU;oBACjB,WAAW,EACT,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;wBAC3C,CAAC,CAAC,eAAe;wBACjB,CAAC,CAAC,IAAI;iBACX,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAgB;gBAC5B,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,UAAU;aACtB,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE;oBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;oBACtB,eAAe;iBAChB;aACF,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAqGD,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAClC,aAAa,EACb,OAAO,CAAC,WAAW,EACnB,kBAAkB,CACnB,CAAC;IAEF,kBAAkB;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;IACxC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;IACxD,MAAM,YAAY,GAChB,aAAa,KAAK,IAAI,IAAI,KAAK;QAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;IAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC;QACrB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACpE,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAC1C,CAAC,MAAM,CAAC;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,KAAK,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC;QACvD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;YACtC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,KAAK,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;YACtC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3B,UAAU;IACV,MAAM,SAAS,GAAG,WAAW,CAC3B,CACE,MAAc,EACd,QAAgB,EAChB,OAMC,EACD,EAAE;QACF,MAAM,MAAM,GAAiB;YAC3B,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,QAAQ;YACR,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK;YAC1C,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,OAAO;SACnC,CAAC;QACF,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAiC,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAiC,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnE,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC/C,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,MAAc,EAAE,EAAE;QAC/D,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC1C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,OAAgB,EAAE,EAAE;QACrD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAoC,EAAE,EAAE;QAC1E,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAC/B,CACE,SAAiB,EACjB,WAA0B,EAC1B,eAAwB,EACxB,EAAE;QACF,QAAQ,CAAC;YACP,IAAI,EAAE,iBAAiB;YACvB,SAAS;YACT,WAAW;YACX,eAAe;SAChB,CAAC,CAAC;IACL,CAAC,EACD,EAAE,CACH,CAAC;IAEF,oBAAoB;IACpB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,OAAO,KAAK,CAAC,cAAc,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3B,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO;QACL,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK;QACL,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,WAAW;QACX,OAAO;QACP,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAE9C,WAAW;QACX,UAAU;QACV,UAAU;QACV,QAAQ;QACR,cAAc;QACd,YAAY;QAEZ,UAAU;QACV,SAAS;QACT,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,KAAK;QACL,gBAAgB;QAChB,aAAa;QACb,IAAI;QACJ,eAAe;QACf,cAAc;QACd,KAAK;QACL,aAAa;QAEb,YAAY;QACZ,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,cAAc;QACd,oBAAoB;KACrB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * useSudoku hook - Main game state management\n *\n * Ported from renderable/sudokuschool/interactors/sudoku/SudokuInteractor.kt\n *\n * Handles:\n * - Board initialization with scrambling\n * - Cell selection\n * - Value input (normal and pencil modes)\n * - Error detection\n * - Game completion detection\n * - Undo functionality\n * - Auto pencilmarks generation\n */\n\nimport { useCallback, useMemo, useReducer } from 'react';\nimport {\n blockOf,\n cellHasError,\n columnOf,\n DEFAULT_APP_SETTINGS,\n DEFAULT_PLAY_SETTINGS,\n PlayingSource,\n rowOf,\n SudokuAppSettings,\n SudokuBoard,\n SudokuCell,\n SudokuPlay,\n} from '../types/sudoku';\nimport {\n cellsToInputString,\n cellsToPencilmarksString,\n cellsToPuzzleString,\n cellsToStateString,\n NonScrambler,\n parsePuzzleString,\n scrambleBoard,\n Scrambler,\n ScramblerProtocol,\n} from '../utils/sudokuScrambler';\n\n// =============================================================================\n// State Types\n// =============================================================================\n\ninterface SudokuState {\n /** Current play state */\n play: SudokuPlay | null;\n /** Original puzzle string (before scrambling) */\n originalPuzzle: string;\n /** Original solution string (before scrambling) */\n originalSolution: string;\n /** Puzzle source */\n source: PlayingSource;\n /** Level UUID if from a level */\n levelUuid: string | null;\n /** Board UUID if applicable */\n boardUuid: string | null;\n /** Undo history stack */\n history: SudokuPlay[];\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping from original (1-9) to scrambled (1-9) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n}\n\n// =============================================================================\n// Actions\n// =============================================================================\n\ntype SudokuAction =\n | {\n type: 'LOAD_BOARD';\n puzzle: string;\n solution: string;\n scramble: boolean;\n symmetrical: boolean;\n source: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n | { type: 'SELECT_CELL'; index: number }\n | { type: 'DESELECT_CELL' }\n | { type: 'INPUT'; value: number | null }\n | { type: 'TOGGLE_PENCIL_MODE' }\n | { type: 'SET_PENCIL_MODE'; enabled: boolean }\n | { type: 'UNDO' }\n | { type: 'ERASE' }\n | { type: 'AUTO_PENCILMARKS' }\n | { type: 'UPDATE_APP_SETTINGS'; settings: Partial<SudokuAppSettings> }\n | { type: 'RESET' }\n | {\n type: 'APPLY_HINT_DATA';\n userInput: string;\n pencilmarks: string | null;\n autoPencilmarks: boolean;\n };\n\n// =============================================================================\n// Initial State\n// =============================================================================\n\nfunction createInitialState(\n appSettings?: Partial<SudokuAppSettings>\n): SudokuState {\n return {\n play: null,\n originalPuzzle: '',\n originalSolution: '',\n source: 'LEVEL',\n levelUuid: null,\n boardUuid: null,\n history: [],\n appSettings: { ...DEFAULT_APP_SETTINGS, ...appSettings },\n digitMapping: new Map(),\n reverseDigitMapping: new Map(),\n };\n}\n\n// =============================================================================\n// Reducer\n// =============================================================================\n\nfunction sudokuReducer(state: SudokuState, action: SudokuAction): SudokuState {\n switch (action.type) {\n case 'LOAD_BOARD': {\n const {\n puzzle,\n solution,\n scramble,\n symmetrical,\n source,\n levelUuid,\n boardUuid,\n } = action;\n\n // Parse puzzle and solution into cells\n const cells = parsePuzzleString(puzzle, solution);\n\n // Apply scrambling if requested\n const scrambler: ScramblerProtocol = scramble ? Scrambler : NonScrambler;\n const scrambleResult = scrambleBoard(scrambler, cells, symmetrical);\n\n // Check if puzzle is already complete (all cells are clues, or all inputs match solution)\n const isComplete = scrambleResult.cells.every(cell => {\n if (cell.given !== null) return true; // Clue cells are always correct\n // Non-clue cells need input to match solution\n return cell.input !== null && cell.input === cell.solution;\n });\n\n // Create initial board\n const board: SudokuBoard = {\n cells: scrambleResult.cells,\n completed: isComplete,\n entering: false,\n enteringError: null,\n };\n\n // Create initial play state\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...createInitialState(state.appSettings),\n play,\n originalPuzzle: puzzle,\n originalSolution: solution,\n source,\n levelUuid: levelUuid ?? null,\n boardUuid: boardUuid ?? null,\n digitMapping: scrambleResult.digitMapping,\n reverseDigitMapping: scrambleResult.reverseDigitMapping,\n appSettings: state.appSettings,\n };\n }\n\n case 'SELECT_CELL': {\n if (!state.play) return state;\n if (state.play.board.completed) return state; // Can't select when completed\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex: action.index,\n },\n };\n }\n\n case 'DESELECT_CELL': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex: null,\n },\n };\n }\n\n case 'INPUT': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell) return state;\n\n // Can't modify given (clue) cells\n if (cell.given !== null) return state;\n\n const { value } = action;\n\n // Handle pencil marking mode\n // Matches Kotlin: if (cell.given == null && value != null)\n if (settings.pencilmarking) {\n if (value === null) return state; // Can't erase in pencil mode with null\n\n // Toggle pencilmark - matches Kotlin exactly\n const currentPencilmarks = cell.pencilmarks ?? [];\n const newPencilmarks = currentPencilmarks.includes(value)\n ? currentPencilmarks.filter(p => p !== value)\n : [...currentPencilmarks, value].sort((a, b) => a - b);\n\n const newCell: SudokuCell = {\n ...cell,\n input: null, // Clear input when setting pencilmarks\n pencilmarks: newPencilmarks,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // Normal input mode\n const row = rowOf(selectedIndex);\n const column = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n\n let completed = true;\n const newCells = board.cells.map((c, i) => {\n if (c.given !== null) return c; // Skip clue cells\n\n if (i === selectedIndex) {\n // Update the selected cell\n // Matches Kotlin: pencilmarks = if (value != null) null else cell.pencilmarks\n const modified: SudokuCell = {\n ...c,\n input: value,\n pencilmarks: value !== null ? null : c.pencilmarks,\n };\n\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n\n // Remove pencilmark from related cells\n // Matches Kotlin: cell.pencilmarks?.filter { it != value }?.toTypedArray()\n if (value !== null) {\n const cellRow = rowOf(i);\n const cellColumn = columnOf(i);\n const cellBlock = blockOf(i);\n\n if (cellRow === row || cellColumn === column || cellBlock === block) {\n const modified: SudokuCell = {\n ...c,\n pencilmarks: c.pencilmarks?.filter(p => p !== value) ?? null,\n };\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n }\n\n // Check completion for unmodified cells\n if (c.input !== c.solution) {\n completed = false;\n }\n return c;\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: {\n ...board,\n cells: newCells,\n completed,\n },\n selectedIndex: null, // Deselect after input\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'TOGGLE_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: !state.play.settings.pencilmarking,\n },\n },\n };\n }\n\n case 'SET_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: action.enabled,\n },\n },\n };\n }\n\n case 'UNDO': {\n if (state.history.length === 0) return state;\n\n const newHistory = [...state.history];\n const previousPlay = newHistory.pop();\n if (!previousPlay) return state;\n\n return {\n ...state,\n history: newHistory,\n play: previousPlay,\n };\n }\n\n case 'ERASE': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell || cell.given !== null) return state;\n\n // In pencil mode, clear pencilmarks\n if (settings.pencilmarking) {\n if (!cell.pencilmarks || cell.pencilmarks.length === 0) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n pencilmarks: [],\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // In normal mode, clear input\n if (cell.input === null) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n input: null,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'AUTO_PENCILMARKS': {\n // Matches Kotlin: fun autoPencilmarks()\n if (!state.play) return state;\n const { board } = state.play;\n if (board.completed) return state;\n\n // Calculate potentials for each row, column, and block\n // Matches Kotlin: Array(9) { CellPotentials((1..9).toMutableSet()) }\n const rowPotentials: Map<number, Set<number>> = new Map();\n const colPotentials: Map<number, Set<number>> = new Map();\n const blockPotentials: Map<number, Set<number>> = new Map();\n for (let i = 0; i < 9; i++) {\n rowPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n colPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n blockPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n }\n\n // Remove values that are already placed\n board.cells.forEach((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n rowPotentials.get(rowOf(index))?.delete(value);\n colPotentials.get(columnOf(index))?.delete(value);\n blockPotentials.get(blockOf(index))?.delete(value);\n }\n });\n\n // Calculate pencilmarks for each empty cell\n const newCells = board.cells.map((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n // Cell has a value - matches Kotlin: pencilmarks = null\n return { ...cell, pencilmarks: null };\n }\n\n // Intersect row, column, and block potentials\n const row = rowPotentials.get(rowOf(index)) ?? new Set<number>();\n const col = colPotentials.get(columnOf(index)) ?? new Set<number>();\n const block = blockPotentials.get(blockOf(index)) ?? new Set<number>();\n\n const pencilmarks = Array.from(row)\n .filter(v => col.has(v) && block.has(v))\n .sort((a, b) => a - b);\n\n return { ...cell, pencilmarks };\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n settings: { ...state.play.settings, autoPencilmarks: true },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'UPDATE_APP_SETTINGS': {\n return {\n ...state,\n appSettings: { ...state.appSettings, ...action.settings },\n };\n }\n\n case 'RESET': {\n if (!state.play) return state;\n\n // Reset to initial board state (keep original puzzle but clear all inputs)\n const cells = parsePuzzleString(\n state.originalPuzzle,\n state.originalSolution\n );\n const scrambler: ScramblerProtocol = NonScrambler; // Don't re-scramble on reset\n\n // Re-apply the same scrambling\n let newCells = cells;\n if (state.digitMapping.size > 0) {\n // Use the stored digit mapping to recreate scrambled cells\n const scrambleResult = scrambleBoard(scrambler, cells, false);\n newCells = scrambleResult.cells;\n }\n\n const board: SudokuBoard = {\n cells: newCells,\n completed: false,\n entering: false,\n enteringError: null,\n };\n\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...state,\n play,\n history: [],\n };\n }\n\n case 'APPLY_HINT_DATA': {\n // Matches Kotlin HintInteractor.apply() - applies board data from hint API response\n if (!state.play) return state;\n const { board } = state.play;\n\n const { userInput, pencilmarks, autoPencilmarks } = action;\n\n // Parse pencilmarks string (comma-separated, 81 entries)\n // Each entry is a string of digits (e.g., \"123\" for pencilmarks 1,2,3)\n const pencilmarksArray: (number[] | null)[] = pencilmarks\n ? pencilmarks.split(',').map(entry => {\n if (!entry || entry === '') return null;\n return entry\n .split('')\n .map(d => parseInt(d, 10))\n .filter(n => !isNaN(n) && n > 0);\n })\n : Array(81).fill(null);\n\n // Apply user input and pencilmarks to each cell\n let isComplete = true;\n const newCells = board.cells.map((cell, index) => {\n // Get input value from userInput string (0 means no input)\n const inputChar = userInput.charAt(index);\n const inputValue =\n inputChar >= '1' && inputChar <= '9' ? parseInt(inputChar, 10) : null;\n\n // Get pencilmarks for this cell\n const cellPencilmarks = pencilmarksArray[index];\n\n // Check completion - matches Kotlin: if (cell.given == null && cell.solution != cell.input)\n if (cell.given === null && inputValue !== cell.solution) {\n isComplete = false;\n }\n\n // If cell has a given value, don't modify it\n if (cell.given !== null) {\n return cell;\n }\n\n // Apply input and pencilmarks - matches Kotlin: input = if (input != 0) input else null\n return {\n ...cell,\n input: inputValue,\n pencilmarks:\n cellPencilmarks && cellPencilmarks.length > 0\n ? cellPencilmarks\n : null,\n };\n });\n\n const newBoard: SudokuBoard = {\n ...board,\n cells: newCells,\n completed: isComplete,\n };\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: newBoard,\n settings: {\n ...state.play.settings,\n autoPencilmarks,\n },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Hook Options and Result Types\n// =============================================================================\n\nexport interface UseSudokuOptions {\n /** Initial app settings */\n appSettings?: Partial<SudokuAppSettings>;\n}\n\nexport interface UseSudokuResult {\n // State\n /** Current play state (null if no board loaded) */\n play: SudokuPlay | null;\n /** Current board (shortcut to play.board) */\n board: SudokuBoard | null;\n /** Currently selected cell */\n selectedCell: SudokuCell | null;\n /** Selected cell index */\n selectedIndex: number | null;\n /** Whether pencil mode is active */\n isPencilMode: boolean;\n /** Whether game is completed */\n isCompleted: boolean;\n /** Whether undo is available */\n canUndo: boolean;\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping (original -> scrambled) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n\n // Computed values\n /** Cells with errors (when showErrors is enabled) */\n errorCells: SudokuCell[];\n /** Count of errors */\n errorCount: number;\n /** Progress percentage (0-100) */\n progress: number;\n /** Cells with the same value as selected cell */\n sameValueCells: SudokuCell[];\n /** Related cells (same row, column, block) */\n relatedCells: SudokuCell[];\n\n // Actions\n /** Load a new board */\n loadBoard: (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => void;\n /** Select a cell by index */\n selectCell: (index: number) => void;\n /** Select a cell by row and column */\n selectCellAt: (row: number, column: number) => void;\n /** Deselect the current cell */\n deselectCell: () => void;\n /** Input a value (1-9) into the selected cell */\n input: (value: number) => void;\n /** Erase the selected cell */\n erase: () => void;\n /** Toggle pencil mode */\n togglePencilMode: () => void;\n /** Set pencil mode */\n setPencilMode: (enabled: boolean) => void;\n /** Undo the last action */\n undo: () => void;\n /** Generate auto pencilmarks */\n autoPencilmarks: () => void;\n /** Update app settings */\n updateSettings: (settings: Partial<SudokuAppSettings>) => void;\n /** Reset the game to initial state */\n reset: () => void;\n /** Apply hint data from solver API response */\n applyHintData: (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => void;\n\n // Utility functions\n /** Get board state as string */\n getBoardString: () => string;\n /** Get original puzzle string (before scrambling) */\n getOriginalPuzzle: () => string;\n /** Get scrambled puzzle string (what the user is playing) - use this for solver API */\n getScrambledPuzzle: () => string;\n /** Get input string (user entries only) */\n getInputString: () => string;\n /** Get pencilmarks string */\n getPencilmarksString: () => string;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Main Sudoku game hook\n *\n * @example\n * ```tsx\n * const {\n * play,\n * board,\n * selectedCell,\n * isPencilMode,\n * isCompleted,\n * loadBoard,\n * selectCell,\n * input,\n * togglePencilMode,\n * undo,\n * } = useSudoku();\n *\n * // Load a puzzle\n * loadBoard(puzzleString, solutionString, { scramble: true });\n *\n * // Select a cell and enter a value\n * selectCell(0);\n * input(5);\n *\n * // Toggle pencil mode\n * togglePencilMode();\n * input(1); // Adds 1 as pencilmark\n * input(2); // Adds 2 as pencilmark\n * input(1); // Removes 1 from pencilmarks\n * ```\n */\nexport function useSudoku(options: UseSudokuOptions = {}): UseSudokuResult {\n const [state, dispatch] = useReducer(\n sudokuReducer,\n options.appSettings,\n createInitialState\n );\n\n // Computed values\n const board = state.play?.board ?? null;\n const selectedIndex = state.play?.selectedIndex ?? null;\n const selectedCell =\n selectedIndex !== null && board\n ? (board.cells[selectedIndex] ?? null)\n : null;\n const isPencilMode = state.play?.settings.pencilmarking ?? false;\n const isCompleted = board?.completed ?? false;\n const canUndo = state.history.length > 0;\n\n const errorCells = useMemo(() => {\n if (!board || !state.appSettings.showErrors) return [];\n return board.cells.filter(cellHasError);\n }, [board, state.appSettings.showErrors]);\n\n const errorCount = errorCells.length;\n\n const progress = useMemo(() => {\n if (!board) return 0;\n const totalEmpty = board.cells.filter(c => c.given === null).length;\n if (totalEmpty === 0) return 100;\n const filled = board.cells.filter(\n c => c.given === null && c.input !== null\n ).length;\n return Math.round((filled / totalEmpty) * 100);\n }, [board]);\n\n const sameValueCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const selectedCell = board.cells[selectedIndex];\n if (!selectedCell) return [];\n const value = selectedCell.given ?? selectedCell.input;\n if (value === null) return [];\n return board.cells.filter((c, i) => {\n if (i === selectedIndex) return false;\n return (c.given ?? c.input) === value;\n });\n }, [board, selectedIndex]);\n\n const relatedCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const row = rowOf(selectedIndex);\n const col = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n return board.cells.filter((_, i) => {\n if (i === selectedIndex) return false;\n return rowOf(i) === row || columnOf(i) === col || blockOf(i) === block;\n });\n }, [board, selectedIndex]);\n\n // Actions\n const loadBoard = useCallback(\n (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => {\n const action: SudokuAction = {\n type: 'LOAD_BOARD',\n puzzle,\n solution,\n scramble: options?.scramble ?? true,\n symmetrical: options?.symmetrical ?? false,\n source: options?.source ?? 'LEVEL',\n };\n if (options?.levelUuid !== undefined) {\n (action as { levelUuid?: string }).levelUuid = options.levelUuid;\n }\n if (options?.boardUuid !== undefined) {\n (action as { boardUuid?: string }).boardUuid = options.boardUuid;\n }\n dispatch(action);\n },\n []\n );\n\n const selectCell = useCallback((index: number) => {\n dispatch({ type: 'SELECT_CELL', index });\n }, []);\n\n const selectCellAt = useCallback((row: number, column: number) => {\n dispatch({ type: 'SELECT_CELL', index: row * 9 + column });\n }, []);\n\n const deselectCell = useCallback(() => {\n dispatch({ type: 'DESELECT_CELL' });\n }, []);\n\n const input = useCallback((value: number) => {\n dispatch({ type: 'INPUT', value });\n }, []);\n\n const erase = useCallback(() => {\n dispatch({ type: 'ERASE' });\n }, []);\n\n const togglePencilMode = useCallback(() => {\n dispatch({ type: 'TOGGLE_PENCIL_MODE' });\n }, []);\n\n const setPencilMode = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_PENCIL_MODE', enabled });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: 'UNDO' });\n }, []);\n\n const autoPencilmarks = useCallback(() => {\n dispatch({ type: 'AUTO_PENCILMARKS' });\n }, []);\n\n const updateSettings = useCallback((settings: Partial<SudokuAppSettings>) => {\n dispatch({ type: 'UPDATE_APP_SETTINGS', settings });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' });\n }, []);\n\n const applyHintData = useCallback(\n (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => {\n dispatch({\n type: 'APPLY_HINT_DATA',\n userInput,\n pencilmarks,\n autoPencilmarks,\n });\n },\n []\n );\n\n // Utility functions\n const getBoardString = useCallback(() => {\n if (!board) return '';\n return cellsToStateString(board.cells);\n }, [board]);\n\n const getOriginalPuzzle = useCallback(() => {\n return state.originalPuzzle;\n }, [state.originalPuzzle]);\n\n const getScrambledPuzzle = useCallback(() => {\n if (!board) return '';\n return cellsToPuzzleString(board.cells);\n }, [board]);\n\n const getInputString = useCallback(() => {\n if (!board) return '';\n return cellsToInputString(board.cells);\n }, [board]);\n\n const getPencilmarksString = useCallback(() => {\n if (!board) return '';\n return cellsToPencilmarksString(board.cells);\n }, [board]);\n\n return {\n // State\n play: state.play,\n board,\n selectedCell,\n selectedIndex,\n isPencilMode,\n isCompleted,\n canUndo,\n appSettings: state.appSettings,\n digitMapping: state.digitMapping,\n reverseDigitMapping: state.reverseDigitMapping,\n\n // Computed\n errorCells,\n errorCount,\n progress,\n sameValueCells,\n relatedCells,\n\n // Actions\n loadBoard,\n selectCell,\n selectCellAt,\n deselectCell,\n input,\n erase,\n togglePencilMode,\n setPencilMode,\n undo,\n autoPencilmarks,\n updateSettings,\n reset,\n applyHintData,\n\n // Utilities\n getBoardString,\n getOriginalPuzzle,\n getScrambledPuzzle,\n getInputString,\n getPencilmarksString,\n };\n}\n"]}
1
+ {"version":3,"file":"useSudoku.js","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,oBAAoB,EACpB,qBAAqB,EAErB,KAAK,GAKN,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,SAAS,GAEV,MAAM,0BAA0B,CAAC;AA6DlC,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,SAAS,kBAAkB,CACzB,WAAwC;IAExC,OAAO;QACL,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,EAAE;QAClB,gBAAgB,EAAE,EAAE;QACpB,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,EAAE,GAAG,oBAAoB,EAAE,GAAG,WAAW,EAAE;QACxD,YAAY,EAAE,IAAI,GAAG,EAAE;QACvB,mBAAmB,EAAE,IAAI,GAAG,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,aAAa,CAAC,KAAkB,EAAE,MAAoB;IAC7D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,SAAS,EACT,SAAS,GACV,GAAG,MAAM,CAAC;YAEX,uCAAuC;YACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAElD,gCAAgC;YAChC,MAAM,SAAS,GAAsB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YACzE,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAEpE,0FAA0F;YAC1F,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACnD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;gBACtE,8CAA8C;gBAC9C,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,uBAAuB;YACvB,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,SAAS,EAAE,UAAU;gBACrB,QAAQ,EAAE,KAAK;gBACf,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,4BAA4B;YAC5B,MAAM,IAAI,GAAe;gBACvB,KAAK;gBACL,QAAQ,EAAE,EAAE,GAAG,qBAAqB,EAAE;gBACtC,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,OAAO;gBACL,GAAG,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC;gBACxC,IAAI;gBACJ,cAAc,EAAE,MAAM;gBACtB,gBAAgB,EAAE,QAAQ;gBAC1B,MAAM;gBACN,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;gBACvD,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC,CAAC,8BAA8B;YAE5E,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,aAAa,EACX,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;iBAClE;aACF,CAAC;QACJ,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,aAAa,EAAE,IAAI;iBACpB;aACF,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YACtD,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,kCAAkC;YAClC,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YAEzB,6BAA6B;YAC7B,2DAA2D;YAC3D,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO,KAAK,CAAC,CAAC,uCAAuC;gBAEzE,6CAA6C;gBAC7C,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;gBAClD,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC;oBACvD,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;oBAC7C,CAAC,CAAC,CAAC,GAAG,kBAAkB,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzD,MAAM,OAAO,GAAe;oBAC1B,GAAG,IAAI;oBACP,KAAK,EAAE,IAAI,EAAE,uCAAuC;oBACpD,WAAW,EAAE,cAAc;iBAC5B,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;gBAEF,MAAM,OAAO,GAAe;oBAC1B,GAAG,KAAK,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC,CAAC;gBAEF,OAAO;oBACL,GAAG,KAAK;oBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;oBACvC,IAAI,EAAE,OAAO;iBACd,CAAC;YACJ,CAAC;YAED,oBAAoB;YACpB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YAErC,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI;oBAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB;gBAElD,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC;oBACxB,2BAA2B;oBAC3B,8EAA8E;oBAC9E,MAAM,QAAQ,GAAe;wBAC3B,GAAG,CAAC;wBACJ,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;qBACnD,CAAC;oBAEF,mBAAmB;oBACnB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;wBACzC,SAAS,GAAG,KAAK,CAAC;oBACpB,CAAC;oBACD,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAED,uCAAuC;gBACvC,2EAA2E;gBAC3E,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACzB,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBAE7B,IAAI,OAAO,KAAK,GAAG,IAAI,UAAU,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;wBACpE,MAAM,QAAQ,GAAe;4BAC3B,GAAG,CAAC;4BACJ,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI;yBAC7D,CAAC;wBACF,mBAAmB;wBACnB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,QAAQ,EAAE,CAAC;4BACzC,SAAS,GAAG,KAAK,CAAC;wBACpB,CAAC;wBACD,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAED,wCAAwC;gBACxC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAC3B,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;gBACD,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,KAAK,EAAE,QAAQ;oBACf,SAAS;iBACV;gBACD,aAAa,EAAE,IAAI,EAAE,uBAAuB;aAC7C,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,QAAQ,EAAE;wBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;wBACtB,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa;qBAClD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI,EAAE;oBACJ,GAAG,KAAK,CAAC,IAAI;oBACb,QAAQ,EAAE;wBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;wBACtB,aAAa,EAAE,MAAM,CAAC,OAAO;qBAC9B;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAE7C,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY;gBAAE,OAAO,KAAK,CAAC;YAEhC,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,YAAY;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YACtD,IAAI,aAAa,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE/C,oCAAoC;YACpC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAErE,MAAM,OAAO,GAAe;oBAC1B,GAAG,IAAI;oBACP,WAAW,EAAE,EAAE;iBAChB,CAAC;gBAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;gBAEF,MAAM,OAAO,GAAe;oBAC1B,GAAG,KAAK,CAAC,IAAI;oBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACrC,CAAC;gBAEF,OAAO;oBACL,GAAG,KAAK;oBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;oBACvC,IAAI,EAAE,OAAO;iBACd,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAEtC,MAAM,OAAO,GAAe;gBAC1B,GAAG,IAAI;gBACP,KAAK,EAAE,IAAI;aACZ,CAAC;YAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClC,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;aACrC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,wCAAwC;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAElC,uDAAuD;YACvD,qEAAqE;YACrE,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC1D,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC1D,MAAM,eAAe,GAA6B,IAAI,GAAG,EAAE,CAAC;YAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,wCAAwC;YACxC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;gBACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC/C,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;oBAClD,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;gBACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,wDAAwD;oBACxD,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACxC,CAAC;gBAED,8CAA8C;gBAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBACjE,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBACpE,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBAEvE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;qBAChC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzB,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACpC,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;aAC5D,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,OAAO;gBACL,GAAG,KAAK;gBACR,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9B,2EAA2E;YAC3E,MAAM,KAAK,GAAG,iBAAiB,CAC7B,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,gBAAgB,CACvB,CAAC;YACF,MAAM,SAAS,GAAsB,YAAY,CAAC,CAAC,6BAA6B;YAEhF,+BAA+B;YAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAChC,2DAA2D;gBAC3D,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9D,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;YAClC,CAAC;YAED,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,KAAK;gBACf,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,MAAM,IAAI,GAAe;gBACvB,KAAK;gBACL,QAAQ,EAAE,EAAE,GAAG,qBAAqB,EAAE;gBACtC,aAAa,EAAE,IAAI;aACpB,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,IAAI;gBACJ,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,oFAAoF;YACpF,IAAI,CAAC,KAAK,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YAE7B,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;YAE3D,yDAAyD;YACzD,uEAAuE;YACvE,MAAM,gBAAgB,GAAwB,WAAW;gBACvD,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBACjC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE;wBAAE,OAAO,IAAI,CAAC;oBACxC,OAAO,KAAK;yBACT,KAAK,CAAC,EAAE,CAAC;yBACT,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;yBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC;gBACJ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzB,gDAAgD;YAChD,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC/C,2DAA2D;gBAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,UAAU,GACd,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAExE,gCAAgC;gBAChC,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAEhD,4FAA4F;gBAC5F,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACxD,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;gBAED,6CAA6C;gBAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBACxB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,wFAAwF;gBACxF,OAAO;oBACL,GAAG,IAAI;oBACP,KAAK,EAAE,UAAU;oBACjB,WAAW,EACT,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;wBAC3C,CAAC,CAAC,eAAe;wBACjB,CAAC,CAAC,IAAI;iBACX,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAgB;gBAC5B,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,UAAU;aACtB,CAAC;YAEF,MAAM,OAAO,GAAe;gBAC1B,GAAG,KAAK,CAAC,IAAI;gBACb,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE;oBACR,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ;oBACtB,eAAe;iBAChB;aACF,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;gBACvC,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAqGD,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,SAAS,CAAC,UAA4B,EAAE;IACtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAClC,aAAa,EACb,OAAO,CAAC,WAAW,EACnB,kBAAkB,CACnB,CAAC;IAEF,kBAAkB;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;IACxC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,IAAI,IAAI,CAAC;IACxD,MAAM,YAAY,GAChB,aAAa,KAAK,IAAI,IAAI,KAAK;QAC7B,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC;IACjE,MAAM,WAAW,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;IAErC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC;QACrB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;QACpE,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAC1C,CAAC,MAAM,CAAC;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,IAAI,CAAC,KAAK,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC;QACvD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;YACtC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,KAAK,IAAI,aAAa,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjC,IAAI,CAAC,KAAK,aAAa;gBAAE,OAAO,KAAK,CAAC;YACtC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3B,UAAU;IACV,MAAM,SAAS,GAAG,WAAW,CAC3B,CACE,MAAc,EACd,QAAgB,EAChB,OAMC,EACD,EAAE;QACF,MAAM,MAAM,GAAiB;YAC3B,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,QAAQ;YACR,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK;YAC1C,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,OAAO;SACnC,CAAC;QACF,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAiC,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,MAAiC,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnE,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC/C,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,MAAc,EAAE,EAAE;QAC/D,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC1C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,OAAgB,EAAE,EAAE;QACrD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAAoC,EAAE,EAAE;QAC1E,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAC/B,CACE,SAAiB,EACjB,WAA0B,EAC1B,eAAwB,EACxB,EAAE;QACF,QAAQ,CAAC;YACP,IAAI,EAAE,iBAAiB;YACvB,SAAS;YACT,WAAW;YACX,eAAe;SAChB,CAAC,CAAC;IACL,CAAC,EACD,EAAE,CACH,CAAC;IAEF,oBAAoB;IACpB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,OAAO,KAAK,CAAC,cAAc,CAAC;IAC9B,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAE3B,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO;QACL,QAAQ;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK;QACL,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,WAAW;QACX,OAAO;QACP,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAE9C,WAAW;QACX,UAAU;QACV,UAAU;QACV,QAAQ;QACR,cAAc;QACd,YAAY;QAEZ,UAAU;QACV,SAAS;QACT,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,KAAK;QACL,gBAAgB;QAChB,aAAa;QACb,IAAI;QACJ,eAAe;QACf,cAAc;QACd,KAAK;QACL,aAAa;QAEb,YAAY;QACZ,cAAc;QACd,iBAAiB;QACjB,kBAAkB;QAClB,cAAc;QACd,oBAAoB;KACrB,CAAC;AACJ,CAAC","sourcesContent":["/**\n * useSudoku hook - Main game state management\n *\n * Ported from renderable/sudokuschool/interactors/sudoku/SudokuInteractor.kt\n *\n * Handles:\n * - Board initialization with scrambling\n * - Cell selection\n * - Value input (normal and pencil modes)\n * - Error detection\n * - Game completion detection\n * - Undo functionality\n * - Auto pencilmarks generation\n */\n\nimport { useCallback, useMemo, useReducer } from 'react';\nimport {\n blockOf,\n cellHasError,\n columnOf,\n DEFAULT_APP_SETTINGS,\n DEFAULT_PLAY_SETTINGS,\n PlayingSource,\n rowOf,\n SudokuAppSettings,\n SudokuBoard,\n SudokuCell,\n SudokuPlay,\n} from '../types/sudoku';\nimport {\n cellsToInputString,\n cellsToPencilmarksString,\n cellsToPuzzleString,\n cellsToStateString,\n NonScrambler,\n parsePuzzleString,\n scrambleBoard,\n Scrambler,\n ScramblerProtocol,\n} from '../utils/sudokuScrambler';\n\n// =============================================================================\n// State Types\n// =============================================================================\n\ninterface SudokuState {\n /** Current play state */\n play: SudokuPlay | null;\n /** Original puzzle string (before scrambling) */\n originalPuzzle: string;\n /** Original solution string (before scrambling) */\n originalSolution: string;\n /** Puzzle source */\n source: PlayingSource;\n /** Level UUID if from a level */\n levelUuid: string | null;\n /** Board UUID if applicable */\n boardUuid: string | null;\n /** Undo history stack */\n history: SudokuPlay[];\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping from original (1-9) to scrambled (1-9) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n}\n\n// =============================================================================\n// Actions\n// =============================================================================\n\ntype SudokuAction =\n | {\n type: 'LOAD_BOARD';\n puzzle: string;\n solution: string;\n scramble: boolean;\n symmetrical: boolean;\n source: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n | { type: 'SELECT_CELL'; index: number }\n | { type: 'DESELECT_CELL' }\n | { type: 'INPUT'; value: number | null }\n | { type: 'TOGGLE_PENCIL_MODE' }\n | { type: 'SET_PENCIL_MODE'; enabled: boolean }\n | { type: 'UNDO' }\n | { type: 'ERASE' }\n | { type: 'AUTO_PENCILMARKS' }\n | { type: 'UPDATE_APP_SETTINGS'; settings: Partial<SudokuAppSettings> }\n | { type: 'RESET' }\n | {\n type: 'APPLY_HINT_DATA';\n userInput: string;\n pencilmarks: string | null;\n autoPencilmarks: boolean;\n };\n\n// =============================================================================\n// Initial State\n// =============================================================================\n\nfunction createInitialState(\n appSettings?: Partial<SudokuAppSettings>\n): SudokuState {\n return {\n play: null,\n originalPuzzle: '',\n originalSolution: '',\n source: 'LEVEL',\n levelUuid: null,\n boardUuid: null,\n history: [],\n appSettings: { ...DEFAULT_APP_SETTINGS, ...appSettings },\n digitMapping: new Map(),\n reverseDigitMapping: new Map(),\n };\n}\n\n// =============================================================================\n// Reducer\n// =============================================================================\n\nfunction sudokuReducer(state: SudokuState, action: SudokuAction): SudokuState {\n switch (action.type) {\n case 'LOAD_BOARD': {\n const {\n puzzle,\n solution,\n scramble,\n symmetrical,\n source,\n levelUuid,\n boardUuid,\n } = action;\n\n // Parse puzzle and solution into cells\n const cells = parsePuzzleString(puzzle, solution);\n\n // Apply scrambling if requested\n const scrambler: ScramblerProtocol = scramble ? Scrambler : NonScrambler;\n const scrambleResult = scrambleBoard(scrambler, cells, symmetrical);\n\n // Check if puzzle is already complete (all cells are clues, or all inputs match solution)\n const isComplete = scrambleResult.cells.every(cell => {\n if (cell.given !== null) return true; // Clue cells are always correct\n // Non-clue cells need input to match solution\n return cell.input !== null && cell.input === cell.solution;\n });\n\n // Create initial board\n const board: SudokuBoard = {\n cells: scrambleResult.cells,\n completed: isComplete,\n entering: false,\n enteringError: null,\n };\n\n // Create initial play state\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...createInitialState(state.appSettings),\n play,\n originalPuzzle: puzzle,\n originalSolution: solution,\n source,\n levelUuid: levelUuid ?? null,\n boardUuid: boardUuid ?? null,\n digitMapping: scrambleResult.digitMapping,\n reverseDigitMapping: scrambleResult.reverseDigitMapping,\n appSettings: state.appSettings,\n };\n }\n\n case 'SELECT_CELL': {\n if (!state.play) return state;\n if (state.play.board.completed) return state; // Can't select when completed\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex:\n state.play.selectedIndex === action.index ? null : action.index,\n },\n };\n }\n\n case 'DESELECT_CELL': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex: null,\n },\n };\n }\n\n case 'INPUT': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell) return state;\n\n // Can't modify given (clue) cells\n if (cell.given !== null) return state;\n\n const { value } = action;\n\n // Handle pencil marking mode\n // Matches Kotlin: if (cell.given == null && value != null)\n if (settings.pencilmarking) {\n if (value === null) return state; // Can't erase in pencil mode with null\n\n // Toggle pencilmark - matches Kotlin exactly\n const currentPencilmarks = cell.pencilmarks ?? [];\n const newPencilmarks = currentPencilmarks.includes(value)\n ? currentPencilmarks.filter(p => p !== value)\n : [...currentPencilmarks, value].sort((a, b) => a - b);\n\n const newCell: SudokuCell = {\n ...cell,\n input: null, // Clear input when setting pencilmarks\n pencilmarks: newPencilmarks,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // Normal input mode\n const row = rowOf(selectedIndex);\n const column = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n\n let completed = true;\n const newCells = board.cells.map((c, i) => {\n if (c.given !== null) return c; // Skip clue cells\n\n if (i === selectedIndex) {\n // Update the selected cell\n // Matches Kotlin: pencilmarks = if (value != null) null else cell.pencilmarks\n const modified: SudokuCell = {\n ...c,\n input: value,\n pencilmarks: value !== null ? null : c.pencilmarks,\n };\n\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n\n // Remove pencilmark from related cells\n // Matches Kotlin: cell.pencilmarks?.filter { it != value }?.toTypedArray()\n if (value !== null) {\n const cellRow = rowOf(i);\n const cellColumn = columnOf(i);\n const cellBlock = blockOf(i);\n\n if (cellRow === row || cellColumn === column || cellBlock === block) {\n const modified: SudokuCell = {\n ...c,\n pencilmarks: c.pencilmarks?.filter(p => p !== value) ?? null,\n };\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n }\n\n // Check completion for unmodified cells\n if (c.input !== c.solution) {\n completed = false;\n }\n return c;\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: {\n ...board,\n cells: newCells,\n completed,\n },\n selectedIndex: null, // Deselect after input\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'TOGGLE_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: !state.play.settings.pencilmarking,\n },\n },\n };\n }\n\n case 'SET_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: action.enabled,\n },\n },\n };\n }\n\n case 'UNDO': {\n if (state.history.length === 0) return state;\n\n const newHistory = [...state.history];\n const previousPlay = newHistory.pop();\n if (!previousPlay) return state;\n\n return {\n ...state,\n history: newHistory,\n play: previousPlay,\n };\n }\n\n case 'ERASE': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell || cell.given !== null) return state;\n\n // In pencil mode, clear pencilmarks\n if (settings.pencilmarking) {\n if (!cell.pencilmarks || cell.pencilmarks.length === 0) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n pencilmarks: [],\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // In normal mode, clear input\n if (cell.input === null) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n input: null,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'AUTO_PENCILMARKS': {\n // Matches Kotlin: fun autoPencilmarks()\n if (!state.play) return state;\n const { board } = state.play;\n if (board.completed) return state;\n\n // Calculate potentials for each row, column, and block\n // Matches Kotlin: Array(9) { CellPotentials((1..9).toMutableSet()) }\n const rowPotentials: Map<number, Set<number>> = new Map();\n const colPotentials: Map<number, Set<number>> = new Map();\n const blockPotentials: Map<number, Set<number>> = new Map();\n for (let i = 0; i < 9; i++) {\n rowPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n colPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n blockPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n }\n\n // Remove values that are already placed\n board.cells.forEach((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n rowPotentials.get(rowOf(index))?.delete(value);\n colPotentials.get(columnOf(index))?.delete(value);\n blockPotentials.get(blockOf(index))?.delete(value);\n }\n });\n\n // Calculate pencilmarks for each empty cell\n const newCells = board.cells.map((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n // Cell has a value - matches Kotlin: pencilmarks = null\n return { ...cell, pencilmarks: null };\n }\n\n // Intersect row, column, and block potentials\n const row = rowPotentials.get(rowOf(index)) ?? new Set<number>();\n const col = colPotentials.get(columnOf(index)) ?? new Set<number>();\n const block = blockPotentials.get(blockOf(index)) ?? new Set<number>();\n\n const pencilmarks = Array.from(row)\n .filter(v => col.has(v) && block.has(v))\n .sort((a, b) => a - b);\n\n return { ...cell, pencilmarks };\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n settings: { ...state.play.settings, autoPencilmarks: true },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'UPDATE_APP_SETTINGS': {\n return {\n ...state,\n appSettings: { ...state.appSettings, ...action.settings },\n };\n }\n\n case 'RESET': {\n if (!state.play) return state;\n\n // Reset to initial board state (keep original puzzle but clear all inputs)\n const cells = parsePuzzleString(\n state.originalPuzzle,\n state.originalSolution\n );\n const scrambler: ScramblerProtocol = NonScrambler; // Don't re-scramble on reset\n\n // Re-apply the same scrambling\n let newCells = cells;\n if (state.digitMapping.size > 0) {\n // Use the stored digit mapping to recreate scrambled cells\n const scrambleResult = scrambleBoard(scrambler, cells, false);\n newCells = scrambleResult.cells;\n }\n\n const board: SudokuBoard = {\n cells: newCells,\n completed: false,\n entering: false,\n enteringError: null,\n };\n\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...state,\n play,\n history: [],\n };\n }\n\n case 'APPLY_HINT_DATA': {\n // Matches Kotlin HintInteractor.apply() - applies board data from hint API response\n if (!state.play) return state;\n const { board } = state.play;\n\n const { userInput, pencilmarks, autoPencilmarks } = action;\n\n // Parse pencilmarks string (comma-separated, 81 entries)\n // Each entry is a string of digits (e.g., \"123\" for pencilmarks 1,2,3)\n const pencilmarksArray: (number[] | null)[] = pencilmarks\n ? pencilmarks.split(',').map(entry => {\n if (!entry || entry === '') return null;\n return entry\n .split('')\n .map(d => parseInt(d, 10))\n .filter(n => !isNaN(n) && n > 0);\n })\n : Array(81).fill(null);\n\n // Apply user input and pencilmarks to each cell\n let isComplete = true;\n const newCells = board.cells.map((cell, index) => {\n // Get input value from userInput string (0 means no input)\n const inputChar = userInput.charAt(index);\n const inputValue =\n inputChar >= '1' && inputChar <= '9' ? parseInt(inputChar, 10) : null;\n\n // Get pencilmarks for this cell\n const cellPencilmarks = pencilmarksArray[index];\n\n // Check completion - matches Kotlin: if (cell.given == null && cell.solution != cell.input)\n if (cell.given === null && inputValue !== cell.solution) {\n isComplete = false;\n }\n\n // If cell has a given value, don't modify it\n if (cell.given !== null) {\n return cell;\n }\n\n // Apply input and pencilmarks - matches Kotlin: input = if (input != 0) input else null\n return {\n ...cell,\n input: inputValue,\n pencilmarks:\n cellPencilmarks && cellPencilmarks.length > 0\n ? cellPencilmarks\n : null,\n };\n });\n\n const newBoard: SudokuBoard = {\n ...board,\n cells: newCells,\n completed: isComplete,\n };\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: newBoard,\n settings: {\n ...state.play.settings,\n autoPencilmarks,\n },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Hook Options and Result Types\n// =============================================================================\n\nexport interface UseSudokuOptions {\n /** Initial app settings */\n appSettings?: Partial<SudokuAppSettings>;\n}\n\nexport interface UseSudokuResult {\n // State\n /** Current play state (null if no board loaded) */\n play: SudokuPlay | null;\n /** Current board (shortcut to play.board) */\n board: SudokuBoard | null;\n /** Currently selected cell */\n selectedCell: SudokuCell | null;\n /** Selected cell index */\n selectedIndex: number | null;\n /** Whether pencil mode is active */\n isPencilMode: boolean;\n /** Whether game is completed */\n isCompleted: boolean;\n /** Whether undo is available */\n canUndo: boolean;\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping (original -> scrambled) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n\n // Computed values\n /** Cells with errors (when showErrors is enabled) */\n errorCells: SudokuCell[];\n /** Count of errors */\n errorCount: number;\n /** Progress percentage (0-100) */\n progress: number;\n /** Cells with the same value as selected cell */\n sameValueCells: SudokuCell[];\n /** Related cells (same row, column, block) */\n relatedCells: SudokuCell[];\n\n // Actions\n /** Load a new board */\n loadBoard: (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => void;\n /** Select a cell by index */\n selectCell: (index: number) => void;\n /** Select a cell by row and column */\n selectCellAt: (row: number, column: number) => void;\n /** Deselect the current cell */\n deselectCell: () => void;\n /** Input a value (1-9) into the selected cell */\n input: (value: number) => void;\n /** Erase the selected cell */\n erase: () => void;\n /** Toggle pencil mode */\n togglePencilMode: () => void;\n /** Set pencil mode */\n setPencilMode: (enabled: boolean) => void;\n /** Undo the last action */\n undo: () => void;\n /** Generate auto pencilmarks */\n autoPencilmarks: () => void;\n /** Update app settings */\n updateSettings: (settings: Partial<SudokuAppSettings>) => void;\n /** Reset the game to initial state */\n reset: () => void;\n /** Apply hint data from solver API response */\n applyHintData: (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => void;\n\n // Utility functions\n /** Get board state as string */\n getBoardString: () => string;\n /** Get original puzzle string (before scrambling) */\n getOriginalPuzzle: () => string;\n /** Get scrambled puzzle string (what the user is playing) - use this for solver API */\n getScrambledPuzzle: () => string;\n /** Get input string (user entries only) */\n getInputString: () => string;\n /** Get pencilmarks string */\n getPencilmarksString: () => string;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Main Sudoku game hook\n *\n * @example\n * ```tsx\n * const {\n * play,\n * board,\n * selectedCell,\n * isPencilMode,\n * isCompleted,\n * loadBoard,\n * selectCell,\n * input,\n * togglePencilMode,\n * undo,\n * } = useSudoku();\n *\n * // Load a puzzle\n * loadBoard(puzzleString, solutionString, { scramble: true });\n *\n * // Select a cell and enter a value\n * selectCell(0);\n * input(5);\n *\n * // Toggle pencil mode\n * togglePencilMode();\n * input(1); // Adds 1 as pencilmark\n * input(2); // Adds 2 as pencilmark\n * input(1); // Removes 1 from pencilmarks\n * ```\n */\nexport function useSudoku(options: UseSudokuOptions = {}): UseSudokuResult {\n const [state, dispatch] = useReducer(\n sudokuReducer,\n options.appSettings,\n createInitialState\n );\n\n // Computed values\n const board = state.play?.board ?? null;\n const selectedIndex = state.play?.selectedIndex ?? null;\n const selectedCell =\n selectedIndex !== null && board\n ? (board.cells[selectedIndex] ?? null)\n : null;\n const isPencilMode = state.play?.settings.pencilmarking ?? false;\n const isCompleted = board?.completed ?? false;\n const canUndo = state.history.length > 0;\n\n const errorCells = useMemo(() => {\n if (!board || !state.appSettings.showErrors) return [];\n return board.cells.filter(cellHasError);\n }, [board, state.appSettings.showErrors]);\n\n const errorCount = errorCells.length;\n\n const progress = useMemo(() => {\n if (!board) return 0;\n const totalEmpty = board.cells.filter(c => c.given === null).length;\n if (totalEmpty === 0) return 100;\n const filled = board.cells.filter(\n c => c.given === null && c.input !== null\n ).length;\n return Math.round((filled / totalEmpty) * 100);\n }, [board]);\n\n const sameValueCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const selectedCell = board.cells[selectedIndex];\n if (!selectedCell) return [];\n const value = selectedCell.given ?? selectedCell.input;\n if (value === null) return [];\n return board.cells.filter((c, i) => {\n if (i === selectedIndex) return false;\n return (c.given ?? c.input) === value;\n });\n }, [board, selectedIndex]);\n\n const relatedCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const row = rowOf(selectedIndex);\n const col = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n return board.cells.filter((_, i) => {\n if (i === selectedIndex) return false;\n return rowOf(i) === row || columnOf(i) === col || blockOf(i) === block;\n });\n }, [board, selectedIndex]);\n\n // Actions\n const loadBoard = useCallback(\n (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => {\n const action: SudokuAction = {\n type: 'LOAD_BOARD',\n puzzle,\n solution,\n scramble: options?.scramble ?? true,\n symmetrical: options?.symmetrical ?? false,\n source: options?.source ?? 'LEVEL',\n };\n if (options?.levelUuid !== undefined) {\n (action as { levelUuid?: string }).levelUuid = options.levelUuid;\n }\n if (options?.boardUuid !== undefined) {\n (action as { boardUuid?: string }).boardUuid = options.boardUuid;\n }\n dispatch(action);\n },\n []\n );\n\n const selectCell = useCallback((index: number) => {\n dispatch({ type: 'SELECT_CELL', index });\n }, []);\n\n const selectCellAt = useCallback((row: number, column: number) => {\n dispatch({ type: 'SELECT_CELL', index: row * 9 + column });\n }, []);\n\n const deselectCell = useCallback(() => {\n dispatch({ type: 'DESELECT_CELL' });\n }, []);\n\n const input = useCallback((value: number) => {\n dispatch({ type: 'INPUT', value });\n }, []);\n\n const erase = useCallback(() => {\n dispatch({ type: 'ERASE' });\n }, []);\n\n const togglePencilMode = useCallback(() => {\n dispatch({ type: 'TOGGLE_PENCIL_MODE' });\n }, []);\n\n const setPencilMode = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_PENCIL_MODE', enabled });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: 'UNDO' });\n }, []);\n\n const autoPencilmarks = useCallback(() => {\n dispatch({ type: 'AUTO_PENCILMARKS' });\n }, []);\n\n const updateSettings = useCallback((settings: Partial<SudokuAppSettings>) => {\n dispatch({ type: 'UPDATE_APP_SETTINGS', settings });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' });\n }, []);\n\n const applyHintData = useCallback(\n (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => {\n dispatch({\n type: 'APPLY_HINT_DATA',\n userInput,\n pencilmarks,\n autoPencilmarks,\n });\n },\n []\n );\n\n // Utility functions\n const getBoardString = useCallback(() => {\n if (!board) return '';\n return cellsToStateString(board.cells);\n }, [board]);\n\n const getOriginalPuzzle = useCallback(() => {\n return state.originalPuzzle;\n }, [state.originalPuzzle]);\n\n const getScrambledPuzzle = useCallback(() => {\n if (!board) return '';\n return cellsToPuzzleString(board.cells);\n }, [board]);\n\n const getInputString = useCallback(() => {\n if (!board) return '';\n return cellsToInputString(board.cells);\n }, [board]);\n\n const getPencilmarksString = useCallback(() => {\n if (!board) return '';\n return cellsToPencilmarksString(board.cells);\n }, [board]);\n\n return {\n // State\n play: state.play,\n board,\n selectedCell,\n selectedIndex,\n isPencilMode,\n isCompleted,\n canUndo,\n appSettings: state.appSettings,\n digitMapping: state.digitMapping,\n reverseDigitMapping: state.reverseDigitMapping,\n\n // Computed\n errorCells,\n errorCount,\n progress,\n sameValueCells,\n relatedCells,\n\n // Actions\n loadBoard,\n selectCell,\n selectCellAt,\n deselectCell,\n input,\n erase,\n togglePencilMode,\n setPencilMode,\n undo,\n autoPencilmarks,\n updateSettings,\n reset,\n applyHintData,\n\n // Utilities\n getBoardString,\n getOriginalPuzzle,\n getScrambledPuzzle,\n getInputString,\n getPencilmarksString,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/sudojo_lib",
3
- "version": "0.0.87",
3
+ "version": "0.0.88",
4
4
  "description": "Business logic library for Sudojo app",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",