UNPKG

goban

Version:

[![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/online-go/goban)

2 lines 372 kB
/*! For license information please see goban.min.js.LICENSE.txt */ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.goban=t():e.goban=t()}(self,(()=>(()=>{"use strict";var e={228:e=>{var t=Object.prototype.hasOwnProperty,i="~";function s(){}function o(e,t,i){this.fn=e,this.context=t,this.once=i||!1}function r(e,t,s,r,n){if("function"!=typeof s)throw new TypeError("The listener must be a function");var a=new o(s,r||e,n),l=i?i+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],a]:e._events[l].push(a):(e._events[l]=a,e._eventsCount++),e}function n(e,t){0==--e._eventsCount?e._events=new s:delete e._events[t]}function a(){this._events=new s,this._eventsCount=0}Object.create&&(s.prototype=Object.create(null),(new s).__proto__||(i=!1)),a.prototype.eventNames=function(){var e,s,o=[];if(0===this._eventsCount)return o;for(s in e=this._events)t.call(e,s)&&o.push(i?s.slice(1):s);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},a.prototype.listeners=function(e){var t=i?i+e:e,s=this._events[t];if(!s)return[];if(s.fn)return[s.fn];for(var o=0,r=s.length,n=new Array(r);o<r;o++)n[o]=s[o].fn;return n},a.prototype.listenerCount=function(e){var t=i?i+e:e,s=this._events[t];return s?s.fn?1:s.length:0},a.prototype.emit=function(e,t,s,o,r,n){var a=i?i+e:e;if(!this._events[a])return!1;var l,h,c=this._events[a],_=arguments.length;if(c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),_){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,s),!0;case 4:return c.fn.call(c.context,t,s,o),!0;case 5:return c.fn.call(c.context,t,s,o,r),!0;case 6:return c.fn.call(c.context,t,s,o,r,n),!0}for(h=1,l=new Array(_-1);h<_;h++)l[h-1]=arguments[h];c.fn.apply(c.context,l)}else{var d,u=c.length;for(h=0;h<u;h++)switch(c[h].once&&this.removeListener(e,c[h].fn,void 0,!0),_){case 1:c[h].fn.call(c[h].context);break;case 2:c[h].fn.call(c[h].context,t);break;case 3:c[h].fn.call(c[h].context,t,s);break;case 4:c[h].fn.call(c[h].context,t,s,o);break;default:if(!l)for(d=1,l=new Array(_-1);d<_;d++)l[d-1]=arguments[d];c[h].fn.apply(c[h].context,l)}}return!0},a.prototype.on=function(e,t,i){return r(this,e,t,i,!1)},a.prototype.once=function(e,t,i){return r(this,e,t,i,!0)},a.prototype.removeListener=function(e,t,s,o){var r=i?i+e:e;if(!this._events[r])return this;if(!t)return n(this,r),this;var a=this._events[r];if(a.fn)a.fn!==t||o&&!a.once||s&&a.context!==s||n(this,r);else{for(var l=0,h=[],c=a.length;l<c;l++)(a[l].fn!==t||o&&!a[l].once||s&&a[l].context!==s)&&h.push(a[l]);h.length?this._events[r]=1===h.length?h[0]:h:n(this,r)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=i?i+e:e,this._events[t]&&n(this,t)):(this._events=new s,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=i,a.EventEmitter=a,e.exports=a},7925:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GobanCanvas=void 0;const s=i(3896),o=i(5862),r=i(4527),n=i(6512),a=i(1925),l=i(8619),h=i(7460),c=i(5336),_=i(2239),d={black:{},white:{}},u="#ff69b4";class m extends _.Goban{constructor(e,t){var i;super(e,t),this.__set_board_height=-1,this.__set_board_width=-1,this.ready_to_draw=!1,this.last_move_opacity=1,this.__borders_initialized=!1,this.autoplaying_puzzle_move=!1,this.byoyomi_label="",this.last_label_position={i:NaN,j:NaN},this.metrics={width:NaN,height:NaN,mid:NaN,offset:NaN},this.drawing_enabled=!0,this.themes={board:"Plain",black:"Plain",white:"Plain","removal-graphic":"x","removal-scale":1,"stone-shadows":"default"},this.theme_black_stones=[],this.theme_black_text_color=u,this.theme_blank_text_color=u,this.theme_faded_line_color=u,this.theme_faded_star_color=u,this.theme_line_color="",this.theme_star_color="",this.theme_stone_radius=10,this.theme_white_stones=[],this.theme_white_text_color=u,this.board=(0,n.createDeviceScaledCanvas)(10,10),this.board.setAttribute("id","board-canvas"),this.board.className="StoneLayer",this.last_move_opacity=null!==(i=e.last_move_opacity)&&void 0!==i?i:1;const s=this.board.getContext("2d",{willReadFrequently:!0});if(!s)throw new Error("Failed to obtain drawing context for board");this.ctx=s,this.parent.appendChild(this.board),this.bindPointerBindings(this.board),this.move_tree_container=e.move_tree_container,this.handleShiftKey=e=>{if(!this.destroyed)try{e.shiftKey!==this.shift_key_is_down&&(this.shift_key_is_down=e.shiftKey,this.last_hover_square&&this.__drawSquare(this.last_hover_square.x,this.last_hover_square.y))}catch(e){console.error(e)}},window.addEventListener("keydown",this.handleShiftKey),window.addEventListener("keyup",this.handleShiftKey),this.setTheme(this.getSelectedThemes(),!0);let o=!0;const r=this.watchSelectedThemes((e=>{var t,i,s;this.engine&&("Custom"===e.black||"Custom"===e.white||e.board,null===(t=d.black)||void 0===t||delete t.Custom,null===(i=d.white)||void 0===i||delete i.Custom,null===(s=d.board)||void 0===s||delete s.Custom,this.setTheme(e,!!o),o=!1)}));this.on("destroy",(()=>r.remove())),this.engine=this.post_config_constructor(),this.emit("engine.updated",this.engine),this.ready_to_draw=!0,this.redraw(!0)}setLastMoveOpacity(e){this.last_move_opacity=e}enablePen(){this.attachPenCanvas()}disablePen(){this.detachPenCanvas()}destroy(){super.destroy(),this.board&&this.board.parentNode&&this.board.parentNode.removeChild(this.board),delete this.board,delete this.ctx,this.detachPenCanvas(),this.detachShadowLayer(),this.message_timeout&&(clearTimeout(this.message_timeout),delete this.message_timeout),window.removeEventListener("keydown",this.handleShiftKey),window.removeEventListener("keyup",this.handleShiftKey),this.theme_black_stones=[],this.theme_white_stones=[],delete this.theme_board,delete this.theme_black,delete this.theme_white,delete this.message_div,delete this.message_td,delete this.message_text,delete this.move_tree_container,delete this.move_tree_inner_container,delete this.move_tree_canvas,delete this.title_div}detachShadowLayer(){this.shadow_layer&&(this.shadow_layer.parentNode&&this.shadow_layer.parentNode.removeChild(this.shadow_layer),delete this.shadow_layer,delete this.shadow_ctx)}attachShadowLayer(){if(!this.shadow_layer&&this.parent){this.shadow_layer=(0,n.createDeviceScaledCanvas)(this.metrics.width,this.metrics.height),this.shadow_layer.setAttribute("id","shadow-canvas"),this.shadow_layer.className="ShadowLayer";try{this.parent.insertBefore(this.shadow_layer,this.board)}catch(e){console.warn("Error inserting shadow layer before board"),console.warn(e);try{this.parent.appendChild(this.shadow_layer)}catch(e){console.error(e)}}const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)return void console.error(new Error("Failed to obtain shadow layer drawing context"));this.shadow_ctx=e,this.bindPointerBindings(this.shadow_layer)}}detachPenCanvas(){this.pen_layer&&(this.pen_layer.parentNode&&this.pen_layer.parentNode.removeChild(this.pen_layer),delete this.pen_layer,delete this.pen_ctx)}attachPenCanvas(){if(!this.pen_layer){this.pen_layer=(0,n.createDeviceScaledCanvas)(this.metrics.width,this.metrics.height),this.pen_layer.setAttribute("id","pen-canvas"),this.pen_layer.className="PenLayer",this.parent.appendChild(this.pen_layer);const e=this.pen_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain pen drawing context");this.pen_ctx=e,this.bindPointerBindings(this.pen_layer)}}bindPointerBindings(e){if(!this.interactive)return;if("true"===e.getAttribute("data-pointers-bound"))return;e.setAttribute("data-pointers-bound","true");let t=!1,i=this.xy2ij(0,0),s=0;const o=(e,o)=>{const r=performance.now()-s;try{if(!t)return;let s=!1;if(e instanceof MouseEvent&&2===e.button&&(s=!0,e.preventDefault()),t=!1,this.scoring_mode){const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);return void(i.i>=0&&i.i<this.width&&i.j>=0&&i.j<this.height&&(this.score_estimator&&this.score_estimator.handleClick(i.i,i.j,e.ctrlKey||e.metaKey||e.altKey||e.shiftKey,r),this.emit("update")))}if(e.ctrlKey||e.metaKey||e.altKey){try{const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);c.callbacks.addCoordinatesToChatInput&&c.callbacks.addCoordinatesToChatInput(this.engine.prettyCoordinates(i.i,i.j))}catch(e){console.error(e)}return}if("analyze"===this.mode&&"draw"===this.analyze_tool);else if("analyze"===this.mode&&"score"===this.analyze_tool);else if("analyze"===this.mode&&"removal"===this.analyze_tool)this.onAnalysisToggleStoneRemoval(e);else{const t=(0,n.getRelativeEventPosition)(e),a=this.xy2ij(t.x,t.y);if(o){if(i.i!==a.i||i.j!==a.j)return void this.onMouseOut(e)}else i=a;this.onTap(e,o,s,r),this.onMouseOut(e)}}catch(e){console.error(e)}},r=e=>{s=performance.now();try{if(t=!0,"analyze"===this.mode&&"draw"===this.analyze_tool)this.onPenStart(e);else if("analyze"===this.mode&&"label"===this.analyze_tool){if(e.shiftKey&&"letters"===this.analyze_subtool){const e=prompt((0,a._)("Enter the label you want to add to the board"),"");if(e)return this.label_character=e.substring(0,3),void(t=!1)}this.onLabelingStart(e)}else"analyze"===this.mode&&"score"===this.analyze_tool?this.onAnalysisScoringStart(e):"analyze"===this.mode&&this.analyze_tool}catch(e){console.error(e)}},l=e=>{try{if("analyze"===this.mode&&"draw"===this.analyze_tool){if(!t)return;this.onPenMove(e)}else t&&"analyze"===this.mode&&"label"===this.analyze_tool?this.onLabelingMove(e):t&&"analyze"===this.mode&&"score"===this.analyze_tool?this.onAnalysisScoringMove(e):t&&"analyze"===this.mode&&"removal"===this.analyze_tool||this.onMouseMove(e)}catch(e){console.error(e)}},h=e=>{try{t=!1,this.onMouseOut(e)}catch(e){console.error(e)}};let _=0;e.addEventListener("click",(e=>(_||(t=!0,o(e,!1)),e.preventDefault(),!1))),e.addEventListener("dblclick",(e=>(_||(t=!0,o(e,!0)),e.preventDefault(),!1))),e.addEventListener("mousedown",(e=>(_||r(e),e.preventDefault(),!1))),e.addEventListener("mousemove",(e=>(_||l(e),e.preventDefault(),!1))),e.addEventListener("mouseout",(e=>(_?e.preventDefault():h(e),!1))),e.addEventListener("contextmenu",(e=>(_?e.preventDefault():o(e,!1),!1))),e.addEventListener("focus",(e=>(e.preventDefault(),!1)));let d=0,u=0,m=0,g=0;const p=i=>{try{_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),(0,n.getRelativeEventPosition)(i),i.target===e?(d=i.touches[0].clientX,u=i.touches[0].clientY,m=i.touches[0].clientX,g=i.touches[0].clientY,r(i)):t&&h(i)}catch(e){console.error(e)}},v=i=>{try{const s=document.activeElement;i.target===e&&s&&s instanceof HTMLElement&&"input"===s.tagName.toLowerCase()&&s.blur(),_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),i.target===e?Math.sqrt((m-d)*(m-d)+(g-u)*(g-u))>10?h(i):o(i,!1):t&&h(i)}catch(e){console.error(e)}},f=i=>{try{if(_&&clearTimeout(_),_=setTimeout((()=>{_=0}),5e3),(0,n.getRelativeEventPosition)(i),i.target===e){if(d=i.touches[0].clientX,u=i.touches[0].clientY,"analyze"===this.mode&&"draw"===this.analyze_tool)return l(i),i.preventDefault(),!1}else t&&h(i)}catch(e){console.error(e)}};document.addEventListener("touchstart",p),document.addEventListener("touchend",v),document.addEventListener("touchmove",f);const b=()=>{document.removeEventListener("touchstart",p),document.removeEventListener("touchend",v),document.removeEventListener("touchmove",f),this.off("destroy",b)};this.on("destroy",b)}clearAnalysisDrawing(){this.pen_marks=[],this.pen_ctx&&this.pen_ctx.clearRect(0,0,this.metrics.width,this.metrics.height)}xy2pen(e,t){const i=this.draw_left_labels?0:1,s=this.draw_top_labels?0:1;return[Math.round(64*(e/this.square_size+i)),Math.round(64*(t/this.square_size+s))]}pen2xy(e,t){const i=this.draw_left_labels?0:1,s=this.draw_top_labels?0:1;return[(e/64-i)*this.square_size,(t/64-s)*this.square_size]}setPenStyle(e){if(!this.pen_ctx)throw new Error("setPenStyle called with null pen_ctx");this.pen_ctx.strokeStyle=e,this.pen_ctx.lineWidth=Math.max(1,Math.round(.1*this.square_size)),this.pen_ctx.lineCap="round"}onPenStart(e){this.attachPenCanvas();const t=(0,n.getRelativeEventPosition)(e);this.last_pen_position=this.xy2pen(t.x,t.y),this.current_pen_mark={color:this.analyze_subtool,points:this.xy2pen(t.x,t.y)},this.pen_marks.push(this.current_pen_mark),this.setPenStyle(this.analyze_subtool),this.syncReviewMove({pen:this.analyze_subtool,pp:this.xy2pen(t.x,t.y)})}onPenMove(e){if(!this.pen_ctx)throw new Error("onPenMove called with null pen_ctx");if(!this.last_pen_position||!this.current_pen_mark)throw new Error("onPenMove called with invalid last pen position or current pen mark");const t=(0,n.getRelativeEventPosition)(e),i=this.last_pen_position,s=this.pen2xy(i[0],i[1]),o=this.xy2pen(t.x,t.y),r=this.pen2xy(o[0],o[1]),a=o[0]-i[0],l=o[1]-i[1];a*a+l*l<64||(this.last_pen_position=o,this.current_pen_mark.points.push(a),this.current_pen_mark.points.push(l),this.pen_ctx.beginPath(),this.pen_ctx.moveTo(s[0],s[1]),this.pen_ctx.lineTo(r[0],r[1]),this.pen_ctx.stroke(),this.syncReviewMove({pp:[a,l]}))}drawPenMarks(e){if((!this.review_id||this.done_loading_review)&&e.length){if(this.attachPenCanvas(),!this.pen_ctx)throw new Error("onPenMove called with null pen_ctx");this.clearAnalysisDrawing(),this.pen_marks=e;for(let t=0;t<e.length;++t){const i=e[t];this.setPenStyle(i.color);let s=i.points[0],o=i.points[1];this.pen_ctx.beginPath();const r=this.pen2xy(s,o);this.pen_ctx.moveTo(r[0],r[1]);for(let e=2;e<i.points.length;e+=2){s+=i.points[e],o+=i.points[e+1];const t=this.pen2xy(s,o);this.pen_ctx.lineTo(t[0],t[1])}this.pen_ctx.stroke()}}}tapAt(e,t,i){this.tapAtImpl(e,t,i,!1,!1,0)}onTap(e,t,i,s){if(i&&"play"===this.mode)return;const o=(0,n.getRelativeEventPosition)(e),r=o.x,a=o.y,l=this.xy2ij(r,a),h=l.i,c=l.j;this.tapAtImpl(h,c,t,i,e.shiftKey,s)}tapAtImpl(e,t,i,s,o,r){if(!this.stone_placement_enabled||!this.player_id&&this.engine.players.black.id&&"analyze"!==this.mode&&"puzzle"!==this.mode)return;if(e<0||t<0||e>=this.engine.width||t>=this.engine.height)return;if(this.double_click_submit||(i=!1),"analyze"===this.mode&&o&&("stone"!==this.analyze_tool||"black"!==this.analyze_subtool&&"white"!==this.analyze_subtool)&&"label"!==this.analyze_tool){const i=this.engine.getMoveByLocation(e,t,!0);return void(i&&(this.engine.jumpTo(i),this.emit("update")))}if("analyze"===this.mode&&"label"===this.analyze_tool)return;this.submit_move=void 0;const n=Date.now();let l=0;const c=[],_=()=>{const s=Date.now();if(!(this.one_click_submit||this.double_click_submit&&i)){const e=s-n;if(e<=50)return void console.info("Submit button pressed only ",e,"ms after stone was placed, presuming bad click")}this.sendMove({game_id:this.game_id,move:(0,h.encodeMove)(e,t)})?(this.playMovementSound(),this.setTitle((0,a._)("Submitting...")),l&&this.debouncedEmitCapturedStones(c),this.disableStonePlacement(),delete this.move_selected):console.log("Move not sent, not playing movement sound")};try{let n=!1;if("stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move){const{removed:i,group:s}=this.engine.toggleSingleGroupRemoval(e,t,o||r>500);s.length&&this.socket.send("game/removed_stones/set",{game_id:this.game_id,removed:i,stones:(0,h.encodeMoves)(s)})}else if("puzzle"===this.mode){let o="place",r=0;if(this.getPuzzlePlacementSetting){const e=this.getPuzzlePlacementSetting();o=e.mode,"setup"===e.mode&&(r=e.color,(this.shift_key_is_down||s)&&(r=1===r?2:1))}if("place"===o&&(i||(this.engine.place(e,t,!0,!1,!0,!1,!1),this.emit("puzzle-place",{x:e,y:t,width:this.engine.width,height:this.engine.height,color:this.engine.colorToMove()}))),"play"===o&&!i&&!this.autoplaying_puzzle_move){let i=0;if("fixed"!==this.engine.puzzle_player_move_mode||this.engine.cur_move.lookupMove(e,t,this.engine.player,!1)){const s=(e,t)=>{if(++i,l=this.engine.place(e,t,!0,!1,!0,!1,!1,c),this.emit("puzzle-place",{x:e,y:t,width:this.engine.width,height:this.engine.height,color:this.engine.colorToMove()}),this.engine.cur_move.wrong_answer&&this.emit("puzzle-wrong-answer"),this.engine.cur_move.correct_answer&&this.emit("puzzle-correct-answer"),0===this.engine.cur_move.branches.length){const e=this.engine.cur_move.findStrongIsobranches();if(e.length>0){const t=(0,h.getRandomInt)(0,e.length),i=e[t];console.info("Following isomorphism ("+(t+1)+" of "+e.length+")"),this.engine.jumpTo(i),this.emit("update")}}if(this.engine.cur_move.branches.length){const e=this.engine.cur_move.branches[(0,h.getRandomInt)(0,this.engine.cur_move.branches.length)];1===i&&(2===e.player&&"black"===this.engine.config.initial_player||1===e.player&&"white"===this.engine.config.initial_player)&&"manual"!==this.engine.puzzle_opponent_move_mode&&(this.autoplaying_puzzle_move=!0,setTimeout((()=>{this.autoplaying_puzzle_move=!1,s(e.x,e.y),this.emit("update")}),this.puzzle_autoplace_delay))}else{let e=this.engine.cur_move,t=!1;for(;e;){if(e.correct_answer){t=!0;break}e=e.parent}t||this.engine.cur_move.wrong_answer||this.emit("puzzle-wrong-answer")}};s(e,t)}}"setup"===o&&(this.engine.board[t][e]===r?this.engine.initialStatePlace(e,t,0):this.engine.initialStatePlace(e,t,r)),this.emit("update"),l>0&&(this.emit("audio-capture-stones",{count:l,already_captured:0}),this.debouncedEmitCapturedStones(c))}else if("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode){if(this.move_selected){"play"===this.mode&&this.engine.cur_move.removeIfNoChildren();let s=!1;if(this.move_selected.x===e&&this.move_selected.y===t&&(delete this.move_selected,s=!0),this.engine.jumpTo(this.engine.last_official_move),s&&(this.updatePlayerToMoveTitle(),!i))return void this.emit("update")}this.move_selected={x:e,y:t};try{if("analyze"!==this.mode||"stone"!==this.analyze_tool||"alternate"===this.analyze_subtool)l=this.engine.place(e,t,!0,!0,void 0,void 0,void 0,c),"analyze"===this.mode&&this.engine.handicapMovesLeft()>0&&this.engine.place(-1,-1);else{if(!this.edit_color)throw new Error("Edit place called with invalid edit_color value");let i=this.engine.playerByColor(this.edit_color);o&&1===i?i=2:o&&2===i&&(i=1),this.engine.board[t][e]===i?this.engine.editPlace(e,t,0):this.engine.editPlace(e,t,i)}if("analyze"===this.mode&&"stone"===this.analyze_tool){let e=this.engine.cur_move;for(;e&&!e.trunk;){let t=e.getMoveNumberDifferenceFromTrunk();e.edited&&(t="triangle"),e.x>=0&&e.y>=0&&!this.engine.board[e.y][e.x]?this.clearTransientMark(e.x,e.y,t):this.setTransientMark(e.x,e.y,t,!0),e=e.parent}}this.isPlayerController()&&(this.syncReviewMove(),n=!0)}catch(e){throw delete this.move_selected,this.updatePlayerToMoveTitle(),e}switch(this.mode){case"play":this.one_click_submit||i?_():this.submit_move=_;break;case"analyze":delete this.move_selected,this.updateTitleAndStonePlacement(),this.emit("update"),this.playMovementSound();break;case"conditional":this.followConditionalSegment(e,t),delete this.move_selected,this.updateTitleAndStonePlacement(),this.emit("update"),this.playMovementSound()}n&&this.redraw()}}catch(e){delete this.move_selected,"stone_already_placed_here"!==e.message_id&&(this.errorHandler(e),this.emit("error","stone_already_placed_here")),this.emit("update")}}onMouseMove(e){if(!this.stone_placement_enabled||!this.player_id&&this.engine.players.black.id&&"analyze"!==this.mode&&!this.scoring_mode)return;const t=(0,n.getRelativeEventPosition)(e),i=this.xy2ij(t.x,t.y);if(this.__last_pt.i!==i.i||this.__last_pt.j!==i.j){if(this.__last_pt.valid){const e=this.last_hover_square;delete this.last_hover_square,e&&this.drawSquare(e.x,e.y)}this.__last_pt=i,i.valid&&(this.last_hover_square={x:i.i,y:i.j},this.drawSquare(i.i,i.j))}}onMouseOut(e){if(this.__last_pt.valid){const e=this.last_hover_square;delete this.last_hover_square,e&&this.drawSquare(e.x,e.y)}this.__last_pt=this.xy2ij(-1,-1)}enableDrawing(){this.drawing_enabled=!0}disableDrawing(){this.drawing_enabled=!1}setByoYomiLabel(e){this.byoyomi_label!==e&&(this.byoyomi_label=e,this.last_hover_square&&this.drawSquare(this.last_hover_square.x,this.last_hover_square.y))}drawSquare(e,t){this.destroyed||e<0||t<0||!this.drawing_enabled||this.no_display||this.__draw_state[t][e]!==this.drawingHash(e,t)&&this.__drawSquare(e,t)}__drawSquare(e,t){var i,o,r,n;if(!this.drawing_enabled||this.no_display)return;const a=this.ctx;if(!a)return;if(e<0||t<0)return;const l=this.square_size;let c,d,u=this.draw_left_labels?l:0,m=this.draw_top_labels?l:0;this.bounds.left>0&&(u=-l*this.bounds.left),this.bounds.top>0&&(m=-l*this.bounds.top);let g=!this.dont_draw_last_move,v=0;this.engine&&(v=this.engine.board[t][e]);let f=this.getMarks(e,t);f||(console.error("No position for ",t,e),f={});const b=this.engine&&this.getShowUndoRequestIndicator()&&this.engine.isStoneInUndoRequest(e,t);let y;if(this.engine&&this.engine.cur_move&&("play"!==this.mode||(null===(i=this.isInPushedAnalysis)||void 0===i?void 0:i.call(this)))){let i=this.engine.cur_move;for(;i&&!i.trunk;i=i.parent)if(i.x===e&&i.y===t){i.getMoveNumberDifferenceFromTrunk()!==i.move_number&&!i.edited&&this.show_variation_move_numbers&&(y=i.getMoveNumberDifferenceFromTrunk().toString())}}let w=!1;this.engine&&this.engine.cur_move.lookupMove(e,t,this.engine.player,!1)&&(w=!0);let k=!1,x=this.theme_blank_text_color;for(const e in f)e.length<=3&&(k=!0);(f.circle||f.triangle||f.chat_triangle||f.sub_triangle||f.cross||f.square)&&(k=!0),f.letter&&f.letter.length>0&&(k=!0),f.subscript&&f.subscript.length>0&&(k=!0);{const i=e*l+u,s=(e+1)*l+u,o=t*l+m,r=(t+1)*l+m;if(a.clearRect(i,o,s-i,r-o),this.shadow_ctx){let e=.1*this.square_size;this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size),e=.2*this.square_size,this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size),e=.3*this.square_size,this.shadow_ctx.clearRect(i+e,o+e,this.square_size,this.square_size)}c=i+this.metrics.mid,d=o+this.metrics.mid;let n=i,h=s;const _=(s+i)/2-this.metrics.offset;let g=o,p=r;const v=(o+r)/2-this.metrics.offset;0===e&&(n+=this.metrics.mid),e===this.width-1&&(h-=this.metrics.mid),0===t&&(g+=this.metrics.mid),t===this.height-1&&(p-=this.metrics.mid),e===this.width-1&&t===this.height-1&&_===h&&v===p&&(h+=1,p+=1),this.square_size<5?a.lineWidth=.2:a.lineWidth=1,a.strokeStyle=k?this.theme_faded_line_color:this.theme_line_color,a.lineCap="butt",a.beginPath(),a.moveTo(Math.floor(n),v),a.lineTo(Math.floor(h),v),a.moveTo(_,Math.floor(g)),a.lineTo(_,Math.floor(p)),a.stroke()}{let i;i=this.square_size<5?.5:Math.max(2,.16*(this.metrics.mid-1.5));let s=!1;19!==this.width||19!==this.height||(3!==e||3!==t&&9!==t&&15!==t)&&(9!==e||3!==t&&9!==t&&15!==t)&&(15!==e||3!==t&&9!==t&&15!==t)||(s=!0),13===this.width&&13===this.height&&(3===e&&(3===t||9===t)||6===e&&6===t||9===e&&(3===t||9===t))&&(s=!0),9===this.width&&9===this.height&&(2===e&&(2===t||6===t)||4===e&&4===t||6===e&&(2===t||6===t))&&(s=!0),s&&(a.beginPath(),a.fillStyle=this.theme_star_color,k&&(a.fillStyle=this.theme_faded_star_color),a.arc(c,d,i,.001,2*Math.PI,!1),a.fill())}if(this.heatmap&&this.heatmap[t][e]>.001){const i="#00FF00";a.lineCap="square",a.save(),a.beginPath(),a.globalAlpha=Math.min(this.heatmap[t][e],.5);const s=Math.floor(.5*this.square_size)-.5;a.moveTo(c-s,d-s),a.lineTo(c+s,d-s),a.lineTo(c+s,d+s),a.lineTo(c-s,d+s),a.lineTo(c-s,d-s),a.fillStyle=i,a.fill(),a.restore()}if(f.hint||this.highlight_movetree_moves&&w||f.color){const e=f.color?f.color:f.hint?"#8EFF0A":"#FF8E0A";a.lineCap="square",a.save(),a.beginPath(),a.globalAlpha=.6;const t=Math.floor(.5*this.square_size)-.5;a.moveTo(c-t,d-t),a.lineTo(c+t,d-t),a.lineTo(c+t,d+t),a.lineTo(c-t,d+t),a.lineTo(c-t,d-t),a.fillStyle=e,a.fill(),a.restore()}const S=null===(o=this.colored_circles)||void 0===o?void 0:o[t][e];if(S){const e=S.color;a.save(),a.globalAlpha=1;const t=Math.floor(.5*this.square_size)-.5;let i=t*(S.border_width||.1);i<.3&&(i=0),a.fillStyle=e,a.strokeStyle=S.border_color||"#000000",i>0&&(a.lineWidth=i),a.beginPath(),a.arc(c,d,Math.max(.1,t-i/2),.001,2*Math.PI,!1),i>0&&a.stroke(),a.fill(),a.restore()}let M=!1;if(v||this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&this.engine&&!this.scoring_mode&&("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode)&&("fixed"!==this.engine.puzzle_player_move_mode||w||this.getPuzzlePlacementSetting&&"play"===this.getPuzzlePlacementSetting().mode)||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||this.engine&&"stone removal"===this.engine.phase&&this.engine.board[t][e]&&this.engine.removal[t][e]||f.black||f.white){let i,s=!1,o=.6;if(this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e])i=this.score_estimator.board[t][e],s=!0;else if(this.engine&&("stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move||"finished"===this.engine.phase&&"analyze"!==this.mode)&&this.engine.board&&this.engine.removal&&this.engine.board[t][e]&&this.engine.removal[t][e])i=this.engine.board[t][e],s=!0;else if(v)i=v;else if("analyze"===this.mode&&"stone"===this.analyze_tool&&"alternate"!==this.analyze_subtool)i="black"===this.edit_color?1:2,this.shift_key_is_down&&(i="black"===this.edit_color?2:1);else if(this.move_selected)i=this.engine.handicapMovesLeft()<=0?this.engine.otherPlayer():this.engine.player;else if("puzzle"===this.mode)if(this.getPuzzlePlacementSetting){const e=this.getPuzzlePlacementSetting();"setup"===e.mode?(i=e.color,this.shift_key_is_down&&(i=1===i?2:1)):i=this.engine.player}else i=this.engine.player;else f.black||f.white?(i=f.black?1:2,s=!0,o=this.variation_stone_opacity):i=this.engine.player;if(f.stone_removed&&(s=!0),!this.autoplaying_puzzle_move||v){if(x=1===i?this.theme_black_text_color:this.theme_white_text_color,!this.theme_black_stones){const e=new Error(`Goban.theme_black_stones not set. Current themes is ${JSON.stringify(this.themes)}`);return void setTimeout((()=>{throw e}),1)}if(!this.theme_white_stones){const e=new Error(`Goban.theme_white_stones not set. Current themes is ${JSON.stringify(this.themes)}`);return void setTimeout((()=>{throw e}),1)}a.save();let r=this.shadow_ctx;if(v&&!s||(a.globalAlpha=o,r=null),void 0===r&&(r=null),1===i){const i=this.theme_black.getStone(e,t,this.theme_black_stones,this);this.theme_black.placeBlackStone(a,r,i,c,d,this.theme_stone_radius)}else{const i=this.theme_white.getStone(e,t,this.theme_white_stones,this);this.theme_white.placeWhiteStone(a,r,i,c,d,this.theme_stone_radius)}a.restore()}const l=null===(n=null===(r=this.colored_circles)||void 0===r?void 0:r[t])||void 0===n?void 0:n[e];if(f.blue_move&&l){a.save(),a.globalAlpha=1;const e=Math.floor(.5*this.square_size)-.5;let t=e*(l.border_width||.1);t<.3&&(t=0),a.strokeStyle=l.border_color||"#000000",t>0&&(a.lineWidth=t),a.beginPath(),a.arc(c,d,Math.max(.1,e-t/2),.001,2*Math.PI,!1),t>0&&a.stroke(),a.restore()}(this.engine&&"stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move&&this.engine.board[t][e]&&this.engine.removal[t][e]||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||f.stone_removed)&&(M="x"===this.themes["removal-graphic"])}if(M||"analyze"===this.mode&&"removal"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t||"stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){const i=this.engine.board[t][e]===s.JGOFNumericPlayerColor.BLACK?"black":"white",o=this.engine.board[t][e]?1:.2;a.lineCap="square",a.save(),a.beginPath(),a.lineWidth=.125*this.square_size,a.globalAlpha=o;const r=Math.max(1,.65*this.metrics.mid);a.moveTo(c-r,d-r),a.lineTo(c+r,d+r),a.moveTo(c+r,d-r),a.lineTo(c-r,d+r),"black"===f.score&&"white"===i?a.strokeStyle=this.theme_white_text_color:"white"===f.score&&"black"===i?a.strokeStyle=this.theme_black_text_color:"white"===f.score&&"white"===i||"black"===f.score&&"black"===i?a.strokeStyle="#ff0000":a.strokeStyle="#888888",a.stroke(),a.restore(),g=!1}if(b){const e="↶";a.save(),a.fillStyle=1===v?this.theme_black_text_color:this.theme_white_text_color;const t=c-a.measureText(e).width/2,i=d+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);a.textBaseline="middle",a.fillText(e,t,i),g=!1,a.restore()}if(f.score&&("finished"!==this.engine.phase||"play"===this.mode||"analyze"===this.mode)||this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])||("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&(this.engine.removal[t][e]||f.needs_sealing)||"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){a.beginPath();let i=f.score;this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])&&(i=1===this.score_estimator.territory[t][e]?"black":"white",0===this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]&&(i="dame")),("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&this.engine.removal[t][e]&&(i="dame"),f.needs_sealing&&(i="seal"),"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.analyze_subtool),"white"===i?(a.fillStyle=this.theme_black_text_color,a.strokeStyle="#777777"):"black"===i?(a.fillStyle=this.theme_white_text_color,a.strokeStyle="#888888"):"dame"===i?(a.fillStyle="#ff0000",a.strokeStyle="#365FE6"):"seal"===i&&(a.fillStyle="#ff0000",a.strokeStyle="#E079CE"),"#"===(null==i?void 0:i[0])&&(a.fillStyle=i,a.strokeStyle=(0,h.color_blend)("#888888",i)),a.lineWidth=Math.ceil(.065*this.square_size)-.5;const s=.15*this.square_size;a.rect(c-s,d-s,2*s,2*s),"dame"!==i&&a.fill(),a.stroke()}let C=!1;{let i,s,o=!1;if(f.letter&&(i=f.letter),f.subscript&&(s=f.subscript),"play"===this.mode&&this.byoyomi_label&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.byoyomi_label),"analyze"!==this.mode||"label"!==this.analyze_tool||"letters"!==this.analyze_subtool&&"numbers"!==this.analyze_subtool||!this.last_hover_square||this.last_hover_square.x!==e||this.last_hover_square.y!==t||(o=!0,i=this.label_character),i||"triangle"===y||(i=y),this.show_variation_move_numbers&&!i&&!(f.circle||f.triangle||f.chat_triangle||f.sub_triangle||f.cross||f.square)){const s=this.engine.getMoveByLocation(e,t,!1);s&&!s.trunk&&(s.edited?this.engine.board[t][e]:i=s.getMoveNumberDifferenceFromTrunk().toString())}if(i){C=!0,a.save(),a.fillStyle=x;const[,,e]=p(a,i,`bold FONT_SIZEpx ${_.GOBAN_FONT}`,.4*this.square_size,.8*this.square_size*(s?.9:1)),t=c-e.width/2;let r=d+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);s&&(r-=.15*this.square_size),a.textBaseline="middle",o&&(a.globalAlpha=.6),a.fillText(i,t,r),g=!1,a.restore()}if(s){C=!0,a.save(),a.fillStyle=x,i&&"0"===s&&(s="0.0");const[,,e]=p(a,s,`bold FONT_SIZEpx ${_.GOBAN_FONT}`,.4*this.square_size,.8*this.square_size*(i?.9:1)),t=c-e.width/2;let r=d+(/WebKit|Trident/.test(navigator.userAgent)?-.03*this.square_size:1);i&&(r+=.3*this.square_size),a.textBaseline="middle",o&&(a.globalAlpha=.6),a.fillText(s,t,r),g=!1,a.restore()}}{let i,s=C;const o=1===v?this.theme_black_text_color:2===v?this.theme_white_text_color:x;if("label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("triangle"!==this.analyze_subtool&&"square"!==this.analyze_subtool&&"cross"!==this.analyze_subtool&&"circle"!==this.analyze_subtool||(s=!0,i=this.analyze_subtool)),f.circle||"circle"===i){a.lineCap="round",a.save(),a.beginPath(),s&&(a.globalAlpha=.6),a.strokeStyle=o,a.lineWidth=.075*this.square_size;const e=Math.max(.1,this.square_size*this.circle_radius);a.arc(c,d,e,0,2*Math.PI,!1),a.stroke(),a.restore(),g=!1}if(f.triangle||f.chat_triangle||f.sub_triangle||"triangle"===y||"triangle"===i){let e=1,t=0;f.sub_triangle&&(e=.5,t=.3*this.square_size,s=!1),a.lineCap="round",a.save(),a.beginPath(),s&&(a.globalAlpha=.6),a.strokeStyle=o,f.chat_triangle&&(a.strokeStyle="#00aaFF"),a.lineWidth=.075*this.square_size*e;let i=-2*Math.PI/4;const r=.3*this.square_size*e;a.moveTo(c+r*Math.cos(i),d+t+r*Math.sin(i)),i+=2*Math.PI/3,a.lineTo(c+r*Math.cos(i),d+t+r*Math.sin(i)),i+=2*Math.PI/3,a.lineTo(c+r*Math.cos(i),d+t+r*Math.sin(i)),i+=2*Math.PI/3,a.lineTo(c+r*Math.cos(i),d+t+r*Math.sin(i)),a.stroke(),a.restore(),g=!1}if(f.cross||"cross"===i){a.lineCap="square",a.save(),a.beginPath(),a.lineWidth=.075*this.square_size,s&&(a.globalAlpha=.6);const e=Math.max(1,.35*this.metrics.mid);a.moveTo(c-e,d-e),a.lineTo(c+e,d+e),a.moveTo(c+e,d-e),a.lineTo(c-e,d+e),a.strokeStyle=o,a.stroke(),a.restore(),g=!1}if(f.square||"square"===i){a.lineCap="square",a.save(),a.beginPath(),a.lineWidth=.075*this.square_size,s&&(a.globalAlpha=.6);const e=Math.max(1,.4*this.metrics.mid);a.moveTo(c-e,d-e),a.lineTo(c+e,d-e),a.lineTo(c+e,d+e),a.lineTo(c-e,d+e),a.lineTo(c-e,d-e),a.strokeStyle=o,a.stroke(),a.restore(),g=!1}}if(this.last_move&&this.engine&&!this.last_move.is(this.engine.cur_move)){const e=this.last_move;delete this.last_move,this.drawSquare(e.x,e.y)}if(g&&this.engine&&this.engine.cur_move&&this.engine.cur_move.x===e&&this.engine.cur_move.y===t&&this.engine.board[t][e]&&("play"===this.engine.phase||"finished"===this.engine.phase)&&(this.last_move=this.engine.cur_move,e>=0&&t>=0)){const e=1===v?this.theme_black_text_color:this.theme_white_text_color;if(this.submit_move){a.lineCap="square",a.save(),a.beginPath(),a.lineWidth=.075*this.square_size,a.globalAlpha=this.last_move_opacity;const t=.8*Math.max(1,.35*this.metrics.mid);a.moveTo(c-t,d),a.lineTo(c+t,d),a.moveTo(c,d-t),a.lineTo(c,d+t),a.strokeStyle=e,a.stroke(),a.restore(),g=!1}else if(b)g=!1;else{a.save(),a.beginPath(),a.strokeStyle=e,a.lineWidth=.075*this.square_size,a.globalAlpha=this.last_move_opacity;let t=this.square_size*this.last_move_radius;this.submit_move&&(t=.3*this.square_size),t=Math.max(.1,t),a.arc(c,d,t,0,2*Math.PI,!1),a.stroke(),a.restore()}}if(!0===this.scoring_mode&&this.score_estimator||"stalling-scoring-mode"===this.scoring_mode&&this.stalling_score_estimate&&"analyze"!==this.mode){const i=("stalling-scoring-mode"===this.scoring_mode?this.stalling_score_estimate:this.score_estimator).ownership[t][e];a.beginPath();const s=i<0?"white":"black";if(("black"===s?1:2)!==v){"white"===s?(a.fillStyle=this.theme_black_text_color,a.strokeStyle="#777777"):"black"===s&&(a.fillStyle=this.theme_white_text_color,a.strokeStyle="#888888"),a.lineWidth=Math.ceil(.035*this.square_size)-.5;const e=.2*this.square_size*Math.abs(i);a.rect(c-e,d-e,2*e,2*e),a.fill(),a.stroke()}}this.__draw_state[t][e]=this.drawingHash(e,t)}drawingHash(e,t){var i,o;if(this.no_display)return"";if(e<0||t<0)return"..";let r=this.square_size+",";const n=!this.dont_draw_last_move;let a=0;this.engine&&(a=this.engine.board[t][e]),r+=a+",",this.heatmap&&this.heatmap[t][e]>.001&&(r+="heat "+this.heatmap[t][e]+",");const l=null===(i=this.colored_circles)||void 0===i?void 0:i[t][e];l&&(r+="circle "+l.color);let h,c=this.getMarks(e,t);if(c||(console.error("No position for ",t,e),c={}),this.engine&&this.engine.cur_move&&("play"!==this.mode||(null===(o=this.isInPushedAnalysis)||void 0===o?void 0:o.call(this)))){let i=this.engine.cur_move;for(;i&&!i.trunk;i=i.parent)if(i.x===e&&i.y===t){i.getMoveNumberDifferenceFromTrunk()!==i.move_number&&!i.edited&&this.show_variation_move_numbers&&(h=i.getMoveNumberDifferenceFromTrunk().toString())}}let _=!1;this.engine&&this.engine.cur_move.lookupMove(e,t,this.engine.player,!1)&&(_=!0);const d=this.engine&&this.getShowUndoRequestIndicator()&&this.engine.isStoneInUndoRequest(e,t);let u=!1;if(a||this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&this.engine&&!this.scoring_mode&&("play"===this.engine.phase||"finished"===this.engine.phase&&"analyze"===this.mode)&&("fixed"!==this.engine.puzzle_player_move_mode||_||this.getPuzzlePlacementSetting&&"play"!==this.getPuzzlePlacementSetting().mode)||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||this.engine&&"stone removal"===this.engine.phase&&this.engine.board[t][e]&&this.engine.removal[t][e]||c.black||c.white){let i,s=!1;this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]?(i=this.score_estimator.board[t][e],s=!0):this.engine&&"stone removal"===this.engine.phase&&this.engine.board&&this.engine.removal&&this.engine.board[t][e]&&this.engine.removal[t][e]?(i=this.engine.board[t][e],s=!0):a?i=a:"analyze"===this.mode&&"stone"===this.analyze_tool&&"alternate"!==this.analyze_subtool?i="black"===this.edit_color?1:2:this.move_selected?i=this.engine.handicapMovesLeft()<=0?this.engine.otherPlayer():this.engine.player:c.black||c.white?(i=c.black?1:2,s=!0):i=this.engine.player,c.stone_removed&&(s=!0),1===i&&(r+=this.theme_black.getStoneHash(e,t,this.theme_black_stones,this)),2===i&&(r+=this.theme_white.getStoneHash(e,t,this.theme_white_stones,this)),(this.engine&&"stone removal"===this.engine.phase&&this.engine.last_official_move===this.engine.cur_move&&this.engine.board[t][e]&&this.engine.removal[t][e]||this.scoring_mode&&this.score_estimator&&this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]||c.stone_removed)&&(u=!0),r+=(s?"T":"")+i+","}if(u||"analyze"===this.mode&&"removal"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t||"stone removal"===this.engine.phase&&this.engine.isActivePlayer(this.player_id)&&this.engine.cur_move===this.engine.last_official_move&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){const i=this.engine.board[t][e]===s.JGOFNumericPlayerColor.BLACK?"black":"white";"black"===c.score&&"white"===i?r+="whiteX":"white"===c.score&&"black"===i?r+="blackX":r+="redX"}d&&(r+="undo↶"),(c.hint||this.highlight_movetree_moves&&_)&&(c.hint?r+="hint,":r+="highlight,");{let i=!1,s=!1;this.engine&&(this.scoring_mode||"stone removal"===this.engine.phase)&&this.stone_placement_enabled&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("analyze"!==this.mode||"stone"===this.analyze_tool)&&(i=!0,s=!0),c.mark_x&&(i=!0,s=!1),this.scoring_mode&&this.score_estimator&&this.score_estimator.removal[t][e]&&(i=!0,s=!1),c.remove&&"analyze"!==this.mode&&(i=!0,s=!1),r+=i+","+s}if(c.score&&("finished"!==this.engine.phase||"play"===this.mode||"analyze"===this.mode)||this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])||("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&(this.engine.removal[t][e]||c.needs_sealing)||"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t){let i=c.score;this.scoring_mode&&this.score_estimator&&(this.score_estimator.territory[t][e]||this.score_estimator.removal[t][e]&&0===this.score_estimator.board[t][e])&&(i=1===this.score_estimator.territory[t][e]?"black":"white",0===this.score_estimator.board[t][e]&&this.score_estimator.removal[t][e]&&(i="dame")),("stone removal"===this.engine.phase||"finished"===this.engine.phase&&"play"===this.mode)&&0===this.engine.board[t][e]&&this.engine.removal[t][e]&&(i="dame"),c.needs_sealing&&(i="seal"),"analyze"===this.mode&&"score"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.analyze_subtool),this.scoring_mode&&this.score_estimator&&this.score_estimator.territory[t][e]&&(i=1===this.score_estimator.territory[t][e]?"black":"white"),r+="score "+i+","}{let i,s=!1;if(c.letter&&(i=c.letter),"play"===this.mode&&this.byoyomi_label&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(i=this.byoyomi_label),"analyze"===this.mode&&"label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&(s=!0,i=this.label_character),i||"triangle"===h||(i=h),this.show_variation_move_numbers&&!i&&!(c.circle||c.triangle||c.chat_triangle||c.cross||c.square)){const s=this.engine.getMoveByLocation(e,t,!1);s&&!s.trunk&&(s.edited?this.engine.board[t][e]:i=s.getMoveNumberDifferenceFromTrunk().toString())}i&&(r+=i+(s?" fade":"")+","),c.subscript&&(r+=" _ "+c.subscript+(s?" fade":"")+",")}if("label"===this.analyze_tool&&this.last_hover_square&&this.last_hover_square.x===e&&this.last_hover_square.y===t&&("triangle"!==this.analyze_subtool&&"square"!==this.analyze_subtool&&"cross"!==this.analyze_subtool&&"circle"!==this.analyze_subtool||(r+="hover "+this.analyze_subtool+",")),c.circle&&(r+="circle,"),(c.triangle||c.chat_triangle||"triangle"===h)&&(r+="triangle,"),c.cross&&(r+="cross,"),c.square&&(r+="square,"),n&&this.engine&&this.engine.cur_move&&(this.engine.cur_move.x!==e||this.engine.cur_move.y!==t||!this.engine.board[t][e]||"play"!==this.engine.phase&&"finished"!==this.engine.phase||(r+="last_move,",this.getShowUndoRequestIndicator()&&this.engine.isStoneInUndoRequest(e,t)&&(r+="?,"))),!0===this.scoring_mode&&this.score_estimator||"stalling-scoring-mode"===this.scoring_mode&&this.stalling_score_estimate&&"analyze"!==this.mode){r+=("stalling-scoring-mode"===this.scoring_mode?this.stalling_score_estimate:this.score_estimator).ownership[t][e].toFixed(5)+","}return r}redraw(e){if(!this.ready_to_draw)return;if(this.destroyed)return void console.debug("Attempting to redraw destroyed goban");if(!this.drawing_enabled)return;if(this.no_display)return;const t=this.metrics=this.computeMetrics();if(e||this.__set_board_width!==t.width||this.__set_board_height!==t.height||this.theme_stone_radius!==this.computeThemeStoneRadius()){e=!0;try{if(this.parent.style.width=t.width+"px",this.parent.style.height=t.height+"px",(0,n.resizeDeviceScaledCanvas)(this.board,t.width,t.height),this.pen_layer)if(this.pen_marks.length){(0,n.resizeDeviceScaledCanvas)(this.pen_layer,t.width,t.height);const e=this.pen_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for pen layer");this.pen_ctx=e}else this.detachPenCanvas();if(this.shadow_layer){(0,n.resizeDeviceScaledCanvas)(this.shadow_layer,t.width,t.height);const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for shadow layer");this.shadow_ctx=e}this.__set_board_width=t.width,this.__set_board_height=t.height;const e=this.board.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to obtain drawing context for board");this.ctx=e,this.setTheme(this.getSelectedThemes(),!0)}catch(e){return void setTimeout((()=>{throw e}),1)}}const i=this.ctx,s=(e,t,s)=>{const o=t-i.measureText(e).width/2,r=s;i.fillText(e,o,r)},o=(e,t,s)=>{for(let o=0;o<e.length;++o){const r=i.measureText(e[o]),n=t-r.width/2;let a=s;const l=r.width;2===e.length&&(a=a-l+o*l),3===e.length&&(a=a-1.5*l+o*l),i.fillText(e[o],n,a)}},r=(e,t)=>{switch(this.getCoordinateDisplaySystem()){case"A1":for(let i=0;i<this.width;++e,++i){const o=(e-this.bounds.left-(this.bounds.left>0?+this.draw_left_labels:0))*this.square_size+this.square_size/2,r=t*this.square_size+this.square_size/2;s((0,h.encodePrettyXCoordinate)(i),o,r)}break;case"1-1":for(let i=0;i<this.width;++e,++i){const o=(e-this.bounds.left-(this.bounds.left>0?+this.draw_left_labels:0))*this.square_size+this.square_size/2,r=t*this.square_size+this.square_size/2;s(""+(i+1),o,r)}}},a=(e,t)=>{switch(this.getCoordinateDisplaySystem()){case"A1":for(let i=0;i<this.height;++t,++i){const o=e*this.square_size+this.square_size/2,r=(t-this.bounds.top-(this.bounds.top>0?+this.draw_top_labels:0))*this.square_size+this.square_size/2;s(""+(this.height-i),o,r)}break;case"1-1":const i=["一","二","三","四","五","六","七","八","九","十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","二十一","二十二","二十三","二十四","二十五"];for(let s=0;s<this.height;++t,++s){const r=e*this.square_size+this.square_size/2,n=(t-this.bounds.top-(this.bounds.top>0?+this.draw_top_labels:0))*this.square_size+this.square_size/2;o(i[s],r,n)}}};if(e||!this.__borders_initialized){this.__borders_initialized=!0,this.shadow_ctx&&this.shadow_ctx.clearRect(0,0,t.width,t.height),i.clearRect(0,0,t.width,t.height);let e=Math.round(.5*this.square_size),s="bold";"1-1"===this.getCoordinateDisplaySystem()&&(e*=.7,s="",this.height>20&&(e*=.7)),i.font=`${s} ${e}px ${_.GOBAN_FONT}`,i.textBaseline="middle",i.fillStyle=this.theme_board.getLabelTextColor(),i.save(),this.draw_top_labels&&0===this.bounds.top&&r(this.draw_left_labels?1:0,0),this.draw_bottom_labels&&this.bounds.bottom===this.height-1&&r(this.draw_left_labels?1:0,+this.draw_top_labels+this.bounded_height),this.draw_left_labels&&0===this.bounds.left&&a(0,this.draw_top_labels?1:0),this.draw_right_labels&&this.bounds.right===this.width-1&&a(+this.draw_left_labels+this.bounded_width,+this.draw_top_labels),i.restore()}this.__draw_state&&!e&&this.__draw_state.length===this.height&&this.__draw_state[0].length===this.width||(this.__draw_state=(0,h.makeMatrix)(this.width,this.height,""));{const e=Math.round(.45*this.square_size);i.font="bold "+e+"px "+_.GOBAN_FONT}for(let e=this.bounds.top;e<=this.bounds.bottom;++e)for(let t=this.bounds.left;t<=this.bounds.right;++t)this.drawSquare(t,e);this.drawPenMarks(this.pen_marks),this.move_tree_redraw()}showMessage(e,t,i=5e3){var s;this.clearMessage();const o=(null===(s=null==t?void 0:t.error)||void 0===s?void 0:s.message_id)||e,r=(0,l.formatMessage)(o,t);if(this.emit("show-message",{formatted:r,message_id:o,parameters:t}),!this.config.dont_show_messages){this.message_div=document.createElement("div"),this.message_div.className="GobanMessage",this.message_td=document.createElement("td");const e=document.createElement("table"),t=document.createElement("tr");t.appendChild(this.message_td),e.appendChild(t),this.message_div.appendChild(e),this.message_text=document.createElement("div"),this.message_text.innerHTML=r,this.message_td.appendChild(this.message_text),this.parent.appendChild(this.message_div);const s=Date.now();this.message_div.addEventListener("click",(()=>{try{if(Date.now()-s<100)return;i>0&&this.clearMessage()}catch(e){console.error(e)}}))}i||(i=5e3),i>0&&(this.message_timeout=window.setTimeout((()=>{this.clearMessage()}),i))}clearMessage(){var e;this.message_div&&(null===(e=this.message_div.parentNode)||void 0===e||e.removeChild(this.message_div),delete this.message_div),this.message_timeout&&(clearTimeout(this.message_timeout),delete this.message_timeout),this.emit("clear-message")}setTheme(e,t){var i,s,a;if(this.no_display)return;this.themes=e;const l=(null===(i=r.THEMES.board)||void 0===i?void 0:i[e.board])||r.THEMES.board.Plain,h=(null===(s=r.THEMES.white)||void 0===s?void 0:s[e.white])||r.THEMES.white.Plain,c=(null===(a=r.THEMES.black)||void 0===a?void 0:a[e.black])||r.THEMES.black.Plain;if(this.theme_board=new l,this.theme_white=new h(this.theme_board),this.theme_black=new c(this.theme_board),this.metrics||(this.metrics=this.computeMetrics()),this.theme_stone_radius=this.computeThemeStoneRadius(),isNaN(this.theme_stone_radius))throw console.error("setThemes was not able to find the board size, metrics were: ",JSON.stringify(this.metrics)),new Error("invalid stone radius computed");if(this.theme_white.stoneCastsShadow(this.theme_stone_radius)||this.theme_black.stoneCastsShadow(this.theme_stone_radius))if(this.shadow_layer){(0,n.resizeDeviceScaledCanvas)(this.shadow_layer,this.metrics.width,this.metrics.height);const e=this.shadow_layer.getContext("2d",{willReadFrequently:!0});if(!e)throw new Error("Failed to get drawing context for shadow layer");this.shadow_ctx=e}else this.attachShadowLayer();else this.detachShadowLayer();e.white in d.white||(d.white[e.white]={creation_order:[]}),e.black in d.black||(d.black[e.black]={creation_order:[]});const _=()=>{this.redraw(!0),this.move_tree_redraw()};try{this.theme_stone_radius in d.white[e.white]||(d.white[e.white][this.theme_stone_radius]=this.theme_white.preRenderWhite(this.theme_stone_radius,23434,_),d.white[e.white].creation_order.push(this.theme_stone_radius)),this.theme_stone_radius in d.black[e.black]||(d.black[e.black][this.theme_stone_radius]=this.theme_black.preRenderBlack(this.theme_stone_radius,2081,_),d.black[e.black].creation_order.push(this.theme_stone_radius)),o.MoveTree.stone_radius in d.white[e.white]||(d.white[e.white][o.MoveTree.stone_radius]=this.theme_white.preRenderWhite(o.MoveTree.stone_radius,23434,_),d.white[e.white].creation_order.push(o.MoveTree.stone_radius)),o.MoveTree.stone_radius in d.black[e.black]||(d.black[e.black][o.MoveTree.stone_radius]=this.theme_black.preRenderBlack(o.MoveTree.stone_radius,2081,_),d.black[e.black].creation_order.push(o.MoveTree.stone_radius))}catch(t){throw console.error("Error pre-rendering stones.",{themes:e,move_tree_stone_radius:o.MoveTree.stone_radius}),t}let u=500;try{/iP(ad|hone|od).+(Version\/[\d.]|OS \d.*like mac os x)+.*Safari/i.test(navigator.userAgent)&&(console.log("iOS device detected, reducing cache size"),u=12)}catch(e){console.error(e)}if(d.black[e.black].creation_order.length>u){const t=d.black[e.black].creation_order.shift();t&&(console.log("deleting old radius [black]",t),delete d.black[e.black][t])}if(d.white[e.white].c