From 88a69666265585041f52850695bb6a0d8e0a258b Mon Sep 17 00:00:00 2001 From: Akita Noek Date: Tue, 6 Aug 2024 08:52:41 -0600 Subject: [PATCH] Update docs --- docs/assets/search.js | 2 +- docs/classes/BoardState.html | 22 +-- docs/classes/ConditionalMoveTree.html | 4 +- docs/classes/Goban.html | 32 ++--- docs/classes/GobanBase.html | 22 +-- docs/classes/GobanCanvas.html | 32 ++--- docs/classes/GobanEngine.html | 48 +++---- docs/classes/GobanError.html | 4 +- docs/classes/GobanInteractive.html | 26 ++-- docs/classes/GobanMoveError.html | 4 +- docs/classes/GobanSocket.html | 4 +- docs/classes/GobanTheme.html | 6 +- docs/classes/MoveTree.html | 22 +-- docs/classes/SVGRenderer.html | 32 ++--- docs/classes/ScoreEstimator.html | 24 ++-- docs/classes/StoneString.html | 10 +- docs/classes/StoneStringBuilder.html | 4 +- docs/classes/TestGoban.html | 32 ++--- docs/classes/_internal_.OGSConnectivity.html | 28 ++-- docs/enums/JGOFNumericPlayerColor.html | 4 +- .../protocol.RemoteStorageReplication.html | 10 +- docs/functions/adjust_estimate.html | 2 +- docs/functions/allocateCanvasOrError.html | 2 +- docs/functions/autoscore.html | 2 +- docs/functions/char2num.html | 2 +- docs/functions/cloneMatrix.html | 2 +- docs/functions/closeErrorCodeToString.html | 2 +- docs/functions/color_blend.html | 2 +- docs/functions/computeAverageMoveTime.html | 2 +- docs/functions/createDeviceScaledCanvas.html | 2 +- docs/functions/createGoban.html | 2 +- docs/functions/decodeCoordinate.html | 2 +- docs/functions/decodeGTPCoordinates.html | 2 +- docs/functions/decodeMoves.html | 2 +- docs/functions/decodePrettyCoordinates.html | 2 +- docs/functions/decodePrettyXCoordinate.html | 2 +- docs/functions/deepClone.html | 2 +- docs/functions/deepEqual.html | 2 +- docs/functions/deviceCanvasScalingRatio.html | 2 +- docs/functions/elementOffset.html | 2 +- docs/functions/encodeCoordinate.html | 2 +- docs/functions/encodeMove.html | 2 +- docs/functions/encodeMoveToArray.html | 2 +- docs/functions/encodeMoves.html | 2 +- docs/functions/encodeMovesToArray.html | 2 +- docs/functions/encodePrettyXCoordinate.html | 2 +- docs/functions/escapeSGFText.html | 2 +- docs/functions/getRandomInt.html | 2 +- docs/functions/getRelativeEventPosition.html | 2 +- docs/functions/getWorstMoves.html | 2 +- .../init_remote_ownership_estimator.html | 2 +- .../init_wasm_ownership_estimator.html | 2 +- docs/functions/makeEmptyMatrix.html | 2 +- docs/functions/makeMatrix.html | 2 +- docs/functions/makeObjectMatrix.html | 2 +- docs/functions/matricesAreEqual.html | 2 +- docs/functions/newlines_to_spaces.html | 2 +- docs/functions/niceInterval.html | 2 +- docs/functions/num2char.html | 2 +- docs/functions/ojeSequenceToMoves.html | 2 +- docs/functions/placeRenderedImageStone.html | 2 +- docs/functions/positionId.html | 2 +- docs/functions/preRenderImageStone.html | 2 +- docs/functions/prettyCoordinates.html | 2 +- docs/functions/resizeDeviceScaledCanvas.html | 2 +- docs/functions/setGobanCallbacks.html | 2 +- docs/functions/setGobanRenderer.html | 2 +- .../set_local_ownership_estimator.html | 2 +- docs/functions/shortDurationString.html | 2 +- docs/functions/sortMoves.html | 2 +- docs/functions/translate._.html | 2 +- docs/functions/translate.interpolate.html | 2 +- .../translate.setGobanTranslations.html | 2 +- docs/functions/validateCanvas.html | 2 +- .../functions/voronoi_estimate_ownership.html | 2 +- docs/functions/wasm_estimate_ownership.html | 2 +- docs/interfaces/AIReviewWorstMoveEntry.html | 4 +- docs/interfaces/AdHocClock.html | 26 ++-- docs/interfaces/AdHocFormat.html | 4 +- docs/interfaces/AdHocPauseControl.html | 4 +- docs/interfaces/AdHocPlayer.html | 4 +- docs/interfaces/AdHocPlayerClock.html | 14 +- docs/interfaces/AudioClockEvent.html | 14 +- docs/interfaces/BoardConfig.html | 4 +- .../interfaces/CanvasRendererGobanConfig.html | 12 +- docs/interfaces/ColoredCircle.html | 4 +- .../ConditionalMoveResponseTree.html | 2 +- docs/interfaces/GobanBounds.html | 4 +- docs/interfaces/GobanCallbacks.html | 4 +- docs/interfaces/GobanCanvasInterface.html | 4 +- docs/interfaces/GobanConfig.html | 12 +- docs/interfaces/GobanEngineConfig.html | 12 +- docs/interfaces/GobanEngineInitialState.html | 4 +- docs/interfaces/GobanEnginePlayerEntry.html | 8 +- docs/interfaces/GobanEvents.html | 6 +- .../interfaces/GobanIOErrorMessageObject.html | 4 +- docs/interfaces/GobanMetrics.html | 4 +- .../GobanMoveErrorMessageObject.html | 4 +- docs/interfaces/GobanSelectedThemes.html | 6 +- docs/interfaces/GobanSocketEvents.html | 98 +++++++------- docs/interfaces/GobanThemeBackgroundCSS.html | 4 +- .../GobanThemeBackgroundReactStyles.html | 4 +- docs/interfaces/JGOF.html | 14 +- docs/interfaces/JGOFAIReview.html | 18 +-- docs/interfaces/JGOFAIReviewMove.html | 14 +- .../interfaces/JGOFAIReviewMoveVariation.html | 22 +-- docs/interfaces/JGOFAbsoluteTimeControl.html | 4 +- docs/interfaces/JGOFByoYomiTimeControl.html | 4 +- docs/interfaces/JGOFCanadianTimeControl.html | 4 +- docs/interfaces/JGOFClock.html | 22 +-- .../interfaces/JGOFClockWithTransmitting.html | 22 +-- docs/interfaces/JGOFFischerTimeControl.html | 4 +- docs/interfaces/JGOFIntersection.html | 6 +- docs/interfaces/JGOFMove.html | 10 +- docs/interfaces/JGOFNoneTimeControl.html | 4 +- docs/interfaces/JGOFPauseState.html | 14 +- docs/interfaces/JGOFPlayer.html | 6 +- docs/interfaces/JGOFPlayerClock.html | 12 +- docs/interfaces/JGOFPlayerSummary.html | 4 +- docs/interfaces/JGOFSealingIntersection.html | 8 +- docs/interfaces/JGOFSimpleTimeControl.html | 4 +- docs/interfaces/MarkInterface.html | 4 +- docs/interfaces/MoveCommand.html | 4 +- docs/interfaces/MoveTreeChatLine.html | 4 +- docs/interfaces/MoveTreeChatLineBody.html | 4 +- docs/interfaces/MoveTreeJson.html | 4 +- docs/interfaces/PlayerScore.html | 4 +- docs/interfaces/PuzzleConfig.html | 4 +- docs/interfaces/ReviewMessage.html | 40 +++--- docs/interfaces/SVGRendererGobanConfig.html | 12 +- docs/interfaces/SVGStoneParameters.html | 4 +- docs/interfaces/SVGStop.html | 4 +- docs/interfaces/Score.html | 4 +- docs/interfaces/ScoreEstimateRequest.html | 4 +- docs/interfaces/ScoreEstimateResponse.html | 14 +- docs/interfaces/ScoringLocations.html | 4 +- docs/interfaces/StateUpdateEvents.html | 4 +- docs/interfaces/ThemesInterface.html | 4 +- docs/interfaces/_internal_.AbsoluteClock.html | 4 +- .../_internal_.AnalysisComment.html | 4 +- .../_internal_.AutoscoreResults.html | 4 +- ...internal_.BoardStateWithIsobranchHash.html | 24 ++-- docs/interfaces/_internal_.ByoYomiClock.html | 4 +- docs/interfaces/_internal_.CanadianClock.html | 4 +- docs/interfaces/_internal_.ErrorResponse.html | 4 +- docs/interfaces/_internal_.FischerClock.html | 4 +- .../interfaces/_internal_.GameListPlayer.html | 4 +- .../_internal_.GobanSVGInterface.html | 4 +- .../_internal_.GobanSocketOptions.html | 6 +- ...internal_.JGOFPlayerClockWithTimedOut.html | 12 +- .../_internal_.MoveTreeViewPortInterface.html | 4 +- docs/interfaces/_internal_.ReviewComment.html | 4 +- .../_internal_.ViewPortInterface.html | 4 +- .../interfaces/protocol.AIServerToClient.html | 4 +- .../protocol.AutomatchPreferences.html | 4 +- .../interfaces/protocol.ClientToAIServer.html | 20 +-- docs/interfaces/protocol.ClientToServer.html | 126 +++++++++--------- .../protocol.ClientToServerBase.html | 6 +- .../protocol.GameChatAnalysisMessage.html | 4 +- docs/interfaces/protocol.GameChatLine.html | 4 +- docs/interfaces/protocol.GameChatMessage.html | 4 +- .../protocol.GameChatReviewMessage.html | 4 +- .../protocol.GameChatTranslatedMessage.html | 4 +- docs/interfaces/protocol.GameClock.html | 4 +- docs/interfaces/protocol.GameListEntry.html | 4 +- docs/interfaces/protocol.GameListWhere.html | 4 +- docs/interfaces/protocol.Glicko2.html | 4 +- .../protocol.SeekgraphChallengeMessage.html | 60 ++++----- .../protocol.SeekgraphDeleteMessage.html | 6 +- .../protocol.SeekgraphStartedMessage.html | 28 ++-- docs/interfaces/protocol.ServerToClient.html | 98 +++++++------- .../protocol.StallingScoreEstimate.html | 4 +- docs/interfaces/protocol.User.html | 4 +- docs/interfaces/translate.GobanStrings.html | 4 +- docs/modules/protocol.html | 2 +- docs/modules/translate.html | 2 +- docs/types/AdHocPackedMove.html | 2 +- docs/types/AnalysisSubTool.html | 2 +- docs/types/AnalysisTool.html | 2 +- docs/types/BoardTransform.html | 2 +- docs/types/ConditionalMoveResponse.html | 2 +- docs/types/DataArgument.html | 2 +- docs/types/GobanChatLog.html | 2 +- docs/types/GobanEnginePhase.html | 2 +- docs/types/GobanEngineRules.html | 2 +- docs/types/GobanEngineSuperKoAlgorithm.html | 2 +- docs/types/GobanErrorMessageId.html | 2 +- docs/types/GobanErrorMessageObject.html | 2 +- docs/types/GobanIOErrorMessageId.html | 2 +- docs/types/GobanModes.html | 2 +- docs/types/GobanMoveErrorMessageId.html | 2 +- docs/types/GobanMovesArray.html | 2 +- docs/types/GobanRenderer.html | 2 +- docs/types/GobanRendererConfig.html | 2 +- docs/types/JGOFTimeControl.html | 2 +- docs/types/JGOFTimeControlSpeed.html | 2 +- docs/types/JGOFTimeControlSystem.html | 2 +- docs/types/LabelPosition.html | 2 +- docs/types/Matrix.html | 2 +- docs/types/MoveTreePenMarks.html | 2 +- docs/types/NumberMatrix.html | 2 +- docs/types/PlayerColor.html | 2 +- docs/types/ProtocolResponseType.html | 2 +- docs/types/PuzzleOpponentMoveMode.html | 2 +- docs/types/PuzzlePlacementSetting.html | 2 +- docs/types/PuzzlePlayerMoveMode.html | 2 +- docs/types/RawStoneString.html | 2 +- docs/types/StringMatrix.html | 2 +- docs/types/_internal_.ClockTime.html | 2 +- docs/types/_internal_.DebugOutput.html | 2 +- docs/types/_internal_.LocalEstimator.html | 2 +- docs/types/_internal_.MessageID.html | 2 +- docs/types/_internal_.NoneClock.html | 2 +- docs/types/_internal_.SimpleClock.html | 2 +- docs/types/_internal_.StoneType.html | 2 +- docs/types/_internal_.StoneTypeArray.html | 2 +- docs/types/protocol.AutomatchCondition.html | 2 +- docs/types/protocol.RuleSet.html | 2 +- docs/types/protocol.Size.html | 2 +- docs/types/protocol.Speed.html | 2 +- docs/variables/AUTOSCORE_TOLERANCE.html | 2 +- docs/variables/AUTOSCORE_TRIALS.html | 2 +- docs/variables/GOBAN_FONT.html | 2 +- docs/variables/MARK_TYPES.html | 2 +- .../variables/SCORE_ESTIMATION_TOLERANCE.html | 2 +- docs/variables/SCORE_ESTIMATION_TRIALS.html | 2 +- docs/variables/THEMES.html | 2 +- docs/variables/THEMES_SORTED.html | 2 +- docs/variables/callbacks.html | 2 +- docs/variables/remote_estimate_ownership.html | 2 +- 230 files changed, 837 insertions(+), 835 deletions(-) diff --git a/docs/assets/search.js b/docs/assets/search.js index 57480b9c..e5c749db 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8y9aZPcNrI2+lcU03E+3emWJe/zTW7LHp2RLEW35vieuB8YbBa6ixaLrCFZ3W6/8f73C4AbtgQSC6sqYmIkq3J5kMSSSACZ/+dvbfPU/e0f/9//+duXst787R/fffP3v9X5jvztH3/rSP9rc5fXN6TekJa0f/v73w5tRX+4P9RFXzZ191Iludr2u4rSFVXedYTK/dvf/u/fDaKLluQ94awGqcKvVoGvv/rx+1ffvp6lmtH2z3vSvcTDtEq9bur78sEme6CwaljssG+bvimaaha4azaHioqcfrAj/fa7WdJ1VZK6/9zckvaRtD/lHZlllnVP2vu8EMXq5AZNf//bPm8pmQh00f7qq9dLQ/JDv6WUZUE/XIjiC0WAHYVBitjPvv3268UwWcY+UjSmq1mON7QrqW2AAWvSv9yX9UMQUMqcjcxnYbgJz2i0y9dBZptNgunxHjije3qzy/ti+7Iqu95X7cXMno3sXnZJ97FMaKbP9Z0vrCvFKIDpim1eVaR+IC+/ELLPq/LRH/EsIxNlnNSIBkiTJV959/wrk5EAez7QP14WTV2Twr8jMuZsYT6pBUUsk+m+8e+Fkj1sNtuUXZTZJP7TW26BMxnv26/CjCc0zGa/luyaR7LJur6pCfcCw4DLcrJBzuntqcOaZ8YfwuxqMJiHfVvyR3BXVdoyizo7Kw/IZkMHjn6z5TxsnRcF2aex9Szq7Gw9IJtt/U0SW4/Ntdma0Yc1YOQ8vSUZkHmWDeykvDE2Ox3qTUPN+58DCfAwOUwmIVsknN5uIqDJfj8ErlKSeZx2jBnRHPUZjWMBz2TE7wM7oWgbpw2LvC5IFYF5FnAmNhzwzDYMXNZF29hsuM8PXvEYAe3Eenq7cSTz1BdosaE59vW4O+yCl7mR9/TWGqDMHcx/Hygaw2Gv8qEOBjnwnoW9KJTZXoErw9gg696PVPkz9Vpi7KbJOL39ZEjzJjpwmCoNtMYfKpK3ukVCAgBmSae3rQnYbOHAkW1srNXOEUvwGa2+8sL7dWiQx73m5nV9CDTXxHp6a3Eks7EC92lDc6z+SUseKRvdyeVV5XcIIToIupTTW1AFNW96A8et1kiMXUlX5J6HO4YmCFLOx64TqNmugSu31kibXftyRyfN5hC4qxPZT2/JGc3s/ASO86VZjvOCTcnO2fOKBzMiwreaqLOJ4BqRzUt2oH3NlrPaepuHmnbgPANLUiDzAhToTfLG2OxU5T2pi+cwhAvz6a01Ypl3yYGLzNQkwGZ0qizJU/DJ38B+Lmd/Mpr54PSrH71Np5jFbryII8AR8fkcAmqAZiu+ehVqRfdJ4EiY7/eE/haIeeY+BwMOYJYu+HWo8cZWOYZvyOIwjZYzWB4EKIvJvg0etZY1gvraffeyqam/7Q+TM2cz80lNJmJZxuj33jaTDAJdKGv68p5dOaMOC4vnEK+LeeM9LkFGNss4qQkNkCZL/ujf+UxGsjgq7HITXV8Odf+yO9x1RVvehTkKTFDGBWWioJM7MCZc82ldmDNjtBnOxoc6mZVlUedkZwHZbOmwDQpgOZet/3MgbZjrzVsxsZ+HTTma2Y5h0UXBKtZNSxMYzxkYT24vhmPeqARuiVlTABsdOtK+3DV12Tfel3MvGHO2MJ/UViKW5V6nv28oGQQwWtkX3vgGnpOaiEKYF2H/HQdrAOgq75qesBtGbf5AgiJVsohziFDpiGbjhWx6NQvhbDnc3ooFP0s5J4sOoGaj+vvXZlMh++hz7T+G1S4xyDgnmzJIyzYvJKygWwl+JtC/7Jt96W9HxppNrKd+FDAimaOnQW8BJkvYbNWFBGA4wO4Mgi8zkNlQ/kdIixlsdvqjKf2vJnB4I+fp7cSAzMPQ32lbzGCzExXjv85yeCPn6e3EgMx28t8GLGaAvNvycn/otuwMKHiLeiizQcb5xAAMkJY4lb9zYrKS06Axu/4F/xlt+I2glp2E/1pqthUUPCXkS/bQ5vtt8IHRIuJcDo10REs39d+ZGUzkNmbEAZKA/nwOkYygFqv6x1bNtrKuO7vAyX53auONMGZz+R+UTwaw2+dl1eSBrt5+l43M52ApjmV+Hh7oGU/2cNisqJqA2/cT0In7LKzGwcxmC/STZ5M47NYd9qQNOqWc4IoSzsJ+M6DZhoE+tGQemx2H2EGWV/53UTloif/0NlzgzBYMnOuEhrntFwP2jOw22yxwR2IPRM13rUKNNl/4OhPLqXjmC3yBd0wRNhRuI4RHSOd7EWdiRx3REskLCY5qJgKMuW26vqzvG2/AAuNJDTfhmA8U/ee6uSmrQ5v/9uMc+fYfJ4rYKeuR5QPzv66D/kqQn6IZjtYUXEa3VmMW8Udoy2HPboOv1ZRZ+hFa8vDQXVLmrmz8Y7fI5lAV2aLiCG1a0iXd0x8z/lfvxi25myQhZ5JPasE0r9retjWayWnSwIdyC/TzeC2n4gnOpXalmQYw4V3Drg9J+Q2xYClrNrOe1GwLknmoextMMITFVOwS5sF/tWAAZ9aTm2pAsriDQbYamwOPzJDUkPMoMKeF7LvNZdldlvWWtGVPNqcZobHpIddKDTnelTWlhTwDw6npIX/0D9mbckMqeVtv94QssVKmSIDFf+RonKptKsq/CKiB/hat4M00dV9Pb88gdTpltPKbQ0VuhRtXisbxZ381Qg7PGfWnltwTykP7jrU7mRi8Ecie8qG0R9RBlRcjq6PnGtsInS/RTpN1rG9mzZ4nQw6EZhSUECjz/+m0v9sH4hP5E8KqmifSZm1ef8k25f19IDhdSkKIh/0+AURdSkKILUtBHQhs4o2D473MOADNDk4YsquhVVDcQJubYxBezeLi0Dq2oI95dUhj0isualWwbLZgXn3fNvaNnX3CEUScTfcUcXls8YwCpTau1FmNeIU+mwL7il3XDH/owetAX7uvTODn25PpWjGIBn2V564n9hsbsU25mnUkbZGjf5U17cp5lTkjqNHNUzQds5Gcr6yLluyYmlWbqek6ZkN3+Z9H+JKCluM2rqyP0rpFzTGbR33cstkcoYGyouM3MdTb9mpeoFse3LQx2TTbqAwAVl4rDOqO/CUz54WBFJ8SmQw7beNY3tasqbMnQr6QevUOa1B3zOZuc+rPFnlodENgP5uNxoQJHak2i5pattL2QkF5JcqLwbvilkKFPMlKC/eHJSzLX9LdDg/pbsi+GvNXzPBJfdiJcVqA3j9suvTE3z7+9jZI38XI6TAO2EYjmvcfr9+8zz7+z9ub32/efX57m928/fDxcyBAWFhSzINUUQ9XHIYZFrYK5t/e/28czkFAPDbxKOFX+sf7sut/39LBZB3KEmXc4cG23BAehSV250ZXeSGzOmwhN84G5lBHwBGYUwCiTA8NS3dkTy9iQCNxJrPNqx//5I/Y/A0zcSaD8uOfYUAGvnQW+fpP/l4qwCIjZzIoTb91VPGDoEycyaD0zaFl/+2Ii0B4JPZkoKp8swk00Mya7mPtid3DA7/VwJgMCMpRh8Dg3XQ8IJbFOAjMyJgMCLvdw26923dqEBqROx0k8lDWtesmCwhJ4E4GaVduNpWvu3Ahs6brO440DmDXwSRxQMHYs3IErXeXWdhSgFjmz8xxNcMARWVOAWiYPwPAiIwpgOzy6kuQPyUyBgIx+dpv696ROk6ijPO1keZfNF342H1oCnQHvW0Oe/oZcQNDQCAyJgWS7ZBrngnMyBwIyDsm5YKCjkjJguTmAAb7Qn+nOwm2lPlilFlTfL391lWW3QBjYkoBwPlWx6Af9/4G136+TFD/2B0nNxlC5U4B6anc9PanFwYkE1MKAFtSPmxx+wwBwcyVAgJ/h1sfdnfI7YWAQ2ZN0kdY5N97pp+5kkBoy0fXXXUThpktBYi7Ki+++EKYmJKMjG3pbwPOhLkKhoLAo0C+ECamZACynuQ775VfZj3hUisA8bgFKQsSG5Oyv5qwXXFJURgdhz1BPdsIdZK0EtBN2+z3ZJMNK58vYo073Ygo8u7Ai+BsAu0oC0gBjGd8K4tyn7ue8BpAqcwpAPGjZ9SdAAMglTkFoKJqii8Z+XNftrnzhNaAycCfZKEbI03ea93Cl6Rj409NxN7seVxidwV9YpmiM+gdxrR3XO/wi9hxw8IvVkB+4RcBTED4xQrkS7MrvXeRA08K9R0dfyTko4iMKYCUtWcoV4zJ1CGBXBccjzCujMU3iOsCgg3hyii8Arj2vVxefWkey2LLCjR22BMscUdnEBAITIwY/rtzODCMYNX44KwAFRbkeKEXXPQ3ZyRlUSeQRyhla279YPdsFp0LtZ9K7w2HphIdzOOcE07LouyaY0QEE3WEnSnRPek6XuURqVdhiVDOi7c4IuqL3oU6pjOXGefGduaF3E+pdHxQlcWX5rV9ahpo4qaEoXuh9VzM9K4Zb2wAtG8jjyXCxRY1iyxxyh+bigqqyt5xMCNql3ji1PND42HP6VgJRQAKlzcE9XDqepv3n+l80LFKmpsPdHTmD273wMgV1wNRERtY7wX+YMTcZAAW4o6CBRT2ooILkumrvaGT6HNXdj7fTOE50hczafX8XmpjY45tQEj4AxwPSHf0s1IfERXbAJHJQtICvG8b+9tEK7KROy0kXjM6HNPEnhhU3n6JATWyR4MKCnXbYXmGu03ChuaBD37o/jHOfKKItN+V1HSTTbJ8pA6HqAs6s2+tAPS6TWASqjYYPDmusxZzTOgJ/EoQnKYFrmd6RYO4MO/biknqUZrwWHYlIurv24ZZ7FqNMDlANzy9ro/7I3EcyfnRdXq6PnIzwdMmnrgYEfEEMIkCIoGJ32pIQva5GZKSWcHJpHFfhyc9axwbWoPCIeFag9nZKi2LmLNtOKaV+XtEvkFFzmwDwEb//Pcnb1gDz0ktQyF4ZH9RJDD8gDne3tx8vPFGM3Gd1CQcBHo1VyQMLYAO2jB5yU2Q8HnJ1zWNmtf4O0RuXVWOnpdcjqY7KtGaYKEq0a5rGaES7XeIxK+KCEsl2rHmljegsfjXqe0ywvDJDK+ImQxgORR5+ceT92I4lFceGE9roRHHbCL/eXi2gc1Gh/3GtWsA4c28p7fUAGU2FqKgiclYY4Ns9mLJhQMxTqyntxZHMhvLf7YWLAH5hk1f3quZANB+mcx8Wh9RwDL7if5jUWoSYLO86MtH4r59ZIIp857UYgKUee3ztpfYHqu5Lu8ax1bbgnHkPQdzMSgepQmM5hpsAZnLpyKBEah3RYKVDQdUJPD3s7AVCRY64jwXtyMmuJPyYxmQw/HJug8akNhuAy1kdO1w1HS2A574z8R+HM5sP//VQTUMdB9jm/eXzqrhJqgeVcPXtVlQ1XBF0GIGm512iJAliHBhPr21RiyzwfwXU8keNpvtQ0alR6X1I1hrL4xETEVSk6n2rjE42vJyqDdnDwe7vmu2CDm99RRMc5/zX1ONdrLZtG/2pX+Mh6OeWE9vP45k7n7+C4FgCZuthn3q5cF1ixXEOQjIRgGnt5uAZ7Ze4MIg2sZyKawqu/6SX1n0RjyxZxP7Se0no5l3XP5Tn2IVlO0u/0FtXtcBuwkZdpYtcs7ImjOs2az+QxoyGHhpvyg3lI/OmfsmYDWe+LOZ/7QBcBnObEd/J0Y1jP21dLD7N/KfiweowJkjUP6To2oYh/1w1dZtkD2qrR/Hhlq19e/9e6FuHvCuAEsXSXeGPF/ky+65LuicsttXJCB8LAvLVGEnta4N22xof//Raj+czQOPNpQGncchhxHUHPHyX+zNprJdybokXV/ucspwSer8riKby7CzEC4tm6Vlo7TzOB6xgpvt7T9v2E0I2Z2QLw9tvt++fKiaO8cDIGNrJgHZLOC01lXwLIWQ/Q2q2sbir778R7l5yWJs1Avpygf/8BkTkmXlJpOFnNxTVTHNeyf/Dmq0k8umRUXyNktiWZOo87CvhmyuCxC2GQAs57R1iC+2NOIM/DAJzNxV/Ye+bBKM3V4OAag4xNks5HysOGKae2TYrl+zk3vcN47sOo4R1WDyQh1tfFM0swX9N1aKVZy2m0pI8IQzric4duQGUWdiUxXZbN+IlUlvrsvWpG0b/wjp3IqJ/TxsytHMdoyYNodmuWzH/kI3BXk4YEHCeVhwAjTfs4iYLufGuezIHpvWhf9lgRn1IuA8rDjimY0Y4QVNTXPZ0J2p1IoYmbP0SPbjaGbrRaw3Q7NcthvP3thWv45ZbDQ552FNGdZs1ohlRmmon32zvCjIvg84EwZaJAo8R4vP+GbTR6xMUNPd36Aj/SXzYKM6OBWSTULOxdYzpsm+30YsWqKdXDY91JsmQW9WxZyHXSVUs2Uj5mK5mSjbDncNo20riDkj206oZttGTMhyM1G2bcl/DqSL77iinDOy7gxrNm/EpKs01GXfrs+rqqwfMilUHtEiWOB5WBzAN5s+wv+Fmm59f8w57w9VlYWdv4yPkFnTJCknPt8ygJqPB/xNbDaV267+0QIB+cljBSKW2Xj+q5pkD3t6gPdljXuhzwjjnpvzeCfy7f2s7WLhQj645y2C0gw1G3d9GVn/yJJAufMwW1eOO7nGKPcpyiBj8K7J4IKCTqW0YPDLn+SyAy6zh2wBj7QdNvWY23bGMYC7W4eBMNY98R6IIl8CGKispzoKfPZTAIQ2CTqPQmaquOmP+yMYq8+qLhYWTFttpxd92SPyGQuqJ4ZYxR754QXtvlnhrRB4MGKIemCLDAhQjNxpIYXZyCIjFh4vmZF5TBQLKp01FgwvihEGRmeNBVMcWsaDLaEhYNE4042sbEMqxzkPOL5m3lg4vGSSPxKZLRYEZe+RSSQXCCJTLIC6efJRPZAnMT3d55Z14dVwkQ+d1dA+reVtHzDDClxppi5W78R/1hq50kxYvhAkriQ9wrsrhCkOy76oqPbLssiZB8jWIREK48qn/puAxpFWMGqcytBmIekBsrsffdsg9ig2hIKUWIgpO5gMzjejq4ZSaat5l3E73XT9mbDL75hUjGaW6PBLVZH6wbkJsSi/UIQ4w1LGlkPxEYJ4WwFDm9ljQRm/3S1bpHCp3wGeY389g/bQz6c03rbB7QbScIiKlBUgxhgQvSP3BFa0hD0riPiys4C0wNx1GK2wkBVEPUG5Ky5aQSHLLHqC4jX2MGunFZsiZT2ILNEC/VcKz3XlAolWFpgWeOus3GqF2eJquIaAysatA8ntMW03PlnSGlDHLUYCqJKkNaBiK4IisHrVBg0Cy1+BYDIiObFKkqKhGh2Z68kF8HJlVK5jOzNG/aHujGYCyxFFJMJFxBrgnOcnCHS4wxRveJhSaw506Ppr3uD22KJsDoR7r0pt3jB3vHJDjXS/zBAFGcnh5X/Gw1tkpIbn5eub0fl7+1hwsSN3xVGL3bzBg9Zr44aFhqpm7ACHr2zsDc9Zy9cBDVfX1/+DHirnmwH79xwFpAb2VG56V/ZzK7BJQPJ+RsqHLdKRA3rZJCE1tNndaemeq8JGCxyu0yIrNdxN2bEcCbiaUQ64Blmp4frv381QA3fwITC99/BuxGG7eC/we9rnEK+53ZAFQcnnTXzAAZg3PUMOXsCymq4WNYmc2VVJ60D1jY/YwAZFSPzg+sZIbHCDoiR+cKmgvizKfV47X04hACvS1oHsHdqxIQ4L7vgB9g3v2PAGBXiwcMv6kXW4pq5cr5WtSGUxyeMWh8iIyiHVhkwKj40POW7ZO463qCcxJo64sBj2jjas2u+ytrnRYMyE0L1TTzbZU1nX4QgNclLCRO36YXT4Hb8PKFSaaRgUPsG0Dyh3nU4LJGQ5Ti9AqAqoFkz4QqdesJon2ku7bemIPMC4RAGRwEwveHxKe6aK3qPfMKh7Tr9nDI6lpMK+XZJQjFzBEMRvMLy3+ty8eTe8wLKiUYnjvkJeXg7PvC7pzq0mhd05Meq+yMtsfHG2yHDYRWtxxD0tJCifuiaaSN1MTntuyi6FSSUxZ2TVBZdPwROLYYWGwrblgZu/yOVj3pbupw5gG0YxmSjmHGyr4fKonGUyrW4ut2n3TVfGW1aQck6GnWChLwrbrDq30TYXVPnzxLCJtC0XNjVlc24mBtB5lOMyTw5mA7r7cXe464q2vIvsMaKYczCzhsujQLOtMy/tdJv2UCcyrizonMwrIPMox2czsNhWyMSHfkv5WX3IIPgy+4K17zaXZXdZ1lvSlsOF2JOYV8DnU/dLt6rYUOhonFVkd10dMePk9eDVKyNnYsMJm08ZME3SbBvzdmSim9NT2GCqxHHbEY6scXw1o8rBMg3moo/WvoivZMfiMTdrgmZTJEeXZVQa+RPtA2lSRgEiMikxQEFuCCVoyebdju56b9kT4xnn/aEu2BJOYZopDT3IrKgdme1KdCqrAuGUsc3rrhKn4l2zYfcYXs6/YKF2pP+1ucvrzyMjQ2bAusg1MdhH1oLWiID3jn0jNcekWKCL0pdZtWT+sqWYFTPNbd/SKcx4XLUoEin9dUpT0/82h/YFdOBs0XjBGO0HzGZuCMjv0LMFG4jfrY8V/AD8BD3msAH4yfqEww/Au6oiD3n14l/Niw8BH2Rkz/7VZB/SfRYm6kXZvegOZVFuzDdCbagYf1Z2mcCfAtb7Jt8wf+HqyhfQyJllWSIon9qmYPdcg9AszOkA3R7udmXfhwFamNMBevOCp+N4sc27F3nVknzz/OKOkPoFXyo3L6jv6d3b3wxpVDMqMxtlZkxmNsjMRpkpx+Vdk7ebFy3Zkx4Md2AGKJeTSXJSwHzLEp/TcTp9v6BZnQvJFiEpZ3h2avDil7Iuu635uM8GjDFnAnOyGf9F3wRZ6qfhuk2TfA0MBfT7cKEmKaDZO3hx+aLZU7+dCnmxZ3K9P+DsL9B5ZRKVzaJSgL3hEXdfXDNXCgjXwz3B0UTsS/6Xryt3cT3fNWQy2AfN4PtGnivDc11s26Yu/+K+9wteK+HvdEqrhkXRe7GQ5Q1FHLJMlJcENl89boZkTt4Y+TKxMCcH9OITlL8fDSv7ZM3h77kOMAAv+i15UeV3pHrx3BxePOV03NLemG94p2Q/8lXIe3lgZBllz7jsjMrOmGzWS6ls9gf7cZKdbFkLWsZSfWxS3V8W+b4/tNwTrpueejFV8+Q/BzJR2SiKOcVUVLaISgH2M/2y7JrOi6fmUG2ol8X9lZz7A09lv6WfPu/5jP536n0R2uuYE/b8omt25In5TC9IRf/tvmw7Y4DM1jqqmxchybhu6o1ls+6M6c56XoSdLwGDbp7vK5t1Z0x3NulOt8L/nlf1wbs5wwI/8yaB0zT+O8yBJ4kDxmR4O14jUxIAlDpgl7+wpQDxz99+ffEb9IzFBoMyZr9ZX694AwmAkEj5v/JnYyo6m/aRJ8lIaJkhX4SgGFizhGD4R33xic5Fvlg4ZzZyJoMShCJVNIO0Xbnb+e9uRcYkQKq89AcxMiXx5Q9db87FbPXeJ640O5rNi4+595JB2bKBLYn/syWVv9c9MiUBIIX3sQAq22VXz21509YvghZPxpmlXEHf1EDmRGusrLYlTvQD8F/dk3d/zAaeNOq9ne6sS+Vc/1dnfJRrVw4/w/VV7j0XZV2qiei//Lt+FtPnxWOxn9hm8rqp70tjfEL42XpuiXtgrUpzvKQWsXk/mdZ0Od5GI5SBm3pNl32LjlDVwuEYTVnriL4g1ME5pTVtjiTSWDOyDfq8gcXbVGULBjHm527LrqmBN8x6b9V4wm0w5Cr3Uq/zBKunIu7oLFFs2QkPbqhqLD7KpfduRcMmpPdNodxpELSrNPi5B0waaBTpSBKoQfW/VmNR67pLo7EOYKH37aRty75pjbssN4orkd8HjyOvL1w6FIHJUS80CFDl3e9kTCJ/QlhgXkkzJHseydX6LVfrTl2sMQ9w0/VcGcfSd70xJe69Cq6BPTWogB6s4JolpID2+gfZmbyVKsuNwl8uP1nn8m9fvV4e+1GtfXsoxOS0gLgLmdayNN3airkp3iSkDONJWvXIDjKkBuEcW7XI7iqkBeGqWrWoniqkB+WlWjU9sN1MVuRVdSeu8ZBCjVy7l80uq5JCuZftxqE4y5B+jKPs/n5mP9n6MT18ZHsvBVxksL/6uMf2lgPeMdhsH89Y1fz6q2+WGayoqAT8NHah08dr9lAaoa9vHh4qcku7SEV+bZvDXr0BAGm3MHpgsfohvqqvoB/oWudwsgUV3tKxORfSN+fKlZchplkO9+OBka7ZtknBMVomDYmO9DfITyeRhg95krdYjQpxqM4H0v/G3Jc77t3d5E/8qox6Lx5cUx3cEahkYRgkGkeo9uy+aprNL2VVfcjbL+xPxPcAmAxORvk4rAw+PaM51P378o60fUncn0UjD7XEfdOSvNhO39ipWKcP1cw9l7f/OeQVYrmXaINHX7PbH3oChqNgY0N8Hki+XrY5b/79+ePt9cebt9nnm3dv3t/OAPgD/Dv2dkglsW6hzKI/vn978+a367d26ROVVcHrr378/tW3ixZ+yvC2fihrIl/WY3Nt91L9OVT2jZRPVpPNfw6VfXvYk/ZfzZvqgX7UfruD1aiUdo1C2PMT3w7cQpmPhJ/xwc6+6c1nBKq0i4nS3EVFbN6REE2XI2qHUGaNCOltc0YuESqtoXhNpXurgTHpMIPMWQ+Q1jVwBUOwZbbWNDtTWCMUQrmqNWXWpNRmReohAxjX9Bhh1rAsqqaP1RzW0wpUHSObEcSZl1vsbd2bx5SZEm8mc9Y7i9QLS6I7ADag2laMwgbAWYDCDwZ3wbyNe7GwpQABlUSwIbCWQPBTnxcF2bP0ivBiYUOisycG1ZZFn3XkSwlmgEXC0wSlABrSiRN24H1rTDpt0z6wBCo3emPsPWv3pm2Fu6KCB7b8iva6BBjwJReNCD/xWXJ+mqU603zqiMEoE8+p5qVc5IlUz9uB6LNa27F9FnNjxa/17mrsaPV9c+CrR937QVD5ImFU+WbjawWRJ7YPsNgaleSa6qU+IPBEqi9r6gHn1VLXHotBY4wEAl54A/TbT/bQauHLb4Bex8ElWjGmvAYAAV1NA2+FcVvCizllm/L+nlAR5jLXkF1gEYnABYCJVw5ttgDF1i0XflmCyv5AS5K1yg9+PYCeiUJrgfVNqPcU1EmnhfgZqLOeGqJh7PL2i4/RJ3p/tdj7QzbF7gtEOveAGFwGezpcS69+J/Ic3QyzctfxpM6/4LZ7RvvGXEvI7huNXEc3iKB+6h1fexhFRG81i08PWThOZI7OnUUSMgXYO8CIExLJlT0cBeIJvf6IhWUPwoXCaqFaTOD+ylZ6yWNrxwq2sOo9XiupxHX0Piuonz7Ltx4fRESfqO+aEA3912vp0cWk6sVGgFzISgBbTBkkK1hM1SPPEIZfH584TtC/uWp3dnXTBxpQg68xhswOLSka8wMjyItUGWOjGo46hFBQA1N2EO/Lsiifj0s50idQm/Ut8fJmBZ7YoQCWv4W6o73aLVpx05aUiA7piE29TUYqeN3DfQiigS0SxD39xNkcJOA58FgIzwMPLCESGlhKCQBir56E/yyHvmi8Yr8LR3SwDaoBBkbbrMW+8KZmtfOyHngiDtlbZIoEQOqNr3qBJUW8f+MX5RB5ItXzRE5ZJ6R48sBhZI4FdOibXd6XxZgq0/JiF0IFSkhiqy8+GxeBJc2HYtekAhAsfCnmxcx6kcg2Q0qcaaFkZc3PjsMhCRKipzSvM3F5YvM/BcfYCXV3QDcO/s4ABsR+kOELYmZLA8J2Jc2Ow3k9zRNKwDGGxhi77PPXRbtDN+Q1zag0HwcMYI+d7B7yxasbb+b5zHlm9ljfbM7/WuXP3ZDxL8vvKRi6xHQHP68NISu2hw1TfpZrl28RnczAG+/l8TqY2dCBiaUgL+zyARIioRVV4xX/muhjowLblq7MtE1DBlqf6cjAGh0yAuvZgnEb+5sZtOqakE1HF7y88hvlKl/s8DbXr4AGsOVdzorBMqrWXcdG523gJEnDG09v70AEcqXI8EDliKsOgkO8TQO+ANcTDZG7a+Q52oSCmNQQNyRH3iB1gJQFpYM5uBJxCBUZqcFF90RdTHL7xfZEXUxqiAl6oklQOpg88E49oKkogVfAXuCLjUv5ugWpnAFqoazc7ZvWZycgMSW5f+mhfGaIVDxmPAi4BKtzJtmYhUDROWOtAiXog2yh5VCwVWz081G9QoGm0F8SKN5XYw1XYpMAwSX9s30nOK1JEoCIhID2bmyMuaSxnTtZoH2wrwfNnUgQPLoG0wmGAgPefbwbrlreIm5oiqT4NyCYaymaZMezPgh/xMUTHQL6zhQAQTT4UOjnA+m6/MGIRCLAG9f6ykWXiXjhIiOFPCvjKDPo62E3BqXIeKht0AOfYqPUGINqBjVwAA2lxpzR3aDHksQdpehQb4yHSwZVI2lMZ8D2hUg1/w9WD1w6EKXIOFkZ9MDTE6QGGzUyKXPfCpe5wEyoe+MxhUHlHj6WQNlxT4wlFEyaCFw3AaWq2ObYXjiSHu3DMX2ua+wyG0doaSh+thd0Xy2cWAyO3bV1S+MA497UeMOhJHVNjLsKt2VGzkRQoGsgDhzWmyDeIO5b9GojghjZEoEALys6UNgvLXrDGM44Lj1miYEjC5oslEMpkrf4mVAgj1C6IRVBd8GZOMaxeQLunJl8myfbdTOUOnZxio4WY/Umg0aBPOZLDjd4K3RDJYaYdXSYLA97j3lF5fFTLyVmOvz1VzXtJg3Kxd/x+xboNo0m7cJ6eUYCB51L5uYjfV2V9ek9RtWe04Dega5RZghX7HxnqavGPbHEKAdfVxo+pvVhJaAM63wB6lzOl8RmfUc5fi12MZFfUc7o1Gku2wZ+aZ03urfNd1D4ioUfWDb2aFDj/BMGycAcDQjK/QOCsCb+8VC8IV3RlnuoZjuoX+aLhlGwhajwRiGxxc9PcLwdnqAcWShQM5Tt8YppyXG9W8EoBbNe6Ar1hBe2IC9GOZz7QtduSHsRqx48adK1+x0yYZRbzpd09b5HS6gh59HLPQ+U0MZ3niUBXyLsGAk1HtwnSIaREXh4hLKT+9zIYKTAIyPULOk8LTLMkmEHRQAcNevYQDZkKGPpxT6IS/mQesxEYt0HmHV8HN0QqxaVKEDPp+lt2S3ppaGhtEYi8tPDTXHdVEKC6FH48ot9pyTUjBGOmWZpI5N4euVAKOR13pUPLfX4lQ0dJPJCJde6lyGBt4gZQHFfVtXP5D4/VMJREghCoXYeyEFahyTxh4qM3xWh2sTiox9bsUdXjCjZY1aJu50MKg65lAy6Ia7kUyCKmJxTLjR47THazHtyUKV3yiPw+EpMawWqw2azwrvU8BTi8wzcqS+jk2hz6LNHghtHMGM6LNJyjUdirRRpxoGqC4PT7JVm6soMHmugTdn2zwE4J77gTyUF/0C91sAfQosppxSozDOVVPTHN+SOQr05wGSN0jOLgTC8EopFNzokgxg2dxiisR65sRJ93/lSNSovmF8aLLRqfParoLxXeBzoq1tIHHAQDcaEDqBhJhg4lugCgIkj4hFYgs0uIB6BZjweMM7sQoOOMeOxSCFml35sXnmfoyaXTuxEaDkBRe0ZC32z6KkJTLYD6gxJrWN9N1IoeZ7g/ZJneifbobZ4mwZU6JEiHX9tFNTmlRMdvpBQ0DG2yeT7IPDHVMiD9bqykIAIIpKPgN9XywYOf2GfJODwNxaTM1q+LzIno1WPko3Rrg2fhDHaORL0eWULxeRbHEhM2QIdcDyTBEL6XU/xQRQRL/Dh0LUxRx8c7fBOzQdpzuTU1qDGTE9p7R3B/O71q2+EJRinGJ1KG2xhcVCeMMKNFEiTtROv3qg9pLXjouPRaJkjadu9wNiw+FqCMvZZc39fFiWfLlDGMDIls0cIJAciX6uASZlgm1iTMUVaxB9OSGoo0BpyPQHYBHodgch2IxWj6xeALVQSGsJNNCQyjGwjVjU+hSLYSvYMh04c/znQ1dhQXldvrcaQrNW+UCxIfK2g5s2Em2/KlxnZbrRyj1yd4MbElhkL3pW4EmL5WkDGpOZFhHGY0iEm0G3MX+lAAaatTIFHSdPogmLIzhiFAs79BS8u1pRfUWg2Td3f9nTHwEs2/7PspAwq8GYeYEuEypV8GMQVkXMYPA5p8g3fVwnJmGG3SCJOZA0ez7wjrPB49sdhhzjqNnAkwmJOCAYfwvnmAQNHDZAeEh4z/lkh7bqVpDgOxfjMN3at+OsN/skn7Zr1fEoO1V6Zk5C6tcSxWAw++WLBkLEgrKgOLHjJpGLmARurDx7pptMQQf3gE279EBBslXSS2kOnTJxAp4/KeMt+aknfP183TUvncDo1oq1sYgzGsvdHYWIJ1v9A+lvc7SaBMsJfF3V3aN1dct3FoWXEn8Ya8+8QmyQTS7Dd7xvmb37Ke8StI4k2WOPwkPAT9v6DSh6st9tS7Cye1hww66lMHaX1N/InwokUKKO1fW4PmANklTxYL/P2PiM2NzNdpKb3edd/HMOAuBkb5Au3Nen9YZiZgjGUnT8EI0/MvM1E/FzeI/wTmXj9IztB35Xw98tXXqWlrgAx8DayQeyu3djsCRQQAL0yKsQARR+u45GqQ+1Ndz0se+NDc+xoM/NFuGwswwEViQOgkocPM/rHdV7/xP6vIFWFCaYaeSInXnHa+O2wu8OEtC2cwWimG2CICOtCmcplGyKEv7KbFQhvTaZOhKHsPuVtTw26zzFGUMkjFpw3RV8+jv4YRrFCH75B4RI+N6z/fKyn3vQTf7CG2KvYuZOg8kMRr/W3pvdTLDKEj7x+S1rs55eJI9srv4NztHUiDtZZMAFY+8rEcTo9PqtGH2nhn569bLyQx+jFPOGayCLmLX5kcKM9Y7bMXBpHeGhpU/afcC0VScNbK2QRReo1sQTrb0k3+HafUa+6VPKI8bPbH3opieovTUv/94VsfkU930FIWH/b4gJx5SJYfHNUXWinPCdB5OOPlA32KTsd3/A0j06Stt+jqvUa7Vc3br+xs7hb7MmdzhAXUaau/81w3/q2x12MgNhiIyTY3ZJKHqN33Pp6qjdxxU7Jt1LxXNdAmKiDtU7nkfxQ6D25R2yRTCzhbk3eduT2118Qns1CGb41DHztN6q+mv6yzCLfo2YPTQDo/4zXwpG9QCWPHXo/Pb9vihz31M3EEu73/cmKn7zphlQgiIar9DEt/4mtg5/wVxdMLDH6f2frkJ9+jSVG/z/HAf2pKev+zeaPQ9ezSzl07fodtyqjZAQf8w+0bx/Z/+3KvsdMzkae8N5JRSD65EAVc0xyo1QStK3+N/gagpBllYRl8Izvl6wMoVnO0wYq9svRhtAr50gD9QYX4YGfLSHfwEVU3QHfwDGSrMir6g61x9DoDctt05OCInkRCW2PjI6FVwCydgRzvjZ7r4gu+WPdAfncoEtQ48e6G/XBkqCoD+gXV1QkjzAhr57oDCtg8YGREkHfPDxU5Jb2vWo4KbnBziwWzhh0YR41BOYK+mHxuH9EedzeCqwzN2ZJjmnSlUdBYP+mOUIvD7jjuaj2PWiHeiu2zpB+DvsRFepkw/aBRWuoE3XHn4/c5E88cjKETHAev5U9JU5ZOgqbxpJuwm0Odf++vCNtj0p4pNEnQ8Lu6ufFdvoMbig6QzIs3BF5+59DXmGWZok44ZeZA1D0m08xANQnghijliE5/0QnxU/uDzXPBtS9nH/jWOQJSWyonF2Uq2S5T5fmDclFlx+85L0Z86V8FnOXDRLFn4Jk3h7uLGLHX+2S1ZqFP9FBJWTQUEv5DT9bRcrX9htjMSxV1sVAZ1kxRlzQuyAxmGnTUzlDmHZFLZT1W9PUattoT1V3Td+bKwxpumZSH2XGjn+9zfv3jZq0V/zJrzvBZU2En/HdaVN2bHuYganfVakXKofFQq4M+1RJzq/toBTL9MFqodoOmj73Q3e7oo6uGuytVPkXTp9MH6yWehSOvNE2EDZuH0jYCih4AKi0iKMkuBWA0XipuarB2UggDu8ce1LQ/XXTorWqHOEDIK++NI9lsUWrVjmCVe/zQ6fnKbOpVjniVG/o6BJzOTs1LwzBijdt/pTR1Tir8jtSwY6ANMdqPHHq2SLtrV9migMwrKfeEFS2OBDcgfDGoHAFQ7iz+4FyWYuRNLy9dMBkw1dkqWykrDfWFhv54mCw1z/ZbqjYhrS7iS0YxNySrM035QEHwcAUDKAo26Ly0q5yBKtmiQCLqiy+ZN3hTjyHs2k3MEX0gAPLcemNwcwXDOMxb0u+Ux6TIzb7vCh7YyE0DQrMGw6n5On0xDQ0WcmPgMUE8VZQDgnB0OgeH7cPGAmDFRlTltoU4rOWBhb/M/g9ttp/iR1fsfLf5SvHvTpM7b+yG27Ef4Qqneo7LIXjKO2WlCIfzI38Ml6HGa6txVBBWNfukqgrGWTRjMwDqlhFQA6a5l396dBtyeaNmrXYDtDAdiTTqJqR9QFm02jIwfhX/kgCbGPmO4pxDKqRp36jFBN20K94yyrtIN2JifYoZhjVzTOpo7rAyDqBBNvLLwm+HW4MUl/g3zxdgLFgoAERyHwki5j1zyZy3N6fTQQ0AwpE0T884j4CdfDSTnfsbS0+wLBpFIjDwzikfSRt1jXFF4JzbFWO8F1FU9ek6LO+yaAq8fq+QuMJDzPmcu5357ctPY+EXRUz1XTwNgDmjPCREHir0L1NpE4GYSwJgbSCSJ0MQt8c+CiiO3YkDJUjGZQq32zw1hCp0/UJLWO+tU8Yk+ZHQnAXLjacrIB1iyPB4I+VAi6r2lXD9YQ13SE3dB1hD6gaiONkDS4IEmsNV1lDq30wlQ0TAfQClBKAVITQplyrQxi7lElpqa3LGJQRO3j9kOoBWNcOqBRB7DQl15rEzFJ6ucnodUMtCWdfN0xV4fwhhO/zlEJxlz/gdne4UnFySUCEO6FVBTyiKQyFAl853pSN7IhKgWrpPDeQk3UJpZrcK1yP8Kqo56UeU1VPBuH1wNkPC6KynhcWyihUKbJvO+oHY27t8F1PrRUucgIw1C46YtcUIMzfBBeOEsFHd1EjDNwbfh1Oss5qRoV6We+NaqA01X5yI4TKPyXZxGO78kR7om7M1c/h5q+QX2cADcbfjSWo7BFwsApV5MeQ0/TZL8apafgSqJYrc7vU68W5Y7si3dkgw7kzaTLlTVs+lHTTlwVtG23c6SGKCcJRqIBiAaFAXMUTbJgw9RMi4clX562BYC3rQOwnUorBWL8OXIsmPNRTY8+Z4bJHwWbv87bP2A0BnO1F8mQgSL3BQxCI00akN9j9tEidDIKlKo71MgmqME4wKEdNVcc1F2dZ1SQ2+4LbU9gKGUV+NKV0EOJ7wdWDouZPQ3UO50wKFOhIC0cr2OEBy1izI3raAyr52Sc/d2nBOHspxWTcRjLUk0kCZD9IwwOZGVID0ZIBILCE5QPAwPEKtltK78S6DDwHw+7Q9dzw/M4xzoEwM6abEG217qzzIrLcXbCPN2aZ5kd1XXZfttQE+T0FRBem7oD1/hBS0vU4sCKctdNhisJFeIvWMtQO19FZiToSXlE1yKjWRJnuNH/b0nWdtjAj7DoUbroyMCUMEcm5B+wxmoDMA3b15oJwNhBwTbjYof+ADAf45jRIFySjqucwJu5CJgNri+36uBKS9iuFHQXFEUEdRPr5piZQZk81Fhf358hzjLEECelwbUi+if2MsowU2AYPIhiWwp4OUUzv0iUktFRE79IlpMMV17tMMlJg409VqAODf3incqQLSuHX8fSrN7VUVu5YslHsx1nIE18LRAGYSZMpH1O7ed3T1HkS77j84Og86awjJYOzP4n1TgWHcCyRMcAVYn4etzPT38q0pG90foOIDI6orukVKIlK4ogauF5wovI42uFQkXe8ilC2zTvcjVqNJd2uCHvpPfl9d57Uw+NelESfGgY7GuCHiNSDoGPUB5HOmhrcHOPhx+Xo4LCNOzXEcUkJAmjgTQ2PnfP7QBrpU8PYkK5oy72UVh6BRmZLDapg70oLX0wSVwwkMSvWm8OmbK5ZIIwnLDfhUUg4JtnTB99YHep+0zyxk5uiAdJ3mKRfmDjNOwsVv29Q0KxeCwwGqLS6iUa1ZicxpLVSfTC3sW3lwZAqxfQCWffc9cQYqTYCMPNGwSnrjM5tLXSfwAhD5vFVLw6q//714y+c6Pey336mM1vH6gAAjiJIjB9og+c03uyK0XYBSzLbA26p/dAqAVRYUiKoYwV3y1MwB0JNAG7SjgQKzDheWH02qt5w+XBv7u25lRxwTTJWgjsMCXABQQ0ov5OmwEEVClHmXgnicGcM8lMdCCXmVQHyfgVlb0WhFCWsBlW4ShUJGZK0EnRXHkEHXjCrYHqQ8NM6DEbPZ3YYiKKDwYtLDAkkuB9i9Kw1IrxDAY1Ts0h7rlcdq/9ZqUXvfB4BvynQuTlgcHnqKx8QE/3RW88VT83/Gj4x1tkHyL6vWgEY+tvWI7WfK54/P5zzSmcfIMPeFOiVAEgElqNbYdLtznKlC5hxW0wxJv8IsIjMeRLDCBDcudHM9hFbAR6RUSe0GavV+1rKyHx0Y+ko3M+jdVGGtoDX2lhOSl9byVxHN5Kgfp52fVYdET50dZI9PvqL7miBZ+QAMoXt6JYR9btzyulCJPwO01ArBlpn4TyZgUYIrmzssIWmNlgvKNuuZEJ9G76PeazRJSGYe5HPeqY0IuLaP4TRdvn/WHZSMMyW8pmptYb4ZlcBwOk5Vo5kFa54NoXP3DNA9n6WB+AwPM47kgUGzfPC5NMbRtCADcQsyea7xAAijfHoNpERzLbx8QGVRthsVOR1QSp/Ewl8p7HQBGA2kM+kKzfBGvfx2dxNDMffVnLN877SxxQjaP8XxgAU0zvjI1lhVI24kK4LmGBb81ZkDUs7DRxWQJO8xnn8dUaGgMhoYVhxlGbY7VTMiaiDjKWyn8piEg5EqiXQbHKD4t8ogW6W+6XS0Tw+I5S57/ksZ1CzzHFmfn8EjjALP+Njyxuqs23g+15iyxday73yYHND6uZQkSNNzcg6gYRcg701p4C0GE+kR2ntoG3J9O1I9T0t9wNGKGK4zfvLlnSWdM5SjI7VApvIj9LoReMcMHVUS5higUvLbG8FUCCIO6N7uhYTMZ/7d44iCCMjsWVzZ5kvaB/IUdoF4qO0dtI3Nxj3dWeYln6N7l/H7MtzL3a8GBR6MZyAhRfKPThy80t9i7NkC8txerSkdf7SOAsorYRC+k2Os8BIeJR2M11Ta7/HrU0cHuQjbZuny7FEGEq/WFPsWG0WdS5HvY4UiJOvIzYQvBhK8tbLCpzj2GaQlE52+BbXB+QmWg9k2JWDS+urO/08hPEgSt0l7BKy2mWL6ijEIZ3CLC21ezJoY4yOxTENIaiclwHc+i42DrwC8kgud7nlXYF8E4O9JMhdJX/TtX1WOE+IuJYvzbJe27708NrHK5PHdd4lpfNZLc4GchNtdthc3j1f8iqCeFCb7O45m3iOZ4tF7WwNnEOgNtQajbnqnuvism8ux/uy+MlyjF4wfl5AZrxve8z5wgJhLnWFc5dtxrDbz8e7HPEe2buUtc6GcSQFlw3j8C5HKuacXfJboz7AGFc2cR3TIovi2Si4+UZvLsIupPbqJBzcwHN0m1C1s0Vwc47aUOtzscuntqHOSl53T5Y3z9KEODwY43zZzHecuVhXPdsG566aGm23T9HQ6afoAyw0cp7GRrLyedXCzcDmpsPRcJ7a5E/cRCORH8elnzUuJVxx4UgBK3RvaPPIDifZOlVTskt71gQR1cjJ1krGmelZFFY0iVG5696QKMXcbshIB0rWkq58gJ+kSugofTbTH8cgi0rEJQfJEkLjrGEAXysMu/IT2EJTPO//cBbRmwvNHKS/vG/aS1e+D2kwkz6jPMZcv2vOIbLaJViEM4naUsAgf0ZiufozBI0jYRLuMM0CCnXC5gnKlXsQCc2UljANwDFVNvNJrQmwpIE38qASXiUc77LaebQjA4BKQ23Pymbb5UVB9tidmvyOTGA9kvdg0r54Esi4oLn5KGP57GpltEfe3BqVL5ZCxtWNbUcZiuf3vHRlBIURw/lBj2Y0CcJiOkfhNKPpZGuAyRzqTcmyfuQVD7B0Xr1N4OaBnu7YPQ4EMJ9iIEPWoBnsm0OeJ8hnWzYxHHMryHXOO0CcwyK1zzfticGjtKU8Se6+NkuY9lvkyTUHCG5fNmVzyQ7xhwATcnBwtqEi1MJ2pM2MqhlbG2ve02gtdtuG1Bt/y0xMx7YL14u4hgtYZYBttQlLfu+BaiQ/oh2YRsQtP90CHKq17Xwh8oAy0R+x9Vwl4n2z3vwBrLX9Tb8l7eV4ErYpO7q81KTwmzi4jCljiiLjiHYCYSCew+i2gw2DtycrrxdpTlnEqawpoEA8SHMYU2yS1Zb4VXuAfNS1W1CJrKAsWQSxjAeOxtMNQNOYs6Sj0I2CH2ZhI+tkg8k0fnx6C37IDCEOn1DO2JEHxiPHc0y63QkKDKNJbrbbA4TfYdlcMcdjrPV8QOUtlo9pxOa67TIU7vE2zMJ2bMuMmrE1y3XTTNCttiEMzKUUtPAAyrkthf9Wt5QBALbCimQwkxkc0zQz7mDo+7bZBZtwEDR8cibolNa0Y0FkxDDN71Y7WW3M3p1eWp8lA+1APktexYbeD5J1myntdtvooc3rAAstbMe2z6gZ8RoZsM4EHbzair7V6psaO509xNQO3+Mmq6CsZppiPZ/ZEVst5TR79RoXVA9LZ6bHYrVEZkdsuJTM7AfkTanQNGZ6QNaUwOyIrVeTmH2LfJMXn7/MCAXKXHZkixiyl32LvN+RMnGZhs3IdhIr6UjmXRTOUIamWB/I4I0E5So7onUM+cpevUZeq4tPVaav8FCSsiOaxJSoDOlepElRBiIyJSc7gWHkBGWWJG4m20QnJ9O7cESZ2IQDyZh34dVXuFUqXVYyw82EmGLkKW9ImHOSvXr9Cmei2HRkGiI9EdkRzSElI3v1FfKVRFgeMk25IQPZEZsuZyF79TXu7lVsAjINhmWPf0RjmHf7r77GDYpEmcfMqIw5x45tGjXv2KvXuAtokSnH9M2XHt8+5tZPCnJ/j7z9E5pqTFNvSjJ2xNYrica+x62p8SnG9EnbklzsmGuHOcEYbR5uFUmbWwyCB2cVO76pzJnFvsLFUFZKKmbwkNzpxI7qsFlTir16hfXbXNnEXr3+YcbHOX8Sw3GjhpfzLxydrBp+mcILZVQ5uxTaOURe6OSW1v0kx9WsVsbpQ+6nOL8KFTbANbX+XV58wbRepF296bMy1IO1qdULxAXAt69eizeh6UbhUPRCmi0Ag0yKb6+c6IoRiBMjoEygC9SUjTnkiFOXRKlNHfu2fBxmFavu19+9fvWNlpHPrdys26ulQ/oll6KZCq/l9Vff/CBoye8q8onUbkULYaCuTdkhlUmUgdr4y703LN7Sld3Pbf4kvqOABoOZJ7S9VABtwoe8dc87Cm2gRpbH6YOSoQmaeyTSGBsjFSq0ETa9/c+B0mMsOlMGamsJk+LSNFMFahkrMxJ2QwCjz0Af2l9I/4EK+0xlXVO/Li/F0Am8aJl4whEgFEbJ/6Vpb5TrJLAmiThc561UEg1WN9EFahoe9twyl/Lt4FGKlZIBtRBT6IhUstTaV8QYPUWzIazruSdTiTR4ZUTrk0mj9eHVhWvbt6Tvn6+bpt2UNe0OzjaaGKK+5CdfBDCbBw7Znyu76Y4gHQ1Op06j9mn/j9+/+va1vMF7y3LHjiviu0U72wZMG1GJwrrlc2r4ePcHKXqXloHKX9O7j+7WqDT+Wlifd+vRqeya1DTeMk7FbmqswESM35uPuSZtMSVQwYXEbOmLxvZAQfIWPoyFkQxc4RC0T6B+QsdHMJMn/QwWFegPAbQKvHxH3bz6sLuzHGdZUUn8yWAVbOqFjxZtiGbWKDBqnOytlE1cmrv5T9Zu4BU1WcThwyZv1QThKvy5wWad88/pmiGLxDdlQQqFgdjqCEWBFK0LbYxG0xixafUfE8hhYDewR7f3mKKsDfWdksRQpvQsvht+v6a+1+fmtm/FMMr9oS546PWlmdBv3b1tii+kH0P30PwiEuEn+PFxFF7qxcJhsZ6EOPCwAVSNfc8sCZhgA3ZY3s954JGYjm6NRTv2YZwkQwAPnvD5m0TkObpFZuXYbMaSiAU6eE+CkTySloVgM3utDh2cmfvoNjLAQB8QS9JM7QEvCfd0aw6nGNNRLhxHN9CoGpsUXBIwwQZfUOxIc/AZTgvH0e0wqsZmL5YETLABO9Skf7lvLNmbdDSUJRtZPE6717HMhAV74USSMLcdsM0///3JA8pAfXKLUBjI42mJl6EHzPD25ubjjQeCif7kpuBAUGfWEu+AHzDGtun6sr5vPGAILCc3yYQF+7BCljA1BLBN2RceUAbqk1uEwsA+zJOYGXzIOSkv94du6+MJlNnIcXJ7jFDQN69kR2RsOWSYjrQv/3jyWXUZSzawnN40Ixb0XXDZNlPjbcZxFCoBMBmKlZzSREopQlfKXt1K9lomnKTrA+zUaSeZpzQTR4N+fqJbaWgN5Nc1fXlfFvJhK8KfktlObigRD/ZOtezjiQ2CHnoVffk4pELwgCZzndxSAhxk7hlJhtgaq5ku7xqfyNeEa+Q6FzMxOMgXgwYzDTaAzHTom13eF9uXw5sGH3ATazaznt5gCiZkmjDZaqpJnKajbK1PkGJBOXGekeE4JGwqMcBwQ7OcdrPXH7KB1GsQndxuUnUiV4ofwG7WCkW8cN4fTemzQvIyfSPPyW01g8FmVpXj8HPzbfZxVdMEUJlKap7SSmrVUa8DC9EONlvt/UYfB7Y/k3E3g8HmLtZNtHeNtdGGl65qEvZvmJmqSJxB35pwYdO4gX1sto/Nln2zL33iLRzpxHQeduNosHltdWsNjbHZaNhIXrLtki+2gTUbWc/DXgImbAJb3WqiTSx3JKqy6y+L5lD7TGgTYzYxntxuMqJ5Z+RjNcUaKJtd/oPauq69vH8ZapYtEs7MijO02Zw+iylkKCioXBflhjLSOXHfeK2uE2c2c57cjgokbPl3OfCsGAR6MD88Hgtw30bOc/LgFEjYzGqSINUgDrt1hz1p2YQZAFPkPRvbzaCwFZWN1luaBt5U2TU9z4LcUiu/5OWJi2a3r4hXvFYWk6liTm5VGz5s8U/lyovFbjhbex8eKI04n2MEIzBsRR2bWe0nC/zd++X47r1pL4f3pLzMsZddpffzTZuNcs7n/MEKEFsPWhJrNx346J18eWjz/fblQ0Ul+jhLM2s2s57eqgombBl22ZCqTSz+5st/lJuXcsFSH48uy8oNWO/0hJ6migubjFpzMzX7uGxpKgHrjdxeR/bUdgWLzbrSVputqzfWaWM/n2oBfib+lAQIW9AIMJ7Fj5KIXg4BoVCU2cx+XtYbcWFTg8NGnOzjHt+NpRaPddQ0SlGek9tPrNnjKp0Njd0Grt6zUKklH4PQGoSckS1VdNiSvIBdtca6bOx7gX1Grt9dP7UtpWvs3wRNi9YL7DMV+wt15vMQkALv+VhuAjUbL2g6nJvmsp//S4AZqelJwKmtp7wV+CbIm3E8Gpjp7GUILCgDqhKsbDepVME3QeuItXLBTDWeaWWOol4WqJqE87GiDG3O7x+0fCjN9LNr5qz0jm6FufL7eVlaqw/vqj+MMXnmKhcv8HWkv2QeaGCHpuzZxH5ONp5xYet6Q3Zd7OOyJU8DHNN7VQHnY08JGbb4h9miciNRNnWmk3YhD8sufQybqimnvwuacFEJqGVqd/5yF/TAdObHsKqW4/y7oEkVl/F8JvfNx2tpRZL0vCtb2pGz11UzyWxyRAZfPW8057w/VFXme84xpltmzZH4T25lI7A5HO8zSZhN5Lanz25eQHsWe3kRz2w0nylAsgOcLutnuk190z4cdkS4ZDTkyBJ/sifoUGR+apu+KZrqhnT7pu7IZ7Hpg2wTiT1Lh5oOZ2jsLFbKcTL8li4RjiAPnwVnBAg9oGqBLJOiroEoWAePLWabtrx32+lCJg7WqUY0QH0eKQ0gXc3ekqhc1LUQBuvqcN3tYqbTZhAok7TLnl0/LeBgTh/ZripDIiT7ttmVVE5W1tl9VT5sEdYw8iTCM+cnAfM1i0gU6tQYsr4tCaIn6gyJkHSk3mT0ox+ArKBSHxVpU/UO5vGwPBeIKVSiTaR/TLGBhaCSJ0JR2MsHSPOtsXpAlPb80G8psfriFISg0SfCscvrA23dc7bkVIIy4YtwILZU3+bQMuKM9z7ugIGZnqXvBLCFo1Jyy3pYyGwVhEYxq67w1RFzhUIdrJXNOW88+6eRJ8LuEp7yoc6rz0oGIhiKQh5shz1qtdo76wk4Wsde3H1CqRJJE9lWTZPm6s/pNOsp2twrcUrtLAXpp9HneVf/gvSSQL5UfZ2OI9xoix3hYxtwyhbiYJ2GNIWgSr/shJbt7fVytYBlxZy2sMoOF6Cyb6SFTJcAPyunYAojWMjR+2pFhqRqMquBxhEb0BK6o2VezPTmz2XC67/DB7Vjdvp2CMpjuLLatIaaNjCAhSNEO6rSlFO5K3eXScAMHNosDMxoLDN99EeQbvA59WoX9vBaDSUb8Hpn+mjND6S/Zh8Dr1vgiNa+Oewrs58JD3mBJUi/MIWyIknvpinSNGlKBPZpUtprtmVeP1RIkRcCublFMk5ogy8XM7Kr7Oz1jFAKi7It0G2ciWMUtk1nPMI36RtpI9TdVQeSQTd6DSpF+gi1Fel780tog86ZOKbjHO66oi33xgvfpr4j0Eeo7VnBxZLtnL1abGCLaTs7gsO2e6SN6cH8Qb3f7KDyxH1pX+0KS4Ry+Ha8Qa3hLrx/a9k9ocySxcLUXIUnQv2OEmV/IvXOxBEKt6U5DYBB3UgaNTnm5kv6xokxV+7le6t72pbmQ2+Duok2Zpw2lfmqt2l8jrQR6mpCNl3WkbwqzUmeDWpVHj/16pZ1cpS0KpPDXlX9Gb1JnRj/uzNnOBR/x/tX5lGlirqwjCcRFqDEeOlaVwIfUGKU7Emd7SSDW5WJ5OFKPRTGK+vJn+ZZSdM1Ukaoag/1l6zGKxTpw9XeUY+k2JpvS+tKBepwldQTadkZIXWFngDPSVOs8YSrf2qb+sFLucLhpdo0n1xTp+h9WZOfmo11nIp0Hvs34CoOKPXCGgExgoaWAvaHl+qRI171fdvs/FSPHPGqwSdrsG79gZqHcluXwsDAdyWWwQn7Tcc7PQsHrm3gvIQcG+O8NFD7qxTiw2BQGBUJNjnv+aY86GflckRIIbW3wK5vn282pkMxk8KFNkbjEIjJuvIvh9UuTPRhmsf0uvu830Ilz2TVOsPlq2Dt03k59VtJJjvaZu1GhjDdiwhXp5Ipw7SVXTOs9jiVBnK0XlQo367OFcefuTWcYAdvG+dYAlBczcyeYKZWQJ4Lyb8EIhpZo/HIFdupf33Y3/76C5tZPyhZwMz4ABZ0V5H03+/6f6srlFmtTBmmjXRFviebEbtDoUYcplMyl49p02j8vey3zaH/zXS8Y1Eus6FxYI80/c8xnTNrfkf0y1LKnDrShGlgDh9uuZIpw7QNVcqzwlJVXDmCNDEE6jaffnodeTrXJv3ET5kGLeFPh2zDPtysw2MDjt58mzWhd92eO25oQHlttb222WaNXvtrWwAZ89lEOswNJGd/r/JnZwtnoljPD+34xfV/TNcP14AYWzGjitQP4k4YWKAnohR94E+HMncs1x3HNUt273pBK21K061cxUoTUegu0XQ7Qt0Z2q5DOEefFoIGBiA69mwf55mSAdM23E3ZLr01brI7Vx8Q6U62p47wvZ7ZU4XCNYZEujhNLnuKdFGakE2KbhGyQTHtob5vtiN9WxbO2INCG+ixsHsDVePagAtkKeZxzEyizyLh+ujc123p0MXoVWlT6J/3+04XVKaMjShtc6F2pSuQMRIHtlfa3PaNdJQL+B4TUdgGumryDRPwS9N+3pYdYu9s5gjTzu797/aHnrxDf1qAJbT1zZfDnlE5Gy0QBoYq3Fp2MfL7Nn8kreG+v+oMz2SBYazGcINViV81liurLvmY8LxnRF6Sj9h0+e6S5UdFLXl0xy8eg+XTfyGupXqiCdTgnl6DZdPp8fOW3NL/uGmanlG/cWkDWAJ7L/0nfqX6921ZuGZ1jThMZ9HUfV7W3cd+S1pG+Ka7Pdx1hhfsWqwQ5EuGxHwj3QnEfi0d0QveVNX1+DLh4727B6jkoesNYhZ23Yd06HggPeunDiULVUxL3t3/1lxDT1lMrVIYglvID6ed/q5EGKyLfvoPCI9Tpgxce9DaugTaeKpwjDKJMLBlzB9HNUwkDFwBm/3t4P5jFOrUwXMKRp1AFur/tCQvuInI5lPTlcb306pDZOYJXZ/f1AVhFTycM6dCGvg9GZNrjZiJwnRsyN3BNZ1MNIH+cXP76y/OzdRAg9cgpw/g90auEZFviTB4ZvyJ738+NeJldHBylImDdTKSdwgXVCEN1vdzSWekunAt2jJlVOt+4xHCn8v7e0IZC/JL2+w+I44ZEOzhuHALYPzqxyOln/Le5RqrtFEWv+3bsn743LB4ArI3Q2yBcQAecnTFACai4LayWMmb/j2Xg1w5YK7w/c8tv++DD7lAPOH779vyrnLf/ZMpw3fjOG0yZfA3nr7Qu/oT5mqBmSPULxjmeHah5Xo4Fn+DOdC28aWIY24bOjP/UrbduAbREYuYTmGu8J7/09h5fS3k4o3w/yexb/9kKYx/cV8ggpjQGL4Ta4mWQ82ZnmTNU03ablvulzJoM5T7Q13wrH0vHRzWS8dfv5a2r/2Sj3URNat8zNuSVUzrXoK0VmVCKx8bOnc1pU3b0kCYGKuOm+gp73Y+JoXosUo5P6qBACVWEUuEXjVFXiFbZ6XHKs03fxy6Xk+BvKhRKOyCbRd47SIv1H90XORVydWGQCdt0lPpIEhX9ifUDmCOq722/uWDUZSTCKf43OSWmeDtSHozpOGcEQuvNEx0+OcT4/WJvgETGIDyLzResxWMDYFuspUbwXtHoZhY4pVviZRlC6V95olXf9fk7QbO2g1jkBnjgbSHSnCrURAmlgRWYG/AM+qodQ0bXp6W0JgTdEn2SjwUkM4cD+hLsyv9UIwc8ar/ePIcHgNDvGJWkhJMwQGrF9mCQFgmZCVXG4wHka7NsT6hZF+41yNzC1DLOA6Cl63t6p/KOmtxU6GIQGBLAGLuP5vMb3YWIYFC0gK05C/BgXMlMwkF5kxagYOHy2PhBCm8QhVpDVtX+Wfr+MU+pzGIRD2qUZDaViqUTnvmE5w2ObGLTZs9rQtOG3DR3KTOcN3cX99D2xz2emzRpG8mxYSbcNr7piKt8eDABECkjmlzvmsOhpifSeVMGqNPX+hsKv2WN4ttSduW9Hf9Jq/RtgJ1lNa2zCtcf5pJo+aCsq4NkUHjZDCRxujjD2G0baR93pM5omaHccLfZFu+wEqui3WuMDPGzcKEuiAk3+A6mEQeo3ffknu6Gx8CjijVKkfU3LEs1OaXKMZZRGdKhEF1hpAofFwgBA4/9elab/a4kDbw97MauSyU9I57GF633gPyNswisPYb/Lgw80Wt7jCu9yy87A9rYkuHanhBNbnOKEQaS8zXYoeJbXOX31XPP9PpEOd6aTwxCLZ5vanIdVUi/VqZPkZzR/objxlLIo/Ry8/jfDQrDNG639B5Bz85aCyR/e2WXWTircmr4T4GttcZOSPR/Mr2EVgAE3FUr0MbPsX6pETXrQNLD6rbiidiPeKN4WKQ2SFWTxTitfPID263PFKm1N4OPRWlf6FNieCBFcTIplJVuF6ushjWOro0sypGL+IBArkFjH6znmEgUQfJyo76oHuSG0vRgb1FZUs6bIDjD2d4CTj1SGAp4ITIGYJKiUhZyhqWOZB+iVv03kfnWQeRJ5jEOPrm4aEityXLCs6XrBuPmcjCHIkRlQXNB9IV9MPlK9ctC0WNtwbrnI9068KbdeW3ZfZvnuMyxwPaaYpo44OHs5WihdrVW+YP3TXMzbzJn7jvOTidyAC1Q0LKAc+ehkkKsAg1rqTTIYtWvy/vSNubiquaw5MKS0o845Oa6augAOk8KRFxP+Ltfw7YILVMn/Zb8RfyjJh2BBbnMNdmNn80iDcaoZwGH+jjQxJ8+Uf7wb94HGkbNEh56INIRR7uFFIACEzH/FS3IwXwyVStKnmw3nocFQidImmwPnOCMINVbY+kMPY0rN+aES2Lr1vDfMAFJD3T1OkM4a3rMstpnNZOmTpYa5blmw0PdKP7jIkFFXk1osF5n04MTsdSkKA3wDGQWI3ibp+bTqChASWyhBsHRjOktYb8HisqhTUcnZK/1eB5qjgGIp/OavMUKCVyhVD9BZEzIZq3u33/HA5JZk9qJfxiajSV2RX1xGVMB6Opt2aEQWhhY5uTISYRgTRK32QrIGht0quyhOufkyh9xq8eZiavRcTsq/10KKuNKXKokaT23ESxvg7chBq6/GmOYwG69cN71LzqxLDM2lnJsrFZO5qCyMQbbxXkEgRiQTmdOgrTZOcceRIIhSkWA3xcBeh3H1lZdQvXsN9s/tkUvzTtLjfeRRd+xl+5BovUqdIcdxlFbKhLmjZV9kuaCFVF1SBbNVEGq6I7ZpYMue7bpkJpVBiCFe/zQ+enWeXwUa31w0/yqZGqd/gZ3w/5Hwhh9lpOIjL3vtKmxrK1NCtR4yQDFR0yZPNBvBg4BEqUX6120kx/be3d/Fe84R/oH5nFKIu4i4XUYpgBHDQuxzo1e3vnEXRqHKGqx3Ow4eEerr06S6jy8VjQR7nOEqq8L3tzLVtV5UQYqoiy9eBjSlWZSByqkPy5L9tcSsdh0ShRx3UjNofje9BIHdd5sCol6lCVfKXYZF1Zm4u+q0pFekvdK7di6k+3rFtsUGol6qi2ohvpp8ga73KpckW5BKYBmvVj+qq9mtlw2h2nlUE9SoYyM6cD5HSfrIhwrpQVEuBW2Vd4gQa/zvfbsv7C9oTWiUQVfaGyOV0i+/D+Uu6zu6Y+GB8TmxFIPHHq96Qtm42H7oUhhWJP08tMcQDYQttlFbmHd46afoknTv0d+9Gz+RKPt3p9YLEBeO0Y7iIRfmjxMMeletPQKXuqymm42qM3UkQP+QmEfCG1ZXujAVg4IlV3z11PjJVxoaZPDJGKHWubrhizqgGKvRZzSPO4BLicJIl9xGwxAZug3bsLJ6Yrkyw/lJhV1zURoWDipiZvgMyZbNkViMy7axlYj97JVAwoH1ISo7XCaSivHgcAvFLEhaK1e1j//evHX0xY2b/jp/s/Hpp7q5SLkcLcCA7CNxq7yLaHYW3CwfjrItweeLUJd4VBFx2o+KdNFRjcXXTYo7o24XlJF+THkjwZvcRFg0SHUoMd2SYdrmHMeQRIcPd/J9w7grSLNPhh8SdanKVSnQYRUGas2m5WBh92WpSpZrsdHoVirGcgxRtRvomElOy4bAXh9/2OoHr5c9puGXpCAb8yCOU5IRS1D8AnHsuv8Qceiiz7eYcAy+u4Q1ViWXONKn6QDPPbYUftO23EpB5M6sNuUKcT2W212P7th0+f/xcv8WKih9tjAGzU/NP7N9f/8tA80cdr/v2f7z6/9dA80QdqNnf128Nul7fgIJSI8B1/2FuAy6su9WLhcHXRCXHYqgurdu/adP4JdYirh0ByxQWEIHLsgKxuIgYYF7ACMMr+0GQ9yXc+nUfmOnoHEtRPFnrtYRkRfaKOZEI0dqZAZIk7lBHg0KnWAbhpm/2ebDL/mUnnPHoHUyBgdgqyFLUNibqZGdeVe/tqRZe4qwEg3dtgT5Dq+voBOCSffku0YZhFIXYIHJJlc78hVZ+7FYmkYcqUkuGgJkfVcJcave41qMld+hqlTCvrbVforOztUnpXHRA9Y6QKU9E93Geb5qlmxWWRxjSxhCkfD05YCrEO3o4vmjX6MLXg/njR5LchtilDGNRvy6soUycm8OB5/tFjanJe9pKFYu96LThRioH4tFW3LQjtVM8DnM19Zr0Opag38QSqH+4cWYOk2g0ld7wUcUMJq1KmDlRpvyikaETcE0Iq5N8JOr0yahU5glUL58SeECDOQCiuazyKftTFHZxSOAG1Sacjq6JJpTkGYp0Qgy7i7PKyBq9CmKReiBwulxRz/8Xae6A7MO6O43cPJgQEsgdH34cxfwX3dRik8uVmix8Cnc8XhtbH2Vi5tQ2shcLzPkxmuQ9jEIy8DKOABgA85gV4K9ikW6D3VOu1eQe0IoOLC/cMF7I/aR8tBxWq4SfqGItb7h6ZdLouHuGU2h1LVSfCq0z+iQedqJjMwrm3Hug4nVorhiucf6uhibvWg4CFuNETAmy+H4KFJTJ4dhT1BRAj/Ewn6/Guyu2eCGGN4RmQicT+FsihQ76HZ1bCadAvjhj3L2VX0P2kIAQyp07psWyAlwgtkl03CQH4EATpG2ERjEwpALCiguXoqvviUHhTwOG+BnXe6bLM2D0BadwpIO3yP4OsI/ClgDHsMpo6G5cy8NQAwmMSEAhMHa4/PTf/2+xKxHDVKVMNV0AyZrga4IcMVxCBc7jiATj3chAI3JYOD8TxwMAGBfPMIAQMOCLsQOzjwAMEdoCCcLwGqBWYFmXN63xT5jVihBpIUw1RSDRmjJpaEDJIYQzOUeoBwTlMQRi4ceoBBTFQQTDYkerzcdiuu8uo5GyQ7v+hDBLSWAo7gGF7eY1gOzTtQmi521cEMYA1wlTD1ywYM3h17CFDF9LvHLho9axP2c5PAAQCWwoQ2G4IofHqhDZYahd8c9c11aHHdEIDaapuCInGdERTC0K6IozB2Rk9IPRN79iZgTgk1iRg0N0SxOTXMe3Q1K75G10TEN1SIUvVJU1iMd1RRR3SFc26nd0QqRr91Y0w/L44DMkRhLKHn7wCT2/e3fAXLWDnHn/H9xw4birJct2In4EBag4HrKKRMlyVLR4tq3IGoV2qlFKkVmWOWqR4ddkjaTvLYY5JrcATrr4m/VPTgoe/st6FOFphJuXOxGjNrHk0Maq7nl2XFaoEWdUK1OEqbVfhZHXOW3AuVbaK2ro6ZyFtH5XwumzU6ViEXV+RJXFHapxpw9XxE3GctonUS5nPyZtBHe6+/cw4QISehdZ59fwX2WSPeVsqafmtSMyMRzKDQTnmLHIWYgIPzdVtCx+yKVP0SHokI3B1uDP2mXGACHV70nX5A5Q0zwXgSmLHYnEecz6SrD7s7uDjcDsmiT8RqKJpWsu+xIZnZg2HArmStqv3Io3HhS688Zdbu74Wt10StsVIzJqjVWJX1EWt16pqvXMu1W506rUXcMQqvWNV5rfu1U64V79wxKnWa8U7dbsLxluU2wbO/0zrAAbLTOw3lFA2lmV7uBdyKxL0bgWJdzd3gkH3dwWJX8d3wngsu7IP+TYzYyIgVXEXgGLgSvlJsh3JA8bBhcScFFDXb8hjMKKJOxGkQ19WZQ++X7HAWTjTQsnCeo7MnQjSvqnKIsQ4M2M4kO+kVDo1+ZD3bbm8aro/1ENVqpfCr9YpXBC4Y9S0GW9awkukGaSqJHjRX2Coy48+4j7e/UGK3ipUJPERzcu7WCULFF5X/hShQ5A1QM5v3Pk0ShN/8pI5VDEwyhR/whqSv1rN7irxZrHQPZdfsQI3pGg25JrtLspaXOAXqSoJVjSpnaJVEj/Un1rS98//LwK8RunXBowigBKraM8ZF77OoEKj8TPXr58/2eWbyEK+CEaLRumn6IPkFqvC+a/oIbXN29d032kaT+NPWFGU9DXjMYiafvLreNLWXO1rzj25UZzJasKv/gI/N2/aNn+2ih1pAtBipHee4ps/yC35z4EKoMAgm+hEaPRdke/J7a+/fCZ/9ibg4u/orkWeqpJdK+qbobCeCbNOhBZP/Y93zOV6NHoo4s/4pYrX2HrzSNr8YegF4kUBcdUyEWLVdNum7X8+DGUMlCJviw4DFXpmbuhujXK9M624y49eXgEvr/65zevuvmnV1wnyj3aYthgwKO3CEfFW0CVSt8QynacQihCJH9o/qN6VD5ArOP2iDYoD0XMMInhD44dIHCl0CECz3fwbdlTwKt31ptm9q01znPgzfmUn++tKLF0oruvjbz7CoP3W/JtHY39v2g60nvQ7+jrHtCudWd/WvTm3nJkSH0S0FBeCJbueBwLwobNtKFmODYE9bY4fAMeZhA0G5mTCH0wIinD137z68Zuvv1oQXFcl5fzc3PK3rj/lQsGXXbM5VGM/vjDSGXucXQNGOlay/G5QEnir3yuzyBFvlchitNsjsJQ3h77Z5X2xvW7qTSkdBUgyjXQoDTdUyC3pzWKXH/3Q0g3YPWmZe9s58MqUOMRk1/Tktm+YR3dD9lWpPD+XmwBTo7T9Sv94X3b971vSAh9UJfGSK8/LRrkTCUruvztoPIy/4NBRM31pXgO45h/RLb3e5j13Kyq6Hd98GM7k4VZD5F763rDrFF3ZobTpxF66xhAwRpNKiptN+Bz2uRnmNGBeUWm8WvBevGpoBP5eu2DokCrlctFF6hmJbO0nXx7afL/9mVSkJ1ZDg7R+mm5ZPiFHX4WJ/XRR81YVqR+QDTOQ4/T1lI8VHWcnUG+7vtyJ4UZZF0Dq1adQ48GzDdOq/uYdZu0XqHAr2DvMSDNQOSMJpP+1ucvra2rWu7z4YtwnqTRobx8QLTh/HoIV1/o+P1Q9dSvuywek4AuVyexWKqD9L585Vc87XjgaoMiQkQM2oTuyJbb8c9mxvcwt+ETChNIq4YjWgnHMpvsBazpLm6DHAd206lLy/K4yP/Mw4TZyHtFuuv7JXt98h7WXoQ2W/sYWy5/b0pzwBfq0ItORe9Wseu5IaMPIyGGb/Dbcxn9Pu1ttPtwHwGmMx7WNrH6yz9ffeNhHaQFso/cNnJoLgCewHNcuk+LZIl95WGRGDdvidtvwSxrDcTt2lbwwch7XMor+2UA+c7PaBrud5oss4QYDRBzfciYg83Tt08fAVsG25AdOLRkpxeMjN3YT73GtpyGYex7aoTK2w7LO/fzbDd215R2RooaIBUdlPPJ6J6mf1zyfOV1pgWV8Nod687b2cph0tiOPQ0H5PPZ8OpGE3mGb/2mqw84b3cx1AssMumfD+HQbETt0v5oFWm9p3yp6svm8JTvzpW8TQDPrES1kADCZ6Vt0/zG14gjw5r99Pf8N/WVhwc6yPdD5TxL8V7P8NM0wHCof83OMzZn/4dvUDZvsZZmyggamifHIE5fRzF/7bPPAIanUF+j6ZvcTy5x/y7IfXUM1WExAIeYj2soIYZ7rseYyN8RtMnYPLNRiIu9pDDYjmOyF3vIYm2E11++sUEJoD9OZj24wBcJ87wc9Is0tcdsssItpvKexmNbFXqP3hMZ22Icku18VMhxFvuMPxVn73Kk8bSTgd9uHHTSG2kjkPY2dZgSzrdB+qrEdbnv9uzWmfHLgHLhOYyOqe7aO7wo4YUd6C/7GUVhP6CkIZvKcxOVGIJc9b1OprCdc8sQe5ekjyK2AbJXXj3n3pqrGOPNblgbhn3m9qcxX/oyY7TKOaT0LEvcNatWKtmYB5sw3G+F5zueGXQR4V+8P6OMtm4AjGhKE4Ur8ogiDmwM9suXFCsXbGR6nPBDzEQ1nhDBvw9HehbklgM36Ju/QHWwiPqJNuMp5Y4iexQakC4SvXwuzlnolhKcWuqsogkJSLiszXmHJhxFOrvl4/9i+lXIQLddYjHRYJY95VW5mZoN0mQD9Xqgl7FYCeSwL2lvyimxABRApVlVLWHo4lCqIFP8OgXEOPIy/rB9u2AgwqIJIfZ5kkIpyPJK3j7QbfhrfJhlUQaThj42Qsi/AXx2TMcgHttr5TigRZMvjIW/Q6BdFqbDDVysSYBffRFa84snH+/uOGN9Eir+n6IW6wAv5nxz9TSaW4YNr1z4cyNXA7Q3G0WOk+lP+oKzVp7xQiVchhynuhtQb0pJ2WCrBy4sgMf6C5B3bj2ab0pgJxi7/QuQ1mwFuDdRPyr4igXBE3kRw+OumviUkK5q6z8vavFtyADNLSQSxmmoAZ80+L4AcOg6AJhmJ4G2Gm5TZU7kx54t1QFP5F1i22tXeMDmgvGATdwBImXsliFD1Ymfn26wIqvvPIWfZoIAcxA5sMvdKEOma/Onw118V+VRRTGweviV9D9xlcgC2yUoHH7sJCwXrWt9huXD7objTNu+zqgmxtcC6Vufdk6Jn1RsDEar8aw38vPrS0O3PNhCmyr8SzKFeQAHXcHDAVPnXhGmpSY5BaapRnhTkps2fMur1ZlV+RyrjrQrXuqlJWBMq84Ujscoi1gR71/R9s4uEqwpZE3BbPmxjzavIWAnuHbvNF4JxZlzLjnRayYZ+Nvm6IZY0SlkTcrdtnrIxB3jQtzcJWQnwsoto8015CIFrELES2KJsiyoCqcq/EkxW5b5g79Wz7nC3K43hfwdSg4jVeuzhrorGa5ayEuS5VEHGKxNG7KFhSWtBL7tDXmV03myylmVjo0OHUrH8EOarJ64GOOSt1Iz8EBQXGNlWAsVrUYe7sgr7avuC1vxY2rkfGPjObsPKgc3XIODiG7CYoWnge91PPGvTx6ewMJ7Kf3b2kwC6b97A0uSWOsw5VmoDLpIgIUtCztawC0r3/We3dYU2gyZ+V386dFuymd5aB4E3CDlDE6so3Rd5bCbW2gweAuWPJNrGZilnZ2QDzMnKPwZY2dRq0I99C5V8crqvb7UKUGdizhHavGJ9HWDDqXmg3ZTLQf/mN4aMDyedaEFRZ2hZM9bZ1PBDJ5upAQNABwf0j+DYu8C7kvt36EjL/+qPTmBdK7TOEwxlXVN8ISGbQJV/rShAU9ek6FlOaHbcEBIH0CSsdYzFepS5iBymL5Zpx7nyZpOlhAsDJ/KuabnAkSLyrnUgwZ3BMOuJvGtthZsDnyvqPgyiyr9a8HGzCbWiyLtWH2ybw55qCHEuRd7Vrj+UfZlXGZwM2XkDQhGwEtDQayQrXx/ZEna8EoBrZlwrJDvk5sry8L2NQcRaVsx5uHGftXn9JduU92Nq3RC7wqJWBh8Bdj1wX5pdGQBsZFvLbWAZKUNchpFvrfV4C6Tuca3FWzVzzypTdNcDpSaRM/TEv9o6zHK6lUEfVuQ9uy3pDM79lN8SMZlbaHcG903YFRqJ++xMKMCbN/LfB1hRbKbVjiGdcOE8U/t1iIeiLtuB/e+OPbxNAe1qkhQI0HF3/4k9ek2Cc5K0Dk4q5qEJwDnxrbZjp+KznuS7oAVY4j67YSLAm79zSHhbbGbi4WKEOAyZy5BzT11e6oFjRsylrYx4oCxyfjsh8BK8ScaqwbCwYTVxnuGQ4tAQKWZsX3xoHnjWmfFgW0uKpg2J4mgCVnuHAVSdd91u0KrOJ4fFHxkFQpt41xoWdB8edGw1M651w64tH8qaTgsJQiU2WWvD7x7uYxAP7CuBvGdv3+aQzH56OxKAF5a01kEWOzIMOcAa+db67Ie+aIJONBbO1UK0ddj9qplxrU/JitxkfRlkNol5JYCUMhSewLrmKdomLPYk8q51jbSqmqesI9U9dfP2/SFo0BqFrHfvlZWQK4vxvjBPtJqHRH1gSava+kvIvlZgXbcjHPakjUC48K+5rtD9T0tFNebKppgVRpJwHKhZWdMh8iXkPAGWtNqU35ZFz5WEbh0NIla1Mx/DIc6nwr4qyP0gOxTkzL4uyLbsqDGCosC6hFWhRhweagLWcutYqCfbHbqefz7+Ai7EyTOLWWsxeMiX3QKzVNizf0DMWr79fk87Xd3zyxRddl+21Fj5PQVLl/YOKA3h8voRMtfq4cNSmuXVAzVcvzVWmXN1coOM9XYJvHJkNgwsopaZ9NoyAJLWus0oVSz1uMOolTJNe4Ns21KPitoiI+yqc8h0bBCxWviWBcPCbjJOnCtBqwnZdNQR4dnvAgCq/GtNXw9BobOHswx8U1iIPNiwENYs29lRuLsnIbtShAXAdJzCDApi9ismwObdS1rM3HMnz+mMLMhbC/OG5Ju0XUOWmB734NclgqwIWwttut6sy1vNwsl6sy5vLcwpe7NJYnrc/AE3dTlDE4Wo/GsFjEP9qbW9KGrhrNztmzYoYYXIvOpzgQBwM+NaGXT4bB3zJkSXsGpEIAaqLmG1vER50J2CiW/NzUZQzH/1GH/wS5C1X4AMSWfLLmvJnuSBeRyNQtYdJhHBSF3CupNPBFRdwlrX4bvmrs3rYptt8y7kRZAmYK1de9jDw5XfHPIknsH3kCXudSGyw01+zYP6fHRmCUerC1oX+Bxx5ZerAg+fbLLWhT8uygnAGyStC53dGAuHO3KvC3FDuqIt91DRGxxSWci6gAuWp6aIwyvJSAdXzJ4/UHCmdxM8E2ATHccq7ybBezoPZe0n92LmMW9WjcBdNz3tSelhLD756B3AXn/1zQ/C+QPJ2ykTzM9t/gQ4ZzAyQEI8NJa08xOpP0Ap02BICmc8FMKrwFORvh1oYUtgj+GCqjcKiS8eRkf6n56b/2125XuWmdYPi86cBND7vOs/0BHyEU4FacWk88fDWkbsHf1xYOIFZjw7s1VOSpgtYeMmFNzMneSDso/xmYq9DpstAQkJoG2bpw9DVl5PRBJjonk7CInCmWaevuVVIfxn6ZkvAQzS9W3jOfYXprA1/vUPJj9mxjAKFQHgXZbP/3z74e2tU9bFQKe86LJ5aCJSq+7s9uPN57c/YyEs5DE4rKfAOAT4stpcgIwe9QjPF4fjySqIBnPyGA7K/t43GJQUuPUHxdgt7xM9YEnzw8OyJvx22N0R6V4ZiBLgiungKqrrn3+7IXRS7shPYhYLGySNJSWeW5bX/y13XRGfUWdIjuV/mkq8QeeEMtMnmw6pP/G5zeuu4jkI3fP7hc5w/ClRwTAPMTjlpShCbQFsmWut4qsNkkh9EpssVWwng+DmGgn7guPbV0LtW2qovj0UYjJ3EIpM7NSPDGyA6vDBjMh5HTx/27fl43CX0kdrllHDZ8Phj5KyC4Rg5FkBj5zZDAUHTGoWhqYl+eaZJbKUtm4gEpU8EYqxTolUAxLEIBMnRtAjOqhEm1o/+RPRPxXq1BjKHWkOPjBmhkRIum2+aVjBHfE4Gp6TZeq0GIr+TzSCgTaRfvb2oCK32/K+/xd5dmPQ6MNxhC2NMoBpcYRzPUkCZPDgBR6o7CkIysSSarhYQvLwkAkLw7sx8HfUYUh01vQWwoU1LgwcyZbdu6bdkLbLxqR45V+Y3QnElgjVeED9zF6MjCdm0u1DEBfMmAjZ3XPz3OzKoXocwmlTyBOhQM2+Safd4tC2/M0UqTNWWQahXuc49tSrQnCX0RBFaA2ATNNUqH0JBOZqEuAPyREx2jeleCwSAG2WkBwbHxFsmEo3KiwLlkyeqFvzdZDLzvZNV0qH+vbFU2M6duc2oECUhBDFmNoBXTGLxHNVIgcdLAWC9kcstD9Wg8Y52Hjw7FsKS7J9DHu+j/E2ZkKD5qYnhX+gbzPcX8gINvypMySyArMtavlcCBNqRm7dRNJE2vuyr5CRBJE0WQ/ot2RHEJ1vpkvVbiYvQx7oyMTpEagvfzBALGks4vGwSEmGdGBAvtS46kBcKl9aXLgorUycFMF9viGbjDpBxM8yBr4VcLGkYCG4JL6kuPwttZ6N/K2znl3GzFhytWcnGoknKR7kDQCZOD0Cz7kZfJebDI//HGjgC8eFvQtoOxPUeXxCeo6ropYjOY97mR63QmFn1esmKPaiFawOf7kK1tXnxfaWx+ff43xSE0ui3pX33mhMLInQDA2lH/MaGZ3VGZLaxQOJzpAICbsi+6nhV/9+on+lOzMEGjNTIkTWC/ZwpCvwUj2E4s/n13vMDDHTJWo9Ffb6T8RUMdOlWwdo77rtnyvcpRCBOBGCpuYy8xZxECvRptT/AXUYIZKmmptMbzesQRSf9xpwmz8L+fgs7f1szroXaukPzaEjWFuLxGkRfMQc+ku0ifQPjgx6clPJY2I3Jl8IDUSjT4YEeiRjm4N8H8Z43Me3jjz8HXxIY5b56FSoE8449CP+U3xZ7ora/hN4RR6GQHk/AyrHv5TxeYUC9yy/lydeD07s/ksCrewWKtsyogbQRJlsFDf1+/E4D72QqwzJZvhJMHaZUejT+VWfWdQd9z1GymTf4ynv6V6KVJz3MzJQb2aKwRR2DmrAcWX4t8tX86k27nQUKRe+QYq7sRIA/2qWnawV+kHm0T7G2Jr5H75boV2TxUIeRtpGYtBjSO8Xo/BBbcAr0YhntQgcIU9pwZWx2e0PPeEf8pbFWW+QIWuYMdmMubSY+1xMiY+ZRKYEX4yJuyHFoe1KzJQDMybAsi0r9jDgN9StHogtkU0+5ZhnBEaeRAjedc1PPLPS58YXiMyaZFYZP/TPAaYxMftgkm9CDLTu6NVEB4/bFwnewnk6PiaW9QDSmexje83cfuSOV2dY1XpTMPWWJXa/ZqdOb/r3TZHjrju5Baxq2TjwbgFHAX8z5D8MRG7iXg82uxgq2QzjXZh4NIihiKgXN4RMbsu/+Kvfzcf657Jjl8h/xz1DQ0hIiZaP6k/oC4UGjmRomnr6Lp+bh4dqdLaURJ6WvbSVe71OKB0CYXuhmWmdbujZ51LiGH3nD9i7ohr9Cp3rdqgyg44VAXzrdShNJTaYZGZLClR5VV4PhRs3WXPosx061gnxxXxtGVlTfCGIrzvTrWgkriIjbAPLN7S4026IbT2gRVPXVNDn5oaXk75F+dRmphUdlaZjt5FYosLM6x0/zLge2Gz8iJiFVaJd1cW+ZjWJfm7Le8TnVclXBfYb6Z+a9sv7vCd1gbiNYGJZcZkfejp6SKwKZlN2aDwS7XqQ6KS+ud7mmEl3oUzo8NSbz2xFQZ2uK9TpUDzXxTAR4pZsjT6pPZAYFsoVR3f5SIaGsth22yD8eRNLOvPkjyzKvuF7mLxi7cesyWauZKjoJqB8QKwVM13S7vKJcCfjhgtH7vxBvpW3WyFYYcYVweZ1Qapfc8zRuESb7MvmdX1AjLaJbEXPjQrGxGi7xEPqPwfS9f+uN4iIuUyc7hMUBdkjIUi06bbhvGvhEEi0yRDs80NHcONAJE05tR52SAASbTIEG1KRngxnMAinTaZOGhjqc8wDGYEy7TLT8j3t7VjCFbnGaExrYHrbFfneF5PAlG60kPa+aXdiCPPNoW9ulTLL8BBy8See226GAq23yCdPZqaEY/0PumJ5YjIzJcNE96qf+BPsG8JSNT4Sn10uxJkS3fu868etCDaMB3ClPZ3wRgVwpUTFloZrqSK0DY1InTqw/ht5GjoHEg7EtmZYgM7abVn0t+RL+QF1jcPEkiwyXCz7N/4ollUowz6LtPKugpBdlvDDNXIkQ7NpDneswkxVstwBh7tdiQk5GZmSYXrM25Lv3caHxOg8dTBjOnu1+VN21/R9sxuyuyAf1mg8aRFV5L73wyNzpEXTsstZfnAUlrR4+mbvh0ZiSNevy+5Ah/CB7r2ycS+asZOfIkcdcbjYk+HEJviFk/qGaq5YPqMCt9ZJtGkREDqhUVYvJCpPuvWCCcy6bXOoNtkdyfj+eZPRDcCQkpPPv12HjJF5yErWgj3dSZXNoUMmb1PJk+FgS4LfQmfgSGeVMfMdJmomkCbT/0D/EIsPw/uAmTCZ7pZ77yjtImm6+wPbhucL65DXeTT6dEjGkMcgOqNzernDxW9AxmTYkInVwWTqwSODzUo8lS7qJEklT4tjk3VlXWDjmgt1uvl/m1PHqMGkK1go066HU9NwkUUTy3rXWkRtd89TzdQAqDrzeqDz8SZXNlYjx+IF+Y4IdbAZ+kapkz8p9LB3aHaMc/JPCSyA5crRXsDKiIypSJBXZRKg8WlUsXj/OAZe5j3RMT7L4Iumuw0QW9p42nevX30j5nvHvYWK9o0VvT3uRXEPPScO1zz41sic7TJxQhT8I/9F6N4f43Qo1CvgoA31g7IwpPw2oneJiVLoDAnRjJuB5onVWvDYPQgM6dGMnmflB0nlSuaxZWONo+GRbzYnB+Y3shEf0Mm/nq+RDdETPFKZfE1g3BZIL02hXhPWsAaiinEtpGfgcc1wrmYOtwewtCHci1IVX5V+quP9Ig3BH0kRUM8IMwtpKCa+dEiy7LDf0CGQze+CMbAMPEfY3HB1RXNg2Qc9XFuFbT2gY0bd0fNldWu4L8riPxtUNgG3gPXA37FyoARfOFCjXx8aMtSlkq8MDJM1c6JbD4p4/LxHJQIwcKwK777ERMcmunSRubGGTYHbuajkK5pk0FQ9Z7tnT3Qyz3oQN2XbP6NT1yjUa8KaHtOQzS9ts8PdKAW4VoXJYpXYaUslXxEYW2WqJmeX8LNhp4OAZ2RaFWQ/uOjVVNgQBdLAtHJcm/sX2Nz7Bo4Vp5iyLSo8NpV8PWCErjzYC18S7YqQ2rZp/8mLc2JAydRnsFkTEU1xW1z5cqkt4G2TvN9hEgYvhGs6E7QzsFscvL+iMhqoDOuB4wfxuE8mkq4IiPSfeNnMT1VekB27wU/6HnWF3cZ6Bl0ehDf1f1xWSLiV0GCgOx6e2oxP5DyX1g73eNHCuV4H4Nn686JHJZKTiVcE1b2rPx26LdlMCTMQ2Ew8Z9APdVxTB/wR1QEN7YL8DZI/El+zmZnOwG4GYPOJIy5lqKlpYIcbb9vPIX3MhzXwnIHhdFyz3XDHtIaGOcz28QmVQFUlPyNjcUiznXCukdwccBPA6ocW25zNmxgj6Qxr7lCYLlx5Z4l25U3Tli57bdYh8+CbWI6wq/PYzq0PaL/NO/RtqZF2ZUjjKSk655SZaWWQHQu+DrfGhkvU+fjwZD+5e0jgKEFrN4Yr5EiwqCWO9eANV9PHJKpubCr5esDqJhtDa25UEu16kJr6Ldtzu/EshGewkI5g5iX0B9QSOjUBNEXGt8FdQTdD/z91b9vcto6si/6VUztfMx6Lb7J23bpVieM1a52Tt4o9a2rXrl0sWqJtJpKoIak4XvfPX7xQEtFskA0QUHK+zHhF3cBDNF4fNLoJnoo9eY9WqorHQjwzFEtOWpPCOGq0/MFs/WEp98ldUY+AxGFaXF+KmTFd5aTBp9XzB7XiaReLpVzC67Qpj+fycbiDuj4hi+XzKVuJgbDKmoyCFVPyeBPe3lrT3CSBtEdYT8VDk37LX9KiTlflMyW4EqLiE2D5LG8HtvvNfV4RX71AFc8ATy94LaBqlT2CNpm/zzVtg61jKjO9ESZxvaJHsPl21Ya8uKO5/SEaHlecKuc3k2xbTpsOe/JOofVifZZltWJbgiZvQ4jfvtRNviHx23pdr5BveSI0Njw/Uoc2quMd4p+HucQGq0bZH+hV/pDt18ykNFcYKO4PWFEf0+fKLI+EWQjVmeK004uFUxoknDhLooN6+ZSv9uv8S94mYSXmtdbqeR0fIk/Bb2VlEoJep+YP6I+XoCC44x7EfoFTsIByIf63k/KMdhbu6E7wjtYguCiI9/0d/emO0jowX52DIfpM6wAJdeIrtkFQMLLSG/my5470DKgn72zK5AGbiAETuqL+hja/R3jHXQIJZGBH1GWDkJrCZZ3SL/6QQnC8+p68P3PIqj5VchUyhYjoeVxo8+Yt0bO6K+rMivxsQGDXpZTL/srWXXKqHSjuDgfbG1Mz6CiyzhA8FaucikCRddsGbewOUfoNPeTHgKrjeUbeTd+VYlDSHgbrFZ1hazPFi/Cdn+lXbDo1Z7gkT2IKS6PltKf9VlQ1Za3qiDqt/3Mby4kGoSPtFMXH/AexEVpJZ7XzWFa3xT0tErIq7AzDln0TGYMq7AzD1/1md1e+z+rm08NDsSxkdoVxOFo9l2ujOSxcySeNYo4R1fG9CRRT/pvtynQuHNF2ae1Ohg/aNhXVcYbooVyvy+dOBbRcuzo1f7hu80eaLQc0fTKgPKC+cTPq1FzSjdfyZZ0xtiFVlwPirjysu+T4zT0Vl3h4ke/yh5x9OuXOqqfgGgsZg+O6b5jNr2kPmYC0u+0L283zlUO8XKB5hmEqXs/zH2gxNDuSLo30O/X1kiLrdj0TL5CuqS+WMBUPeOhmAQpOhy8rkz6EutJeu+z7vGny6gPJcxqKewV2u7+vl1Wxa8jYoIbTnrSvm3JDhqKIu+Mc5A7BAAqi4Y5pYLO82Bi/fWErcNO8nG7xCYNtRNvlsmGJcEDT9bxghW9Q1zVCMhzXG8Iq29YF0yCDgBper5+JK8ujhwW/Eannac2iyHqkBrbLSmy23vMnNtf0p0J6Rb9rn1Ibj5ZB3ynodc8I2QKpyy4o0lzSemBX1G39hjMEquObiurekJCcfXRqzpquqNvz/D/rvHojb0ooPB6q5fR2X3pJ09M3KfIOt1o8mtUyX91s2Fk22zX7ip7gbVh5CkY15AEXoaVNOElOaiE15uiKPw0oXyjMSFfUoY2WzOrEhMqqsMPrNgMMqrAHDCYQnG6yLXbXPjet0tgWe2q9osNxU9TycVfFKqtITqhAfhKW+OQMePvnP77k21Ve5ZUUVn12RZCMB3YIqv+OSwp4Ch7dVCXD+K6K74aFv+oqdqrpfKbmIzRARMhwGyBdRRdAjkFFRfTlrOjGHSBCwotwAW59DN8F890RoWEFuACGB5sjghoNPYcOIzOAWBQaIryRmDQOwCnv1MidzGBjZQYHe7BERDXyfMkBuPF4UkSoRtGl7IAPunhPhTkWFVtTqHG4qV5uISJw40xDhp10x86BPHuADTao7GVQZ+tv5fdi+WQDECr7AIin0CICtEuoZQEQ5tYywWeaactwzdOkDaWuepZJRC1AYplfTVDa5IG1gImnzDUBapdA1wIqmr3WBKlVLlszoCA8OHljb+TPbth2A1F1qa1Hi7HrCqx83y6DBZlbGivBB9S1LhCw8bFAH33XAUw8IDB1PzEWHtgBQG32VyJG61ywpj1Tn5Cd3DXt07ObgR3L1E4EPDVvuyFoUhpuKnQnSbnNPiDbm5/DWx0fcHj6JdutJtD1s1fvXi+S9+gmN8dnOSwKSIRgnJoy5BfpGBQ0FCeVQxkLzPnz2gwN0KmP/6opihSqcyAIrCHY4ZCwP78x+6FhI9sWpQSJ1QZzJsOmhHb+mc2qC/EcmDeri2jP1H0lLfbzz2vYgRjQ+uDZmgINokHDCIzk7aU2HuPPa0IYl1EfeEFTymiIRuBu8U/hg7Eyx6kt55dqTRzlsXn1SQW0zav5bh3BnsEMElSmOhvIJ+Fgk7av80r8aYiro+eFiM4rERi6XH7LjY9hUNnLqVumneIhIjknb3zu7ql7udbhnacwHtQnNR+g2riV5rC6it5ay2YsdBW9UPa9aLBUvn4oNqyLA2i5F5PAtrEAB5X9UHirlVXLdRW99LWq3O9Y8cabv66inyv9oil49kjVSZJ8qw+0fUC0cofw6QYB0qsSEemTrLogM2XkjTSzPGMg+l5aLhOM3S6tsu23dFU8PDBFi4vJgXJ8wraF6QnWt3JTmEJqdbws9Pvus0jqIr83eRhpuI4q2Taoa6gu7YbDyVZNb28412qz3TtZP3m038LcjF3FX+ggeIR1OPnpYzzq+Ijjhw1v1nalhfuHovoLNVsH2PHIPDdtue7XDbadcWc7qf1ybVYTMmsMtpe2n92vs+W3yaAuDsXYQBsJ7vn8VJjPan2Eh2I8IGRlPJbmx1Cp5OdszMpOmzzbmC+ciuovNBA6wI5WNaaBu1/nckCg4OSgGIgrOw7Sx9DAsYqifGKVkstMXLfbOFVjBfgjliwGzkHtlxo0AtTxQurS3L7yq7S3e+irHPLNmdUbHUP3AeWZmcErEV/Hh+MLFBtQqS6JkIuOzw695lc3Ry0vPl+HjFlTiYihgrwCrx8frLFKXR/wHvgDqCPb0c92SESqL8bLZQ6/KjO+xGmVvBh53yxLc57/pOaH1txa+AAdtbwYrsmqJuWuYsbW62r6gMYkrYB19LzdIa0s2JyuohfXRR4akifnfGA7MfFG3xQhWoInL8uSX6ovW6fUCoRPpzteaorx177fjE+THT2PZt/v8soW20nZ29rAziEVK6esjB2Y++pnAJkWWzYOvhlz7fpi/EzeIpMlr8Hq2Ibo+2vbWg02YtSgtVmsERt4O1mwFbyjrkd4VVGzNjBnTvvq/kDaXpr1tL1svjiLkm72PM86K108gzLeiuFleJnWH7PT9r1NtWo8u+NleNlv73asf20b4RdQpw884UGaPTCYbFWu9xY7cUKBXnqyXAvTbP3I2qt52hh3ZqQATzt3ka0klaMnh6lO6Nt4TTFefOrWpTmDe1Dy4t/0VLENEGuCNOfOtMbTK6Lvh/jkDJOFP91BzQeobZ6varZ7yNYWcxNU9jIpPZqTUY+/GE3MAB2vAowfLfCvGbpLsdyUKZguQEmmAEfuJmTp1qcHDCp+lnCIVmyo8xdHDdspzAvaVZ6tHHYEtTjHiOUGzAVYUJIXnI56bb8wP63qptf2C/OC1lmvxYpzjFi8xGW7QqvADVDZC9VqtffxuuNhrZoWm11ZmQcT6Gr6czk3hXXU8hKzREy91q8I+ur+TuDWIPvqfqK/ZOa35Qclb1t/c27cLxdu93bA65sBGVmzqNMq3+WZTWQ7tASPA8GW0uure5xSbEH21b24V9flfZVtl0/pU1YbvxjpaXs5JVs8N/P50kwEMbTzd1VUPYLj93rCY4Fty9iUYYmzX4pHyEe6UngC2VzGDBXkEXi7nk6FjRTjETR3bLIE2qp6BLfKZdambmIEM4xqCR6hLnl8kOUEpEoBroAGp8DnHeEjwraaLjyBST23aT787vebDze3o2W9knLA6Zb4WcN1p7efvtzdvKNCOIlPwTHIRNIQmDmqXqjoSU7Spjjo7wYusBJoXubGoMjPLcxAKccSc1C9A4olqF7CKJ6Lvsrzj/vNfV5habB7GDVaU7p3Ly3su49f8nWe1fnb7nvAIUg9FZd4RLLOG5GTnmDEvoJzLH+W6+6d7CiUo7yzyfCQ2WwtYqv0U1n0oPQVzj8hAgzHAUaK3XMBv0DfMtfZen3PphFas3Slf0qbHAEcG4T0WOVCwX7CEc+CbhCWuqn2ywbJM9qDogqP1q93PH0stoQvP8pZ11R/J8yXUqhnWHa0/i4v6g1rZNvLB0rHOkk6qjv/zs81eGqufuMqwtYtnKask6WS2QFBHLRVozqO2qBbthrlggRHG+PCDk2VZ6sXHqGIB4YeRwLFHaFogzwrWWy0GFRhxwgawuqsyLquP/9B6J9A2jWGYpOXexMYRwVHSLjL2jq/fSoemv+Tv4wD6cnb47BbAlUAh0WQ9Hz+AoDXXTmxhaamTp2qsCOjLI/Zw9ro+1Q0ekVHyB4rJGVgfydb4VdG9nVSG0CRdbWMP2Wr8jmlfboq7BYBsQ2AtCMMu3xLBdAVdVT7WptUTD8yB9OITZu+B/Kv6adwu4xr4xjEkzU7JH1V5y1E2nZDcUco2luJF+5y25KoGyzTZQ+PXtERsvuX8qXcFHKWHscDxV2tMzIhb8oH7AbLgNxfYPoa594AQAhGUaYveh+gXYLXpFOwDszFoQBzSCPs5K4stg3hTKmHdizBOTbRP/mg2WApmJEpWhV3uViIstNdWRdo1mx8uegpnbtzIyjMoipfYN+hu9CfiOeiIA46fSk6aF+nQvvqDZrQ4OPBsG8BFWcnSf6ukDAdnASRmtuE9YZ1c2aCj96cSrb3FRy1Qj8zrxYDnot3Yks0T/kmJxjhKOfqu3l5KfESTRV2jwB6CFOADLw2nY6HczYpcSHX6rnGtbXEBfXc4qLdeKrCThE8ZKucndyLbW7WMoieB1w8/oYNLkXPKS7zlvLXRuat469d2uAUava+UTSKjlM8RK8LVdg9AsO5Wftgxxke8zkQ0bPHpVzU13nznu3QuKPEJyq7hOqYkDkKArkh+pwT9pJdUev62uhfpAoVWfsa87qpSkLDngQn1NVkyycG+D2Nr+zJO+pXWWOGoyfvCMc9+6fPpXA2fMv+ZDtwwkSAKzlCtFznWXVIQPVOngoIjAauZd1PfrwEO8oIOMo5+npWWPCDMBSOcu7mOda5bpuXNc3VpCPsCEG5FWVmFeHKU5F1Wf8HEgXcFXVUOz/+8kKVRJ6Dh+WOtHUvL7d3nSgxA997h4eDsW3pD+W+zqlt3RV2i+AT5XpdkXVUv1yoyZMbFJ/CTWBrPRlIT94ZEjalvH0p/6vcFO9p1x59Bfs9Afuc23/vs4rQHRVZ6xrT1KROIO1wxmFG/L37XmuMnftd8zzLHsH7gnT06Io6rP366BMhOhERCKLlau9Tbnb7Jr/jh5pbfsL6Qjys6hWdjdAqpzqn9bzSTOeCp/L5g3RqIswDirB1nWL/SK4USNt/ad4Ik5Gmu4OkM4uW2/ftJRt52wUVnK3Hh4KpmwIg724XfMfvAGj2aCWd2eM5a5ZPt/la6N4Rrw1wpSmY7G4nERwXyL/9bXa8a6bdWRLLHXy17wf+xbFsZ1/Rv148mzHarzn+AymDvOF3HVpMP/oOD5Ku6R5LGi3rOfnkb0Rd8RANB7VzkuWGO99TLnBxLQcoxM6TbyhMQHSVHGH4ki/3VV1QhrJe0QGWp2LNHyJ8JPmw6NQctcnnjPJsAdVxhOCPunwrAjfclaZAVFUno7U19DuLpsGUTTCpXlhSdpzDO8jpV+v/5eCdoeGGAlPxB5CdWj5V13w7TTz39xW8tt6BUhY56K/53dKb5n25zGjOPeMFeG3ZaeDHCzgL+C8ygJIlckzbH2zuBqm0GWXtxnR6EG0Rsd2RJI5ui7/Ei+rVp+27ouYOzP+iPXsjlOASrRjVn8nuc4iGMzTl9mCXu/Lxcd0SKyAM2MAZdVDbXydUrsKovRBX8tMNDfucSxwtT/aB6hnZk/fQuW5lQHgyB6PR89ehelVSSRpczSlQ8GJ/KzMhrdJy36QbMoeo05tibRVZufyWE6x7lPPYSKKKVL7rviff+evU/AFdltstK+iu/CISLN6S9tS4kseNSllznyMeOik1ipGgV/QHNm2NSFlYFVmvW+xrnlbgXVU8EMwLxb0C+5g3z2X17b3IQ07wycBUPC7zsqeTh4RXMKuiJuNRZP1BYpP66vopo0y6J0mHG57t6o6vKCQfAyDtDsXLdiknQtqS3ZN32h5EDCdJj6O7+J7LD+WccVUS9vOYirvmyb5z9nolzjDZ+oOSkFffVLiWM1TsEFA8EtaKo5zT7vI5F5uML6Jw4slfq+f5uGWDVa/oEWy2Xebrf2SUK2dF1plls+12TxhtBzGPOzdWMIWjrR0PqX/v87r553ZFYMxVYXcmWC7zHRGCIuvuGC66Fg2BIusMwS7b1zltHHRFXU6t+w0RgCLrDMEqX+dNLu9gCJs2VdopMdRklGcwHUm3y0wlzrS3bf414hrTU/KB6aZeZjtTTB0ld6Mlrx7KatOlMN/sm/IWpEPUD6Exfcdz2xeZb+2W+LAJV3I41r+yFcsQE67kDBM7q34WcXi+5DwM5vfc5JSr03SJ7n1WN+1RhErjabTc3k4Yo9JouUTFl4ZrJaPjEJqutGti/WP+LDsHEY5OzSctwGZtnm75Nv9WfCC5cWAqzpjh5en8Jp6+8nQn1MePg7peEHJnCTNcrYYzNKtyf88D3q8LHiFgf78pKJQTquQM0/esKsTZrX0uTI5Dpld0115V9pzel01Tbtq4f4TmwnTcIlrnD40ZHlXDLZqKO2eZwQEqbvE05c4MjaLgrl8X9Z4N4T07e6XtWTQtRBpr0hXHmLoznNSAwvogwrY1r3n0niVtrVNk3SLI2YTGVI2QQB136wUvMK2fyv16ld7nqTg/r1J2AJAhF8X8W9dEjsygLGdfsGMnqaLc18RQZVDcGQ6+JJgtdIiGu1Zp47xRWLOOqLP6H9n/paQQs0dBZ3VXYvdOqr0r6s5/4Kl8PiaHp9wMQHl3SEbS3eshuUtwr8NGDOSuDd5uPTL4rCRCpZJukqC4WxyrtC62SyqveZJ2N/8/ZWxjVFKCNpwk3a6Hh0+jMYuYij+3lm5t9y+HhG0WUPvK/kBnrSdX2qYzpeLV6p0RqmwzskfpqL5T6Hbvu4YxHkNdKmA1WC5GvlfTyoT4oESQF4UToNODhlLxfj0HXr57YmP8WIZYNMe/Qafmlk9LglnUjedNews1eW8M6m1oL3Ub3TNd+5rl3poYL1wVdohCGPmvnJ39KZsOIO0BB/tQMygnBZe26e4uKSxFX8EhmvYwUD5v1VTrY6eHjoJ7NO3Oc20GCWo527GlbU4l+Xg2PWaIEB7ZBAOO6vvba6SSPaEjVcV9AhNtQdylAWmfsOQaSEr+dRL9BXZcRzgXR43xHcDpG+x3UbDii8Ks6un7oh6Cr04RsJ0RZRbqoTjouUOSpvvdiudHOr4LpsBCdM5wuBHVLcs9j8FosLUFav6AtnFz250vz5ki9qKc/1mRogmMF+AP/D1PtZrTExX25P1DI1JdUNwzMErs0IOcPyjd6+cdKRAAouEVHk+0TgEl5dwxc23GliXt5ALFPTaJrGn9km5eDNGpOv4groqqeSGHhAHSPmEdHtPkq9+qckPzKNVoeYXJuUrqtAXFPQLjq8y6zLgTfipPOgR4qJJXkI3coq8PietIIBElz7y22F9QI+wjGh6nmKJarunYoLg/YDlbeagOX4qsR0hVVVa/i4SoFFCq9C9wWOsiOvC2tNTwyrdovU2yZkMJm3wS9LmZYJ2Be3GI/kqKaAAV/IETF/E0k3VFPQLKm88iZePndbbMN9yDP28akgv7kOov0OW18A79nxZtUf+VusHATjwitJmYyEUsrQ3t8eKApr8OIHIWZMuGFEhOFfYIqv5j+3lfP+WrQ8AMAjZM5xfoh31chw64IHVA5Lt0+408+56bNhuu9Au0GwLseONIC8WJfZq2w7Xe9kdKn2JYROcXaLg+rmO70a5pkQ8babZPz6TApFD8F2osAenYTrStkfo52kMAz5a5fMr4vElppL6CzxMKr4uWzFiR9XxoemLLXpXWxGwAmMoZTnUGxzn/gHZPWU32lmplPUNqb0nJMadwJc8ga06+Sq8x6USdtQ9PdoftHhE4qSDfHyMqFEioqBUNf/Cka3obRHUcGxT3B2xbpi21No5KkfUHqdze8DP3OJ6T4C+wkLZgjkvoFWkJPXyCtilScQyul+wwRPBU7Ml7tFJVPBbimaFYctKaFMZRo+UPZusPS7lP7op6BCQO0+L6UsyM6SonDT6tnj+oFU+uWCzlEl6nTXk8l4/DHdT1CVksn0/ZSgyEVdZkFKyYkseb8PbWmuYmCaQ9wnoqHpr0W/6SFnW6Kp8pwZUQFZ8Ay2d5O7Ddb+7zivjqBap4Bnh6wWsBVavsEbTJ/H2uaRtsHVOZ744wiesVPYJlv7chL+5obn+IhscVp8r5zSTbltOmw568U2i9WJ/H1GltCPHbl7rJNyR+W6/rFfItTzDGhudH6tBGdbxD/PMwl9hg1Sj7A73KH7L9mpmU5goDxf0BK+pjEmGZ65IwC6E6U5x2erFwTBJOnCXRQb18ylf7df4lb1PREtNYa/W8jg+Rp+C3sjIJQa9T8wf0x0tQENxxD2K/wClYQLkQ/9tJJUY7C3d0J3hHaxBcFMT7/o7+dEdpHZivzsEQfaZ1gIQ68RXbICgYWemNfNlzR3oG1JN3NmXygE3EgAldUX9Dm98jvOMugQQysCPqskFITeGyTukXf0jNN159T96fOWRVnyq5CplCRPQ8LrR585boWd0VdWZFfjYgsOtSymV/ZesuOdUOFHeHg+2NqRl0FFlnCJ6KVU5FoMi6bYM2doco/YYe8mNA1fE8I++m70oxKGkPg/WKzrCt5HlAhO/8TL9i06k5wyV5ElNYGi2nPe23oqopa1VH1Gn9n9tYTjQIHWmnKD7mP4iN0Eo6q53Hsrot7mmRkFVhZxi27JvIGFRhZxi+7je7u/J9VjefHh6KZSGzK4zD0eq5XBvNYeFKPmkUc4yoju9NoJjy32xXpnPhiLZLa3cyfNC2qaiOM0QP5XpdPncqoOXa1an5w3WbP9JsOaDpkwHlAfWNm1Gn5pJuvJYv64yxDam6HBB35WHdJcdv7qm4xMOLfJc/5OzTKXdWPQXXWMgYHNd9w2x+TXvIBKTdbV/Ybp6vHOLlAs0zDFPxep7/QIuh2ZF0aaTfqa+XFFm365l4gXRNfbGEqXjAQzcLUHA6fFmZ9CHUlfbaZd/nTZNXH0ie01DcK7Db/X29rIpdQ8YGNZz2pH3dlBsyFEXcHecgdwgGUBANd0wDm+XFxvjtC1uBm+bldItPGGwj2i6XDUuEA5qu5wUrfIO6rhGS4bjeEFbZti6YBhkE1PB6/UxcWR49LPiNSD1PaxZF1iM1sF1WYrP1nj+xuaY/FdIr+l37lNp4tAz6TkGve0bIFkhddkGR5pLWA7uibus3nCFQHd9UVPeGhOTso1Nz1nRF3Z7n/1nn1Rt5U0Lh8VAtp7f70kuanr5JkXe41eLRrJb56mbDzrLZrtlX9ARvw8pTMKohD8r7bEtLm3CSnNRCaszRFX8aUL5QmJGuqEMbLZnViQmVVWGH120GGFRhDxhMIDjdZFvsrn1uWqWxLfbUekWH46ao5eOuilVWkZxQgfykGSQ4NdM/+LRw98R2Xj0Qp58EBqXSTmnxLOjEq9myQb5fYqGZQXGvVNlO0R38HXS6N4/ZOPJXrZBtHXXzglFZsJajmEE9JM9MvKKxULUdrRaZ7k2B1Bir9Sim3ymNfi6M8c5/TkkmVEQNGljdW5TV+He2QrZ1sElNDrm36wzJ1tVrVSg+ud5/PRWI94623oO4m+9lE47hJ0sNN19tVHtHw7p2Tg/Jchos7G2v7p78pJpl+9FrVuQn1SwKuX3KVuUzqc1RHQcIzOoGtR5nr+K7dFqztzwZCFRxZH9y/VDFtn7+sojU8TqCU+v6Pav719S6+lph65WCl3Gd1U0teyxhTe4pTPjeUzfBr4uQr+6rTKj/1E3I9fdVpn7/Xf5Dc+Gs+/yuxtSvN6q9pzGldlbUY8Wvqq9vb0mVA4UJdX/JsyUbP6Ttbk98Qr3vC4Oe1hWeUOdv/FmsUcU9jUkzWlaRK+4KT/1io4p7GtNG1dZ4VG1djSrBgBvV3tOwrb0S203KEt2VtK1tlT+ke4QQhHWd5Exqik+HVfFb/QePovmQdTJSFod/qf8ORAZpBDXVp3KGGSnx1fPgEQbiJB6+SZWOhx+GuhKr5rPvlSPjGIL7wROjp88WlY6nIIS6Eqvus3mCJzqCVvq8n80rPb6xpH+2wOoIQ8rTq+c/xngfqNuqdVCEJ8Lu7vebDzenXYYIWXK/5gjED4MjtldMevvpy93NO21p7e+DhQ620FCBr8aaRYFImncI1V2MzD2K3vCrX3XwU+oemQBM6lZGIKnu4VE4XHd3GTmtM/jGtzMqNKL0ZeX+qPY3NSQ/sZJXpwKQOP346ql+1TiwYtMNMGkB7FCAa2BKUCELXL04Q2awxvoMdnQZQdlRselD1yZdCNb1ql8OvWW63zoK8w+TDjUA8w/jfmUE89agew2g7MXxsAPZ7W1sP37blDsMXPsTvfeUDw/d1/qaol4dxfDvOCDSVKKd25Q6hiewfhX9Jtnmn7OK/UPTDUbUq64rRW+oAt0Qakp8NZwqEELVVPlQrNcmlbbyU6vlXhHf0K6vq/io4abqtF5mawsAR72pMB55Hp7uFSQBQkfHonrqPnysdkK6UKh/BK61SbkzGU0Qy8WhAGNEI3vEiW10YdtQI7B+zKaA+jEYJscWUjAJkv54aQ/pZVIrvfhopZdJrfTio5WWP6ZAEtrOIb1MgvTiAdLA1mIc0diOwwbQwySzPfgw28Mksz34MBtHY4BJilusrR1a6B+f3r75mP726eMdwi2cfhzcFfbOfbdtKH3Jc2mPDKqYwflOR0bqSh0hJDHMpqy3tuph9smgai3zrP/qcX8lWtVtEui/sW68eyqWRiAOCaRPus7gaDfFo2CGt8XDUILLxXwWn0aQuIT6XNaF8maAD/P678pvZmPoQ84DuusHT/u7wYWNkvl1qLhX/ayvveY5wNNUBhJ3D9aGJO02rW6Dn0X7dW3GrtNGKtKTA/26RhgCXXXQ8/dYmXJNSLc7uD/ol/LqKDEAdLh0eK2greQkSKuL7nyL1HK8A5sP13dhcfFAr3vk/gFBYHQLYQCEsB6YAVHWYRMg48vxGJDeE882FqSMnY0Frurg0sj3/A5Rh33YRXvBW959/MLWjqzO32I5slQYPWE3GEQYjRtNEH8VARB1WP+f5XqvcxtXqz9K2tUOsgPIt8Vr8RhP4yOlPkM+idrVbzpJgXqPd9aXI0MC4tW3wHW2XnPCfezzu3Jn+/ZjpYTkTccPPyG1fNZi+KJl6LG7/inOyb6tTK9R9Q8xbN5+2D/70NWWtYH000MeHDwxeqd2rQaCBnfjJmNZi3SCcKtNwQQ1bbCZdvVhEOOeKrKokU/R3c04AHZRTARnHNDdAuNX5xiBq554ETuE9CRiMZ3wFRAnSzTLJRS2G/LqQ4V986m65g/uxXF1cKbpiTqo/7ENQ89sJJ7Si8v2N/qcG2qLjKi6aR9bfOOqbvG1EbiNwWF6DpDxUPrK9w92b1Tabok+JQzh2+rVp22bsOhfCgeCL91junaIcJYIRwBlLWost4eWvBNBZQQXrAvn3ql9RM9BnxCRPeidAhef2ivIXcCurmW5YYMrhxQeuh8FkpNs3UbZ4K8BBjeMWg0H9u2VjUY8GAIzGnjY4Cy4bdKm2OSrtNw32tTQivE1Gi5OpuXyG5IGpFv7QUL/7YORbgjVp/l3/on37HfW1MPnQ42CD3DsXLZlRdyVX0Ry0NuREw8u7giYuriWbLO4FGnPUuIZU6/iA2Damml4VVGkfMDgXNaa1fGuKh4GTQcFPYH5mDfPZfWtzfo4Aqgn7ANU22cJ3doTgFVREzAoUj5g8GSc10/Z8ER4knFASPLSeN7P1af9aK0dORc1v2yXcooaWwV7ko6+e7Tek4yXkVh8z+VnXZdbdkwe3Hxiwi6aIfvejdeOR4HqNgku7wAJ27wWj4Pz9FHCkfk/52LZ/iKKHT0RajW8zId8Z2+GT6/iBWC2Xebrf2TDZK8i5cBq2Xa7HxwlBwEvux1W5DDTXDsbCv/e53Xzz+2qHB4PXTEXzbtc5rvRahUpB7XKTjJWqyLloNZdtq/zsf7bFXIzxe03o5UqUg5qlQG031asAQfpHSDnZJLlT/+HHQM6Mq6m9Uqcyg6p3Ubn9J64Wxw39TLb0XF0xF308rx6KKtNl6l6s2/KlkwY7Ppjms7mG1G6NjJpb+KB4k7G5Ve2NpBx4OJunANkQNovOb/G/p7TTmg6HTeI3md1026+xykijbybucQIiUbeDRI+OYuD+giCrpyLlVISoh/zZ2nyUQg6BT9HVzaHVsWyuc2/FWjsYzjrA2EHLOLydDJJa07bki7pB7Uco2qwHGkaLI1JbrRBBKtyf7/O0+W6WH5Lazz5dHcngIo7wCG85/nXpSLeWFrusmWB5J3uYNGruGiXKntO78umKTfpml8sDc77qLQrFOv8oaFiUGVdIai4pzEVAhB2haEpd1QEiqiLvlnUezbo9uyEkbYnKx55pFhmI5T2mKIDbMBjHAGB+Ilb17bmPiDLsbVFkXJVa86mGqZErB1Ku5ireVFp/VTu16v0Pk/FCXCVsq1wyrd7cjas61EuxqAUB6h3bfpAVvrwugsFHdTNJ2XqwoLIuvj6fJtu0KwnynnmJOSgThHNXBemrN0LH0Uc1FeJfexIjV0hF3eyT+Uz3wrVo44IPUkXtbcHcllomuvyundhaFUc4Hkec4/pPwyy79F8vuD3o2O3AlDQVd083M12Oc6NneRczL1PGdtSlIO0REfG1Zpz+JAxpgoT9nHd363n/iXdiZObGby+mg+gR+fR48vBMYxajbPAWxt7SOs0HcG1dppGcY1HNZRFjXzdJKfpYWAXxURwTpymRzB+9YuR70HYCFUcrweNrlNwxeGoKS3GNpCT9o0wfQbPTz9U2UHASW1yxyn234N7CEXMSc3CdH/l7MQ6vJgDOad1s8+iVn8SddPu3b3Y8Em6L+oEQbstLp+3bEEk7aA7oi4RtPu0NRUGlHew40lT8b6UTV2CROGnIrlR4H6dg8YZ1fSxhqfybE9Bpwr6ASO+fHSXA+T8QJFrzuBpuyv0k3YsRwikbE8XJ8Q2uxBY2UVBrW7KvqJX61dHtbKdxfAs0av5oOGi9jSVCTwlYTV2bYFKe93Ui4qW5X6L5ZDFtn1AwQc4eUNx2BVm+6Y8vqtbaZPNHKiLMVUfgHmOzxXbXI7zyz1Jn3BGqRYo6A3MIOt1lPBRffcicJcNNwci6wnSQzHMzhwkXLBBMk1vuhzbsUNBL58u61i/pJsXMiJV2gesVVE1L+2ObAgQkPMD5eAan694KvExLzeNvCdonA0bn1agoBcwfJ5flxl3003lPn8QEiruCVgjN65igzDWx3Fxb3yoWL15oMD94JSMyHqZDopquabggYI+wORs7h93clGkvMCoqrL6Pduu1sMbMiD3kw4mXRTjWXCkooJce1OfNZtsN1T1ScTPIs1MzO/ERc8beV8LRX0AEtegY+boCnkBkTef93/9tc4/8yySG+7vmzfNeCQsrdJP6rZaSIc+HI/0Yf036To02++vhbMPn1b5yU78MdixBnR8GFcEGsyW3Pl1CJUq5gVI/cf2875+yleHV9uDeDDpn9Sv+lgOHWosPCDyFbp1PM++5/TmwcV/UvsgYI43RmPLBvYh2g7U+ukeid9hoyHSP60DQSyH9lmMdqDeV4y0zifOzlPAHAR/cpsIGMfuMna7qILX7onv83W6fMr4hDbcGH1RP5t0Xgu/qxzH0kp5Oys8sbWmSmsRp2T0sACEvR5gSCcXnyB2TyNRNxUpbzDa6y1CyBFc3BuwWmT6Eq4z0lsza73Od4fd0ihYUhH+PkBUJTCMI1VkfUCSvq5tVLYhPFDQB5htmbb8zhASRcoHjHJ7w4+RQxhOIj9p4WoBHJessUPFAbD2k1NxvquX7CQw6HjVk/Rigap4LMRbHzHpp/VIzCuNvA9ordPe8LVfV8gLCHE+FHdQYs5KV/nIoNFq+IBX8ZCSxVIulnXalMdD5hDEQS0/MMWi9ZStRJdeZU02jA8T93JJ2V4rjnl6ATkvUJ6Khyb9lr+kRZ2uyufh+BuIsB9Q5bOkkLci/Pmo4zsU9gbq9BTOCJ5WzQtQ2pzqfyoFm640Hw/4rlfxAjDfrtq32ndj3k2IrCNIvfjdYz6ZHRkfEGSbv6uy5xFyFgr6AMN2gkQ0PUkvC3OV85tAdq4YW016kj5ahwerK8tqxfZGTd7Ggb19qZt8M8Jg67U8wbxl0yCPVPVxfMZEpT3C+vMwOZvh06h5GQT5Q7ZfM6ONOX9AQR9givpAob6TI25wQkele7DsomLQAnCTQkZPmLCXT/lqv86/CM+Oz/n2PT8aDO/qNBqe+rgIDP1bWdHCC+sUfID78RIUg46dB4GfdAgX1V+I//3b7BjTfyygf0fLyodWU+tFMXo73tGc4k6rA/DVIYBRz1odCKE4+j5oEAjccL2Rry7uRh5n9CQdTGM8CMvok+2ukI9hyC8D3nH3tEF+sCPk5sNHPtlNPdIn+pBNa6jKnqSPppaVfKrk3E+HhWh4On28HfW57Qo5sBDfJQ8S5fJ3N32OrWqELANQ0EXdbMc4nk1AkXJQ61OxysdrVaRcfWsbB0CUe0MJHDCg5GwekNe6d6UYRmPHbL2KAzztaVXmQKbcbOkUHGCR53g6FI28o57zW1HVw2tDR8hRnZ/bmCxj1XbkHNX8Mf8x+rGtjIMaeeyZ2+J+LCanKuag3i37AkK9qpiDer/uN7u78n1WN58eHoplIaNlD0HQarhZf0yg4OJ+jvQmuFBpf5slMem+2a7o89OInhtLdiKwj23hUGkHKB7K9bp87hT9eeSRkk7BB5bb/HHMTgM6flg0HlzZoLl0Cm7oq2v5QskAz5CSm059Vx5WOEL00J6wGwy8sHf5Q84+dPiqqCfqrn5Cvc7qu2GWvB57OgLkXGwF2L6Wz93C/3zMWQkT9nT+/DAWRa4j48YAv4+/F1GkXK0f4uXH9fgbEUzYKQZKkwNRR0ONlUbp+l05T93ufd40efVhxHkWCnoCc7u/r5dVsWsIeKCso56xr5tyQ6heEXRxLpZrLql6RNbFaZjNs2K7+PaFrW9N83K6Kx0cJCN6bqZsY1QDOu7GsCGmQS13qAgQ3G2ceN77gskSKoaynq79Rmf1R6cLaSPysY59viLl5Si7XVZimyKS1F5TXmfoVXytNUo9/OU9ZQXWa50FphE6N11KpNMa61FdIVd1kkczKu2PCuny4iOODzoFB01U1O0p9J91Xr2R/PgwX4TKO7o9PeTkHU92oUg62arw6DPLfHWzYSezbNfsK0rqmmE1O1zqQ2v+41hg7JOMZUuo0fVW3Le7fBk+sXeFHHxnvn0shiM6HSWcXZJ8Hn480RVyd0k0Uqki5WoKPHptjTteauRdfL/0jxpdHYGco6sZSoYjRczZkjdeMZBz1Na3o+81FSkHtY7HTdJHTLJwdDlExiPEa0JkXfGL0oWDP7bOipFn1Bp5J6vXkq2Eo8lmVTEn8yipXlXMab20ah0d2Y3O6n6Ow9KERid0vYqT3UJRyzeGFaumGnEfBpJ29YfBse7b609fbtKb27s/Pry5++PTx/Tuyx9v3t8eQYinOmw5rf+ukRTAFCTUij69v/ny5uP1DamugzC1ug9vvvyf9O6/Pt9gn3L6cbC4ID55xyqU87FIEcDlIVuyMhWBwWJ7D5Jpxb3qPcXvmljFp6lMDck1XFs/MJdxdfesj+YVCHI3XCtQmV65yScDFbPKu52FT5jX5WaTda6ROlV3fqZ3FJjeZ6A8NM9P9xu6+Az7Za+uwV5JqOh+vUft06uoFbSuSE3gNVRTP3kXoargtMKI6faPsRBQHYHhWQgSme0GSL6x0R5GYPGvNKr4R/Y+YeDi/t3HLznbf9f5W20oDwxMT28yEnEVezP0qhLDAbTcoPizXO83Bo2hKhljAM84Jae+FiSXZmPTA9HXMthb4Kjo70vG0BwfPFySW+cCfpC+ta6z9fo+W+oO1Ri4rspPbqcjlGNwjCujRjp9yglRPAs6m4Zt3VT7pTZTRg+UqjFtQPF3xvyB8erTXuM8hbSJojJ1MG0bkcJhlZb7ZjhAEIYEV57eJvqTG9oeo26JNm1jmtsY6yiUNMdTsekjcQwi6oXisMFBznPcgzKW8tgGjVG24x4iSuJjqzYi5jzuN9Fw+mNrLKOZj3EkuiTI1jjG8x/jQLSpkK2RjGVBxnFoEiJb9VzzXMj9/ktOi2yDcChjRQ8KkrTCps71SF7kXr2KgoO6CdmRcQz6RMlWs/3EHMn9dcAuXbINdkKm5B48fdJkGwS0fMk9EIOpk61aYjhrcr8V0ATKNjUP5k7un9dG6BVqrSMZlHv14smUrXa1hDzK/X2kPqWyFQaTbMp9MITEyjaoBjJy9DAMs5TkXj+eWbnf87VJlq0RDOZXxgFgqZatZu/BLMv9uRlLuGy9go3nWsYXMHLa5anISAmXBzGa5F62QWuSdbkH1CIBsxOM6/HUy+NYYSGTMU+ggmjZhEdClnRLdZqV2RbueIJmOmS7IDDWyEfTNjtDbpDBufc15smcbYafyeZ2IL5n8V3ODSTKjJpGut8kLjbV6UAu6f4na/NKT/pmEwh9BFZfPZrTuv/tI/mtzVpgwgTaBULMXN8tQ/kOrUnM20fXPFbmGU/83W+WsSTgk7qoBSAtnkktMpiOXN8oA6nJnbSLGawhVHbDmZIqHRlJ42nTJ7WOHawhVFatQ0rj3m8dQkr3Sa1jB2sI1ZTWIaSY1zbRaLp5F+1kA3AUn1WLjeWzJzXdWCGON3Ygyz0NoqrjGpGS654GSFFxjWd9zHlPA3OS/5nnyV5advpO6PgFE8+IvXTyhQUIR6e+Hpav7rEMRAEdx3NQdowpTeXbufT4AoAMEFH0ROqIKpblnquYnuKBrluE8qL8cKbn6UjSQxYLnkeZTHaPleIW9SGZvdGVZk/JDyYTgh7qeEBEvTy514YIdeaCs9PGSxp0c9lpIiZNxaWNzY6hgfHZreqUz2qP6e1JVQMdx60gS1+/pJsXG1iqoltsKx68ePDhV9+nQ1VxjYdNadut0Oev+f+Rkf1nNarO8fFLFKP5B+o4RsQXBR4OmK8D8kBCxYVqOkfXyG31ejjZJIYO0fRwwSZW/oq1gi7SKX6rpqo5njHEsxIzUFDHLSIex8fIqVNRcIylm+6eiEZV+ZkHqi6UA78c0TfsypdofdAGYrf1AD3pY7hNXPzFE6l0ORTMDdkFQC23qITXjoG5uvKOkWgz3pPfi2j1f2YH1+I69PaE3tv136jr+uzUsRZ+r4c0ijKxInUs6NXdGr/oiNCgqRqO0dR/bHsZ7UmgMMWf2fn6gA69zuA5DPJVug1Enn3PrVoO1/yZTYcgOt5/GixQ2Idpu52Me3R95M/JVkYUf263g4COTWfwVg35rJGW+/SsDZWhxXjQ+RXaS2A5NtVIDimsqeTHaLf39/k6XQ4Ha0N291DL9aGDl7/RBlHTANqMxVGzPgA9sRWuapNIm5yAgJ6no5npmcwPkt0T/VWzouABS3vraPYIEdf0gK7mFKf0NJUvJbIU5K81QUwqzcdXiEpqfQhwDVxFzS0u+eIkXx8KoPmwqTpuEW3LtOW2iHAUBbdYyu0NPxkTgZykf+Yq2KI4rn8GB6PDB2hbQ0YIqpfsCEP1a+4pObZQVTwW4o3vWCruPjJc1S2+1jmefPXalXeMRBx5xQ2fmObSVU4fY1pltxgrHrayWMo1t06b8nhiJuIcLMA1VrHsPWUr0cH1Sap1Dj5A0/HlcHuHa+CaDFQc43kqHpr0W/6SFnW6Kp+p0wem5xpZ+Sx59+1QQmoEWV/PA7LTw3hbjNoSHKM1noB9zrtgP5fmRqF79NqOUebb1fusybfLlzsDJzdEbTKuXph9A//+jrhbHLLdBwPj9q9CgI5bRG0EYDNIPSXHK3uV8wtXdpYxWIR6Sm7baVfyYADC+SI1j/Kj13aLkocKO8bcfCcPEbcvdZNv6NcS+gKcY73lMZDZHP7RaBFAFb1g+/Ow0liD1JTgeAznD9l+zTO70f2IoI5bREV9DOotpwrqQoUq0k57A7Z8Xy4Hsh5gtutouLaVCGRPttJBelob1MunfLVf5zIT+Od8+16feQHZR2uUnY+5f3Hfn9/KSoYJv6XvvHS6bhH+eAkKqgv0QfZnMicCw4X437/NjmEBDe4POgVMdU/XYLko/maHx5Gnug7WVz+wTJzWddBEGSaPLQfhwW3yG/kq7o7+jq6nNHGqEnnp6JF1uvJuhzu/S3rH3TipNHJHfnIb0L9+cm3y6cEh3i2x4p6S27aXxX+q5JpjhQ1Rdn6ofGvi1t6Vn2YxftAhVtqKTu6PbGX9It9U0L9W0ZmIgO2lb00DMN1aB19S6n4qVrlR3YqCg+9uwzd1M3KRmYwBfRezhvQvuCvFIDNgWPTa01C1zAQl4buO1RhI+m5P+VgB0qhO71G/FVVNXmE68tNrPqT9Nqi8ozK9/o/5D5MPb8Wn1csDEN4W92s6v6ZqTKt9yz7BrHZVY1rtX/eb3V35PqubTw8PxbLI1gbBmLXKk1czS0C4pmvqxBIcquhjVyZm6jfbldWcNlLEZMten17rGewYUcVpWB7K9bp87pT6mf7kUKfrGNFt/mhguQF11xSZyM1ti3NAHcFpFBJjEKWBfXW6k4nONluqHaoh/cnj8q48rOP6fKvoPRzUm4yEl/Muf8jZl5KvT3taTlCY1e6i1htm1muD92lAZeI+iO32+bIkHqgY+Axies5P8gOJQlGD2IZShvX+bvQKTVFwsFZ20nOZJHSBeq6QGBoBaE0fk6wgw9HRVXHeJ9/nDRPTJxJH96ddHeeIbvf39bIqdgPZzTUEraI2vb/s60YmsTfoLV2diSyDXL9NQSBqE7kFNjeL3fPbF2KOzj7HMFzE5Bl/CrYBdSdj3R7ZYAFOsJkBcbJD4wnACqZmVj1Uc34pbLIoPLpamZvy8XGdG7SEouCYEdguK7H5ec+fOF0bPtTSa7tfr5QaeHQRwwVdX4BnrLYQJ/czmYyd3s268g5qthnzqKIPnql7X0F33tHpTmutom6Pxv+s8+qNvLcg83Ko6vRbcunebnaQVJWMMQwkNcp2zb4SSR7KLXkdHSnCLV/Dw4ot89UNq+66rerWBOxwCdPa8pHLGWTVOYn32sg0oyYI9Nq6nJG5ka78ZCxqBJvtY0EO+3cUnt4e/du7z+TXYV15t0ja20k6FEXBLRaxBBwdNY1cxzWqjttK+ima7D6Ails8/Crxg1k2VEXDg/XM4AAV99a6NXlXryi4xWIU408f3W8ShmMMWLOIg4ia4158SorOY29kBT2qhkbVOb5bg0DWHXHH/Tlfsu3VB4OASqqG6xXMFI2q4QuNMRjnWHa2tNQg5+OuB9mSU3pt13vFopZv4StWY0V/4gGUpu8ag1PT3bHtqBDtoTn+ImCoO3bNDvTu95sPN7cjJb06StE+5IRwsNb09tOXu5t3tMpPwvYYSA8NhmonRGg4qau4NS3x/FQg0zkNw8VB2QjJiP/+/TpDUvcSAR2UnQLi+SusAbXKEwH1CNt2pZfP3bCjAcCn0bHvyj23iHcfv+RsC1vnb7EARX04PQV3WMQN9o3m9XYfCRB3jOPPcr3fUBpElXY00R1uD9aCo+svbwBGX/y8kx2o/ziQFoQhBLHrW+Q6W6/v2URBaY6u7Nnb4lj5sSHmtIY4oT5hiGfB6Xw68LwawNC9pTbqhhqeCVSFEExGQ07PJPUqwmgbo7oGuCJQmYYkMqqNxAZBw43RQGbfO8T3wC/WET1GNQ4xOnCoaKgc8zYmVqgla8y+kM1YT/n44tCRo10Ckayp4YMQWyJEkFFtGo4F1IRQKka1jHI6oL5BMsfUjuOsTd+mw3SNcU9CnwYhPcko6gpxziVOSXZxVqhzMRGEZWSV0TWulRyp/Silr/V/Tdp36qIfwFZAwh5M3u+28R3FZDW6SmAKvhplt28+Vdd80hbOBaNG6on7AvbYvuxmS7S4TxeOjm/00TT6bTii7rFFpwAfVz8D8PblrBVqTNcXZP7qXWmt0bGFajga6JzUPwYA4Wf31adtG8boX2gyov4aNKbvDqkYv5/btPUEZFDeEZJye7DGnXBiEy4NusfeANWIrq9OpxwfaL0OV/HR7Yz6mDsMy3LDpoD8Q84Dho43B5R23plaV6PbJqtGNx5aLV8dqFcheiU1hnL0kaUxSBhNsRGJf1dpuW+0ocx73Uuj5Yq1K5ffkPgkEMVBylvjiArS/Dv/3Hv2O7PHOGemUfIFsk21d1d+ESFybwl7cFzF24aDGNYQ7jUs4hlOA5q2phtfKBVJj1vja56X+11VPIyaFAp7BPUxb57L6lsbTJUArKfgbcmW/ZrY/X2eQY8ZMAmHcf9weOzb66dsfEI9yTnbtGxXPNzu6tOeVHtH1hWCl+1STnOU5bcn7bAdSPWf5LyN4OJ7Lj+xzW40OoIRBVfNkn3vPlHHPYhgE+E6jhCxLXvxODr/H6Ucdo/PudgqfBFFk07jWi2vRyJznHo1b0Cz7TJfoymLIbaupCNrZtvtfnRUHYS87bpYseNcbO106Px7z2T+uV2V4+OnK+qq2ZfLfEeqXpF0dTQWHYlSuyLpqPZdtq9zSn/vCrqbMvcbUuWKpKPa5YPntxVr1FHmDcg6JGZQn2CEkzFyBqYtG5U4aR4C8JHWjJ6Kezw39TLbmeHpqLgaFXn1UFabLmH4Zt+ULbMyOlTGtJ3OW6IG7WsxdAKDKs7G81e2/hjhwVXcXazJF41fcu7a9D2nnzx1eu6Qvc/qpj0w0KgzjY5Lxt8QkUbHHSI+4QtygoCkK+uWtP6YP7dJXSlQdEr+juhsPuZZuG7zbwX63hZbTYCCI/Z1eTpdpTUnyXmGqyUatKbPrOg1PaBDs5wNYNIlNbNDsir39+s8Xa6L5be0xgOKwx0IquIIzylplczFVO6yZYGEFgeY9Gqu2qnKntP7smnKTSpS6JIc6HoaLtGs84fGBIsq7xJJJZLcG0ABCi6xNOXOBIki7qoPF/WeDdQ9Ox2l7Skx5Xcoy4xwZTCm7AjjU85NMAbmKOWo1jWPY7CkrF2KpMvaj1EUyCighqs1gBeX1k/lfr1K7/NUnGplWmKZaJfPrHVN4qYMSnKEftdGm8QTTcJTCBB2hIFP9CYLFyLvqjXyrUipPs5WdQQd1S0eCSIRMeCe/SjmqN42m+l4zV1BV3frTyX3+0xrkktLT9oVipZ8kAWnuS7lAISjVXOE65niwfU82U0LOM6yOYffcVNuY6CwSwyrtC62SxqHeJJ1Nac/ZWxbU44/6zjJuVzbDh9FYfIwBV/uHd267l/SNte1Mcy+qi/AWeu/xHZggjOjYdVqnQ2mbC2ip+SotkPYNm/nhvEdX9MpQFEcFyNfqmndfso2O4AXhQOQxnncLLF+9Y+V73/YaD6WIZbBMfw6JZdclhq0gbKxnbyfBXU2lPc/je7xj22tcjcszgqjexdF1BmCTCbGY6fx8c0DkHWOgX2iCYyTuDt7dPeF44xBX9wZknbrXj5v2aJL3ul3xF0jafeMaxM4UMfRjitNRVyI9uFhyk92cnPSoBndAbZRbV97hlTyGFSUqrA/UKIVSLssIOsPklzTRlmFruBP3jEdoVwc5cdW8hN6210QrPSiMKl26r6mV/tXh7XjaWjHEBy0XKFIUxmrNz0+dh6HhGh4P4SIypblfosFitZtR4GSL5DyVuiwW832TSl2kJyFWZXjQS3G1X0B56F0V2zjS+Pre9K+YZGoJijsFdQoG3jfzy3r/DHL8bJ2h6WVGrjc3cE0Us6hPRTj7NRByhUrJuN6p0vKCQMKe2sKWc/6Jd28GCFTNXzBW/EE2cQgGEDWH6TDM498xXMOULwlNToeIXKGkDYtQWFvoPjawfNL8+VCnklGoaEqHgE2clMtNiSUsYCreOWPxU6hYk2CZMXFSGNV3ts0IpJ7EXFBYV+geLIimrOTIukNTlWV1e/ZdrUe3xgC2Z98oOqiOXCkAWFrr3yF1gMDz2jXc8Ho57FzvSkQ6eHSpSa/XW93AMV9ARNX1hQzdQW9gcmbz/u//lqf0vDe5k1Di9qpVfzJ3VsL7dDXI0Jf13+fruOzs8laOIDxKVoE79pQHs0N6PkyerE9xVEeQaeKegNU/7H9vK+f8tUhxMIoLkzjJ/e7PqZDh6OEREa+SLdvyLPvuVlz4So/ub0QUMcbO8pyhH2UtoO1vuJH0nzcmIjGT+9gENOhva5IHaz3RSOt9emZEC0QCv8ibSTgHLvTpUH7yA/R7tnv83W61GaO623Zobi/wwSvaYMlckMxbcYytzk42zyxdaxKa1IwT0zB+8GLfOLyDWb3RIhMrkh6hdNeMRJDDuEqXgHWnO2UblPSIzhrX0jsDrs1EmhSMX4/RFRXo/nQUcSKvC9o0r+6jYA5hgsK+wK1LdOW2xpDpEj6glNub/hxeAzLSewnL4wtkOOSSDkEHcBrm0DmcqmX7NQy6pjXk/Zmmap4LMQ7N7GQpDUhKp9GxxfE1uFz/Bq2K+gNjDjnivs/Me+lq5wwyLRavmBWTIC/qpTH47QpjwfmMaiDmv7gigXxKVuJbr/KmmwcJ6bi7fK4veqleAQCWW+QnoqHJv2Wv6RFna7K5/E4O4iCP3Dls6TftyJNDemBBlTwCu70XNQYplbVG2D63HyeKRls/NKclqRHr+YNaL5dtfES7ijeboi8t5Wkyvn1HttMU6a7nrRDWL1wjcdMeG0859uXusk3BCpZr+kR7i3PGsIG4kfaEEY1PMP78zBjmOPUqPoCvMofsv2aGZLiJQKFfYEq6mP+G5n0YXSmQTXsfVl64VLocf3PEFe+Xj7lq/06/5K3GXve833w+DZFo+VxLIjA8L+VFT0CuE7JF8gfL0Ex6nF6EPrJp1QB40L8799mx7tpyuOdjqa106+m9ouCdD3e0Z7q/6sD8tUxEJIrsA6MUCY9rBoEBIPtvJFPUO4Ir1V60o6mQx7Bh/T2vivoa/hypv4d94UbJeI6gu4agtAE7uqTDt6H7FNjVfekfZlAVvSpkuuKGTxEy9uimTdvSc7CXUFHluM7+VEGW8q465tsBSVmKoHCrjCw3SwtAYki6aj2p2KV02pXJF1+exv0QZR9Q40UMaDodB6R97l3pRh6lDeoejVHuNoEbyIO42fqVZVOyREmyViYQdLoOOxZvxVVPb72dAQd1v25DexDqb4j6xDBx/wH6eNbOUc184BGt8U9JVitKuqo/i37GmL9qqij+r/uN7u78n1WN58eHoplIUPYj0HRarlb50wh4Sr+qAxTfKiG382bmMjfbFdm89yIrjsLd9ImULaWqIYjNA/lel0+d4r/THjtpVPyhek2f6TYb0DPH9vII5kbNp9OyR29dy2feRniGlJ01/nvysMqSgyv21Nwh4UX+C5/yNlHj9/99MTd4iDW77TeG2bla8obGyDragvC9t58PRAO9xSvKEzB4/malGS+I+fOML/THtYoki7XJ/E85pr2mAZTcI6Fagog7nCIshKpQ6Ur67F7vs+bJq8+ELyAobBHULf7+3pZFbuGiAvKO+w5+7opN0QYirCr879c58kwEHlXp342d4ut7NsXtpY2zcvpnnt0UI3oulsKrNAN6Lkd+xbYBjXdoiNCcbuRq7JtXTB5IgAo7/GalrRaPDpfuBuRF5vSHIqkt6P6dlmJrZJIJn5NfcaiV/O5lil18TAL1BVfr3k2uMYo3XU5kdOP0uO6gi7rNpoFUA2/VFD3zoHg8KJTctRkRd2esP9Z59Ubefcwzp+hOg5vvw8ZzmnZbhRpZ1slHtJoma9uNuyUme2afUXNeTWsao9PfTnPf6REqD/JTWgZNWzkiolU5cs4Q9EVdGaXJbMzKR+sKursuopcvyrqvH569Q43xca7YX8bTWle4z2wXs3Z+Chq+dSoYlVVBMdKID0BxxHC/yMiJ2yz9f97rH5Tct/E+u/p4adU1K9U2C0rPjnP8QBT74u6AcuDKOiBHXeUQlVhpI7OR3Rgaua5fc1/3+Tmlb7qqI7VDvS1HnwrCxgDYSuNAbCNyjcLCK2aIxBsN/SQi8w3HccXOhig7giUTHyZ2xioo+rMTDxUS21lqYOmPZRBx1djKGNRb7WILg7fonP+zCslD5MtsotTQZYIR7xUeVSAbG3T1QHQU0HOgHqx9QHoeDYIKuLjpw8OGPfAL44Fu8E/0lNW+fdCPdS5+5Ju2Wf5mO8lT4677uaJdPc1SuG+Pqe7hTk8XrkuN8rNPf5JQHrqJoYwKrEaX1EnXvhxuhAG4/soFAZ1E0WEcS/SrKsRUAzQqOquQD1U5cYGTavnCoYas80ARz9o20QgCtlpAqTHdRoDsVjU9FAM9i+wEPkpul1wLzuhATI8Y6FxQ3UnOJmlmza9KbJnmNz69ZGnNvWzhoMdjB7PEBx4HkVDMMHlYj6LT6dvkROcv3Y+4uGfq0A5ilg0P6xOcIt3XTP0qjuKWFQ3OBxHanpFH32nrxh6Im9Y8cVBiV79yLaofspW5bMxjIPWFBxau7+pqk7EFD0kIWfT4bobqX1TiuRIX/J6v25Gpz8gPnW2qUQxNpW+OqqOz7jwG7WxELJ1ztMNWWOCJTiDJtJqjNIhuoY66DqDs83zVZ3yrx0/5+GgYAlToMGB9C6/3z9+2je7faMfRR0hB3P2Bxmp7o93+gqPIhNHrGCJb9lykzefdvwEOUpM9RSmjloR2X5HOOLjNb/q6o+fFvvfq9vD8aBCQvH7OJWpgQbLcAiPJwgr9w0IiGUGD5bhEN6/90U+NuvpYB10p8Hp9nIRKo4N9R0TGduPKrJT+/aye0tNre/VEt5Wa75f/SzdYQ1EyiSjwOJlGgLp2uAtz753y3PI/atonv6oS3lW/z2rn0awDWhOtU9xKCx9mo7jVa+00YYbahQNZJCXyhKqPl8VeqE4DbKaHMYSsVn69GmARabIqYAPhZwDcAWemltCrgwfoU8DLd1Pltl6fZ8tx64uR7H3SrP01Jr2TTvKLfjot+zM3KYcdPZUpJbe5ZS7FlrPhyWeZaJ5YuWlu4pNxNtuzC/bKadX3FnssWb9191H9Ivz9BHA25LVdtKb+hH94s77Ee7wnwm6dNm+ZUNvnf+jKvc7GIzE8kMGyvX0WRaEv/VXXOh+OAaXmrip01ag/WEah+OxJS4MmCCnLTLCwT5y0Z/YLIf6f3ajQL/pL246jFLSeSbhPKscgQdlnQP+Y9585Gete+GH/iV7FoT7bVMRnMDG97wjhZ/pA9WKHXxUr8CzdDSeE/t9cZ9XTTF6zz7e1WBp5/iEh7LKs+XToU9M/YZ+cef4CHF6uPn3PltP3/sqRZ2nE212e/kkh/XcQzRaB71JV6y3j1KvJHiV6/aNUadj9e4lVDnvF8pIdQa3yuCjcN7yzyJ//lxWzR8Hy43Ysic/laMsHx7Yopv+sKr3VUd7tD36nzoMaezeYRgS6caBDGlTbC1bqNV0CsWyZVpNh1CyH7atIjWdQrFtFak5CUp3RP/vf3z6rc03yB1t+DTInW1Wn/ZjtPqA5mRPKV5OWk6G8Kpb0GiTDTWF1o7FNm26/kuWQLsFGa9iFsB3rMByVafr/GFyI4OyzgdfNJjDT1DKO8dnyDxHLj5AKekc0O+5oDsD9Ivz9BF9f48//0HdzfTkp85z+fax2NrV+uqoS/QM6H7mQHdMRWbrZblt2Iw0/oQRx4YXNAlonwY5Ztmosmeqw0wPqaYkd1DbBBcfCA7QGoigBHfQZHDgz/noIxxdBzypO2wvGUTZGpWi7w4Wj8T+Uv5XuSlEOBA7bP1CnAJ8n9UNf8X+aZctCY+RtBj75biDeZoZ7tmPN99ZSZbDQlOSD6iVSAwwFeaxFKdGP6QruJ42Y2tKcgiV570ieV/pECoFOF5LJiEDJbhdO27VrNzGK8dtP0n3ZFgyWIklpqPyNECdbdyh45qSU1q9M5FUw/UbkVX6JphGWtEgkqxpDJFAYo3Ao5JZNtAmthyV3DKHNk5yjUEjkl020Ka2GpH8IkELTjPap3/cslVvmy+b4nuBJHDqIASiVg8cQMTDFqxMsIjlVBip/pWmEOMTNGwGPebrdx+/5GzZq/O3WceJ3ABwrwSPaEW86RtNnlgCVqDvG+mf5Xq/sWpUVd0hTvCYSwYEXYPrPCrQvr5DpKRkhoYIj9EYriiTDywRfq6+Va9bf12rJu0q/4LteYR3bMzEsjFPH3pCGc9Ot7NL1shNtV82SMDvMaCqrik6vWm3TXq8ikjhIxR6K2qKcYZTvB4yx3VQ0zuZu8CV5vyML077iruQGcx+Kb5QL6XMXSkfw992ow0Y9EekDIeI1aCFZd1wxvaheEynjCJ9Ob6QwyMpFanBaZSIJG27GRKvdgyMouqrpfjWi1+PvKuKB/P+CLU9ovyYN89l9e191uTbpbllsRJ8oW1Hqe3o9jkuitoWnKLqCx9b0lbXT5nFmnNSdDVyeZE91wcTPB1lZ5hetks59aOBbEdRQXWXbWWH6KTobe4ovueH+DNbNrv3c86Ozh1ICc5aLvvezR+Gx0cebUW8EFcYq7wuHs3Xr6Oay172ORcbtS+ibDwOPKXPocV4Ww/4hYAD4PpyvCHPtst8zaMImoPtqrrqAdl2uzcfvwctb/tkVqz5plgquRuj/96zzes/t6vSYqB2dZ3ZSkQHtgKkqLrCIzukFR5F1RWeXbavc6uh1dV0OMfvN3ZwFFVXeGQGrbfC/d7iGKcou1t/GvXBrgHf1X+a62AtrAR5ccjJbrcQ9srwgPCmXma7iQg7ZTgbgXn1UFYb8ZqqfSrIY1+1D0nMh+VYcW5n1vapnia1Cm2KhWW4m02+MpFpCPEyXCF8zNugyF9yTsR/zycQC7qCHGLlPljtyc2SLdYU4nBunI5RU4hDjHyVEoyVDbausrNdiXy89jF/7vgqWzBHeCn+eJqGPz9dNrf5twLNNkVaEkEJru4tlqejcFo3WcWDrKRLNOMrgZLTF+XrQrVbaYNllTdB3ZgkmTfHuir39+s8Xa6L5be03t9vCgtqES3DF+LvWSXzAaQixG1aAvdYKmp9Od7ausqe0/uyacpNuuYew+aLKlqEV7z8+cYktGoBXrFWPO7bJLCgBK9om3I3Caui7220FfWewdizs3Pa8gwpv2tdZjY3iWOl+foKEFeQCtc+kCARFyu2YfOmzZZBUfWKL2fzOStpCk5YhLeVVzw7q5/K/XqV3uepYFpWKTvWibQZcnGqazvy1qBoX9+341H7y33NqrTYs0FtXyj5ajppQ4EU4K1Fe9ks6HQBlsrCLTqRHxHJdTp6WDzq+ULWzzxB5wWwxBOOXRqfSv7yLxVh0C3u46C6N5wtbSdrSnMZrsPiNKYtxxdyNewtFad1nFvqaOaTsnikanNPDLW9olyldbFdWl4enJS9raRPGdsHl+YsakfR667k0A5WhD5Wgp5roYbUtYB//5LKeLgOPqRf1tk+KdvKF9dpG2TZ8mu0xfy8D5ENXNaF1Y3/aHE+P8yJq/fwFxglyoTljzSOxkKFr0+4KHx8xkhAz6/evubrT/gavh1mE9GxDLEbMf5CXSk+xwpIZG51vHJ/qgKomqJZm8M6aPnDJQ9pal5L8s5V0fWHUfSmv/K0KS02hkDZP0rWKpOAnvQ9Wr171LDgAvv6/rC2Z87yect2R/Zn1o6+d6ztMWQ9CTAsxNeOPE1lWgQZEyPl1IjcifLnTeZdY7S4s+0HU0lZWn+Hqn1G2KLh7HbhQPmMoOVew5wv7Gr+8jvqI1iDqPuwoNMHO9slQ1gXxSRgzve9PXxffeJjO1+LWbeH8VCMN5xput+t2DhNj3GJLEAjRZz/wC1qF4HFLSZaXSln+wzpQnA4M2X7phTHFk7JrrrJe+mE7lh5Z/u0ex6EgJ3HLO9Qe+pnB25HVUPt88I2v7M4qp0NaNdLaZdZNDFSwDnBPxQW7PZBzRvvvq+4brq0Ok1D7fM1p6x4/ZJuXqZhV4s42wesiqp5gZEBye44qvIZQR/e9Oar36pyY/X8Q1PIOT+CX1tYTtNQ+3yw+QK9LjP+mC+Vx21z8GgZ5/yERp71xGbTatTiZZz3Lk1s+irWinvzZRMp4HyTZlEt19bIofbZYOds0bZ0x1ZUzweYZ3D+Pduu1hZHC6D8y9MLXbyH26DA5giqfLjWrzJrNtnOGORJ74wbPtbruAuiGDYWw62nfzbowpvLqjN0Nc8HN28+7//6a51/XmfLfMNfJ+ZNYxkIUVvSLz8QteAPozKyGZX6JtENUXbsXguvdr7KicjVG6sgFQMFna1rCYWMC5nbQ9U9H+T6j+3nff2Urw5pCcyRY0X88v2/j/rQ8a0iBSKNoNsT5tn3fGKT42X88m2OwD56hFhtArB20Hb09u3i8c7RossgRfzyjd5HfWhzq/iiSCOMtPin5+2Exj5o/1/TzgLwsVtfTmlj+e3as+V9vk6XTxlfNSwauK9/xmMxr5o7UlmiblXPe45/YtuJKq3VDAlGB3lQwvlpCHv+4exwd082ob4V1fMCbn1abMPt4mWc9xNqfkkjvbTl07GsfXy8O+zm7T6LVO6ZP1XUL4BZfpNSwNnAy8d8+TpvoyyY+oCq2meDvS3Tlgo3xqyong1wub3hBJMx2pPeL79haaEetypWB/7D92qbMRUkT71kB3LzBwo99fPZvyoeCw5MrtZpXfxl0cJ4IWf7iPa9jYWrUFfzfHAFcyTcScTCkK5ymwlDW8zZPqTicb6Lpdw51WlTHjkp448ZLOqMHyT2JU/ZSozHVdZkFl+ClXE+F6jWP8nq7QRQPh/op+KhSb/lL2lRp6vy2SIaLVLCGeGXz/L2cisSBdk9dYYlnBf+KQ7P9A/RlnW+T5qwmv2kRQycFNLcMrOSvpzzfUq+XbXx++6sPPaRAnyCh0HZ7qxeeHUUzwZWGhfmaiZfUgPts8Fu0wnb4u6pn2/rVuXcUYgd7632Bj31s7U4TzFSltWKbdOb/J08Z96+1E2+sblR1Rd1zg+65blr2QLz0XKtQos49wf8eVgrHXyJpqzzDev8IduvWe+wcuqF2meDXdTHVPVyYjFfdNEieh/grue8L5d2yQ9U3fMtqsunfLVf51+Ec+7nfPuen7stzieaYs45av/FfVx/KyuZA/rWZoupK+Vsn/HjJSjMH38dtH55yk8AvRD/+7fZ0f3O6o6yU5S7V34afBeFnY9gpzjnD/50UL/6hmr39k8HV5RmF4tjEDI8Oohl4K/8ziZsQE/d1wLCo0bbhQTsap5tsuK34O/42w7ze6COpsfGtGlGj4jkQ9JD7mpjcD31sxla1vypksv7xA9Aijknh/DW7v1gV9NX/+BHUPPLYKnkcRSxzVCb78Om1RRtbyjZIevWPpjlrYdAlgq+p2KVW+JTVL22XxskU1R2Yx1qc6Akv/OqdFm7K8W8YkUU6svxhbwlzET6l8/WPi66UnyhlvTkRNCaQnz28N+KqrbYE3Q0faL73IaftgLYUfaJ8WP+w64BW0Vf2Hjo7tvi3ipNmKrrC+GWNYAtQlXXF8Kv+83urnyf1c2nh4diWchEq8ZgtcV43KFMBo2XcUaic/IXoEWc+YAgVss329XElWGkMI/96PoUccPqgIMW4QvvQ7lel8+d+j7bBBnRlXI21Lf5o1UvGSjojPcqPBHnVBPoSvF4TXEtg4lMRT5Uksdhelcetju2udl6JXhEy2t4lz/krJ0snEZ6+p6R2iL0i+yGda5rq5AKQNnbBpQdGvmiK14cWzn1YyWckxf7YJXlpaPo0fy/W8ZRUFS97htE8INry9gJWAn+0VobHOj7nJBYFdbDvqt8zoH0Pm+Y0gebx4VQ+5ywb/f39bIqdo0tcliAzx68r5tyYwtU0fbG7MlNnT1QpABvfB5bIMUJ6+0L2xY1zcvJjcx8ghgpzOMC7Ab/QEGeZzoX6AeL8ozfFqznw0KVbeuCFWALERZwTpcmuzX60f+mrCkfH9e5VZMqquej2LbLSuyt3/MH/NfWUQv05Zx1j6FUzsNSWu/m9EX9vA+a/h0euz7boGd227uupld00+Y8tIgzU8ndq2Mbd1pdKb6avahbIuyfdV69kVfIFhw+WohPbzP5rtCW+FHV/W2lefDuZb662RTNdbZr9uz0Ka4FLDKDD5bl8AvUkH/lfba1SlR7UnTZumpGnRV/4lu+WLCTXU1fbZdvHwuLDAFHNb9OEJ8tggp0NT07ltjAU1S9LlPHpxmWz800hXhrU/m0wW6nBZR9Oml8sIwApOr63T5ZQgTKPi19axdnS1H1hc8yDr8+Ar8rh/BDihzbTAFIAV7vu6QHMhNvssImSKCmEH87oSXban2wik+r6vpbFe0Rqrr+EU4A6JPInM5gnpH6k71qOm+pL8ffvreoZXCnitVd2TwtBepO23gxn8XBEepHdkC55rkSjyj5cycF41FEoFPg4NUPVHdbbHbrsQo7QjZVxqfHhG/u63K9b0CFQushW6q1KrIW9Spni+ap2H7jcXV4Bkrjil9B9TEYahmaxvit4I9pK0pbdEXP2RS9es1bQvlKXbSSb8UuvS+3HZdoKh5F1RZM1ypvX8r/KjcFxSpd0XNapVevuVWUr9RF2mBTWrkaM0kfzEnPIQy7dlF1XcNJ1/lDMwXToQBbYN1+e51ts1WRbSkdV5E9Z8/tV2zeddUPHQheWlPsgyBSdN3AuT9mPzaHo+iawvmf16yiVf7jP/7z//uP73lVc278P/8juAgvFqyAhyJfs4H6n/8tcbLiy43wrP2f9rc/2Y6lrLiEFPn75X+8/u/L11ezi9l88T//8/q/DxriB/EPQmzG/muGic0UsYD9V4CJBYpYyP4rxMRCRSxi/xVhYpEiFrP/il/P44vF1UwRixWxhP1X8np+qYgkisic/df8dRBczGaJIjZXxK7Yf129ngcXcTxXxK4UsYWutIXatLylFxj+GbCBMAJqrJlqBp4RAa96phpixht8hhtWtQUP8aopUrXGjLf6DO0EM9Ugs0RbpGqWGW/+GdphZqplZlfaIlXbzLgNZmjnmqnm4SEu8CID1TyBME+M9n4wSrTmCVTzBMI8CVqkap5Aa55ANU8gzDNHi1TNE2jNE6jmCYR5rtAiVfMEWvMEqnkCYZ4FWqRqnlBrnlA1T8htEKCjJ1TNE2rNE4JpjNsgQEdPqJon1JonVM0TchsE6OgJVfOEWvOEqnlCboMAn25V84Ra84SqeUJugwAdPaFqnkhrnkg1TyTMg46eSDVPpDVPpJonEuZBR08EFhqteSLVPJEwDzp6ItU8kdY8kWqeSJgHHT2Rap5Ia55INU8kzIOOnkg1T6w1T6yaJ+Y2CNHRE6vmibXmiVXzxGIXgI6eWDVPrDVPDHYC3AYhOnpi1Tyx1jyxap6Y2yBER0+smifWmidWzRNzG4To6IlV8yRa8ySqeRJhHnT0JKp5Eq15EtU8iTAPOnoS1TyJ1jyJap5EmAcdPQnYq2nNk6jmSYR50NGTqOZJtOZJVPMkwjzo6ElU88y15pmr5plzG0To6Jmr5plrzTNXzTPnNojQ0TNXzTPXmmeummfObRCho2eummeuNc8cbKi5DSJ09MxV88y15pmr5plzG0To6Jmr5rnSmudKNc+VME+M7uhV81xpzXOlmudKmAcdPVeqea605rlSzXMlzIOOnivVPFda81yp5rkS5kFHzxU48mjNc6Wa50qYBx09V6p5FlrzLFTzLLgNYnT0LFTzLLTmWajmWXAbxOjoWajmWWjNs1DNsxDHUHT0LFTzLLTmWajmWXAbxOHr+PLikhk+jl7HV+wvVUW100JrpwU4nC7UsmOsbHhQ1VpM/tQVFTZD+7/8rSurP61eguPqpbAbOgbkb11Z/Yn1EhxZL4Xt0HEgf+vK6k+tl+DYeinsh44F+VtXVn9yvQRH10tulgTnAS6ByWZ6k/XYBW6WBOcCIL8wQDBAhkHwCAnOB0COYYBkgCyD4BISnBOAPMMA0QCZBsEnJDgvALmGAbIBsg2CU0jQ/dkM8A0zPeEwA4zDTPAKSYItXLMAUkIDnBAwmeAWNKLAYoJdSPABCZiHmeAXEnyUAe5hJiiGBB86gH6YCZJhfiknsNfzGZsoL8IgBErAeJKKwLslICNmgZbJmwE2YibpiBC1CCAkZoJ2wIsFjMRMUhJ4twwhpae3HmAlZpKWwLslICZmgn7QFAuMF6JU6wzwErNQS7fOADExC7WU6wxQE7NQbyzATcwkOZG8TsKLOLhSZQE9MRMkxHz+OplfLGIoC6wlGYorlNIFHMVMMBFznP6NIAXLTXJ1icsCcwk64mqGNhmgKmaCkbjCxwJgK2aCk7jC513AV8wELXGF91pAWcwEMXGFd0VAWswEN3HF7Da7COfAFoC3mMX6QQaIi5ngJ67maJMB7mImGIorvEcC9mImSIqrBQ4Xkuf6UQYYjJkgKnRwgdUEVaGDC6ym5zFmgMiYCbpicYkOIEBlzARjsZihnRewGTPBWSwCXBZYTdAWixCXBVYTxMUiQgcxIDVmgrtYxLgssJpgLxb9GS+BFx7cLIs5jhWYTNAXC3wSAdTGTDAYC9bDoourywDIApsJDoPt118nwUW4gPcuwGh6hmMGKI6ZIDI03RGQHDPBZWi6I+A5ZoLNYGcGtCEA1TETjAY7NeBXRcBqgtRgxwZcGJhOEBvs4IALw/sqcSNyic9mgPiYCX6DnR3wDwTWm0vr4RsuwH/MBM3Bjg+oMOBAZlfydhHfcgEaZCbYjpnmLhJQIbMrecmInywAGzITpMdMc38IGJGZ4D1mmptBQIrMBPcx09z5AWJkJuiPGX6bNwPcyExQIDP8nm4G+JGZYEFm+A3cDFAkM8GEzPC7tRmgSWaCDJnht2YzwJTMBCEyw+/DZoAtmQlOZIbfdM0AYTITvMgMv8OaAdJktpC3xSE6dQHeZCboEXaseJ0kFwGckwF3MhPECDtX4MLAgoIcmeF3RTPAnMwELcIOFOiABZxJIIgRdqLAVv8AsCaBYEbYmQLDHADaJBDcyAy/kwkAcRJcag8FAeBNAkGOzPCLmQAwJ4FgR9gRBFtNAkCdBIIfYYcQcVJbhEAYXCpfykv/CGvlALAngaBI2DmEH/3AghIA+iQQFAk7jKCywHqCI2GnEfTzAIESSP+M8ArrywFgUIKZtN4C218EgEMJpJtGdPk6WlwEc9BwgEQJBFPCziRcOJ5DGMB+0lsjCrAtXAB4lECQJexUgn8gsN9Me7oLAJESCLZE+3nAfK3nhubzgP0EYTLDbwsC6L8hHTiiGG2LnguHsB/O8AfQjUP6cURzdFxDT45A2g/3p4DeHNKdA+fbA+jQIYgTdkLCYQD7Sa8OfJ8YQL+O4Eo/MwfQt0M6d+AzcwAIlUCQJuyohsIAjEoQShcc3AMNcCqB4E3YYQ0Xho44woIx3pEArRII6oSd13BhYEFBnsxwqjwAzEoQSgvO4UkjANxKEM4Hlh3ArgSCQmGHO7yNgfUEicJOd+i8DBiWQO/+EQCCJRAkCjsJouUChiUQLAo7CmIniABQLEEkvajQ42QAOJZA8CgznFgOAMkSCCKFnQbxkoHtBJPCjoS4MLCfoFJmCXooCADPEgguhR0KcWFgP0GmzHAaNgBMSyDYFHYqREsGVEsg+BR2LkTnT0C2BIJQYQdD3BENWFAwKuxkiMMAFhSUihYG9IaLB7YkgHEJBKsym6NcQwAol0DQKuzMiS6WgHMJBLHCzpyv48VFAm7hAsC6BIJZmXHeEhmugHYJ9C4kAWBdgkTab47OGYB2CRJpP7wbAd4lSPS7T0C7BIm0Hr4FBrxLIPgVdpJ9Hc8volkMhKE7o7DeFUokBIB9CRLp04j3OEC/BMnVQI8D/Esg+ZcrvMcB/iUQJAs79qIwAAMTCJaFHXvRSRFQMIHe0SQADEwgGZgrfC4CDEyg9zYJAP8SSP7lao6OEMC/BHqXkwCwL4EgWPBbsQCQL4He7SQA1EsgHU80rQvspnc9CQDvEghq5XQRP7u6wu6vAsDABHpPlADwL4HkX67wSRzwL4HeHSUA7Esg2ZcFvmID9iXQ+6QEgHsJJPeCU8UB4F4CvWNKAJiXQDIvOK0cAOYl0HunBIB3CSTvglPQAeBdAr2LSgBYl0CyLouo7Q+vZ4sY7RqAgAn0LisBoF8CwbDg15UBYF8CvdtKALiXQHIvC3zGANxLoHdZCQDzEkjmBSfQA8C8hHpvlRDwLqHkXRZXr6PLC77pmi0WWEuHgIIJ9Z4rISBgwstQrSJgJ6soukhmM6AHHMf1Xiwh4GJCycV0q0CvwkNAy4R6j5YQkDKhJGVYFeHsgr9V418RRhfzWcz+DF6HwcU8gEUAH3O9o0sImJpQMjXdDwrxDwKW1zu9hICzCSVnww5U4dXFIuKW73xb1P4rKAJ0Ar0vTAh4nFBQNcFlfJjsg8uk/RPogU6g94sJAaETCs6GV9F+EK/i+Cf7zDlbauHrB9Af9O4yISB5QsHkBJeHJYtVgQ8cwPiEeteZEPA9oeR7wsXr6OoivpprBw6gfkK9G00IiJ9QEj+dKmaX6FcADijUu9SEgAEKA/lUBF3TQsAAhfrHPCHgf0JB8QQzdE0LAf8T6l/0hID9Cds3PZevg+SC82fBLOQDPWYTYzCLTn/GfLRczWNQGjC3/t1PCMihUPA/wQxdOkL49mfg8Q98/SOf/8zQpSOED4AGXgD1ngBJw6L3tCF8BTTwDAi+A5IPgWbopi2ET4EG3gLBx0DyNVCAbtpC+B5o4EEQfBEknwQFeAcHtFCop4VCQAuF8l1QgHdwQAuF+qdBISCFQvk4KEA3bSEghUL9+6AQUEKhfCEUoCe2EFBCof6RUAgIoVA+EwpQ9igEhFCofykUAjoolG+FAny8AToo1D8XCgEZFMbSbvh4A2RQqH8zFAIqKIyl3fDxBqigUP9wKAREUBhLuy2OK1mIrwGAEwr1D4lCwAiFsXyIhw8RwAiFei+cEPBBoaB8ghAfIoAPCvV8UAj4oFBQPkGIDxHAB4X6d0UhYINCQfkE+M1eCPigUP+4KARsUCgInyDEhwhgg0L9C6MQcEFhIu2GDxHABYX6Z0YhYILCRNoNHyKACQoF2ROEeL8HTFA4l5bDFw/ABIWC7gmiS+wQGAIuKJRcEH4hGgIuKJTeODgFGgI2KJRsEE6BhoANCgXlw/ezyO1pCPigUHA+QTTDGLcQEELhfOAuJASUUDiX72DxkQc4oVAQP0HEjjAx272CDwSsUCjonoBtvBAuNgRcUHglLYh3fMAGhYLwCfCLyxCwQaGgfAL80VEI+KBQUD5BdIVRtyHgg0JB+gQRyvOGgBEKBekTxJfw2isEbFAoKJ8Af9gTAj4oFJRPgN8WhoAPCgXpE8QhxvGGgBEKF/Ixs+aBNLCeoH0C/gCnT2KHgBMKBdfDT6ewJQAJFAqmJ4jxyQXQQKGgepgVcGFgOUH2BPgFYAiYoHCh9QIIAQ8USh8c3H0iBExQuFgMNRp8gy5sl1xiU0sEuKDoUuswHAH6JxIcT5CgC3oECKDoUr5GD7BpNgKsTySonSBBl94I8D6R4HMC/BYyAmRPJBgdLQzwNF1wNwH+biUCxE4k2BvN/BYBaicSlE2Q4I/zAZ8TSS8c3D8kAoxOJBkd3D8kAtxNJAga3DU7AuRNJMkb/JY1AoxN1DrhoH41EeBsIsnZJOjwiwA7E82kAdHhFwF+JpKRU3CXlgiQMpFgXoI5ejSMAC0TCbolmON9H3AxUXA50OkAGxMJliXAn+ZEgIKJpBsOvlxHgISJ2nAq+AcCEiaSbji4i0EEaJhI0jBz1GsgAjRMJLiWAH/NEwEiJgrmA6MK8CyRdMPBb7MjwLRE0g0H9waKANMSSTcc3BsoAlxL1LrhoD47EeBaIkGo4I85IkC2RNILB3XziwDXEkknHNTNLwJkSyTJFvwhVATIliiU5kvQdgN0SyQYFc0EA9iWSFAqugkG8C2RdMPBXcoiGIQluhyYjWAgFsm4zPEgJzAWSxQMTF0wHksbkAWfunohWcQSiDsYRDAsi3TE0cxzMDJLlAzMczA6i+Rd5ngwFRigRT54wqcMGKNFEi/4a64IEC9RPOCHGgHqJZLUyxW6CY4A9RLFwcD8AsiXSJIvlwGfX67A0gq4l0i64eC+GRFgXyLphoN7fUSAcokErxJcBdjhLwKkSyRJlyt8JwVIl0gwK5pjZQRol0jSLvjztgjQLpHgVoIr9IgWAeIlksQLmxPD5OKSnSKCqzm/AgvZMAuurl6H8UUYgQYFdEykp2MiQMdEko7R1LbAawO21pM0ESBpIknSdGpbXB7vpxZs0xbzmz5QBIysNBBaCVhfUjea2oLXUdDfTwJCJ9ITOhEgdCJJ6Fzxsi/iyytRxeGmZBFyDAt+i7mI2j9BaaDL6N9eRYDvieaww3Q/M0YbFbBAkd4fKAIcUDSHHaZbW4LXBjqM3ksoArxQJKif3nk3AoxQpPcPigAfFAnKB318FgE2KNK7B0WAC4okF4T7JkSAC4rkyyzcVSsCXFB0pT+RAiYo0nsFRYAHiiQPtMDXV8ADRZIHWuCrIOCBIkH1hJfow5QI8ECRoHrCS3yxAjxQJOieEH/eFwEuKBJ0T4g/74sAFxQJuifEn/dFgAuKBN0TXh68cV6Hl0nroqDqAVooWgwdTQEtFMkHWppDL6CFIsH+cBit70LI1jA5ubE/r9AhCQijSHBCShGLwzIQzi7xIoDhBVMU4g/9IkAjRYIpCvGHfhGgkSLBFYUz1FEpAkRSJLiicMYmpvBiEbIpeBa/ns3ZhmXG/kxO/zo//Xl1+nNx/DO4bP8E1cFge7LrnBqc13PJzl/s/4IAbzgYhU9OB/PDjNo1A/toaQaliBjQVrHgpnhnjJKLkIPAggXFgMGKLw+dLOCbNLXiIOZwrhJYBIjiJx2bWKdmRbBzOKUEEN3vMmqHU7tW8iKCmBXGbZAc/zVgzRP2vwhEAJRkGP4OOQZkWCz4LgGTjd757FQH++vqsF6HwQJbr2NAlsXSN6pjxPAwatif6M4mBhRafCl7Lluxwwt+lx7ybri4mCcB0AMBBdsnbcHBF4sXwb4j4R2B/+slW5xhEaALChqNd93Z7GLON5msVQK2GQ95i4SvZ8kFt2gYia7NP5Kdwg//mPDhlfAdDpM+/nnV/qnWC+i6WNJ1uBNwDOi6WFByfGJifW2R8EoWorPxvQjvxGymvOJ+KrPTvwbtn6Bg0Ilnh/mTNfaMd7uQtwP3N+OfPAsvOJEQslPSLLq4DHlPjU5/xqc/k9Of89OfV6c/F8fC4svjv8az059B+yfAC4ZMSy9e8t05vwwP4xAb7oBojAWXGOL3EjEgGmPBJYYxHlkbEI2x4BJD/BVTDIjGWHCJYTw/rp9s3oj7bkQx4BxjQSuG+J1GDDjHWNCKIX5NEQPOMQ5mrfABUXKJtSdgH2NBMHKjjnwIICJjwTVyYWySAkRkLLjGEA/MFQMiMhZcY4iH24oBERkLrjHE3zrFgIiMBdcYJu2ywloIixgXA0YyFqRjiPP8MWAkY0E6hng0qRgwknF42XbPo8muMECAm4wF/RjikaViwE3Ggn8M53jYW0BOxoKADPEXTTFgJ2PBQIY4yR0DejIOZdxU3E6AnowFAxni7HIM6MlYUJAhTnzGgJ+MQ/0j6xjQk3Gof2QdA3Yyjg5LD5O9vAJDB7CTsSAg+aKG8FUxYCfjSNqPoUgu5oB+jQE7GUfSfujzpxiwk3Ek7Xf1Orm8iGKwbAF2Mo6k/Ra4MLCfICDDK/QxUQzYyTiS4W/xPgfYyTgaeGYdA3oyjrRhtGIYQ1rwjyF/K6We0WMYQ1oGkWYrNEKvxTCMtOAeQ/zpUwxDSceHTShysophNOmBcNK9eNKx7tOA1eJk6NOA1WRMad2nAasJ2jHEI2PFMLK0DC3NNj7Y6ACcZJxc6scooCRj+TYQH/uAe4wFwagbz4B9jGWYac14BjxjLMjE8Kr3/DkGLGPcRprGBz7gE+MkGRj4gFGMZcBpzcAH3GEsCELdwAfsYSzjTvOoSPDjgN3mcrwteoKAFowFxxcuem4zMSD/Yj35FwPyL57rrwBiwPLFgsoL+UMuWD8wlyDzwkV/mAGWLxZUXsifWkFBGLVdmGkR9QWBiQSNFy7iviAwz1yGBcd3MoDfiwWFFy76HRVwe/GVNFHf6IDZiwV9Fy76Rge8XiwjT1/2jQ44vVjQdhHOvMWA04tl8GmceYsBpxcL2i7CmbcYcHqxjEGNM28x4PRiQdtFeGCtGHB6sQxFfYlbDHB6seDqIjywVgyIvHgxtJABIi9eBJo1BJB48UJaDmVkY0DXxQtpPXwfC4i5WEZZwm/vY0DMxTLKEn57HwNiLl4c3okgt3wxIOZi6eGlWaUBrRbLt36a3Qog0BLBhkV4PLIEUGVJG2UJjY2RAIYsuRxwMEkAF5ZcDkSaSADtlQjmKsKfBCWA1koEcxXhbGkCaK1EMFMRHhYtAbRV0sZZQn1GEkBQJYJ4ivAYaglgpRJBMUV4DLUE8E/JTFoQzzcBSKNkJr1j0UvrBJBGiYy0hD+4TwARlMxkWoXexJ0ABiaZSc9Y1Kk4AbxL0ubEQsPjJIB3SWSUJTw8TgJ4l0Q6eOERwxLAuyQzab0rbNpKANmStO/usB1fAriWJNDvJBNAtSStexfqPpMAgiURxEk0Q6NkJYBVSaR7Fz7LJYBVSaR7Fz7LJYBVSQRxgvsoJYBUSWSQJTwiWgJIlUTQJVGA+mAlgEtJpHcXHvcjAVxKoo9ZnQAmJREUScT261gjA/4k0QetTgB7kgiCJApQP40EsCeJPmp1AriTRHp24TEDE8CdJPqw1QlgThIZXAlfcRLAnCQywBK+liWAOUkkc4L7XyWAOklazy7N5wHb6V/SJYA5SWSAJc3nAeYkkQGWNJ8HmJNEBljCva8SwJwkghyJgt4WPgGsSRLpLQc4k0TQIhG/8uo7eCeAM0kivUteAiiTJBqIy5MAyiQRvEikmbgBaZJIjy7c+zIBxEkiuJEo6GevBKRJEssh11++AGGSCE4kCvClABAmyZArVwIokySWWYTQYMQJoE0SwYxEIUp2JYA2SWKZTKh3nEwAZZIIViQKezvuBNAliWBEorDfF2EeLkGHRCEaOTqBubgEHxKFaOjoBKbjEnxIxJZOVBhYTfAhUYj6pyUwK5fgRKIQNzHMzCU4kQgPR5n0knMJq7GZBDMxTNAlOJEowlcXmKNLcCJR1LcczNGVyCxQ6AksAYRJIniRKMKtB0iTRObqinqEQAJIk0QwI1GEWw7QJolM1xX1BybgTBJBjUQRbjXAmyQyYxe/f+qRMQmgThLBkER8wkHmPUCfJDJvV4wbDVAoyVx6TWKUUAJYlKQNohSgXQewKIkgS6K4PzwBi5LoPaQSwKMkgi6J4h4xlAAeJZE8StzvB4BHSSSP0n+SlQAOJZEcSj94YwL4k0TyJ3GPFEoAd5JI7iTukUIJ4E0SyZskPVIoAZxJIjmTpD/HAr4kkZGpcf/zBPAliaBEoqQ/rAFXkghKJEr6FgdcSSK5kqRvRsCTJPIdHP4oMQE8SSLfweGPEhPAkyTSgQmnuRPAkyTSgQmnuRPAkyTSgQlnrxPAkyTS/QhnrxPAk8wFFaJhr+eAJ5lLlyKcvZ4DnmR+KVkudCWfA55kfimthzIDc8CTzC8Pvg7IvnUOeJK5jIGE71vngCeZS54Ev5yeA55k3rr3oDTCHPAkc8mT4DfZc8CTzCVPgkfknAOeZC55Evz+eg54krmgQiL8/noOeJK5oEKiOfp6YQ54krnkSfCInHPAlcwFHaIVBhacyTSHeM5IwJXM9aGK5oApmQsyJMLvxeeAKZlLpgS/F58DpmQ+O4SpYsN1Bno+YErm+qhEc0CUzCVRgr/4nwOiZB7IZxwoHTUHRMlcBiPCnznMAVEyD+QEioYHmAOiZN5mF0df/M8BU/L/M/ZmSc7kONPuXr7rtrLghGH/G/slAlGVdMF5zk1bWQOvMlMgY3jocGiQkvrlSoGUaH+dx9ILbH4uj1vqCP8MCtmjkPVGBGai4T1Ud90qUBMNalL3JylQEx2xEUsxkgI30eAmVu9a4Ca64cise44UyIluODLrSU8K5EQ3HpnfC15RHmAnOi7W/grsRDcemVY+jyuwE914hCAyBXai42KNq8BOlLMTBXaiG49MW9VNVoGd6Iz6lS8GCuxEZ9Sv3ovATjTYiZUvBwr8RGfUr3ylUyAoGgTlO8qpSob6bUpCOLICQtEZ9SupiAJC0cmhswJB0cWhswJA0VCe1M9qChBFQ3lSP6spgBSNKeb1s5oCSNE1+bOaAkjR0J6QZzUAKRr6E/KsBiBFU39SP6sBTNGAKV5PmgagogFUnMyQhgIGVPH6Tg9QRQOqeKmZUYAqGlDF69s3QBUNqFIf7CtAFQ2o4vX9BKCKBlSpW2wUoIqGCqWW7ihAFZXL+7kCVNGAKvUhigJY0dt4MMX55wFWyLUZZ6DrpStccQx6wBVy1cBR6AFX6u4kxWnom6GsujtJcSK6UgatOBJ9I5RVyyn0Zyz65dBVcTK6xhW0PEdRnI6u9NxHAa+oXc59FBCLcsSigFg0hoPV5zMKmEWNnvsogBa124sgwBa124sgABe1290PoIvm0PR6OwF40QAv5FkA4IsGfCHPAgBgNAQr5FkAAIwGgCFPXABhdLOW9ZSMTgHEaBgS1ce5CjBGnU/CVGAxmiymPONXYDEamhXycg4sRmOsei1PUmAx6nGWUMJ8BRajORms5EcKLMaeiymDAYux0KzUh4IGLMa4LbUBibHncnRnQGIsFCslbjYAMRaClfpIzgDE2BPXzvLd3ADEWApWygN2AxBjm7WsWjBmAGJss5b1lJMDDECMbdayasGYAYixzVq+LeHVJwOIsRb7r7ydGYAY26xltfL13ADE2GYtq27QNAAxFiCmPuUxADG2acuq9UkGKMY2banlFAYkxjZsWbWWyYDEWIvzvPLB1gDF2OYtq9YyGcAY27xltbJh2wDG2OYtq9YyGcAY63ESW56XGsAY67EDy9uJAYyxHmd6JBkK2OMktrxDGMAYC9lKfQ5pgGAsEEx9omWAYGxTllVPxzRAMJbClfqTAcHYiAqWD+MGCMZGVLDegoBgLBBMfaZlgGAsEEx9cGmAYCwQTH12aoBgbMSpbF1BQDAWCKY+HDZAMBYIpj4cNkAwtinLqgeLGiAY25xl9fKdwADC2OYsq9cXfoAwtjnL+j6EVslQwc1Z1lefVyVDBTdnWd9XkyoZKrg5y6oHixpAGNucZXUtL18AYWxzlk9W/clQwc1ZVq/XM0AY26Bl1YNFDSiMbdKyRisXP2AYWzHrpt4pgGFsk5Y16is/YBjbpGWN+mIOGMY2aVnfZ7rq14AKbtKyvlfRKhkquEnLGmU3swGGsU1a1qgrCBjGuB+0AYSxnA9WQngDCGPRBFRDeAMIYxL1q5cRQBjbnGXNehkBhLHNWdasn0wAwtjmLGvWDxsAYSxagWqDcwMIY5uzrFmvOYAwtjnLqoeLGkAY25xlzfpBFCCMbc6yao9eAwhjm7Os2qPXAMLY5iyrHi5qAGFMo4J1uQHCWEKYEtAZQBgLCLPqtQEQxjZpWbWprwGGscAwtamvAYaxTVrWKg98DDCMbdKy6uZ5Awxjm7WsegSoAYixzVpW3TxvAGIs5oWtutyAYmzTlrXqcgOKMY5iDFCM3VCMAYqxG4oxQDFmUb96zQGKsU1bVm3oaYBibNOWVffRG6AY27Rl1X30BijGNm1ZdR+9AYqxTVuW1MsIUIwFiqmFEgYoxpzXD0CMbdiy6vGiBiTGNmxZtZjBgMTYhi2rFjMYkBgLElOLGQxIjG3YsmoxgwGJsQ1bVt2Mb0BifMOWVTfjO5AY37Bl1foEBxLjoYr5bWx04DAeHKY8zHLAMJ4D2qtDMgcM40/c/cqDLwcM42GHUx98OWAYf+IQ6UfN5oBg/LmomRwQjD8XNZMDgvF2UTM5IBhvFzWTA4LxMJr57cV1wC8exjG/vbgO6MVb9ML+KPAcsIs3euTgAF08rKBL4aUDc/EwaPntxXUALh7mLL8ttg6wxcON5bfF1gG0eDix/LbYOkAWDxeW365ZB8Di4bvy2zXrAFc8jFZ+u2YdwIoHWPntmnWAKr65yfo8XBcgyAGq+OYmq5YROUAV39xkafkU4ABVvMfFsLwmO0AVD6hSS1UcoIqPuBiWUhUHqOIBVWoTWweo4gFVarMKB6jim5usWqriAFV8c5Nl9TUZoIpvbrJq31YHqOKbmywrX/YdoIpvbrKsVJ84QBUPqFLLaxygigdUsdL/1wGqeEAVK1tWHaCKT3qu54BUPJBKfXzjgFQ8kIqXXNoBqXggFS9FTA5IxWPCVj3NwQGpeHg913MiHJCKB1LxEjA5IBUPpOIlYHJAKh5IxUvA5IBUPJCK12sOkIoHUvF6zQFS8UAqXi8jQCoeSMXLMwsHpOKBVD4X2vKToYKbmkitMXBAKr6piTwlInRAKr6piTx1BQGp+OYm8tQVBKjim5t8lludDBXc3ESe8rTAAar45iZkVwFT8Zy6XlcbmIrzqesORMU3NJGHfC6UT/gTCvAUlyheveCAp7jQWTEONMUlSldf4oCmuFBJhANLcY3C1csYWIorv3QCSfENS6TVKx5IiiuvG3AU36hEWn3hBI7iXMziQFF8gxJp9T4CiuIhZqktEhwoim9QIrWTqwNF8Q1KPm8idTLU7jZfy4GiuIXtZCkYcKAoHj1Dv6YADgTFc7ZWqcJ2YCgeDKU2BXBgKB4MpdZDOTAUt3AQKGUIDgzF7SLmdGAobtwCzgGhuHELOAeC4jFdq1aROBAUDzFLrWdzICgeNsrkXgMExWPiei1Rc2AoHmKW8hTbAaF4GLDUmgUHhOIe3cylqs4BobiHg0B5ROiAUJyPWncAKO7RzFyKzhwAyufrpVLqjB3J4b9SalkyeqRTNUvGjuTQs5RgMqNHenDMEk1m9EgPkllKdjJ6pIehAPtDBdPp/S9jR/LFzC+jR7pf/1CsZ07cKmVBGT3Soz/9hxlk5Ei9VLNhNaPLqBYRZfRIj3mT5VlWRo/0kCiV19SMHunhi1Ruy4we6bExf9pCM3KkhsDz5/6SkSM1tmV5tc7o3/QwZqk79zN6pEcdSy1KRo/06F0v5TYZPdKje/0HQWXkSI3e9R9umpEjNVQuxdrrWMGbxiWjR3poJErpX0aP9FBJlHKbjB7poVUqNTQZ/ZseWpdasJHRIz08CMp7ZEaP9OhlL7VeGT3So5u9vOlk9EgPzUtRzYHVTMVLKY/J6JF+0bxk9EgPL4IfEpmRIzVUS6SaA6s5wo+g2MIDKznDjYBUcmIlo/WoFF1m8MiO9vayyz+jR3pIl0ghJxYyZnKVwDmDR3b0u5dqj4we6dH1XmzkiXWclzvlxEpGA9Jvx39GjtRwJyjWx8QqrvAmKC7vCysY7i2/ff8ZOVKjfD9gOyNHapTuB21n5Ejd+++3+z8jR+qu2W//f0aO1Hi6KR0AMnqk77336wGQkSM1uqeLlbCwYtFw9OsDkJG/qTGCq3YCyOiRHh5z5UtURo/0i+ltRo/0i+1tRo/0aBwrz9AyeqRH61h5ipbRIz2ax8pztIwe6WGBW56kZfRIDwNj8pQgWNFoQKpbYzL6Nz1akOrOhowe6ZdGzowe6ZdWzowe6Zdmzowe6Zd2zowe6ZeGzowe6Zemlowe6Rud1m6NGT3Sg+OUp1UZPdL9dl9SrGqynBKkZPRIb/uXIevdsKoWNK48D8vokT52eqlSyOiRvplcLYDN6JG+YXgvT8UyeqRvMtfLc7GMHul7AN7v5PSMHKm7or0UQ2X0SN9srpd6r4z+Td8QR3o5TSSjR/quaK3ay+iRvu0PqruxYzU3xpFeDhHJ6JEe1SxdGDJ6pO/Dqfq8KaNHelSzPGzN6JG+92itzM3okX45YszokU45ecb+JLeYqf598i62XEPm0/hU9YwdyZvZ1bQso0c65eUZO5Kj/bPs8cnokU6ZecaO5GhjKk/MMnqk86fYhrynRSNT3eeT0SOd17Ih7Wmb58hXw13coRvSntYutUTe0zbTkVEjs4bEp7VLLZH3tE10vkOu6s/GWnJlTcaO5L0zR315a0h7WrvUEnlPC95D3rYbMp/WLrVE4tM206mpdAaP7EspEfe0K+5piHtav5QSgU/r0ZlWnphm9Ei/lBKxT+tRyvrW0xD7tH4pJUKflhPXrS4lQp/GXXkz9jc525tqGtcQ+TTuzJuxIzm2pdS1RODTuDtvxo7k2JZlG0tGj/RLLRH4tAQ+JQ1pyHvauJQSiU/bTEfqdoyMHun7+WeU5/YZ/ZvOzWYydiTvd8/n9622IfBpk/P0hrinhVHvfyZKMqsxZ5l3/EM6MidjR/I+JalH+mX0SKceXhk7ksPFq35gash+2qQHXhk7krmPVwb/Zq9LQREBtQ16pG5vyeiRfikqgqC2cY/MGrM1hEGNTz/K2JG8H2ef539z/vOVGcis5gxm3vEPL0VFNNRiRvvfnzJzqhv+S6wv74rK2JG8Bav/zurdo1WLaX2Z+PdfyqXWCI5ajEr6/3Iqy7zjH16qjgCpBUD674+RWc3jy7zjH17qjyCpxbT2z4VoPZ+P1v99EdTnBy7/+TG4APiQ9owdyfu9Zr6zwz9/jP73n+X44vw3x4dc1gJSpibvWvh30Oy/Q2BlvvNe/yefF+di9Gv+87+fx4e1Z+xI3leDuqEpo0f6ZV0ggmobMsnq71hEKSeDZt7xDy/rAlFUi6Hsf39KNW44845/eFkWiKRaIKnPy3TOoZb13wpZ77xl/BBcFnyEe8aOZMef+O9YZ1lkISK8anZZC4iuWqCrut8po0f6ZS0guGobTX2ZdP9cV7sdi1yefxe5tJyxjJ+HS8QuSwS5VguuJf8tERnlZRAJV7PLEkG+1SyuHPPfKn1+4L//OXIUM34ILhG7LBHkXi0mxf87VfnzY+Z3Cu93DLDIqpcI0rDmlyWCLKwFCxPyrI4srG3iJUIev5GHNecD3TJ4ZMcEvk8p7Z+tRy+nrmbe8Q8vT/mIxVrOhv93DraI1z8Fl4NfHvgRj7WcE//fT9H6aRhBWbuAsoagrIfl8n8DuUXbvxcxLcfD5785PoS/23XEZ30DMtG87n9+Snlt7sjR+oWjdeRoPTja9+by3gFW+TDVEan1C1LriNT6c3Gtz+iRzuvfEan1aEzr71Xi80V9J6d/LoSf/xJSGMPP4EuhI2frOWO9/IFa/0CEb/0C3zrCtx7wTVc+s31+zOcepp8vsuG/xLVw4XAdOVyP3ra/G2mVT4kdkVy/ILmOSK7HQHLdz2y21v4x//6n5z3sf2JPeTvryOz6hdl1ZHa92f+/H17fSztCvX6Beh2hXu9P7oLPF2zW+ReMgK9fAF9HwNc7LpevcKx4D+vI+vqF9XVkfX3TvOPHNPJjcLlcsF9H7NdjuvlXIRnPA9+71tDPK7L/t/HwM3CJXFhgRxbY/2WBub2rnY6fgcviAgg7AsI++PXEyJ0FqWG/UMOO1LDHPPTPRu/6z9en5vsY9NkEo3/+2M+t7d0E/24N/DxcNhes2BEr9hj79bmZ9fbP961w/x6fp1lf+5t+/9/Pr9Q+zyYav8fnP/37HP+p/ed3/tye8afgErvQyI40sgeN/N7Q83XhTwEmKQAusQuj7Mgoe6jS6h9YP3t2BJd9XJYYYsseYjVyhNgRXHbeTZixIzk86+sjxI7wss/LYkFg2Wf0yNdHiB2RZeezxjJ2JMcxX32E2BFZ9otYrSOw7NFVSI4QOyLLzqe0Z+xvcvQVkiPEjsyyr0stkVj2FecJ9RFiR2bZ16WWSCz7ivOE+gixI7Ps61JL5JQ9ugvJEWJHUtnXpZYIJ3v0F5IjxI54sq9LLZFI9vDOJkeIHZlkl0stkUP2zRrJEWJHENl5l2HGjuTQdddHiB3xY+edhhk7ksOCsj5C7MgcO+82zNiRHKWsjxA70sXOOw4z9jdZn//jR4gd4WHnXYcZO5LDRrs+QuwIDzvvPMzYkRzbssYSHZFh592HGTuSY1vWDKMjKOx6qSUCwR522vURYkci2Lmfdsb+Jm+6J1aL4jqyvx7sjxyUdWR//cL+OrK/HqI1I6sK0V6/oL2OaK9vZEes6jN6pO9iGlmEiPR6ID2vRU4d4V0P2ZqXBoQZPdI34fVeP9AgqOshW6u7/DN6pO+K1n3+GT3S912z7vTP6JG+a1r3+mf0SN8btO72z+iRvoGtl228GT3Sd1Xrjv+MHul7iz7khoVsrkenYt31n9Ejfe/Suu8/o3/Sx+ZrX3BbXV4G0rcR9O2p+/gG8rfxhPVoffEaiN1GYLeH/TID0+OyW+sOBtK28YQBaf1FDuRtIyRstcdqRo/0MCGtt8dA4jZCxFZbp2b0SA8r2Xo3DcRrI0ajkW7BgSRtBEmrrcEzeqTvq+9TX9sHArQRAK22B8/okb6vv08tPhnIzUZws9oiPKNH+j5Sab8q4IFQbAQUqx0FMnqk731a+35n9Eh3+otgNXOmfH31Ggi6RoCu2lcgo0f6rmZt/p3RI31c7ngDCdfY4EqJln4g1hr9dj8dCLbGplTE6CCjR7pev0isaLfrF4kV7bSiiKvGZk9KWgYGkqkRZKq2As/okb5pwveBp7qMInoaF/Q0ED2NTYn69wmm/Gys54UhDWRIY8TerAXmA3HRuOCigbhojKgluUwgGRoXMjSQDI0QtPXS+iujRzp/bRlIhkaI2khPxEAyNC5kaCAZGkGGrH5NHEiGxoUMDSRDY8YYkrprYSAZGhcyNJAMjRhFT14WBpKhcSFDA8nQWPE8VH8lCIbGBQwNBEMjOxrJR2MlL1xoIBcaaeP9apPaZ+9XxwgDCdG4EKKBhGhEm6PVisOBhGhcCNFAQjQ2A2pO9hASonEhRAMJ0Qhj76+nWvXZSIjGhRANJEQjbKi8HOia0SP9UlVERGNDoOZ1G9JARDQuiGggIhobAjV/1YX/+54dlEsGadG40KKBtGiEEo3cQREWjQssGgiLRsAiJ1cYhEXjAosGwqKhUdW6M2ogLBoXWDQQFg2Nqv4rimyfF8fym0duNC7caCA3Girnj/lPVIr/Egt8QUgDEdJQwx9Tn2AOxEnjgpMG4qRhT/6Y0f75Nrd9/5ox/9F98PXVLP6jHT8EIdPgg9sydiR3/MNG/YchbxrcPDxjR/JeDUv/N+wfn9/V8OdvnPn/4ofgwrDLwkAGNSysctd7s+ifF7n4T/yXuDDssjAQRo2Nm74/Jv+w74/59z81j5/xQ3CN2GWNIKAa4Zz1vLe+z48hGwtZ1fDLwkBSNcJGa/ir+6IbC6HV4K7kGTuSJ/yYVisQBtKrcdGXDWRXY9Op3si9EdnVuKjKBpKrsdlUb+TeiORqXLRkA7nVfF47ny7/tPk9Cf/30L1/3mX//c99KPwjxZoItuZFVjYRa80Nrnqrbz0Tsda8qMkmQq25sVVv9a1nItSaFwnZRKQ1nyh2/YI1EWnNi4RsItCaTxS7fjicCLTmRS02EWfNDaw6ecGaiLPmRRg2EWbNjau+Uq36s7GWFzXYRJQ1N6zqvd4AE1HWvEjAJoKsGY7npEd9IsyaF4XXRJQ1N6zqpKF9IsqaFwHXRJg1e9SyPj+cCLPmRbU1EWXNHrUk+xJR1rxItSaCrNmjlmRfIsiaF33WRIw1A2ORzvqJGGtepFgTIdbsUUv/96446vvIRJ41LwKsiURrbmbVB9lGSLTmRWs1kWfN4FmDbCPkWfPCsybyrBk8a5BthDxrXnjWRJ41N7HqRPUwkWfNC8+ayLPmJladHMNP5FnzwrMm8qw5o5ZkGyHPmheeNZFnzeRZNSWfyLNm8Kxe2tln9EjftLnXLHsi0ZrzRpsnMq0Z7ZnkQGAi05rBtHqNvidSrRkNmuwmh1RrBtWqx+ll9G969Gj22qJqItiaAbbqkXoZPdKjqjVdnci2ZrAtYt4xkW7N6NMcNQOdyLRmMK1BlhhSrRn9mfVwvYwe6buq9Xi9jB7pAUDIPkWuNYNrDVJVJFszujFHfTAwkWzNIFukr3si25rRhVnPuMvokb7P5H9OPyZyrRl9l/U4vIwe6buepGN4Itma0W5Zj8TL6JG+61nPucvokb6vu+RsZSLRmkG02BM3Mq0ZvZP1HL2MHum7nvUkvYwe6bue9Sy9jB7pux2KHPVM5Fozuibr4XsZPdKjqmQtIs6a0S1ZD+DL6JG+q1pP1cvokW63GwGiqxnoinStToRX89IFORFSzYBUxCpyIqaamz59u3eLTv2JaGoGmlpksSOcmiGFquf8ZfRI3yWtJ/1l9EjfJa1n/WX0SI+SkvWF/GlGJ2M97y+jR3qUlKwvZE0zuhaFrC8ETDMAUz1wL6NH+t6o9ci9jB7pu6r10L2MHum7qvXYvYwe6eFhURsnTwRKcyMjref0ZfRI31UVsggQKc3w8dJyBG1Gj/Rd1XpeX0b/pK/wbq8n9mX0SI+q1mtmITVa4eVFfMoXUqOV/u21T/lCbrRCDEWM/xZyo/XcHGkXkqO12ZDWEwczeqTvqtYzBzN6pG/hImnrXciO1uZDrK13IT1a4eBOLEAX0qO1CREZLJPRI33vVa1fThfyoxX8SOv3zYUEaYUYqp6xltEjfV+BtX7aXMiQVoihtH7RW8iQVjCketJaRo/0fTSktcJ9IUVa7eZ2upAjrRBF1aOdM3qkR1VrQ/yFJGmFKKqeE5fRIz2mZdSC0YUsaQVLGjUrXciSVrAkJdcZpElr8yI1sleRJq2gSfUsuowe6fu+Wk+jy+iRvq/ARtY7YqQVwqh6Il1Gj/R9Bbb6ZrMQJK2NipSI0heCpHUBSQtB0tqoSI1sDgRJK0CSkQWGKGmFNMrIEkCUtAIlEeH4Qpi0QhzlZAkgTFoBk5wsAcRJK+RRXj+eLMRJayMj9iy+ECitjYwGecFeCJRW+H4RCeBCoLQCKDlZjwiUVkik2F0VgdIKkdR3hEV1Z0KgtAIosXsHAqUVQIndOxAorQBK7N6BQGkFUGL3DgRKK4CSk52KQGltZMRcvhcCpRVAycnGRqC0Aig52asIlFYAJXaLR6C0opGO9FUsBEorBvWxhx8ESita6djDDwKlFUDJawCxECitcIZvv7b/C2HSCnMv9liFMGlJ+IfX8HQhTFohlHJyi0SktAIpsdsMIqW1oZE95PqISGltaGQPuT4iUlobGn22P0nHim5oZA+5PiJSWhsa2UMuSYiUlsYI1LpJYiFSWnp9+kWktDY0MtI5sBAprQ2NjHQOLERKS8NihzxBIlJaGlUl2xqR0tKoKrkFI1JaGlUlt2BESmtDI2tkiSFSWvq6sBUcZyFRWpsaWSMLEpnS2tTISGvCQqa0oruutu5fyJRWtNdJffK3kCmtTY2skdWOTGltamSkO2EhU1qbGo1PkcqrDDKltamRke6EhUxpWdSULF9kSmtTIyOy/YVMaXkUlaxHZErLo6hkPSJTWpsaMXKykCmtTY2MWPcvZEorJgASmfpCprQ2NTJyCriQKa1NjYycAi5kSmtTIyOngAuZ0trUyMg53UKmtDY1MnLwtpApyaZG1utFIMiUZFMjIwdvgkxJNjUycvAmyJRkUyMjB2+CTEk2NRpfzUOxmwSZkmxqZOScTpApyaZGRs7pBJmSbGpk5JxOkCnJpkZGzukEmZJsamSjXgSCTEk2NTJyTifIlGRTIyPndIJMSTY1MtIHL8iUpEVVySJApiSbGhk5fhNkSrKpkZHjN0GmJJsaGTl+E2RKsqmRkeM3QaYkmxrZrKmPIFOSTY3s60dYpmNVwzGeHJAJMiXZ1MjIiZcgU5JNjYyceAkyJdnUyMiJlyBTkk2NjJx4CTIl2dTIyBGWIFOSTY1skaoiU5JNjYycMwkyJdnUyMg5kyBTkk2NjJwzCTIl2dTIyDmTIFOSTY2MnDMJMiUZ3IpAkCjJpkbsLEWQKUk225WTZzN6pEdNyQJDpiSbGjUiTxJkSjKiebIaeJzBIzscwKqRxxk8sqOiZK0jUZJ5mewgCJQkgBIZ0iUIlCSAEhkBJgiUJIBSPSg5o0f63qbk4FAQKMlGRoswHEGgJBsZGTlnFARKspERXV8IlCT77sjqRaAkYSKv9dg4QaAkK4pKLjEIlGQjI5P6jV8QKMkKJx+y2BEoyUZGRk4xBYGSrHhRrZmlIFCSjYzY0Z4gUJIcL1gfHAoCJQmgRPiTIFCSjYyMnMAKAiXZyMjIkaogUBKJqpJrEkIliVGDbEUiVJIYNWi/kxQFgZJIVJRcYhAoydWeSRAoSQAlcj4qCJQkgBI5HxUEShJAScnWQKAkAZSU3H0RKEkAJSV3XwRKos9t4yFQko2M6BUMgZLodZ8iUJKNjJbUFFoQKMlGRqZkWyNQkgBKSrYGAiUJoETORwWBkgRQImeMgkBJAiiRU0BBoCQBlLzYGkiTZPOi4b9DRgVJkgRJImeLgiRJNixaUmtaBVGSbFhkVqMkQZQk0TvH7keIkmTDIvZIgiRJTC6POwiSZKMiNvNUECTJRkVs5qkgSJIwWrffsbmCEEk2JmIHJ4IQSTyejWqILwiRxK/PRgiRZGMi+uSFEEnSUf135K8gQBIP5fbvyF9BeCThoO6/thyC4Egu3W2C2Eiiu612ixekRuKxHX+nCQsSIw2bdP8deaRIi3TzoOG/xzWKpEg3Cxr+u4YUKZFuDjT8tw6KhEiDEPlvHRTpkIbi6PmtgyIZ0iBDRGOgSIY0yJDV9ztFMqTPTeypSIY0yBCRJCiSIQ0yRCQJimRI221eqyIZ0s1+2ImxIhnSIENE8KBIhjTIENEwKJIhDTJENAyKZEgbn2ahyIU0uBARPChyIQ0uRAQPilxIgwsRwYMiF9LgQkTwoMiFNLgQETwociENLkQ0BopcSKNrrT6dUcRCGliInLsrYiENLEQO0hWxkAYWIgfpilhIAws5WTCIhbRfNypiId3gpzq7VkRCGkjIyepCJKQb+jg5LlZEQrqxj5PjYkUopOP21KMIhXRjHyeny4pQSEe8a9Yvj4pQSAMKkVdTRSikm/uwoRSKVEhHbFOSjQXd3Kd/nh6rF1lFKqQb/Dg5R1fEQrrBD9MbKmIhndcrL2Ih3eDHySm9IhbSGUUl2xSxkG7ww3zPFLGQbvBTjb5WREIaSGhaCW0UkZBu6NNnzXgUkZBu6MN8zhWRkG7o01dtSa2IhHRDnz5rBZMiEtINffqqO3oVkZBu6PP5G0k6VnRDHzb+WhEJaYwXLMZ2K+IgXVHNWhqjiIP0YsOkCIN03Ya4KsIg3biH/5FYz1AXsQ2NMEglLrvkZoQwSCUuu+TOiEBIJXYoqScCId3Ix4v6IAvSTXu+Trblr4HV3LDHn+IJGjGQbtDjrX6bVsRAukGPE5GIIgbSmAP43+iaPdjL//l8cfgvsayb+Tjx+VAkQqpR1npTIxDSsGJiKxKBkF6smBRxkG7g40SLooiDdAMfbzWbUsRBuoGPE3GJIg7Si+2SIgxSjdqSrYEwSDfycWIqogiE1J5bOkIh3diHPmIgFNJwVmKPGAiFNKAQeWZAJqSb+tAHEmRCalFS8kSKUEgvA/kUmZBabFfykIlMSO3WBKPIhNRuTTCKXEg3+XGi51HkQurX11LkQpqD9sjvjlxIw72b/e7IhXTTHyfiIkU2pNGwxh7skA+p30TYioxINwdyIl1SpES6QZAT6ZIiJtINg+hWQlRk4YJEtpIhLrINhZwIowyRkUXDWq/Nvg2xkV1sjgzBkW08xP5QQ3hkz+3EzBAg2RNvMew3F0znl15DfGQbEPHf3DDdr785VrTFPq1vGob4yC5WR4bwyNqtAdEQHlm7NSAawiNrsUvrW5IhPLKNh9gVxhAe2QZETmR0hvjIolWNyN4N8ZGFdzdRmxviI9uAiGnZDfGR9agp+WUQH1mPXVrfNwzxkW1A5ETTZ4iPrI/LpdqQH1lMqCOXakN+ZJsQOZEAGvIj6+zF1JAd2aZDQvyuDNmRbTokxMLKkB3ZJkRCXKkM+ZFtQiTEaMqQH9kmRNXLnSE7sk2HhNhMGbIj23RI2NJCdmTj9lJqyI5s0yHpZFsgO7JNh5wIOg3ZkW06tEdx/r4nGaIj23TIiVGTITuyTYd81MfOhuzIkh39voUZciPbZMhJw5khN7IZ25NcFpEbWXAjohQ15EYW3Ig4uhhyI7tYeBtSI5tRTnIdQnJkMx5367dAQ3Jk850iWh1UGpIju5h4G3IjC270uXNVT4CG3Mg2GWLvdYbcyDYZcqKfNeRGtsmQE/2sITeyTYac6GcNuZFtOuREP2vIjmwFbaiv5oiOLNARuVUgO7IV76TkW8SCbjhEfLMNyZFtNkScsA3BkQU4qqcsGXIjC25ETHcMuZElN6q/FMRGFo1p5CtEdGSBjsglEdGRBTqqQZMhPbKgR8U9CMGRBThiXx8WcuMgJyZEhrDIAhaRrw9ZkYXDEfn6kBWZ9svXh6jINg5iXx+yIgtWRO7LiIosUBH5CpEUWZAiojs3JEW2aRD9CrGaGwbRrxCrGaSIPE8gKLIAReTPRE5kmwQ50csbciKzfvkzERNZWBuRPxMxkVlcZcl9EzGR2a2cSInMopzkxomcyOxWTsREZrdyIiWyzYHoL47lDEhEeggMIZFtDOSkh8AQEpnfTtAMIZFFBxp5x0JGZGGXTcxGDBmR5YS3WiNryIjM40pLbsrIiCwYEWl/MGREFoyItD8YMiLbFMhJ+4MhI/InHobqWbeOjMifaACuT/QcGZFvCuSkucKREfkT19z6EuBIiTwoEXFtcaREfjHDdmRE/kRN60uAIyPyCyNyZET+3CbUODIiv5hhOxIibzE76ved2ZEOeVgZEbMLRz7kYWVE5l058iFvUcv6MufIh7zN6y+DtdwEiDREO+Ih3wCIrlrEQ74BEFOOOuIhbzcnDUc85BsAMRG7Ix7ywEOkJcQRD/nVycgRD/kGQPSbQTzk/dah5IiHvIcEt37od8RDHniI9Kc44iHfEMhJS4gjIvIeT7j1ZdcREfmGQE588BwRkW8I5KQlxBER+YiqkgsjIiIPiRFpq3DERB4SI9JW4YiJfIMgJ80PjpjIQ2JEuhkcMZFvEOSkm8ERE3lgItLN4IiJPDAR6WZw5EQenIh0MzhyIg9ORDoCHDmRByciHQGOrMiDFZGOAEdW5MGKSEeAIyvyYEWkI8CRFfmmQWzkqCMr8s2DnEj9HWmRzxiXWk8odaRFPmNcat0250iLfPMgJyZljrTIZ7zFkCWGvMg3EWKzWx15kW8ixCbDOvIiD15E5MmOvMiDFxG9sSMv8uBFRG/syIs8eBFRBDvyIg9eRBTBjsDINxNyogh2JEYexIiIfB2RkQcyIiJfR2bkwYyIyNcRGnlCI7JmkBq58L5fR2bkl7FvjsjIJY5c6lc8R2bkGwuxExpHaOQBjYg42ZEaeVAjIk52REee6IisRmRHHuyIyI0d2ZEHOyJyY0d45CE0InJjR3rkevMcc8RHHviIaIgd+ZHr9fEXAZLr7fEXAZJvRFSfSDjiIw98RJKxoDd65EiPPIyxawWeIz3y8MWuWZMjPfIwxia/N8IjtzCmItlYy82H2kMeY5EeeTSePfXxnyM98mg8I2d6jvjIo/Ns/XbqOKIj33SokW5JR3bkGw81Yd8hVtOigbtm9I70yD1GcpF0pEe++VAz8rsjPXKPITDkS0R65BsQ9cl+GazoBkSdmFg54iPfgKiz7x3xkceQNWWfjlX1aMsnixfxkUcjGvG+c8RH7vF2Sq4WgI/6E/ioBt8ZPdJ3VZ+6VyLDR36P/PIuneEjP3bqU1psZvjIn+zOm7EjecWHl7qhDB/5VA6YsSNZ48NL75oMH/l2+XDDZI8PX9Vrfob/5jc6kiBjR3LWVOoPb1jTRh+NMnYkZ0FLVpbhI/9S0IYFbVnQUj2c4SP/UtCGBW1Z0JKuZ/jIvxS0YUHDDftTC/LhWNB+KWjHggZC+hSu/vCOBe2XgnYsaM97KdmhHQvaLwXtWNAeBW1kh3YsaL8UtGNBexS0lZwvw0f+paAdC8qnqWXsb/LGQ8SsL6NHOlUBZuxIjituKw8+M3zk03eXjB3J8WRUC9MzfORTYp+xI1niw8vn/wwf+RTZZ+xItvjw8m0hw0f+pZ4D67nB0OfDy5eFDB/5l4JOLGh0pj21tjvDR/6loBMLOqOgtfg6w0f+paATCxr+108tps7wkX8p6MSChlvRU0uvM3zkXwo6saArClpLqTN85F8KurCgKwtavkVn+Mi/FHRhQVcWlOzQhQVdl4IuLGjMUvs+4vy+Lmb0SL/Uc2E9V9aT7P6F9VyXei6sZw5SKx+KM3qkxw20tunM8JGfFSX7X7CiEvfQWtSb4SM/ilrrbjN85MdttJZqZvjIj41am29m+Mi/FFawsHJpfMnokX5pfMno33SNnVobgWb4yL/sVMW6bii0aiiR0SN9uxXVL3YZPdKzquQ6oFhVzaqWXCLDR35W9Yc0ZOjIjWejUTYGZ/jIj906fhS1GTpyfX8t5cFERv+mWzialxblGT3Sv0Wbn9fj4rw0o0f6LqmVnC6jR3qUtJz8ktEj/fKwa1jPTYaIdXtGj/QNAb0UemT0SN8nMF4KbDJ6pG/KUPfuZvRIv3QGZ/Rv+qZDy8sjlYwe6fsExssDm4we6bumXp5NZfRI3zV1sh4da7rp0HKyHh2ruunQcrLAHKvqUVWry+RYVY+qOvl0rOqmQ/I8JB2ruumQPOWpXUb/pLdNh+Spq9qQHbUNh+Spq9oQHbXNhuSpq9qQHLWNhuRZ5RfZEBy1J4xTyr3XkBy1IEf12ISMHun8tbQhOGqbDMnDPlsxnb+VNuRGLUapPfVibIiN2gUbNcRGLayNnvrS2JAatQs1akiNWoti1su8ITRqF2jUEBq17Eyr90RDZtQuzKghM2obCkk9QjqjR/qlloiM2mZC0shuQ2LUYoBaPbMso0d6dASX4rCMHul7cxKU0hAatR64vjQ0yeiRHrKjssU3o0f6th5rv885DYFRi460unUko0f6fiz6qh6Kp6KGxKhtKtR6TWkbMqO2udDnf0k6VjSoUbMS7DSkRm2EOrByOMzgkR0+DJV7YgaP7F1PrYlxQ2zUNheazclvjvUciXXrpYvcqAU3qi2aM3qkb5eq0l06g0d2OKaQXYfYqG00NPtDvhgs6SZD8yuTqb4Y5Ebtwo0acqO2wdDspUwxo0c6pwwNsVELbFS3jmf0SOeQoSE1avNih5zRI31v0bqNOaNHerR39/L1siE1amFyXXeaZ/Rv+rrcQBEatXXx1cjokX7x1cjokR7t3av+Q5EbtQ2GZv8xic3IkXqpJiKjtqHQ/FxBq/eKhsiobSxE1K8ZPdJtfzq54CIzapsLtUV2J1KjJrE7f3qqMnKk7rfQXtyCEBa1mJTWyWUcWVGTi2I3o0d61LE+tGpIitpGQcQHO6NH+q7m+LE5zciRuq3jxo9BcUaO1F3FUaw9pENt8585yh6wjP5N3/hnjvospCEcahsAzc9NsE7HSm4ANEeph8nokT52Oik84qGmYVFObppIh9rGP3PWB4oN4VDbBGhOcudBPtQ2AJqzqCaiobb5z/xeMstPxopu/jMnqSjSobb5z5w/LpAZOVJ3NSepJpKhttnPnMUWRirUNveZk1QSqVAL06LphZVwBo/sXcja4iijR/ou5CKFRCzUNvipbY0zeGTvWtYDTzN6pO9armIjIxFqfrlTIg9qm/jM9WOZnJEjdVdxFesDOVDbpGf+2jZk5EgN26libSD/aR7l+3FXzsiRGqX7ZagNuU/bZGfKT1dQRo7UXTMprtHIe1raEWl9P0Te0zfRmfJ7EejIevqmOVN+V0JHztM3yZnyW9yOjKc/8RpZQ+qOjKdvjEPcKzN6pG9NZm3yntEjfRuP1ybvGT3St4V8LT/N6JEe/gmlf05Gj/Tt7lc7t2f0b3oLG/nSuT2jR/r2Ia8HdWb0SI93yfr1vSPs6RvnTKvvAB1hT99AZ36PE6pvBnFP30BnWn0X6Ih7+kY60+p7ekfg0zfSmVbfCToCn76hzrT6nt4R+fQwIvr2DpfpWNVAPk9tXZHhI38zn7pLNqNHepxykjOijtCnhxUR4ewdoU8PKyLC2TtCn96jxbemyR3BT99oR8gZQUfw01MrNH+voh2pTw/q8xQPRx2RTw/k88xSzZnhv/mb6igh8h2ZTw+lECHyHaFPDzciclbRkfr0cCPyGil2pD59REFriNuR+vRwIxo1ku9IfXqqhWpfjwwf+VnRclhgho/8rCq5cCD56RfBUEfu0+fF2C+jR/qNFHQkPz1GnLEbGZKfPlPRV786dIQ/PTVDRF7Ykf70maK++imyIwDqKRsiIsCOBKhvxiN1N3ZGj3QO3Tvyn74Jj1gtMO3If/qF/3TkP33FXbX0v8/okd5vV2vkP30THroIkP/01A3NWgjeEQL1mHH2zLK9I8NHfm7XWkvREQT1AEHPqsUUHUlQT/nQKkX4GT7y40K8yg6CDP/Nl7i3LnLhRiDUU0K0yh6CDB/5cXOtbR8yfOTHpl21GKQjF+rCj8g6UqH+6od+30w6IqH+aofIUwFyoS5ZWLLQEA51ycLWWqyOhKhLFrbWYnVERD0FRPUQqwwf+VHYupckw0d+FLbucs/wkR+FrQewZfjIvxQWIVHXiytnRo/0qG3dCJPhIz9qK7XOriMq6qkique7ZfjIv9xjkRR1y8JqfQVEXNQtC2skHwtrWVhyRUNo1LMJTclCQ2rUswutbivK8JEfm7ZuvM/wkR/FVbLQkBx1S4nYLwTpyI262fVhC8FRj1a0R8lCQ3rUoxftUbLQECD1aEZ7lCw0pEg9vIweJRcpREnds7bkbog8qXvWlqwdhEo9PK8fIi3sSJZ6mF4/tXFHho/8qG3d3JfhIz/qWzelZfjIj/rW3YAZ/pM/wvj6qbvYMnzkR32tru9A5jSyLa14ZRsInUYIi8iL5kDoNJ5466lfNAdCp/Hc3noGQqfxZGFrlfRA6jSyK61u2c/wkZ+Fre+eA7nTyMa0umk/w3/zWxS2tpHM8JEfiKJmCAPJ0wjy9NS+kxk+8mPf1s6TGT7yY996vY4HwqeRDWpO1jHSpxE+R4+TdYz4aYTeiDCTgfhptKgu6fYcyJ9GdqnVfoEZ/pufAKo22s7wkb+37VZ6FM+OAwnUCAL1beSu87G82atWUJyB+Gn0G60YiJ9GdKq1h6w05E9jE6ZPPllpCKDGpkz61O/kAxnUCD9sQnIGYqgRftiE5AykUGNzps8v/8voByKoMbKmZMkjgxoja0qWPEKosTHTJ78+tBhIocbbslZL1QZiqHFpWRsIocamTKyRbyCDGpeOtYEAamzCxFjeQP40gj8RUjiQQI1sWSMgciCCGjPLSi4FyKDGzLKSSwFCqBEQqtXTjzJ85M/IJzcShFAjIFSr/aszfOTHfm3s+8HShgyp1S7TGT7yd3XJyepADjVm9gvXSoaBIGpEA1v7nZaYoSM3Stt+D0IHQqgRIqRWaC0HEqixsqS/R6ED8dNYWc5f4jAQPY1AT63/HoYOxE4jsFPrxR0AkdMI5NR68VCIuGkEbmqFXmogahqBmr4q0t9crFtgpq+E9CcXEdMIxNQKfdJAvDQCL7VCoDQQLY1AS9vJtbrCIloagZY6uSAjXBqS5asPwQYCphGAqY36FGwgYBoBmNogDwkImEYApi3xLD8fyylXL4aBgGkkYCL2CgMB09gEqX+Rc3HYOpAvjQ2Q+vdIsUzH4gZe+h7Oln8t4qURTWpt1BLogYRpRJNaI5KrgYhpaFaXfTtYXc3q1ge0AxHT0KxufUI7EDENjfbD+uxhIGQaAZkaUWkNhEwjINP3KKfOx+oGZGpEpzUQMo2ATFvfWuZjeTdFEiVbHRnTCMbUiLhrIGMawZgaUXcNZEwjGNNWrZb5WN3gTI0c0g3kTCM401a8lPlY3uBMjSi9BnKmEY1rvW5eHYiZhmd1yepBzDQCM20Ba5mP1Q3M1Ig4bCBmGoGZ2iKrBzHTCMzUFlkOiJlGYKa2yHJAzDQCM7VFlgNiphGYqS2yHBAzzcBMXy+uKn8iZpqBmXZTTZnfMD/qu+r6TkRNM9yPmtTvwxNZ0wz/7Cb1rW4ibJoBm8grxUTYNDdNYg17E1nTfKI3sSZfE1HT3CyJNXlOJE1zoyTWtTkRNM126zidyJlmNrOR3x0502yXbpmJlGm2LGuvy4SUabYs6yD5WNagTF+fuDof6xqUqUn9BDORMs2gTOTVciJlmkGZiHRtImSaYadNesMmMqYZjIn0hk1ETDMRk9TPFxMR0+yhAi61uhMB0wzAVPdYTURMs4cLXd1jPRExzc2QWI/1RMI0N0Ji7eQTAdMMhVOT+rF9ImGaoXJqUj8qTERMM5ROXzfCOh/rmoxJybUPOdO8mCJNhEwzTZHIWeBEyDRHHsLWZ4ETIdMMyNSUXIgRMs0RosTatGAiZpojuhbLueoZPdL3fv2+ABVPIRNB09woSUbdEjURNM2NkmSUU9sz+jd9Zl3JxQ9B09wkSUZtFzKRM80NkmTUT1wTMdNMzKTk0oqYaSZmUnJpRcw0EzMpubQiZpqJmUgn5UTMNC8WSRMZ00yLJLbqETLNhExs1SNkmgmZPlf6chkjaJoJmsjbxkTYNBM21cMNMnzkR3GNXEIQOs2ETkZ2LYKnmeDJyFJG+DRXeDvUpzMT+dNM/mRkbSKDmhs0LWKVORFDzcRQRpYyoqiZKMrIUkYcNRNHGVnKiKRmIikjNyDEUlPCioU8ACKVmpLFJYsNsdSUm2/HRCo1JWpbHxdNhFJT4hGqbmmeyKRmMikjKx+Z1Awm1ZysfGRSU7lOcSKQmqF4ak62CRKpGYqn5mSbIJKamzkxY4OJRGpu5MQseSYCqan8PGcijZpJo5xsQaRRc+Mm5lU0EUZNDTsW9qtjVS9yp4kkalqYsZAFiSBq2uXxCSnUtLBiIXsDIdQ03ko+kUDNIFDE/mQigZp2KSfip5n4ycklD/HTTPzk5JKH+GkmfnJyyUP8NNM1iTw6IX2aSZ+cXCGRPk3PjUoueYifZuInJ1cZxE8z8FMnx/UT8dMM/NTJcf1E/DQDP32bE+t8LO/mS8zJZSJ9mn55dkL0NAM99YdcCRA9zUBP/SFLDdHTyrFttRHJQvK0op+OND0tBE8rwFMnZxQLwdN6srL1Ql4IntaTla1X5kLwtJ6sbL0yF5KnFTKn/tQrcyF6WiFz6q1emQvZ0wr2RFzgFrKnFSqn3uqFvBA+rVA59VYv5IX0aYUDd2/1YluIn1bKnIiR+UIAtV4T7rqNYSGAWilzItbXCwHUen2460fRhQBqpcyJeKUvBFDrteKuWzwWEqgVBKq3ejMuRFCrZX3JdkEGtXrWl2wXhFCr85vtQgK1+pVVLGRQq19ZxUIKtXq+0tZvbQsx1AqlU29kryOHWqF06o3sdQRRKz2WGtnrCKJWSJ2kNqFdyKFWmiwRS56FHGoFh+qd7HXkUCv0Tr2TvY4oakXP3SRbBUnUCntuttMRRK0AUb2TKwmCqBVWS504XC0kUSu67jpxXFmIolZ03fVOdgqyqBVdd52ICRbCqDWyumSxIY1aM6tLFhvSqLV50xp1q9tCGrU2b1qDFBdp1Nq4yYhKfiGMWps22SRXTWRRa8OmNdinY2ljwtuotWwLSdSKCW+DXJKRRa1gUX2QbYgsagWL6kTFsZBFrWBRfZBtiCxqBYvqg2wUZFErWFQnOoiFLGoFi+qDbBRkUWuloxbZKMiiVrCo78CcOh+rG0KoTtq0FsKoFTCqD7JREEatEER95xDX+VjfoFHfB+A6H+sbNOo78afMRxq1gkZ9j5XqfKxv0KjN2Mt8rG+IpPok9UUctQJH9UnqizhqhUqqE2+OhTxqhUqKeWMsBFJL0tmQ1BeJ1JK0NiT1RSK1gkj1ReqLRGqFSqovUl+EUiug1H6XLvOxvgGl+iL1RSi1NnayQZ6YEUqtkEl9D+vqj8fyhkyqL7IcEEytAFN9keWAYGqFTKovshyQTC3N8pLlgGhqaZSXKBUW0qkVs+DI5ICFdGqFTKoTYcNCQLVCJtXJCftCQrVCJtXJCftCSLUCUhl5H0JItSy8KchTA2KqFc7e9bDUjB7pMVu15qULIdXaFIpMP83okb51FvUY2Yz+TQ9n73oubEaP9PDJq+0AFxKq5VnX2uRhIaFa2YdHLPIXEqqVfXhFT+NCOrWyB4/dQZFOrezBK5qoF6KpFbbe5GxjIZxaHviiZqYL2dTa8ImdNi9EU/KEAX8NRwTRlGz4xHi8IJqSh/tAC3IpeeLMp9Y0CGIpecKqvbbIF6RS8sSRT+3WLAilZFMnJt8QZFKyoROTbwgiKUk5VL2rBZGUpByq3tWCREpSDlVvU0EgJS0M+Ov1KMijpIUBf70eBXGUtDDgJwsMaZS0qGptkS8Io6RFVeuDEEEWJS1EbjVEFkRRctVCCZIoaXHiQ6qKIErC45so7gQ5lPQ48yFVRQwl4fdELPIFQZRs0sT2HmIoCQxFLPIFKZRcxsIJIigJrydyRiRIoOQyFU4QP0mPgpLFiPRJLkPhBNmTRJsdOe8TRE8y+KmsIHeSEcUkyxyxk4zLZRehk4TREzlYEYROMi61ROIkYfNELPIFgZOMSy2RNkkIn8hJsiBskoBNxCJfkDVJCJ+IRb4gapLNkphFviBpks2SmAxSkDRJ9NcRGaQgaZLNkiqLfEHKJDNcE+uTKUHKJDNfVMunIkHKJDNfZEg6VjTa6giuE6RMsjESs8gXhEwSkKmWbwoiJgnEVIt+BQGTbILELPIF+ZJsgMQs8gXxkqw80amXLtIlCbpELPIF4ZJsekQs8gXRkgRaIhb5gmRJNjpiFvmCYEnS4rtuYRDkSnIZCycIlSQNvut2B0GmJMKPcQSBkiRQqsG9IE8S4ZoJQZgkAZOIH5wgS5JgScRtThAlSaAkYpEvSJIkSBKxyBcESSKXGyhSJAmKRP9QrKfebPUEGZIEQyIW+YIIScLuu2j5FKRHopdqIjuSMPom78SC6EgCHRGLfEFyJGH0zS64CI4kwBHBfILcSMLsu2hBFURGEkbfRQeqIC2SMPkmFvmCtEiCFhGLfEFYJGH0TSzyBVmRhNk3scgXREUSZt+FRb4gJpJw+i4s8gURkYTLd2GRL4iHxMJ4v+6xEsRDEhbfpF9TEA9JWHwTi3xBPCQeBvx1g5UgHpLAQ6RZUxAPSZh9k+ZLQTokYfhNLPIF4ZCE6TdpvRTkQxLG34WlkCAakjD+Jl2UgnRIwvybNFEK0iEJA/DCIl+QDEmQIdI+KUiGNAzAC4t8RSqkIVgijZOKVEifS9uNIhbSJ5zba4t8RSykT7i314VUxEK6wQ+xyFekQvqEiXt95KtIhXRzn8oiX5EI6WXSmyIP0ies9389BhRZkG7aU1nkK3IgbWG8/3t5V2RA2sJ4v1gbyH80DL8Li3xF9qNh9l1Y5CtyHw2j78IiX5H5aJh8Fxb5irxHQ3pEjuEUeY+GwXdhka/IejTMvQuLfEXOoz2M94viIuPRHq+RNaRWZDy6MQ47BVSEPNpvprKKkEc3yGEW+YqYRzfIYRb5iphHN8phFvmKoEd7GPDXFvmKoEd7GPDXFvmKqEc3zGEW+YqoR0NlRCzyFWGPjpB/1ncARdijG+gwtagi7tERBvz1XUAR92hMcyMW+YrAR7PXjdwJEPhoWCoRi3xF5KMb6jCLfEXko6kvktpmV5H56Ei/9lpEowh99LVVIt8lUh+9THRTZD46bxPAFJmPRq8beXlS5D66yQ7d28h99HX1rp+mFMGPvq7e9aGoIvnRID/MNVwR/Wg2uxHXcEX2o+nsXeuXFOGPXpy9FdmPbrrDXMMV2Y8uzmYVyY+GrzdxDVckP7rC1q52DVckP5qyIpF6fyD70ZQVSe1HqQh/NGVFUvtRKtIfTVtvYkuuiH80bb2JLbkiAdK09Sa25IoISF9b79qmTJEC6WvrXduUKWIgfW29a5syRRKkQYKYLbkiCtJ09ia24YosSIXjd0USpKkpkto8VBEFaWqKtDYPVaRBmpoibSQfi5uaIuKIrMiDNDVFOkg+FjetvYnHuyIV0rT2Jo7LimBINdUJxdMvUiHVqzpBEQtpWnsTG3ZFLqQpKNJaiaEIhvS19iYbBemQavYek42CiEhfd2/yXSIj0ku/myIh0uh3IzbpioRI09mb2KQrIiJNZ29ik67IiTSdvYlNuiIsUrtsWsRFmrbepN1AkRdpWnuTdgNFYKRp7U1s0hWJkb7W3mThIDLS19qbLBxkRprW3oXkRxEYacqJ2NMfEiN9bb3JQkBkpCkpIjbmitxIU1JEbMwVwZGmrTexMVckR5q23sTGXBEfadp6ExtzRX5kr613XVtDiGSvrXddW0OKZGnrTWzMDTmSRdsbszE3BEkWbW/MxtyQJNmTtu11fQ1Zkr3u3nV9DWGSpbt3wRwNaZI94RBcS0sMeZI94RBcS0sMmZJtcsRszA25kmXDm9avYYZwyaLh7XuaWudjYV9fb7JwEDNZi6fkWu9kiJrstfUm6wx5k7223mSdIXSy7HcjNuOG1MleX2+yzhA92evrTdYZ8icLnRHRdxkyKAvPJWYzbgihLDveiM24IYWy7HgjNuOGGMqy4430LRtyKHu9vWv1sSGIsp6zjX55oiGFspAbEXWaIYWydF0iNuOGGMrSdYnYjBtyKMtuN63f3wxBlGW3m9bvb4Ykyl53b1JaRFGW7W41VDBEUZYj5mrxliGKstAeEdtzQxRlIz3bf7mrIYeyaHRjtueGIMpGFpZsQQRRNrKwNYg2BFGWIIrIjwxBlF1AlCGIso2amO25IYiyyU/DDTGUbdDEbM8NMZRtzsRszw0plKX8iDyxGFIoS1tvYmNuSKEsKBSzMTekUBYKJGZjboih7PX1JtcDJFH2enuT6wGiKHv9vcmdB2mUbd7EbMwNaZTllDliY26Ioywdlwobc0MUZWn1XdiYG2IoS6ulQg9niKAsrb4LG3ND/GTpsVTYmBuiJ3utvn8PrAyxk71W38UdBpGTvVbfxUMh4iZ7rb5/D6EMUZOloVJhY26Imez1+C7qhojJ0t+70JAYEiZLb+9CRGJIlyw9lEhrsCFdso2PmI25IVwyzfLVBxWGcMnSRYnYmBvCJUsXJdIAawiX7DX2rsVshnDJEi4RixBDwGQJmIhFiCFgsk2QmI25IV+yDZCYjbkhXrLX1ruWUBjiJQu8xGzMDfGSvb7e5EKFeMnS15u07xoSJktfbyKMMURMlr7eRBljiJgsGtaIjbkhYbL09SZKGkPCZK+vN1nMCJns9fWuJRiGkMleX2+ymBEy2aZIzMbckDHZa+tNVg8yJktjJaLAMWRM9vp6k9WDnMnS15ucGhpyJktfb2JjbsiZLH29iRrHkDOZR0NibappiJksbb2JjbkhZrLX1pusHsRM9tp6k9WDmMlfW+969ThiJn9tvevl4IiZ/LX1rpeDI2bytPUmNuaOmMnT1pvYmDtiJn/Str1eDo6YyZ+0ba+XgyNm8idt2+v6OqImf9IquH7fdmRN/qRVcH2rc4RNHrCJvCI4wiZPb++afDmyJs9mtpp8OaImz2Y29ulY22xmq0mTI2nybGZjfypWNpvZ2O+OhQ3OVHc0OFImb1nWusnakTJ5y7LWTdaOlMnDVYnZmDtiJn+tvesnGEfM5D1cDOtXRUfK5NnQVh8COUImD3Nv0r/jyJg8GBPp33FETJ7j44iNuSNm8h6S0VJP6UiZPChT3QfjyJh8QyTWB+uImHwzJNYH60iYfEQ7cU2SHQGTJ2AiNuaOgMlzfByxMXckTJ7O3sTG3BEx+UgDaHLtQ8bkl/42R8jk43pW5wiZfFzP6hwhkydkIjbmjpDJN0VijeWOjMmzxa22MXekTJ7W3rWNuSNl8k2SmI25I2fyTZKYjbkjZ/LX2Jtc/BA0+SZJzMbckTP5DMv2+onLETN5YiZiY+6ImTwxE7Exd8RM/jp7k0srYiZ/nb3J5Qkxk18UT46MybPXja16hEyekImteoRMnpCJGOI5giZP0ETeNhxhkydsIjbmjsDJEzgRG3NH6OSvsTfZtQie/DX2JksZ4ZNLmAHUpz+O/MlfX2+yNpFBefh6E+9IRwzlr683WcqIojxRFLExd8RRnjiK2Jg7IilPJEVszB2xlEt4d5AHQKRSns7exMbcEUu5htFDfSLiSKVco7b1cZQjlHKNR6i67dSRSXkyKWJj7sikPIfNERtzRyblF29vRyDlr7c32SZIpDwnzREbc0ck5WHuTZrPHYmUb+TEbFMcgZQb15860ihPGkVszB1plG/cxPxkHGGUb9rEbA0cWZQbtwdwJFEe1knE1sARRPlF6uRIodxuVg+OEMqN9984EigPAkUsKhwJlPulnIif/PX1Jpc8xE/++nqTSx7iJ0/8RGzMHfGTb77EbMwd6ZMnfSI25o70yXOqHLExd8RPnviJ2Jg74id/rb3JVQbxk7/W3uTCAfhpPIGfiI15ho/8zSdqt42MHun02SljR3Iae5dXggwf+WnsXS61DB/5u1euNovI6JEezR1lY0pGj/QQndZnFBk+8rOy5ULO8JGflS1XZob/5qevd21jnuEjP9QStY15ho/8kDnVNuYZPvLDHqu8oGX0SI/i1jbmGT7y0/mZLOSG1W3p/EwWW8Pyvrbe5SlFho/8eJ2tbcwzfOSHzKm2Mc/w3/wAUMTGPMNHfuicahvzDB/5adte9pxk+MiPzVvbmGf4yM/6ku3Ssb6vszfZLh3ry32VMnYk31hFho/8G6vI8JGfr7TlW1uG/+an0qm2Mc/wkZ+e/GSvDyzuyL1L9vrA4obHUm1jntEjPY29yaVhYG1fY2+y1wfW9jX2Jnt9YHnDaqm2Mc/okb6fpdhOH1jc19abXEkGFve19SY7ZWJxZ5q2k50ysbjReUdszDN85MfOrcUEGT7ys7pksU2sbpou1b5IGT7yw9u77L3L6JEe3t6kuBOLu3ETsTHP6JHu/0dtzDP6N33DJmJjntEjPRzbS21aRo/0cGwnl+SFhX1tvck2XFjY19abbMOFhX1tvck2XFjY19abbJSFlX1tvclGWVjatPWubcwzfOSnbTvZKAuLm7betY15ho/8tG0nG0WwvK8LE9kogvV9bb1JfQXr+9p6k/oK1ve19Sb1Fazva+tN6itY39fWm9RXsL7ZglfbmGf4yE/bdlJfwfpmC17tn5DhIz9t20l9Feubtt61gUGGj/yob+1vlOEjP329SX0V6/v6epP6Ktb39fUm9VWs7+vrTeqrWN+NnYiNeUaP9HRtJ8tBsbyWru1kORiWN329axvzDB/56dpOloNhedPXu7Yxz/CRH+WtlQoZPvJDbUwe2gyra9kdTVaPYXUtG2jJ6jGsrqWbAVk9huUNSFXbmGf0b7pH2wd5anAs7uZQxMY8o0f6vvPWNuYZPdL3u25tY57RI33rLGob84we6VtnUduYZ/RID1O10rIto0d61NXKRucMH/nbe6Tu8c/okR42lqWWIKN/0lvyKSvbqDN85NPWgIwdyZtO1YLwjB7psWGtbNHO8JEfG9bKFu0MH/lxPbaybTnDR37sWCsb0zJ85Gdly8a0DB/5sWOt7LfJ8JEfF2Qr+20y/Dc/CZWVLfgZPvLjguz1ymxIqFoSKidrBwlVi0a87qS+iKhaIion9UVE1RJROakvIqqWiMpJfRFRtZb+s6S+iKhaTp5zUl9EVC0nzzmpLyKqlpPnnNQXEVULRDUeUl9EVC0Q1XhIfRFRtUBU4yH1RUTVAlF93uBJPtY3ENXnrZDkY31DJ/V50SD5WN+gVJ8HV5KP9U2l1EPqi5SqBaX63FtJPtY3faEeUl+kVC0o1edCQPKxvkGpPguL5GN9Qy5VWw5l9EinR30ZO5LDlrb0J8rokc7pY0M81TaAImZGGT3S6VFfxo5kajGcsb/JryFUjS8akqkWZIoYSGX4yOenQQ2xVJvXaiKVavNiM5zRI33dvnNkUi1a8T57oF6KCKVaSKSa/m+Of+zzwPD5p58nnvaP6c+PwvKGXOq//O+/nftpaeI/xWJvHKWfH2r/fA9aLj8UK5924Y1cihBctZVbmVyKkFy1lVuZXIoQXbVAV6ORSxGiqxboajRyKUJ01QJdjV62Pmb4yJf/oyYrGT3S40rdyZULyVVLcmXk47HOAa5GJ6sRwVULcDU6uZEhuGoBrkYnNzIEVy3A1ehk9SC4atw/PGNHcpS2k6WG1KoFtdLS3DCjR3oawpOVidCqSZaWrEyEVi2g1ehkZSK0apLvR+QmidCqaZozkqWG0KoFtPr6XNb5WNuAVmOQtYPQqgW0GoOsHYRWLaDVGGTtILRqIaOqR3Jk9EiP8g6yepBZtWBWY5DlgMyqbSpF7yPIrFowK3ZTQ2TVAlmxmxoSq7aR1Le0w/9R+d51hpV3DmRXbcOp8196/S+x3kGxxiTrFSlWC4o1JlmvSLFadPuVcv8MHtlR7qpJJINHdhR7kr2ACKuZXe8aiLBa2EmNSfYOMqzm9+cvhFjN789fSLGaX56/kGE1vz5/IcNqfn3+QobV/Pr8hQyrpZlUbeCZ4SM/DTlrHNgQYrU0k6oNPDN85IdaozbwzPCf/L45FTHwzOiRzilWR4rVN6ciBp4ZPdL5zbcjwuqbUTG415Fg9Wzu+zUhydCRu1+RCHzrCK/6k3u1vq90hFc94NWY9X2lI7zqD39R6kiuektDv1ov0pFc9SBXTC/SkVz1Ft0kZV9RRo/0aDqonSoyfOSHdPnXqSJDR266Wvw4HmToyE1Xix/Hgwwduelq8eNUkaEjN10tfpwqMnTkhtTm16kiQ39zs4nv16kiQ0duulr8OFVk6MhNV4sfp4oMHbnpalFsGQRSPb2hfp0qMnTkpqtFUTcEUT0b9n6dKjJ05KarRX3K1RFC9ZhBR8QlHRlUT6VU7VSR4b/5I70PyvbsDB/56X1Qn3J1ZFA9W/Zqp4oMH/k566o+lOwIofpIZ4v6ULIjh+qbNBGniowe6WFsUTpVZPRIj+LWThUZPvLT2aI+4e1Io3r27NVOFRn+mz+zuuTbQSDVZ1a3bC7P8JGf1S2byzN85IcOrr7rd2RSPZgUcarI8JGf1gdkMSOV6jOdLUqvgQwf+el9QBYzoqi+ARNxqsjokR7VrZ0qMvw3Pxv3aqeKDB/56WxBVg9Cp57+UOTxuCN06iudLcjqQejUVzpbkNWD0KmvOLct+yYzeqRndcnqQejUs3WvdqrI8JGfzhZk9SB16tm6VztVZPhvfrbu1U4VGT7y09mCLAekTj1792qnigwf+elsQZYDgqeezXu1U0WGj/x0tiDLAclTz+a92qkiw0d+1JfoPzqSp56eUkTQ0ZE8dYmuoFrj0BE8dQ1ji1rj0JE79Wzeq0ULHbFT1zC2YJ+OtdUwtqgVFB2hU9cwtiB/KjKnrtHnxX53LKxeIERH4tSzdY/oaDoSp55uUkRH0xE59XSTqp0qMvw3P92kaqeKDB/54VhSK2k6kqYeKqnaqSKjR/q3dMSpIqNH+t6ztVNFRo/02LK1U0WGj/yYhVY5VWTwyI5X1hJddYRLfdMj4lSR0SN9G1vUThUZ/Zu+2RFxqsjokZ52JeSxHclSzy6+2qkiw0d+OlvU2reOdKmniVTtVJHhI58222bsSA64xN7mES71hEvsbR7hUk8LqdqpIsNH/h62VTtVZPRP+tj0iDhVZPRI3/u1dqrI6JEeKKJ0qsjokR7GFmW7ZUaP9KxrffEbCJjGpkjEqSKjR3oYW9RPXAMZ00jvqNqpIsNHfha2vrQOZEwjvaNqp4oM/81v6WxRX54GYqbRODYcyJhGqKPYqh8ImUZCJrLqB0KmkZCJ9DwNBE0jQRN52xgIm0bCptqpIsNHfnof1JeQgdBpJHSqnSoyfOSn+QFZygifRg/zg7IJO6NHelyRa6eKDB/5+wGKtAcOxFAjMVTtVJHhIz+dLchSRhw1EkfVThUZPvLT2aK+AQ3EUmNzJ+JUkdEjPYtLFhtiqbG5E3GqyOjf9BG1LY0BMnqkxyNU3VQ9kEmNZFK1U0WGj/xsmScrH5nUuAijBgKpkR5StVNFho/8bJgn2wSR1IjevdqpIqNHejiWlHYPGT3SOfUfSKNG0qjaqSLDR364g5EdjjBqhIVU7VSR0SOdn+MMJFEjDKRqp4qMHun88WkghRrhHlU7VWT0SNfLZ2M5g0DVThUZPdIv5UT8NBI/1U4VGT7y09mCXPIQP43ET7VTRYaP/P2qUztVZPRIT/8ZcoVE+jTSOap2qsjwkZ8blVxlED+N7NarnSoyfOSn/wG5cCB+GtmtR5wqBuKnsfkSc6oYSJ+GXJ6dED2N7NQjThUD0dPITj3iVDEQPQ0Jf8baqWIgeRoSU0trp4qB4Glknx45oxgInkb26ZEzioHgaWSfHnGqGAieRvbpEaeKgeRpZJ8ecaoYiJ5G9ukRp4qB7GkEeyJOFQPZ08g2PeJUMRA+jWzTI04VA+nT0DxUJ18n4qeR3lFsIyKAGgmg2EZEADUCQDHnjIEAauS0PNJPPxBAjZyWR5wzBgKoYelsUXeKDSRQw9LZgjwaI4IaOTGPOGcMZFAjJ+YR54yBEGpYOluQiwNCqJGNesQ5YyCGGtmoR5wzBoKowa2kMnYk58Q88haJHGqkxIm9RSKIGgmi2Fskgqjh6WxBNguCqOG5ecm1B0HU8Ny85NqDIGps2MScMwaiqOHpbEH2LqKokc16xDljIIoaaSdFnDMGoqixYRNzzhiIouaGTcw5YyKKmk86W9RXkoksaj7pbFHvlIkwambDHnHOmEijZjbsEeeMiTRqZsMeETdMxFEzG/aIdmIij5rZsEecMybyqLmBE3POmIij5uZNzDljIo2aGzcx54yJMGpu4MScMybiqBlO5sQ5YyKNmuEmRZwzJsKoGU7mxDljIoua2alHnDMmsqiZnXpEVTKRRc3s1CPOGRNZ1MxOPeKcMZFFzezUI7qMiSxqZqcecc6YCKNmT2cLslEQRs2ezhZkoyCNmmkmRZwzJtKomWZSxDljIo2aaSZFnDMm0qjZ09mC1Bdp1OzpbEHqizhq9nS2IPVFHDV7OluQ+iKPmuknRZwzJgKpmX5SxDljIpGa6SdFnDMmEqk50rmE1BeJ1ExDKeKcMRFKzTSUIs4ZE6HUTEMp4pwxEUrNkc4WpL5IpWbopJhzxkQsNdNSijhnTCRTc6Mn5pwxEUzNdJQizhkTydRMRyninDERTc10lCLOGRPp1ExHKeKcMRFPzXSUIs4ZEwnVzEF6RDkxEVHNQFTEOWMipJoznS3I6kFKNUMnxZwzJoKqGaCKOWdMBFVzkyjmnDGRU80NophzxkRMNTeIEu/lA/lETDVXTL2shRwTKdVcMfWyllpMhFQz+vKI7mMio5orBprWOHEiopqbQZGJnRk90vfDcj2xM6N/0wNQkUOCiYBqBqCqp41m9EjfvR5EljGRUM1oySPin4mAako4lrBPx6pKKN/Yp2NVJUY6kTWDfGpuAMXsUybiqRmm5sQ+ZSKdmhs/MfuUiXBqZj/erBvOJsKpmf14s244mwinZvbjzbr/cCKdmtmPN+v+w4l0am789PUYWPJPw0sNsqkZyijSFzsRTc1URq26WWwimprZjbfqZrGJaGpqzoapG7omoqm52RNTF00kU3OjJ/bdIJeaGzx5L6cJZ/RI33Nqv48s1VeJVGpm392qe8smUqmZVIp0UE2kUjOoFOugmkilpmWHFnmbRCo1LTu0CCtAKjU3eWIdVBO51DR+EjQRSs3wjiIdVBOZ1HR+VDARSM1NnFgH1UQeNVMYxd7ckEfNFEYxpIA8aqa/OXtzQyA109+cPTohkJrpb86ehRBITY8DPnJnQB41g0cR0elEHrWeOIevL/ULedR6QqNaf/pCHLWe0KjW952FNGo9oVGt/9SFMGo9cWTLfveJ6dEnW4pOF5KolVP1yCPoQhK1UhlFHkEXkqj1TtWrl/FCFLXeqXr1G8lCFrVyql79/LGQRa3ovyOi04Usam3axG4LC1nUCmUUEZ0uZFErhVFEdLoQRq1Nm4jodCGKWi1vseU6QBC1NmliotOFHGpt0MREpwsx1GoxNqQWnS6kUOudqVe/Ni6kUOudqVdf+xZSqJVteUR0upBCrdREEdHpQgq1OtfNLERQKxAUOzhZiKBWT5FqfXCyEEGt7NMjotOFCGq9Y/Xq/tqFCGr1m0h1IYFa6RW16nbchQRqjcv4tYwe6fFUvOqn7oUAag0unllIn9aI6Wu1YnYhfFojHQvqJ/qF8GmNEKnWCtuF7GmNfCauXwAWsqe14RJT5C5ETyvQ01j1+8JC9LRSFEUUvAvZ0wr2NKR+BVjInlYO1qsVvwvR0wr0NKR+Y1iInlZO1qsVwgvJ03on65H7IJKnlR16RCG8kDyt7NAjCuGF6Gm9s/XIvQTR07oIpBZyp7WuXe4LudNa1y73heBppUCKnO0uJE8r+/OIQnghelqpkCIK4YXsaaVCiiiEF8KnlQopohBeSJ9WNugRhfBC/LQ2YGIK4YX4ab2j9cjaRP60NmFiCuGF/Gllex5RCC8EUOsdrUeWMhKole15RCG8EEGtd7YeeVpABrWCQRGF8EIGtd7RemSxIYRaAaEIK1wIoVZAKAL/FkKolb15tZhtIYRamlMTycpHCLU0pY1k5SOEWsqNZBYSqJWD9YhCeCGBWu9gPbJNkEGtZFDkvQoZ1NqQiSmEFyKopVyuupA/rezNIwrhhfxp5Vw9ssORPy2Ltx7yqyOAWsY5xUL8tCzUx2RBIn5adnmAQva0LF5lyd5A9LSMq48XcqdloT4mXyFip2WXciJzWpblJJc8hE4rxFBMIbyQOy1PBTK55CF4WhsuMYXwQvS03tF65AqJ7Gm9o/XIJQ/Z00r2RBTCC9nTCvbEFMIL2dNKMRQRJi5kTyvFUEQhvJA9rWBPRCG8kD0tvzw7IXmSd65efSUQRE+SUiiiEBZkT/IEoqgVwoLsSTZdYgphQfYk72S9eiELwidJIRRRCAviJ0khFJG0CuIneWfr1StTED/JO1uvXpmC+EnSuZwohAXxk7Topq0vaIL4SdK4nCiEBfmTvKP16oUsCKAkABRTCAsSKEkCRTaiIIGSbM0jG1GQQcl9tp4ghZJszSPyKUEMJe9svfrsQJBDyTtbrwb8giBK3tl69Qm6IIiSd7Ze/SgtCKLkna1Xa+MEQZT0VCDXhx+CIEp6vNTW3E0QRck7Wo9cexBFSb8KkAVRlPSrAFkQRUnnAmRBDiX9KkAWBFEyrgJkQRAl4ypAFiRR8o7WI3sRSZSMqwBZEEbJuAqQBWmUjJsAWRBGyTtaj1wakEbJuAqQBWmUjKsAWRBHybgJkAVplMybAFkQRsk7Wo9cqBBGyTtaj+wUpFHyjtYjOwVplLyj9chOQRwl72g9stgQR8m8CpAFcZTMqwBZEEfJvAmQBWmUzJsAWZBHyboJkAVxlKybAFmQRsm6CZAFYZSsmwBZkEXJugmQBVGUvKP1yDZEFCXvaD2yDRFFyTtaj2xDRFHyjtYjGwVZlKRDudRCDEEWJe9oPbKxEEbJO1qPbCyEUfKO1iMbC2GUZMMeESwLwijJ0XpEsCwIoyRH6xHBsiCNkne0HlkPSKPkHa1H1gPiKHlH65H1gDxK3tF6ZD0gkJJ3tB6pLwIpeUfrkfoikJJ3tB6pLzIpyZ49IlgWZFKSPXtEsCzIpCRH6xHBsiCUkne0HqkvUil5R+uR+iKYkuzZI4JlQTAl72w9Ul8kU/LO1iP1RTQlGz8xwbIgnJJ3tB5ZDkin5B2tR5YDAirJ0XpEsCxIqCRb9ohgWRBSSbbsEcGyIKWSd7YeWQ4IqiRa9ohgWZBTiaUAmawe5FTiKUAmqwc5lXie8dXaNEFQJdm0R9QlgqBKNoliAmdBTiUeEmTyVIKYSqJljwicBSmVeEiQa9GQIKQSDwlyLesRZFQSjIpojAQZlYQ+ihwZCVIqDVtycmihCKk0rKOIwFmRUWlYR5EzDkVGpWFMTgTOioxKN4RiAmdFRKVPTMOsTwkUCZU+IUGuz4UVAZU+IUFmv4xiekiQ2S9jmL6fk4keWpFOadApoodWpFPaYhRmvSIV4ZRu+sT00IpsSlseyNe6EkU2pcGm2AwERTalwabYDARFNqWNT+ZSBFMaYIrMQFDkUhpcisxAUMRSurkTm4GgSKU0qRRR8CpSKU0qRRS8ilRKk0oRBa8ildKkUkTBq0ilNKgUUfAqUint/BRIEUnpZk5MwatIpLTzUyBFHKX9NuBUEUhp98vtQ5FH6Xgutw9FHKVhFUVuH4o0Ske/3D4UYZSOcbl9KLIoDWEUu30gitJAUez2gShK0ymqGCahiKE0XKLYrQYplMYIPXarQQil4RLFbjUIoTQhFLm6I4TSNC0n9F4RQmmalhN6rwihdObpQP20pwihdFMmNphDkUHpDEvGGjYrIiid2SdQuzYrIihNRVQxq0IRP2mqoYpZFYrsSdOsvJhVoQieNJ2iilkVitRJ0yWqmFWhiJw0BVDFrApF3qQpfipmVSjCJk3hUzGrQpE0aYqeilkVipRJU/BUzKpQJEyaYqdiVoUiXdJ0Ii9mVSiSJU2VUzGrQpEqaTqQE9ypSJU0WuwITVWESpoKJzKrQhEqaSqcyKwKRaikqXAiUE8RKmkakJNZFYpQSQMqsVkVilBJAyqxWRWKUEk3NWKzKhSZkm5oxGZVKCIlTY0TmVWhiJQ0NU4EMSoiJdWcDUEuVIiUNGVOBDEqIiVNmROZVaGIlDRtoMisCkWkpJsZsVkVikRJ0wWKzKpQJEqaUicyq0KRKGnakJNZFYpESdOGnMyqUCRKGjbkRBuqSJTUcjYEWT1IlNRyNkQ9nECRKKnlbAiyepAoaTqRs9cYJEpqORyCrB4kSmo5+oOsHiRKavGGSt5/kShpKp/IrApFoqSpfCKzKhSJkqYNFJlVoUiUNKVPZFaFIlHSlD6RWRWKSElT+kRmVSgyJc22OzKrQhEqabbdkVkVilRJs+2OzKpQxEqaluRkVoUiV1LP2R+kvgiW7MlWnvoZ1ZAs2ZOtPPWtzhAtWaAl8ohtiJYsXMlJ26AhWrInxkPUL1mGaMk2PGJtg4ZoyQItkXcyQ7RkgZZI26AhWrInGirZ726Yngd1VbuYIVmyNCQnINgQLVnLstZg15AtWcsOrfoebQiXLIVPpG3QEC5ZCyFq/SJnyJYs2BJpGzRES7bxEWsbNIRLFnCJtA0awiVLP3LSNmhIl2zzI9I2aAiXrGd/VrkOEC3ZZkesbdCQLNlGR6xt0BAs2SZHrG3QkCtZWpGTtkFDsGRpRU7aBg3ZkqUVOWkbNIRL9nbekWsf8iW7yJ0M6ZLd5U6GeMnucidDvmSv3IlciBEw2UZIrA3QEDDZiHEudVufIWCya+edIWCyAEykk84QMFk23tVyakPGZDkcj3S6GUImy8a7unPNEDJZKJ1IJ5ohZLK3745cWpEyWVIm0olmSJksKRPpRDOkTJaUiXSiGVImm7xZ1pAx2bw2yxpCJpvXZllDyGRv210t8jMETfa23ZFLCMImS9hEOtEMgZMlcCKdaIbQyRI6kU40Q/BkCZ5IJ5ohfLIQOxEubMifLPkT6UQzZFAWg/GIfNYQQ9nbd0eWMqIoe/vuyFJGHGWJo0gnmiGSsrfxjtyAEEtZNN6RTjRDKmVv4x1ZbIilTMKWoqbyhlTKJGpbo3NDKGUSj1B104Qhk7JkUqQTzZBJWbbdkU40QyZlwk9yDIGU5UQ80olmSKRMsp+HbBNEUhYj8UgnmiGRshiJRzrRDIGUXZruDGmUvU13ZAsijbKYiEc60QxhlOVEPParY1WVH7oakijbqIl1ohmCKNPL4xNSKNPooyR7AyGUbcpEPhsJlOUgPPIVIoEyu5QT8ZMlfiKdaIb4yRI/kU40Q/xkiZ9IJ5ohfrLNl1gnmiF9sqRPpBPNkD7Z23hHLnmIn+xtvCNXGcRPloImcoRmiJ/MszuLXDgQP1kKmkgnmiF+shA0kU40Q/pkfnl2QvRkb9cduRIgerK3644sNURPttkS60QzJE+20RLrRDMET+Y5G4IsZARP/vbd1QvZETz523dXr0xH8ORpQU460RzJk6cFOelEc0RPnp13pBPNkT15sCfSiebInjwb70gnmiN88my8I51ojvTJn+tsCEf85M91NoQjgPJ2nQ3hCKC8XWdDOAIob9fZEI4Aytt1NoQjgPJ2nQ3hSKC8XVuzHBGUv5139XZxZFDerq1ZjhDKG7/ZOhIob1dW4cigvF9ZhSOF8n5tzXLEUN6vrVmOHMr7tTXLEUR5v7ZmOYIo77fWLEcO5f3amuXIobxfW7McOZT3a2uWI4ryfmvNciRRPm6tWY4gyse1NcsRRPm4tmY5kigf19YsRxTl49qa5ciifFxbsxxhlL+Nd2SxIY3yt/GOLDakUT5urVmONMrHrTXLkUb5vLVmOcIon7fWLEcW5fPWmuWIonzeWrMcSZTPW2uWI4vyeW3NcmRRPq+tWY4syue1NcuRRfm8tmY5siif19kQjizK13U2hCOL8nWdDeHIonxdZ0M4sihf19kQjjDK13U2hCOM8nWdDeFIo3xdZ0M40ihf19kQjjTK13U2hCON8nWdDeFIo1yusyEccZTLdTaEI45yuc6GcORRLtfZEI5AyuU6G8KRSLlcZ0M4EimX62wIRyLlcp0N4QilXK6zIRyhlMt1NoQjlHK9zYZwhFKu19kQjlTK9TobwhFMuV5nQziCKdfrbAhHMuV6nQ3hiKZcr7MhHOmU6202hCOdcr3OhnAEVK7X2RCOhMrtOhvCEVK53WZDOEIqt9tsCEdM5ZtDsTYYR0rlFlMEal7qCKncYopArbNwZFRu0cJTY3ZHRuUWLTy1cMIRUflmUKwNxpFQuaXOovY/dSRUHoRqSG1o6kioPAjVqoGsI6DyBFRWUhhHPuWbQM3WSit7Rz7loY76rHnt/yxUEzgSKve0rq4NUx0JlQeh+uzw+rfBwjo/InDEU74BlLI/FKvqWdXai9WBTs3noTw5Y0fyLulnxRS/S0aP9F3Sz4Kp0zum7+vw5zuv0wemz/hLS1vYDB/5IZ15qstkRo/0cK0utTAZPdL3PVYH+eUV0/dFWMvXjYwe6buquqqtndG/6cGktOT+GT3SqStfxo7kXdRagZTRIz2a7bQ0183wkT9vVWpY1KBRtWIpo0d6FFVLL94MH/n/j7Nv23EcR7b9l3keTIkX3eYPzjdsHBhOW5mpLqfl8aWqqzf2vx+SIhcjKIaq9wEGmOySGJJFMhiXFStWZuO+ShoRL7P7xWBUvMZuDsV2PjDW/Mu25RpQ5aRGPFRfLWGOl9n9a8lzXy1zjJfZ/SthdV89D+Jldn+c2ep5EC+z+9f92ld1arzM7veT5xMWW7RYvMju9lNn6yVC8Sq7PU5sVU3Gy+z+lYu8F5SNLud2BUWZQVj2upzcSEY+CAvTlJO7xqLMICxMU05uZCMfhMVjysldY1FmEBaPKSd3jUWZQVg8ppzcyEg+CIvHlNMbgk26nuOPV9nt6/QOwloz5fSataBS0DqmnF0jQ1TjRXq3lYGM8SK720+dUIIbr7LbQzMXo2sIz3iV3W7CD92UKsUr7NbQdqkPrYX6jaK35YyGKJORzgVbTmgIMvn9V1V+tpzQEGPy269+ezmfdp3PTXVcvMJuDVp42BTHxSv01hBYMuOmNi5eYbfuHKltOYchoCRpuracwhBOMuOm6i5eYbeGKRw3RXfxCrs1TN+4qbmLV9itYerGTcldvMJuDdM2biru4hV2a5iysbIy23LKQsDIeSiVW8sp69Ypq8xuV05ZCBM5Y6pyazlhXdSmwunRlVPWidTE8Rq7OapS4ajpyplbo0dhWdZMz66cvjV6FBZQ9f5yDtfoUVhF1fvLiVyjR2EpVe8vZ3ONHoX1VL2/nNLYzm4UvJC+nNfYzm4Ujpq+nNzYzm4Uzo6+nNwQHxqrZTfxIrvbT99ohI/Tl5MbgkOjsTW/NV5lt/vJG5vKcu/LaQ1xodFIX7Gc1djHbhSWfF/Oar/DORCv0tvXoFFTD6HHy+z+lXSgGkmJV9nta9BIcIiGckqHlXSgGtaJV9ntK+lANU4Tr7LbIz9IRYMP5YTGHna2osKHckYjRVNfjULEy+z+lXKgGhqLV9ntK+VANTQWr9Lbxx0in3iV3b5D5BOvstt3iHziVXZ7mNA6I0C8ym5fVfAoqOCxnNFxXwWP5ayO+yp4LGd23FfBYzmz474KHsupHfdVcBk0Us2uClZl3EitcSN/tta+pyoDR6qJvC9VNox4md0feV+qQeF4md0fO0/WvUVVho5UEztPVpEC8TK7f+V+qeZv41V2uxgOjNfYzWvXyWryJF5lt4sU8fEavTlEhgRemXiV3b6iXeoAgXiZ3R/wpXX8QbzKbo/8EtUKz3iZ3R/L16sVvPEyuz+Wr1cTIfEyu7/bUSKqjB2pRCFeLfiNl9n9kUK8muaKl9n9EahWTXPFy/T+ECASuA/iVXZ7KKircx/Eq+z2yE1QLVeOl9n9e11F42V2f5zcarlyvMzu3+sqGi+z+1eUf537IF5m98fZrZYrx8vs/rBt69wH8Sq7fYUP17kP4mV6v4ncBMLaL+NHKhbV1bkP4mV2fyQnEBZzGT9SK21TvRopXmW3R24CYfWU4SNlIjdB3epWZfhIReKmOvdBvMzuj9wE1WL3eJndH6knhNVTBpCUieQEwuopQ0jKrvx51Uq8eJXdHmdXWD1lEEnFyro690G8zO6P3ATC6ilDScpGbgJh9ZSxJBV72tW5D+Jldn/kJhCWQxlNUrG4rs59EC+z+yM3gbAcypiSisV1de6DeJneH4vr6twH8TK7P3JPCPNbBphULK6rIwriZXZ/LGIXTsYyzqTatQKr7hqoMtak2rVUp+5eqTLepNqVnaDuXqky5qTalZ1Akl7ObWxpV/ckVRl7UiHCJHAfxKv09m7tjyW8exmDUl2kqa2FilUZhlKR7amOzIiX2f1xWqvIjHiZ3R/L2IUzuoxEqVhZV+c+iJfZ/WujrLoDqspAlFoDUUKEWZVxKLVyPdW5D+JVdnvYs0ImUZVRKBW5nurcB/Eyuz9EF6vcB/Eiuzs2j62ugzICpUKQSeA+iFfZ7X7eBO6DeJXdvtZzCGZvGYJSfeQmEKz8Mg6lIstTnfsgXmb3R9KJKpoqXmb3x0JnQfeVkSglF9jFa+zm2F+0Wk8QL7P7V8e2Xk8QL7P7Ywm7oIjLSJQKsSaB+yBeZbeHFGud+yBeZbevDlCV+yBeZbeHqsk690G8ym5fyQmqBXzxKrs9zqug/Mp4lFrjUXXug3iV3R7iUXXug3iV3R65CQTVWgakVGR3qnMfxMvs/tg4VlCtZURKRXanOvdBvMzuF8th4zV2c7+76stwlFrDUeKqL8NRKlI71ato4mVyv47UToK3octwlI7UTnXug3iZ3R+5CeoqRJfhKN3EvrH1XavLcJRuIjlBfSnrMhylI7tTPZqty2iUbiI5QX1t6jIcpVd6p3rBWbzKbo/cBPWlrMuIlG4iN0F9KesyKKUjw1Od+yBeZvdHcoL6AaTLqJQOcSeB+yBeZbfHyRUWWxmV0mpl7qrHwXUZlNJqndt6YFuXMSm9xqQEXIQuY1I6xqTq3AfxMrs/Vj0LK7+MSWklRxt1GZDSOvYaFbZJGZHSsbiuzn0QL7P7Q46gzn0Qr7LbV46negZClwEprcWK53iN3RyL2YUtWEajdAg3CdwH8Sq7feUnkF69nFWZ3ileYzev/ATCgiwDUdrI5pMuo1B6pQ6vcx/Eq+x2kZ8gXmM3rwR7wicsI1Da7ExnGX7SMfxU5z6Il9n9kUJEUHll+EnH8FOd+yBeZvcHV6fOfRCvstsjN4GgIcvok47ETnXug3iZ3R83qqBlyvCTjj3s6twH8TK7P1awC4qjDD/p2MOuzn0QL7P7Q3yizn0Qr7LbZdtJl6EnHWvp6twH8TK7P/aNFZZaGXrSIbYkcB/Eq/T2EFoSuA/iVXZ75CYQFnIZeNKxkk7IUegy8KRjJV2d+yBeZvfHmRVWZhl50rGSrs59EC+z+2PxurAyy9iTXmNPde6DeJXdHrkJhIVcBp90LKSrcx/Ey/T+yDYufc4y/KQjr5O0EcsAlI4BKGkjlgEoHQvp6lwM8TK7P3IT1LMmugxA6TUAJXAxxMvs/kg3Xq09ipfZ/ZFuXDCNyxCU7mJKrw7z12UMSncxpVdPHOsyCKVjD7s6F0O8zO5ft2+diyFeZvdHegJh+5aBKN3LODddhqH0WkYneZG6jEPpPjLu1b1IXQaidAxECV6kLgNROjawq3MxxMvs/rh5Bd1TBqJ0rKOrczHEy/T+EGwSuBjiVXZ7ZCcQ9m4ZitKxgV2diyFeZvdHdgJB95ShKL2CoupcDPEqu31thiXs9DIUpWP7ujoXQ7zM7o/cBMJOKYNReojME8JOKaNROvavq3MxxMv0/kj3JGAhdBmO0pHuSYBa6DIepWM1XZ2LIV5m968EBXUAjS7DUXpcCQqEyS2jUTqEmwQuhniV3d79Q+RiiFfZ7eHQrXMxxKvs9pV2osrFEK+y21faCUEll7EoE9me6lwM8TK7P3IT1LehKWNRJrI91bkY4mV2f+QmqG8UU8aiTGR7EnAZpoxFmSZyT9Q3iimDUSbSPQm4DFMGo0yke6pzMcTL7P7IPVHfKKaMRpkmck/UN4opo1FGRW4CYX7LaJRRkZtAmN8yGmVU5CYQ5rcMRxkVuQmE+S3DUUZFbgJhfst4lIl0T3UuhniZ3R+5J4T5LSNSJtI91bkY4mV2f+SeEOa3jEgZFbknhPktg1JGx7axwvyWQSmjIzmBML9lUMpExqc6F0O8zO6P5ATC/JZhKRMZn+pcDPEyuz+o5joXQ7zKbo/UE8JyKCNTJjI+1bkY4mV2f6SeEJZDGZ0yOlJPCMuhDE8ZE6dXWA5lhMpEzicBOWHKEJVZQ1R1LoZ4ld2+zq4AtDBllMpEyich42/KQJWJlE9Cxt+UgSqz8o/XuRjiVXb72uOubjWYMkxlVvpxoSbAlGEqs9KPC0AOU0apjF0B53WohSmDVMbuVRCYMkZl7F4FgSlDVMauFQT1QIApI1TGrhUE9QCuKQNUZg1QCUkCUwaozBqgqvcWjFfZ7SufSB2WYcoIlbFrGUE9zG7KAJWxa+dYSXo5q+2KfBOklwEq066dY4U1U8anTAhACYQc8Sq7fSUTEZZYGZ0yIfwkEHLEq+z2sFltU68BNmVwyqzBKdvUa4BNGZwyK82Tbeo1wKaMTpkQfhqbOojNlMEpswanbFMvGTZlcMqE6JMovoxNmRB8GpuhWnJgytCUWUNTtqkXJJsyNGVC7El+m3JqQ+hp3HQHjBfYnaGCq440NGVEyoSQk1TvZcqAlOnilNZr20wZkDLd7pSW8SgTAk61cjJThqJMiDWNql4BY2Ik6v/+8x/z9cd0f07n/3M9T3/+49//9V//OPzjn//9j8O8/rdzSP4ZRP7j3//9D+vc7H//9//8zz+TpPBfXvLhcDyfp/PhOs0fn2/L/UFlDMOQZSjfb1kS8rYc7+fDfTrfjz8Pt+l6uBx/TffDc/6a7lRiAHZApDOejRfyz39oz2UX/jLeE1n/am0b//ItL8JfAQAiv8T9PN0f7lnzcz5e5r+mM3t244yV/GwfBJQknS7L6Xv17S17e4u3H/H2A96+w9srvL0Rnxk+3eN5fE7FI1v2yDY9sm3wyBGP7PFIjUfa3Uc+/vM63otHOkWYH+lN1/WRvmONJOpyfDwPt2fx6h179Q6vrtKrqwavPuDVDV5dXnCP6RkX3adfufzBjXOCyES3aZp8x9HfC/w5n5+fhbyByWshT15Cz1839lXJG8VJirOm4kyp+JYqfiYVP4iOn0jH+3T6Nelzpg+XPmW8z8T7DJZh/KxpK6UVEu9L05MmIq2vNt6XvmIb72vjfV28r4v3dfG+Lt7Xxfv6eF8f7+vjfX28r4/3DfG+Id43xPuGeN8Q7xvjfWO8b4z3jfG+Md7ni+jiH+lLN+lTN+lbp12r0oJUmBbMCyYmzYxKU6PS3Phqm/hHml2j0h/pkmnTH336I92cNoZKS0ylr6zS5/Ogp/UP1acFkS51+CPdkz627rEH0rJJ31unD67TF9fpk+sBayzdnL66Tp9dj1CC2N9YkWlJpi9v0pc36ctnfQlVkL68SV/epC9v0pc3Gos93Zy2hUn7wuh8oqQ/0s3YG9gcaXeY9DGNxT5KN0OhQ1dBB6dNYtIuMWmbmDSDJs2OSTvFdNii6ea0WczYp92azo40ynbYsGnHplE2LRKb5t2mebdp3m2adzskyQN2eFyHLfZ6ktOl9dyl9dyl9dyl9dylT9elQ6pLj+jTDPZp4vp0s29uG/8YkyJIowaTVELSBeljDrg0xj9G1SY9oJIiSJe6dKlLqreLz/Kcl/GPdHN6n5EoEGiQrEKSleKLX6FW8G9j2tEqzZ9SaeMqX+aa/urxF0YojFAYoTBCYYTCCI0R0D9KY4TGCCilrJWyWsp6KSsmZaEObdaHUIgWGtFCf7YY0WJEixEtRkCxqQ4jOozostLFiA4jeozoMaLHiB4jeowYMGLAiAEjhqzZMWLEiBHfZcR3wfxqzC8Us0d14K8ef2EE5ldjfjXmF1rd5zfTX5hfnc8XzK/G/GrMr8b8asyvxvxqzK/GyaMtRliMsBiBla0tRuCw8miS9BdGtBjRYkSHER1GdBjRYUSHET1G9BjRY0SPET1GYH5xiimTj9589ubDF9/A4BsYfAODb2DwDQy+gcE3MG0+3jEC38DgGxh8A4NvYPANDL6BwTcw+AYG38D02YbACHwDM2DEgBEDRgwYMWDEiBEjRmDd4zDyRA7xL5xLPgyCv1r81eMvjMC6t1j3FuveYt1brHuLdW+x7i3WvcW6t1j3FuveYs4t5txizi3m3GLOLXREi7FdshhUh2+As8x5Zvg3zEyP+eihVQZ8oQHfZcDXGLDCBqyrEV9yxIgRX3KEnsQRp5tkWekmmVa6aeBCKFiP6bTSjcIIhRHZ6YDb0cDxaOB6NHA+Gp1HjOmvNAu6MXi/NAu6SbOgG4MRFiMQEWjg6uJc1Y3FiBYjWoyAY9a0GNFiRId/6zEWli5cAQ1fQMMZ0PAGNNwBDX9AwyHQCr9D4Xco/A6cjRr2vcY5o6GLtU6nqdYYodOJqLMpD62nodc09JrGXnCeN/4NXoRNGsT9laTAInR/GfyF+9IO0G3al87hSN+ly24p1kaHtdGZ7JlghMEIgxGYra7DM7DGuw7y0n7TPWarx7fv8dX6Fv5Pl/0e3JfdG4wdckQKbzVCCoxDPcJrGrGGxiF7QPCXRvhA2QmCiwLr0Ci4JAo+iYJTAg/RwA4zKn0Xo0Y4QZAHa8TA8jA6aXRjkvYxxBXCM3D6GZx+BqefMTnW1UHKAPcpnSnutnS1hW8GzWrgaxj4GO4vRP4GjB0wIq1E9xfuS+eRwVoz0M+mT2eF+wuBMdw3wK8bOlzFuwzJigyNBuNfac5DE7/4V3J/Q4+k+Fd23pLnEOh/018IxLT4tzSXFh6BhUdgYb2GCrL1L1iHoUYi/ZUk67TfApw//YX7EOqJVtX/1AJYr9v5+JwOX8uP6fC8T2VUkkbELJTxCLfXKExXUtCheW588Pphag8+ns8pGP1xX143FpAeOxqQ1mJ80Al5PJfrxAe3bLAYFz1ej5dff02Hx+vtuSwX9sPd4stC3HrufyekIqFnEsTf4P7h9npO8+M53e/zc7n/4r+mZ7+mE8W87mES6eC2IZ9iaMSoqB97n37M08+KCPL8QYnTeZ4ez/vyi4fiu7EhL68H8Su+X5bl/D5fLl/H+3f//1yOoeuh7cVobIhOL+/v82k+Xio/ZaQ/RUwwfC3nqZhKS6dSDo8vr6f7N/5QRV590OJDb8f707327Xh9styMp1QhMWl5/OfxUfxaS+deXDdx3k/L1c2f+/D3w8zTKU79019vRVUSJS0/rzUhDROiRCGvy/TgH1DTWRN/x+O03KeDW4Xz19FtomICR7YXxQX0WE7fJ7eErlwLGpYogXky9Dh8EXLsk5NnYwin+pjnfT49D4/p+7xZba1S9PeK2stpra/5uVnk7rd27LeKK+Y5Py/l0JYNFTf763pe3HT/5+U+N9+praKrTosSfs7XK0+6tcrQ3y3tsSPTC/RpdhTHvD2Wi1OxId3HNxfLnkZHvibhdJpuxU8N3S7y5xrFLFYafAhHFVvcli7urvkbEuSFY+kH7MQNv8q6T37hnLdvFEiHyGIfYQkjyo9Ij+mTRWpjtFB8nl8x/DGWplhNNtFhTsIpMggQWyUeo8fTcy52wkifkOMdnfxlvIjDx/GrkENT2TmC0sm/OMi5HZ+fh+vr642vc/djyJnYIqbRyvLO/DA0xDRpxRPZjToty/08X5155+b59Hl8zldnafCUp6bHS9PK7/C5nDb7Z2yYqSWvAT/6fbk7zcyHazrc7A6/HZ1qPpfqbqSnnHsD6XCKIl6PKR50TAhVuarvRD0ShATIA38Hw95BnhEMr3xJZvF20vl4PP/xcjZOPOa43UsNThUTOFURP47XExva0dPZEx9IQz+Oh8/j9Tyfjrdw4M7XD6aCqLHSJSdrSJ6LpyuO21zBO+9G6TQ+zlS2Hohsm1xSC48K527y8mwKrdoUB7KiG3Sco/Xy4OuC4WIGUffM6+Cfy/3x9CvUXeRW/DhSSTEbVZX0mO4e77OcLrO/QD8A9QRyNKcRXazjxa0yt0hOx+uP48NZR/d7YRc1mrp3jbzqnKSfh+9Mg1tD57rDXKeIZo4YKsThukGc6/CEx3R5P7i19XxxqIo1lj4LyAGk9RGLUh0iS6K3EZ/1uk338if19DEp9YgAdA59IiHllu/e5/9Z+DFWU9UtmWbHy306nn9xS6f/W5bO1/Liq2bo6MqL36420vuxj/mxBgJOXswGFEVhVTYHy1qEjBCSQWbZINhtY9Bq79nBKnGe24oyWh7zcy5N8b6hL4F445giowZABeeoISChEW0RncfNS1QwWh37AlgNI4JrMDPcwxE6SovTxkTl3sOjUnUTcCl9GGowmZhx/Dui5I9pbMtE/u7t0r9zI5h8ExvTEzsyKsGWtidrexS96yRhO7yjw3e/y18T16gNPVI2B8jfODfkEJIn5iJnKuBFOoXONLJTekSM0iCe2yIqPBgsIBHfKYWhOuq6qox2ymA5izN5zPFgxLDbDCszcGxlzbq+xZl/ZOqjiWDMNPTw43ifj36p8qO4ZQeo7N1cZ269s/XZykbR9fri8TtlmR+ETMmAGDiy5c5BQeRW9LeP18dPrlE7ZrApZBR3dNTzeTx93qbreqTzs5wuZh3BonsyNnas0gzIKUfIVhGPz+N5+bmV0lA0sTayonqdZ3b8dhQCqzSwehpgPZ3Xb95PyNPqDNgjiD2MgBWqYTcgkq4QSVcI5ShE0n31Jf4Sd6D/OcGun34USrJT9Ic1vfxFOCC1o+7VCNQfEEa60+J6dqLcf8+n4gyjNlv8SdAuABtEo3pfbHGY9NQcVFZEzDoJfNI7pqAAX9hRMk6C831On99O3o+58LcgwrJxkHEX8uwloRvbXdHgs84YiV40pSDr3Yk4hD/ZS9JfLB93kHJxZx7fYfSL/Xa4s2PufDx1JDSgHqYX93uS5Xzn88aMoCmiDB+LidM9abf79D7dnTLjEaiB/jyA0MbhN283n9b4WrLfuGFPNhJSzn1G/iX7UGf8bSefte6B3o33xtXt9ddfl2kbhW2oR601pPayCeikhhg2t20stW3SOgbyUnWyK5nkOZvgMt1Ll9/S2Esru7ZZijuWLzx42SgqQrT8kohzBN5vDOuB6YCu3Vs5UdJ1ms7OxJ2OlyIEMXSWyQKwZ3d1R6kxKsrlGSZPQd7feMvtL+3Z28nWUJJxnx6vS5ERMvSctI2YE3o7nr771Oq1CFvTOLFRMGIA7jTKSu+VRVYcFJrpMhHjvitj/jp+FBkI6uaaCC3dlfGY/ypFDEyEdJS9cTOReletkgdNTPexh8lu+Zu7/bbM3qX2f7olW9puippMwCMN8otcjptUBhGRkHcwiWySaVPIvk02fptMKdTmAG4BxE6XgDN9wp/1qNcA/rIB/g2INIWnuK0DPB2QesDoOJM3HUMDqjYGSBkyLgvVRSii0MC06g7oqQ5xoB5eDZDPBseKAebCKMQNejH5FL76YRO87TSz7wApHrS4j4Kg83SsJoWoX9DBIspQOLyq7kUbfX1CRHU43+Nrfj4LVemsR/ra4hmwiloD10VeV9OKKWBPuxFLAqDvHuC0XNnSi+ZrfOR9friPw4sVDQ1DoXSwzeVHaaWm9TYCgglooMJ6Vl2K2Gi4Ge690q6JkETxDUMibvpVzh+1svP2yLBAPLMX7bcov7I4aCgUKOgGWEKVMlTO6NhfflW8iaU54A644ozIBArNvbx0BEb5hSuuGSIGa6SXtTzKM3lUnhqIPaI1skGe5Rwu0ztPQVHLUOUKTtlJe7u8tvZeTzESKkLi6oN56ogG4NWAcqcI0axJ8CYU2w90F9ukRtu0mNtU2tGicC+By/qkUDIMucmlGZj6bsg7NyWDdbLzNYoC3K7BX1m9mmxdQPkCaIeSC6dyU5S4EaEhq/F4nn/wo9OwBCaAm61YgrvKCYHe23QslaKhwcg2nR0tqhzTB+5TAC3jtRvg+zvsQZ1xqwgDR8Sz+Gpbq5HCV1QnwlfCcOejvc/FTyJrXIayhdHTf16Fle+bOhIrP1VhAqkPi8A2YnIhiN78LN/8PEsWa3bz4J/z89OdCG/emfn8PD549a5v0k3M4v3fGc5En5HmWTrqh4xiOuxt4ckZT4aVFRvqOFoRevi2LMyAYACzVqy/Xwvfa7mBlkK0rKy7VgHbymfTNkyAFF59W57ftguMOTViANSP9dP4YsuLxfxEBIAbu8VlWFbmL3+0wn2i8NC/AwtxAp4LWyduFxCv3MiKxvknU7Vy3bc6oLm0ZM+NgNbkGtgWWNsBQOJoQ+08dDvHir61eyaAPShYNUkLu2cCKp086NBWYeeZHLRHY2ZjruGA4WqRBelg248ZZ46DsEVZ7ZAOGqtFnNSqGbbRGEZG0UIPi6HpVQ43vHq2yuE0KXhNapT9hnu5AhgespXtYKZnOssSBp34+r+WX8vXfLgc33h41B1RdN2h7E73YsohyqpB52gUIhY7VwScjpeLd9f5x2Rml02TrOUj5HS8Hs+zm5bKi3TsRaSvskaLN1rEt3SkeR4Ux6P6ADh6g9plq8RM0vqYCt6tZY9JNtWQizpAlwHf2sbgfP0xP46PCPGYvZd0X+4em3Mp0zHUOXVbR54nL/A+uWH36f6xvLnfsdH0ztxi0npJJVRAHIZGKNqcyREh7VEGR5QzOINMehLHbioLnEWXxw+izj99ui87XT+mb9+n6Xa8lNBCau1LmhgySp+ZRjtRVWlTYZoVQbMQWDEBNIsJiihJJ+J65TpBNzzkltZgep20N2HeKyNGxp34u76+uFFFjzoV+X/qY4ssBQ0toOAJ+fHki2QeIRRAJYcfXkWfa+NR8atQhalyrS6qy/H73V8DfneDvzT+Eleg+z3f/lhmFi+kdprooISRtyJpQ1G5ItJ4HVnYKjTG85uB35x25VUEDBgoxhPS8Mty5Ghw6reIp20aHRBZ5TJgjrUYLQki1ug9Rz/Qwbs/fh18cDuMh8iogN0Je0w8zk4tajEeEEY+l9t8YjEYWqey981LzUKRwSYT8ew9/XBZPvh6IQ8fkc5rMy9NrhTNFaAI6Y2pGtWAQsY5J2ljDkmHhDaIOy/lk03Xj0sRY2E2w7iju7nF77ml82dB2b4VU6+nz/lyvvNIf9+yCI9oL53m+6l4b7YLrDyhYeTh7swc7iL5blVk76P4OaUvNRBLzphGaSpKHA2mpO0wESCX0WJFjXuZI8er0ByJb9ab9KeYqg8iEm7Ls5CVEWhWqpe5hsB/oaHL9QCaIPgOpgMFUY/6xwZ8N0YMJbH3Cnm2ogZCU4cB1D56QC0ucCWmb8WVHJ5SS+sOLMfdicG+ICE5I9OfvpDinZ/7Q8skiRGHIMkX13HAD2PKaxGYa1CNCyI606USDYPqaGvEEiE8j6f2WaKkFfNl6+jp8Sjygx2DUQPXocF+og1AmcCrGZvrVWBGIAdlmzGvl92vd+MKwdJAYS/rkjjUJ/3cMps/rhvojOK5O9B6OBcEHFeYhh68Tmr/41dy2YZWsrQ98iPJwOkAY2v2F3Uo0ptCQoknJ+j8xEo4SUaIwHmM+3ZVMuxEm3wuAxYHA45Bg+C0W5XJYjWyb3aZi8ydZe6E7DsGND7Xymwpyj/VD3wuCdjPziUa/7TIlI1iQUQSthXF7KwkRwwDcjlvZeEoWSMQJR8ShTtuqULqYEU3sCSazOEDWr6M1+vB3dJnzg5YHD2sfyvCgVZOz/N95omenqkeK+b11uHTn7f5vt2onB9S1hZexONzeV3OhzdfCPZ6TOeD09xrPjZUbj4eGy3QMdJRhfhcJsHDVmhBp4fUuFViAVl4oTKN5gmHqB+6Ywcs12mbdqJ2IqzDEZQ/3QgFK6JJsuRKboAWuYHGDVEDpJhtI3uUXvzX0dmSf7K9Qss21bijLNwGCWGV03Ke3G55luVOPUW8qJ3DcFNQzmqZGtldL938juJjFEwd1QI00SPb3aNUccBaAqmW7kFtQRBAMKysbJ77Vzq8XQpvZ2Rx/FFMUa3Dn8smRjv0zJCRzw4vwO2m1VouzLaRRbhRozOCcCQTQbbJ1XdzkSk2xLWwPnVr3HuSMJY5EX1EL+EaUgklLQH1LIb9D18b3dDRogpYSSaOTt87m8oL2aTV6YZWo5iOi5Ii+XLYuE6zuf99n85lcLWl0YdBVtmryK/JVzeXljgLmwIDPaRcqwGu2/Ri+XZ8wHX6KZRfep5CunSSnahHEJiCwc4AN2qVCFWMT9wCOmlIYhBrx8hwp3NSjLdAX9JwajLYR6Dc+wYKWExkxsc8P923D1CTrfOpnJahM5AZlMREXxUlTJOzmTIyY8LkV4zCOKK3Y0hv3fz2XY6XUJBdZMQYSTnIxEC8ZoyG7wwnYkjZOqvFMhT62IC/rtd0KWbp2hxFwfEOtkRjR6QBwTYkAyTpC2xZfVgWyIJSbswUUiCoBR2YeyzozUVQJXms1zHO4bm5ZcvDISyJZXc0VlVU+WN6ZsHvnVtM3FYMC9LI9u4mJdJSIDUIEXTOaYG8z2QW4xY51yHFc6xc0uceep1OvBiY2kc2B7BRvAKyYA1Ags5kVyAJNT1IhZWceFif74/tbXiWAtRRlAymbN2J5fBRKndRe8PmQc4qroOfSyzb9tfYEjfMpQYr3NAjPgm66D6zcol0K+55zv57nQpmGWbIQUWAhE7pTMeZ0yeZ2hIwfrA1qzYjE9usytNVIBM1soXOpENKBOEwDQJu4H1NRjUqEbjnyRGO8/WxuCPh7vfI8RGCoUyTs6r4ducM28hyno/bwVwYOxfk4OiWtcFQ7Fy7p4ojsRE7PWkErt85yhKDxppMfxxqVXN0qcnsEUEWz4IrVq4EGlRQmqtRxPc6y+Be6ISO5XrkKsI49LCtSOyZFd+CtbWVXbiy3lw3rAoA2OtMS4vEmpxG9ELPy8/rIdB18I/WMaerEetpgpDL/ObW3jwViDYK8UsxrxGfv28QS96xgl+bOrGOeR+JNl1E6pzuk1tXZ6e/Ts7QO16ce1Gp6mR6rBEL81ZhIWvPxpNPtTeySCZ3zD0V5/6+PPh6ZtlCK2uG55/8R7Ivp8VKnTrFHeVXy+zqcIgjekMQJ7LeUcclM7XniJUcdXi53XUtNiar2BOrfuLQw2kDYFIDiw2BPnVEawGcL862SEfc0GZMwW9e93CZr9PWQu0HBnqSIxxRim8JtInnNtTn0TpzuoolghDnzeZQNlMU9PWGWX2yg5MEbdS2ZohHcGU3+KsH6/0gI1SY+CIb29Ekkq+KhjjRzlvFXX4dvn5VFwFrEQRfGH0PTO6OAbS3WwQ9FsFvFl4iieC/o6Xn7CAHTl+PAiZp6Ly3Ox/RDwwlA8EH3bpJjWIYbxElWkp63Qv0G0vr7QQOs5zn9Oez9kI9e6Hf/LQVlr0Roplqt7LWgxC/SWuCFBP0m8/jBW2/jGYi9n/Qz8/5OYlzxSiFxHL5UtL2jajGa+RAS5YjzdXIfpooiJ9JxlBItRJrS06/imGaDZMU0/n4PB7vH6+v4qjo6UQ4B0FaFOciXq5pCtGg9xKiQaPIEnWePHz35AyRr/mZIHcVXkDNtHjma24yJzQI+zo4HeDPtkaMcrs3ePEaXvrtlUyLGAYur2dJamdoSbptRH17nsrIfM9OahlIv47M3gEPhVMDdRQX3CrjHGwPDp6mfHL9uP8OH88bofnjAd2GvYf8Fb2c7VtQrYLGfMrklgWo6GuRp0Yy3aB9kekB0BvB42hEh2J9m9t9ej5/CT+spaphyC08cuMEFIm2mZYdtUaIjBjkStyboYpMjG3RN/tTmnrGUiPv3mm6hewUG8zAMKPoR/rBoUyHD2aLTjQxz9P74VVy89KCOiMjm93Y4+vyrKGCWSdB1AFreJAGfSYMsJOmQ3AVeT2rxRT8ebpMhc6jGglRzF4sul0lrHCaAn/BQtxo1TBgzYAuyakWUImJSa71QSTiuIk8a0pop1u0FUNDC4P2KAZ8dwbtJ60RazE2z35MH+Uhowx1uEwnkrVEYa/7xj+ix80gRunSeH9Eb2EerH6nRaC7AXLN5t6GKW9p4PHYWK1Sf+zzyHcHy22JSbpIYs6seBaQzC380OJO69yUA/WRA7rcgbLIdDlRZZGaGXPoUbK5BGZ1ekTmvn25ewLK0A2o+kyXuxikXWiNWCh3nnbYpmi2UBvRvYSMWtyMujODiO1dRchsUz17Efkr/pi3gI6OdS7N7RzkBe2jNev38DEbD+ryUouYDdOGYir7PN+fv2Iz3cLRY6+FFikj+gcihuwcPZAcpoyD1WJ89zw/jm+X6ZCwj0yd9ryOZhUGJd2jAx/0I5rK6U5k+4hPrIA/fc88OnVIGYBD1KDrlelyYQL6xmpZ76wPLRB7HWWiUzrX6ALHnDc1IkkGhXIGvaFMnyC1Fpg0a2RDb32bYFPfnFM5bfSx1nQRZ+Y/dEky6LllwP1jwHlptRhqO3vWxkr2iJI25gZlIDyzCNLAl9ADJgN0aKYHdkKJ2In8CoUKY/YpoXETCW2opPf78rWt5WLKAK00NRpCmtw2tIWBOrQAgMhKaH74IM+2rLKlQZncS6jJ3ZbQ16gdc4J5wPugxw2iOEM68K0Ww/9nz3Tlyy18hGwNYhZfguEZwIuCjpgm901Fcbt7MgpMxWIH9+Tn2sQ6EItuLAMaXM8dlWB+a/Bs6g4sNWMP61AD4pa79aAlqhbzc+GtbqWGMQODuInhyzD68bn8PETQcVHMOtCfhDZkaITb7b7WwycpQ9Tl05OX8qRBSyNJMl/MeXl5tR3wq7HzA9tKDasOAplZAgpoqA/3rshLZxsFi8Iig4herFaJpPBhFazl0TE9xj8bTQ3njm45RZ4cQ/dSiGXCXEJxqmnReQDcQDYiR6SX8jQf1Vcy9JUGvBIaooGuoWsQY0cSS+cWVgCSD4DZKBF+FF4plABX34kqEHDEwDLUaK3oPhMsARRDIJxuQLVkBtQSKjGBFd7pudyqb0RXU27Kh3MfZFLuK+XVBF8JyLoWcN0ht7uSnQ33Rtmt3r6WMxipThtkP3W1NQ7TNVge3DbrWQE0MMa9WKIVpW3oJlTDakRym3Z5EztJPoJb/qqe/SpRR7nRzqDZ1FR0zPPXmc4InfoMOogTghk4mmA0cVYNalGzdyDHMNz7PP7zOt6LCo2RvU36KuBS1chRaLByG+QyDHKvBkhwC41hjRzEui+323SuJHp4oxER48IF8EAag47LPbDOr9tlQ7jatwx3LpJsTc5fryHEmJ+VQT3oY21yt3OgsA3QkVaLTYj8AwvsDauuAZrF/eI9GcGi5aBP2nRMRCFg7Nuv3WifYpk6DaIv0+AToPWrQcGBQVLMGnHOp0swxZf39wKV4vY2yz6I0X+nojhsnWJ5ZRrBqTi/W4pmHEWe/Onr9uRtJViKsRfrqbgfpJgOFCGEFfWpFeOgz81/xe9zlZ0/BtBCq1E0CzEowTYdTrve5kCh+JWuVd+P4UVzN1adgzdg+Ab6EsQsBqRZTi+hSCqHs8VQ4Poyu64fPdRaNOdswKEFZgDn+mF1g7RZiwfXdN1mNwzTReLyvO5lN1j1hFhiucrYeAd0wQ6oCTK5+zEMoBZ5JZhC7pzALMA/HwdsdDEIkV+mSCTQ1nK5KzhQHpm5JvcixWlkbEaEY8WMOR4gpizJ2zydW3A/8j3NIBejmI7IUqpCDBMi7/G/kdNgsVOxw1JRENK1rFhYxOW6YRuGP0sDaF0Ka6ncl1rlgmf5QHWy+BuxlSvHyKbrx3wtjBrO2I2WXYCvdyiGHnJRKnSazu2JoVAsUJtdZsFLzq9F+MCpFlmp+/f819q/lf9Sy0gTdraFl1ANBvLGr2KgLUr44SymIrQ6UsIK91Ukd20q+8wY2jejzdT/IkZz29aIRYFS5gBeZJuUTZtxXQDimszmJMa0RaodxVowoP+UM9ZwpuXGyHBvhw66XCSQCo+soekVI9GzMjYmSOAFJDQJBMZClXuqa4QPZEZcj1x0ZvPj471EhvcsQ9HKyzhIcAI8fIPrMJbSFCuSUy+08+EzsCduiu17hiYQOX+SnErNDoUYgre0E9NITJIv3rnw96G/q5M1I5Xiq7lLKvGWiREnvtYRVTMO8L9jyPmeFjXwMy2D1nIFVr2gVrMGRCDV6WWNBTGHTZJPMxJEEVzsRCz35/GxMvfzeaZAN1FjvfNNRCveRYCdb2nMt61mOCExKOIHxrx7UWlP2QfEyl/fgCLxR3j2zAj93iK/B1b/0mlpaXuBoSLg5+fMs+gDw2W34vf3EnxC050cicqz6P9gGeO+6Hw6QfPjs2A4oNCQVnSk3uc7b6lhWtaYTf71D/e2lfJBS9tQOtNPnM6v5+sx3a9F4qJnfbJlitb3pSzF0Oybi7938b3o9gEJNGfZAsnVIPtlFSJGiB0hOGiNmDLdPLsGSNCGgcvAhNfkimTwYcIgNIjgWiOi7NfHl7+31ZRiSQSCFmQrHWMgUmKxihs2HU+fG/K5kSY8lVx1Esf7UN90rnVuGzTbrTvfPgi6egLSt6JyiQZ72lRIPqJdUp+J6eTVzMU7Fz9EKLaF8gPzvmVCqq3AFYhYEcjavooZw5rArSzWhVaMFr3fpyl3P61685Y6812y8Af0lmoSqMd5MCiQE1HwPsXJbXIGGkIyOhokfQplIJ9JOli1GlEL0a59LxGwNNijRGvnvUTAtmyYdDSVyVtDQwPIr7QglKj2A6v279p74rd/z+dvnpPpsJLxcKOIMiGmFL+yItYKAkvbV1PMsUG7Cyt+eiapQmSnKVbcgCPFik5sFui5dg7iL6aEcck3UVZE0RCxxRGoKVzUACZlxQx2FkVKlTchGs3sJIRorJhxhdiNW6jpAjOAjVoReAVR/g8P2ObS6O7IhZyipwRpF2fTXzlsXNMMg7GYXlEXQdjts2Dv0bShtwHHpRVVJERFwqhKzwkGTzFogWRFBhxB5iH1sefC6RpsMS1ivQgRXoTtNT0W/w7RH0Q9nseLB3Ot3mO1vTaDbBpgZqxY/AHhngu4/tNZjQFCSFbMAXKRK9NwKZLuFxwEVrQ1uMj79J+X+/GlTLpxUGtu9xXtpqMmXURiHi8M3fb10wyatju2UMX0e4ghBIyscYjyOOauhKBrnWPq3ORzTd3SUI1kA62SSp34rVjqdOWIIeIkqoR/ca9hb/DOb6G7QTIQVxlVCBorfd79qhV9yUKE+4M5uyl1LcXijjBwyyFPba+9kYHui5+y9GTcHXpf4ywhJlaYqVS3idUTTEpSahz5R6TsfgCuur+t+ot9EQpS3f1Zhaj79Ee5GCgSeHdjFKLKvC1LnezL2SxoquR+82Uer6/i0KVKd2+sT3WcDwsvWKI13mLoKwz3Sro2FRQksPu7g4CKfmUVIL8VEI8JHnSnccAdCYeydM3S3dzhyGqQmVVAPUQOUkly2ZuMzmimtkwxA/SET9kZwKv6lJEZM+M3egYDvK8VWGpRrKHRWEyDicnozKaaCfyAcxsUwFpiyU/4dWXQyFKVBCwlgP1a4QN2u0fmSlBUHPkdyyrszufz140fmPR4ASunVvhGGVzcJU9Gj+CehXfjDCIgYhOyxcrgYP8ubmG/TevqLuyilqbEBpFGIQhxdkBKiVU4aFXPImXJDhzFaFCSeSmyitpQqzoli9Q47v5CJ6jyUprme4HtcrL2VpSXtUKHaz+TdYvpssQ929RLDLyu/sw+16R2rOYHVKVitDhI3fiatDW76fOX25vW0oGzNK8NQL9Su6di2YpZNyzY8f/FdpLkfgucIt88R87pPvP2pLTcSqwpLgS9rnVRiv7s34lyer7oD0jZrvaOOj982nCkaIYewcyJWfwkqYLrMzQtZ/YXphfx83PieT1FqUPQlU6NYksHL+mxIgQ5qpQlwWTjbPIGWYUUm5rCrZh38sMpZXkACzq1smybsSvFjTPAWMAIYjQpqBFX5vQkDX8514syDSuQl/WyE+KZFKrNPNuOtToQt16UIXAOaNYqRMmWXxRTJwowDTOCZDs0SLmKUlg7FTn04KSE5FfoC8zWg2E9ouWY4fQ8na/3yTmdj6kkcVaNYqQQGYuScGUaBCdGobDJDhmLArY/Mbfi38AfbNzHGhiFQSs2KwmjC26xnqGGrLwT3Vh/KmxonlXTsAZFwM7jgNUD0BigjTdgbLNKDuC5ZwIhFeuBHr+ckvsqXoCRjKDwIlt8DTJpOLsMyjIMSBitFtO6/lVWypb9nB79FG2miUMCzQIP3oE0CAg8a0Tihfx8741dX19vXDe3FFoyyJbR9HTf8Vm2ph8MA0jIMe7p+X48TwIrimlY+kL22aMUbwXXpDA6M9mzmZ6bdN/AOh/lXrq9HASYninBFNTC8fzH6/H0t7wv98Bxwr4yBbYMImu8ExqKKSR9xXSn7D16KY8de1G1jKkXzUlGFIFocBLBwbI75tb0lCaW9a+Xg9BT/WxsGkbegyK0FtuyAU+nQcuBDvxaqL2xWqRZcM/envOMsyq3PWyBY2/gBFmLjTlgY8IJMnuL2e/It1+1X95S4vNhTy+HGMv8zpAuLX39QY66raPXQezXM7iSiJSJ42s6ha522Zqm4/1vcEaf0y8+l/q8v67f+Tv1bEZ2TvwVretTx8/FN6HdntqW8ZfL+alVlufDXN+xBMY3itFCwWsGo6DucytloNItFmqPTK8ScQHuJUhK3Bfy5DR7QZVI8TSpAHhML6V6UBE3YkFeeNjz53L/Xonkut3IuL1Q4Yb2VXpAGADpbJO7fu9ae9flPDn75PjLkwTVcBTUm1GdnAmcogPirC23rX5MtV+iqO3iFCBCGyhp0jhke7QvUCLXln9oImS73o4lqeBg2SkppwqdmPvydny7/HIfg8OHGF1NJwfEnYiAlgPoITZ/YfuTVhyPSX9pFElom+wu3WV6dRhABkXvaExjQNZrtRxgnnzA4bx8FftxZAiRUaSVCeN/CjATQ2sz0R5pzN1KQInd7ClEj0F5Pp6/yn4FpmEgwN3fGBdeiOzXlrKz0pndKcJcvbBl4UtJM/iZHEaZ3MRfQvn9ShlfKC5meaeyNI0ktAZzutEIlfR769+XZGdtXjyO8dI3KtvZOE5hUyP66+xs1I0oxBRFho74Cj+O95U7RH4XxjGHekt0CTbQ4wbtnUwH63tUWOh78/YIvZ1rVa2KMY4gLo22Ue7MQJMPlHhb0Hb1yeCxSga7xOf/WC5F9sM9ni09xJ3ROFf3CalnEPRxjweCKbcF3HM5JAudheBk2EAQUFjQNK88yElpP7Rg63KWMvMv5DxqHLwpINYje/G9w2ftzeBTX77jRqmlWkq7i7bFzuHYOf6DM1EPyVA660EOIEcZYkiGhUH2nOod7kZNq4mNTFDvpXhiDuclrSXJj/mvYraYcsodKZtcbojd0IEjZERuRstR12DbPJ4b6NI4slinWEP6wU0u1gdH9jdn3xLB+2IVZnSlDCNFSnabHsC9pi1MkR6miLx3nOvH7ULq7LXpK8n8wB+euGLRPGjKKY3jqh3FZpJbcmvDMnwyHjeMPKRG5Ox30FIhMMKMTd5DqMiSc2hB+vtyLfANhkUOxI4S6/CCOpj14tFpZeoWVn4zQI0CLN2hTnLMPTBleJJ/bhk27FjNjRahqetgfxwUuoPagHIsITQXr/WFdycpC1vKHswqYstLxqv993/9Oj7wS78XRexOEHXDZN6AVdA2CtrSjNwoQ6XqfdZbWgQ6ypACP3pbr2jpydKLxXtk9PYNLM0g7MTgsgzaEYpJornkXg4mZ0kbUKOlIZ9WBgEQEcFd2+SfLHWuO7HaiQgKrS75u1CXeF9brSJCX+vvy/Hy4dzt5+cXl0YVqRzVCNJKRGvP8C5GTsFgdAzccW3T03dQRg6DlGKWtxLI07OUmpHBv0GU92U4lwkLkSmxZjAMD/vWOVZzAdQyLcP5ilXuq5Bl77v07Mf8LwTVvszIhO1u6VonNGNZvk1OjQQBy7kodafVgqN80K+Df0yVtcYWiRx1ZRKE7zqwT/G/ElX5sgzOaGRTM4l7bMrlLf1xO7FJL+HuC8vvRTMBclT8nbFbdUuX7J6EHf/bMDyJkqM5Qc5y+s6xc71mqTeRRZ4M327gnrXzkRvxEiHLbdPazm18oqZts29I1MKWrBxv3y58/PioWwCsQsrKjWaClDAf3OOgv8E0cm4bw3dy7YoFiuSQSUWWGHxSzP0U2So+fE/AIvboe1jRwbKJcXeasejs2tKWWTL0143cEEaybvHy6XA/3j7nU7E5WJpLrJT8uBfk2JqR5fRyxscNrDaHorqhl53AMnloaPk8mpWOCp7JCM9Exn97oc61KPiUeKxqldIlwX2SO8LrUOip3snZuvSow9fxxr88S2fIC8WN5+myjsW3RSK7lDAt3Ag6FimUXK26/tGmPCSyeyA0HUFTqMDv3IlfGmWBbtV+P+S0Ez9kyIfvUsQN/fdGkBAqcKV1InFLemA4zzzbIQ8IUYJ8kSBopbDY9EQfGOFLJ+q9dfjjc35/fp+KpA7d41qDAVVuCf/J/ThDvQ8rBqHcKOdFBhSJ+9wLy1cO9HOrducrPCqQLJYYEevI3VinbR/uRh9S93PBf8bAjCbZWficjs9y36iRNensc8oEJNCgPcsp5AHtHGWX9dOn/kpCeLpJwT0T1yFYqdC2EqHrPqFFkOYfQY/TpZSO6tDBXSEtYJEA78D5BPXmNDSAavi9LTiQwc7sHEMQEIuEYCXuz9B0x87ims/TQZk/nd3P5oXx2khW0jp4/FONfDDVS2J8Ngwe/yyGUjCJ6NSEoW+TM2muZWKZJXlEkPEqYHkeAtixWJFUgPi1vYCCDEoxSNi4+9G8Uckfy3pqiIvaj62eBcwkFW3BMP5yPJ9LTh/G/ShuYD/6az6fL2XYmb777qQtt/J30/NPjAysY32LzSICTAeLWtcP9kfWhiWVjBYZHMPo5/IKdBaFgcgiE2LAJkh4XWtvQCddDEP68QELW1g4rHdUCzXZAFVjkZPvEgmdGZNqsnpnnj8+L4HIN4E4tiXLbp+wttKogEBU1hi8CJLKZkg63GoR3vNZJLn7jp1x8jnlxh2uBb9Sz/rNtGLh0WeRE29pyDylWFsRhvG5zI9nIFxZ8a7PZYvDYT2cOzGO9bk8nvP1nXVbYFYiUK4p46FkFj4vLAykwhhDnKimuKXOuzWkWXRGnLTqZ77S6UO1TplqbfNJCaLqFj0S0IZGj7mGJiM8wayrM8k3sEJGZXgb6pFyQ4ncxQtc7EP+K3cfUDh5kW0AkNhqkfeh9K9YFj/9+PSbgBRRLdox9un1FdhAnY5Cs0bQM6rMEyOedvPlMn1wei4G4LbozyLCK+evEglpGEuqEuH181U4qWkAU+a9c8PLY5ZDMMUZuNaOKo5eko4qN9Y3Yy8ZGztmGzSieTJfT05lX4saGuaaY+eKR70Tcg8opABrPX0efRS49LuZB5IryRogQSwUP5C5ZkwE79aImdf1CczIZz1SxcPW50cOK4/bYfnp0+6f8+1QpWcbWoYcFs+DIPKnc2B+L5DVFIhVCTGHU6HRttQMA1odsBI0UHMWPsjhd1b++phtrogaqV3SYn1yJPoEChxBLI6OTLoTIVjpceWqHXmbwaRBxFADzXBVaK8plkQ0WYSsRUsPkazSm3wcIInfZmg10vlgRnGnM1Q1EvtajPeHt7keC246mrAzcmFjGHxbLsUcMlSbFU2pMPoxnTbR34ER4MqcevP1x+y30vXCuVRo+MKKAau5CBiz6vrk9+KkkXOO8yN4Sgdfj3U/87VMfgeom9EvQgF57hvwpdXcItWPcFCHepUmw33RsQOnoRkTYbI1YscO97buq9/nsg3JMDCLX0zJzI916W71Q0upHAexktkJiDVsqTFUEbdjvOtoEAKIiUElkzNewKALvD56dVi9+wonj1u6FwEjw4KGYqJ6foRmLvfpNh03IFiqZwcxdOZEBFv4N5SMDJ0u1qPNj1iL45kFj5VCSd0xvnd4IQ1iLLAwDQAvBhXZ1sjWwGO+3l6ehLHGIdzRgx0tj7QCxtumR2iYmho9Qo3BAd3i0AYW3Gr5gH74QpXl/X0+OWW9YSCnWbIhbzfgIxt0y7NAb3YAro4WSlW2CBOv5drPgSfIGMCmlY07yChxgyw3BqsYfTN6FH836YsrpA+0xrcnXNNiIkUi6GRJ/lYsIp4ft6OzFE/z7cgtvpaCdAYRmr2W2IVsqUe4FWzLHbXT0RnP+TugGQATAgwJDTPFGFQ/ZlDVANZtLWYu00sFg4u/Dz3B0XBLQYehREN3QMgiWGpAPG1yN90BjtWOQf5kiS6mhTHXaFop5hP+KHxS6pVpCLJo+GcB6m6BNu7RhXI0+As7p0G/MSxC55NiOoDaRvtV0+ZebRnjZqAK8l+5LUKufUEHG+CdrRbr1f/44EfByGKGPb5fL5p1XsLx7bFcXs/Jm5kVVObI9PkgpiCDqHnb021kToGc1qHjS+03tjyGK62qUgYQ8ExYxyPKe9/m7dfya/maxU/Dw4XiKnWSTu6oOc9Oo0iiWMBWzNcGUSWxxMgajw+i34XB/gAPhBfup5W2QMcC7o2YKvDCIrGw+Jt4NHfvtahZzZc0nfleNMu9jM2q0SwULVqHfux1ucobYGQbQDKpg5jX13SfT+kAKIDhI8snyC3SvaRAx7VxNEdWYzyIXa6ChI1JNbK4fi8mNPLoylJjeSQRqFqICAvOc0gtZc972gbMNiJcPct7vHxP5qKfENuHYjzZC3lMof2tuN7Y6u/FYE4QNX/dLvKqYTMl4qi9IElEy9Juu+9CRDxuE3dPRtZXYxDRAKWcDUnAyOoOB9Fd+2OZeU6I1UMgNmrEYOsfr6/bk8XLW8ousfMTwsB9Q5qaGumYd4Y0Qm0IJNvcAxvG9Zg7OcnbN7wEfYFKWTD9lIPImPDHT17xxo6uTgS7sS1raZeuXkRwfj/+YkRDhp654GFuRX/u+3x+fCyHTXNbw5Dx4huz2WbV/VZMQH53RzMPBrPOzKg7T6TMKQ6BluZ9gieMKWCuOtQrK3TF7cSVHkK57M0NqzBJwblW1NRBwqEeDVYjqzUBsgmYG2OwWHPfqQH9vbSIwF+fuultr2huTducrEF2Apw87oGI2KF5lFy4EB+4BQgPDQtDi4ZPEOCpbr+K7mDO6qcvjRyas+t3Z61ajWosI9MREwLbjLul4CWUtKgmEQNq3SAJJpqcq9hDmWuipiHqs5Mj3KUY05jRKsln0Z2YzQtdkLcdIRSlQNE2tzpGUSo+sFt78PhQlCpjKsMDfQdB3/LmdLw9X/cqa7Pbdoy3V3QYuMDKL2Hp7BQU0UgAul8C3zV5u+6XICkosu2FB3/6fNJh20nU7aGO7SG4lChzMjhNWjiNA9rBaZHFMzx33Uj1UuqOwdcQperF3E61FbZmhQjpDRUgU9oOiHqlkLMBA7ZBBNgMSWFZGfSKNzgst+NpfhaAPMNAn/hFGs24odN1L1oT+RkeE/wqmgaTJ8Dr1w22GXr36Q612iOaYBl487nB59BB/4qHbXilZCFsm5FTvNWAeLvKrQREeEAQHHyH8+HtV0yIbRNWquB+g8IYwS2lofNbxK6HFAGyMk6fvkHtuazVfY5woR2sxvqB0WHQXdPKBYnrc6ertDfoStJDBiTIB46XV5Z0ue3NfgA6co5oh2cQO2rxCVHe7LbC7gMjRW1xBPQM2GlFzEsU4cMfhyrZ0cgZ/wDOzCALNM5poa8GZGi03V13odA+Eg0e3pf74bjq93rXEcXcAvc2Gm+D8Bp4/1pomgG1rVokI1/fJjw6vFMBKGTt7tB5egTDADjtDZDWZkgz7R4rH3GeXmUuCu+o0404YD8gJYwMNMhHZNR4hcClZx4rIFrKimnslViG52xYSnlHbfmRhxMHEjDUeitipdNgnsFjvYVakUYiDi4ezBj7xIB8HFs8l7FXilm3y+mNxw4ZMlKMtF2m449pL8VETx1QBimYWxYJ9M5gk4Lk0KDJbotU+tBDw4h1RxvAPc3JjHhQI6ZGLtOz8FF6ai8qKyKWNizCNFtuxVZNfti2vXjPese3YjQgjy6SWQxBKOZMQtP7avNAqrd6ed0tx6K/Kf1WKllMusXZ14BE2oBvpENv5RG5Ly27Nu6ZJRsQhWBbkT8tjjw8Pjh/GgXQDPK3cqP/eCxXp/U9z9i1cNIGBoxt5UPcd50MUK2fd8/Scdg2kFRs54q5kSCpCirynMY05ih7LJGMjkMu6MJtkyXfiiCey7J8f91KC29giPpWzLhflp/OfEN1DtfZdONJAnjVNl24vVgc/3Xkk9ex3ITsF30d5+sWrMQQXMmUHdALakimvBqAYpMV0Nfx+xSatblZvc/sNBh7DlqXFoYXURnNIMmjmLf0o9da3tobsMSSCGT8Ol6+b/A/iiUrxOoOP3b5MZ8+DyVxA0WFId2vG8RwOpGjKMu8+d5EhZXWckpmUcb1dbxcfh1y2xQehO4ZaaHt5MXHyUgZ2K0X4do+lBUo/cvqcwrStL201cPwP/nBxjSWyLngRzJ+6wJUz3pcwDXQaHZnNCIrcv9Y/5DzfC+8Y9auTbcAT4PDzJ0iyVDowEGIBg9WiyUSawtHdNjeNidWitWXouTK+XH4XTCn85sNBtEVMbTmn12tbO7pSlRWzMNtyuJUz0C1KW6WfN4+vfKYiF5VbrGNftdagRIZVZe22dGhd6f2q/2lmdEqeoNMQMWX6xnXTisGXpkcn4ZzpnB5Ovesz2UrOnlB5Z08EcHk3FQOvxzZfhlFhFBNbbIqq51f8mc4CTlqkpqRIl7UD90cTKxdb5r5YUcx/Vk0mqRHmzMjAEwSEVZORNF0ksbb3bGXKVDFt6g00WAE8KAtRkgTrKcKreUU0FYmlfkok5vGjDiI5clY38Op+x/cOGsZ/xCasvdimWOSVEQ8mIFkFN4Sv8Yka1iN8i6Msp8FXJPliXQquNAy5xAEFcVITpRmokaIEvVbEuXWY5kNb1gJhU7Ybi13yq4ylbhZpbjgRsTN1whbmp7NIHhQ5Vz4V/l01udErj78mj/ux2eNxIn6dztf0pmbW4VAO8qI/rkbWm5mzTZzcqZlAgwnotzMhokYIEL8/IUetpR8q0/1f0ClqSYdqUoTotqMcstBcQToUbGn4VC2uSoKpYNyRbB/x3vpQo2MNXoQ4XkYXOzukRWJ9qL7k8evAWUuo2UyRE1VuF6MGh/xW1IxFU2ZNlV1tSlx1ybd2jbpnhybRwOw7OSAwUEB06na3PYH3XZGlPmAa9hYEbIXEhlvk28RffBIA+6s074k8hnsRWwxCZx+ERV4KPBE3yOj81/pIGnRmRassAqU8+4nyuvLvUuiByritMzETPPiFjLApyiVQxrIDCmobbVIfRie6atgeZyWkiklnCgYYPvknarM2YtSPd3tLr/wrMObe9BK3bclIFKNZZofuHIjG2NMcEUkqyjRQJvaRlbIEFmjKGwZuFaMmBIhy/V5nAu8sWoMK51Eul6jSFQj5Ybwu+6BoG/2d0Z48vl+/AkUOAcSKVZjroGndh6ZaKEwuZt+JYxaQaOnshP49170Pp1e90dJB8c4FzT6Prt5/P2HPydqcC6RsT2jTMFJ/P16+JxD+XjpOChG76ARl3YyRRsYMuerWxrSImlZdXEHM/Jv7LMY7t/4yy3VJ/8LQWUlQ0vtbTnrvJHzw6k4foxamgDr5aAXJGGpCAuR1cKm0hC9dz5nyV4ks8BZZgbevAauSqNdus7l1TY3S0mHpIGD7fZuMorM31h0jx8FEwh19txS2JPg/+1YJP4MtdWN3bE6SmqEnrEw53jN+keHMyIh/wdUZTY4ApFFV2ODYxGV//DI3FqHphNrCMMb/ut18z1JeYqBfiIl81YFAYcyHzQyskc0l3LGIdplJHfRGhGplSgm2GJi5EytbJfHsbXGkz1r+9CKdAuljLflzBOmPY1EylRuSY5Pa/DxLGUpdhlN42/TdROS6lmoOAKpdmT4jP5tuT8lyj/m7om47usGm8l7L6RTF1CkuK67FEvoEySyB1MF4h6qze1VUlmvQsckrcGb1AMz02QyOPELXKfp/DhE1DZTnnQ3d8msHhJ+xVlUyb4GAZNWQGP1DcwhMWpEes0cHrfiow8s/taLq4gJWREJW+LHYWSoc5ELNAkrCo+ZIyQGQ67T81vZnZvm9uLXSt6mFfVrELQU5A/0JTQaoOSYkohVjk12mB5qWeGI6ILHoYeSNn9ktAFyM4Dr9HPN8T6XdYI5ET4rLh7FRkElQU3HMAIK/dNaMeTtJTzmt3KFD6y8COQFukX6v0luirEoTuuA0B0tXCGxO+d1Pk1BqfwowrkDC+eK6c1ryclmqJuQeXaScd+K3WKuyyF2Jyy8QAZIBR6nSe658wIR2QBwCHQqVssLrzSQGZxEtOv8sC3a1FJryRqx1unKW9gwduRW5J12o+b3udIUjkatNBjsjBjHpIK+nZ3XXXAgUKpH6Xy/LsxO1HSzGRGte319aY9y54uM86uJTwyhilrmgOqJUQTOLkfePYECxluxIHt5f39MJX8sg4cDKyfznK1CDmWwkfEEdzD4RHBGFFMGHBUTgxNN3O0LP3Ys1bMddHUDn1gB6duLZo6TeZi/vHHCoQZU9IjYCSImoHDVclLXiY655PlHCQ221AuzSqz5Wv6YHh5TeT1Nz2Xb7ISdnaNY57FwHAW13nqReH65rhwbj5PvmldoNQZOR6q0QfrGwJHqoOkG9J/Uovu0XGk22p0oZfxTsWbWGs/RQ/KyjUYFcy8iszbP8W2OCnynZtCB1EXOPQgkmaDv6kXIY37Qc/n4uEy0qVDxOBaHgUM14EtqAJl7eaY9ZMxzyx4er7evmZ/sVMmPIGGAGastWmiBmFiPYPlAQbpBYZAZ0JVTidjHZdtCoaPRIdA/aYXQpAUuvgOiu0lbzi0uwNax9AZEwLXYUWq5pjKc7apiDRENWOAGEfqfhVWWDmuHbABNHGQdf/1aXo9p814NgzwjfagH0X+Mkja5OYZWRgjcCZIsmuXqXb/tC7EPpRB/lNWgl7P9Rg0r1jKY+kF0H5ZrAHJEVJwzAWoRBBrRG8HAofLKFjFAPpJX8FkzsLyBBTuIVYTLzXkWBQTJUD2C3MsgAo2TjIBEfxwCiePh+P70SLrpUXSBs5TeoAMNIgh6tcq1AmJWvtIMoGd4LivaNk53fsxOwR0isdChhhe2VBgMfJU79oEGTMvE13hSgfC09DxApatCG0KtoLk7ETGUhYeKqI1L5k48VsuIHE6DMKFJiTMD+kSnlFBCJMa9NyyyHQs2aWAHtLwxvIgaORRNp4ngMacp3D8VySRqSSc7cdBYXggGgnfOc+7jg6dtJzfD8xjZ46VkQKNot1HEoWxIYCwNrfViOzSw9TH7nxrxNh2KCoAz1aVAtEK3djWKym7bMbZvGcR8ADQLmRaQ0OgBZWgqt69FmWIv+oLrU0MSba0o5OuAIpRGUQs4IY+phE9TX2MQ4fG3Qrmz3KcB95oRN/et6HTXsWBpDr6hM7hGHY3R4PDpMyWqiID1T+JHhqEKJOfGGywFseo7ZPW5M0mZAsCO2ovBlyDhUCFP0B3zsVK1DYKCSEqovstYirSOrMYORFgU8HtnyCHvDOb3QePTiYmc9WWd2/088h9N8xJiQdo62jkVP6fp+1S0sKPGiQKD1oANN+R/S/kFNcDjQ/WpGn7z+E1FX0c1nWoyoa1oJmyhHIqlhBHJAtoF9czOxMdfCSyn+uRTql5U0akecS6aW+iWcUaC5SEhQsHe24xYOAnDq3pgPgbgX9HgUFuwZSF8rkeEvnWmMAb+d8jtbMXoU/ghG44FZZlNiWUMm95o1Bz3qDRWojG9ks9s80OMMrbPC0lMnXtBPvId61BLFBCr5JB/M3eeLc3GybFyN0oXcMuGMZyDu8tZzKJ6ma6H05NHbxrWG0eLxdV+7LZ4qOkZ0AOcDnL618upYJqpZY1tThgnYLRZGHKjxnJA3Rigzs4VRRxKYSGKxU03N50bwiXelx0KR1Qp0/19uX9Rj/74ei4xoMBXOKf2ABhogCFJ8rKAACkRAuQePS/nLSiYhoM6bPRco5JzooBFGdERIQ/Z7iXDchQ5RY70rxEDAqtcrv951yG8uMWLo4mQiCWNYiuvytIxSBA1Ozv2/pi/vniw2tC8SCvS1G9LrinllE62UJsIE9H2eEhqFqXYCkag0oCmIMGlO9mqKJZfzyr3rDwxXtfV0inuoQxfKtbRBQl+wfCCRzYDVn7vLbszGYgSUSXz8AQJbxff4HbbOpymPI0SE42FjA2Mg2phJ2b/VX7d7tPz+eu0LPezczCfZc8Mphda8As3GUmZctamA3MJeDetESMR4fHczqXoSrkBTxgYWyaeA83+5lNq1qNPzAsGSes3/Dyel5/bL8nSEWIgmsjZSGDdOcUEVJCQG6cXy4IR4YuglULG9lUYalzkeHRi5kKvaKpXRGVcZBYNde4B5JVhJSutATN9GcXbzlG5EiK8cRQKs9jbXBkpGzQbY8LQwqY2AfrapP67ZED3ySsewSDS4GTIp8UmUuLNCMSDOjDBDMlfVDnyrGHj9uAIaWR3u2YOatYpNu3VLgXI+2Qdg2pZNdmBATmNSseBBoBbdzlhjl5cJn0A0yFSMOQ+IGK8Lr76beHupqXJhy5Fv/vEWAPMslbAXXZiqVF8xnPZWFjKMKJxBFbEOp0oag30shceKBoSqJk2V0LJIZog8+3Xpi6/pY6sTHkosGNaWk/VJ/N1kO3iIOa6PNe8Hg/cUWCLSCoZCSW5GmIp5bSTkn/XA8iPZIoaQOylYGR0YgY+PrMsqLQ0fdLKTngYXfvBlB5cbNdJhy/XxD+0wqS5ONoUQkQCeHFelP/HCs8Ka0XfwjxvEOeFi+xMXXAhA31mdgyMqbARWZ1vK58dy7wB3lPeNo2ufbqXT+XlMnMSk5F1cxrF+OltuT2eR08KUmndyFjz5RhjhdyInZwWhr48bVFG4Y2zSutRVk6LJ44LNVv+/x7P+6vENStO+mgA30aJv9EppWeQKTXwVqwSGWhuLPZsKdxVxuDdvCHm60sOPwPonIevKYhCDmTcp/eQPyrpKAaGQenEsggnwHNkuHdwmvjINwqrSMgOeYPuEQZMdWD7MzjLrRYr5NxDV0M0WOOF1ca6PYnkAFzExmijfQGMEkEikCLZw9SyFmvRICVYkcWLsM7OIpyUi9j+HNaLvNmZTOeTHASnpGecF61sBe15Ni0tRxrSwaIMLLjM8ZCZOBvU+0MNmB5YA7RGtjKhvnsnVtA7sBhduzc1P+bl9djScypGz2lVDqeDTh99MuDUG7DeWSWHV9wzq7BJFsRBxh8VaqZBwsPi46Cbq0HNpNUiHut2nx8+aMWztJTkphVZa93YHyUtHuM5BO1wZqoEZTKQVEZEed/urODJ0qBtt7OkF+cjPjbcQfRoEXFlbvC7H7yUPZlYC5dMnZxW6bj3I75mH4Oer4f3Swky7VnSwe6s5uW5nApLnfyg3wy7T4+bO+EmzyvCH8/CMXKQ8cUrhxT1lIEGUnLfo8Ag9vj2eL09Tvf5rTD5KE5jX8DrWhdBNoqYLL69ngmSkGK0z8SMxDe6Ykgb0FsNsPx0PurF2jjyuGAkBzdBfCKDlyRX1T0x95HMud+dH7jcT86kvG/YnBXro6vBtqwHQD81uu30Iibv9vrrL962sGsZpRICcwrlwTshuiDt4CPlIaTiE4o8tGHpYZiLMRpwmeCldZthmJmFDAlz08FABzBxyI1JdiYxvOLJd7/ZUOxbGrXq0QloQKoNNriG7u7lVNX6KN9Q9z7fNs+iIcs+JX/RhVQh2q4R8tC97EyvzwK+KJSqbYv4KXlB0nloMuPTR3gkqlvlbPv6yOjGCw/s6QNNeuCIBxo8EN6NSE4VH1jyKliquvpkevSICTWkVxMiQXIKeH1IqVcttUn7RBGGdI4CQYp7CGgp5FB6eEiFXYKG4n/3IdJcBze3/PDU75KRsqsgUKC646RsuWJpRLyXPa8kyC2F+vvQkI4IqP3Pay5h7YyMsREXY8EWYFgcX8y9b5YSRRh2gH+NosFU6bPNWWaAEUspITAVwIXSIGjQnVjY5B9UJh47RhabG1uJIsrJLexfgPRFxPoqgkcpWoY9BSGkaJClAvC11oxZx6zmohcdpft0PP/yIciyLlg1NHCuNWDQ8sL1p/iXO2YnsTMbi4XL8zPFcgBmjFGzwy3KdIzI8Q+IObivU7hurJOSFQ0ziCgyAgOrmUYUXYvZTggqM46sq6MVKU7vRYqKRrPk0pZatTd9HhqcaRB8aFRWOt8SMHpYBeh1a+UG4vfJ8yYmy36+Vux6VvFmxTjmKimYo9O50kKgaEUNLPwIYCm4lUwP3LsSce/30sJiOcy9lVbjY6VrTC4fji2XI1ib9F5mO4dhIzuxlDX1by5JJxvOofOb0ZmWNbCrFlqBSvrNe/gupseP6dt9g9dncWx5OpiUokqLxa7lfcNF/LryfoQsf/D3ZRy8oiur6jQ98AwwwEbW3lzwNnmjqVtuUhRdGTEnvUqMAu/OhqgVEzLCByDhx91vWOAcDMVqtClWhbBOmw5Q5Du7pGn65L2NwI02mUkJxqw2QHRkgDFs6z7l/3WuZu8RbVCov8ltFhuRzD3+un8dT6fpVup5xhardifSywhF7EwA4xDQYrg/CahSPTTsHfam3ok4uAO9IDIY2RkjF8TUdin1ccABhUIBhYo2hR4IuiHEISh62f/8/BezUmDwG9oUaGjTku2QdUVCu0EAVaE1TyY8RKJcK9Dl9g3S2DmhLQaa1red36/L6XO+nO8csTiwvnutGPRaI9NlUJo1+TZKzC650R+c6oiiluBsohOOTXHOLp3dQwO7OVMmAFvfibCn8OQQkDhsypR0z+o0k5WwYyR4WSHZcHhOR1Z3qWl9g8UP2llDXtbp+HiFJitFYNqytlEZvZ2kgt3FpK8D3AFpfJ780E7MMq9vcXVWj1MDD/5tyGlnxW4Wq4Dt2c3aUu4PJh2NizegX1TMVKxC/HRwO4uRlqXNBsL6ASlyRJTUAL2s0Iq3E5Ez63NDqqayGGjOKD1cDsZWG58by9q17Y19bvKuRrPguGwElsXRmu9ocLGKDJuxK0zpbDCuHzFqFQe/rueCCI3NnkH3MHQ6MRr0En3uSywGTDx3OC+XZSyRMhY3DKyxBrWUBUzuPOzGzx9Xfj7TAL1CdUNW7yYFWjW61xmNBFEPmiMlcqf6p/41nacfnhHZ9xo410jzePdDEXp7D576aQ0pPhLyp/wezlBgRFRNjtiibwSAFDmyAoy01WJ+2xdGXoqoUM9as8ohj01NZUd5TJOhJo4sFrVmQ+Ud4YdWCiFYRgDFGAMSoxoVYog4WyXWKG/bWbMUMTxhm0zVVkykr6L+tWkKwjy4bHbLnS2ioNJl6VibYrXjk4bhNYuSdepWOweal/Dt3/P52/vrctnWBGnaBBM5BKcA9j9zkMjBGbTdMWAkyoqkmFHQ8XabrkVghMLz9keXlO2G1cf+fmzFre1Yumd/ar5VglwU9icGmuPw3IGBSaDspvszm8rpLhuIZseaOCh4YBk2ZQFvHC10EvJJmbkoFzwokTImvs3n8Rx4NLa4GUY50Gbm8+R3GiwZ0wH4OTZI7++Y8+HJBa811Wo6eZpdytb3IElL4aYR1MwK5YQWvAFd/lKAwWmcRQAkmwEWaZNN+N/s7jVYtJk8BlfOjjRSNza55xqFbwbFpwYAY5NLQNSOyeJfJP0rP1dYZeaO0eUlVAjvLYXb7UWw/fiijp6y0sAnbBQmCg06OjmfUUYtWxr1lTsf3F+XIuzNulihW3H8yl1aFVgA6LapFAiYNfC6HSjBVcqc6U7koQovw801VjWf2ZxFs4u3RaKIDJnP8HH01JzXc7Cl197YReSWlYIC96bR1NgARmIyJ7ASI93BMivSVsz4FgvsH6fP6ey+0hord+dJpREYI1zNhZwN6uxgVRtMpwHxt9VigHvbcIW2akP7U0TnbVq3oEDrUKbaYLGgDFqBR02BHkaBxlR1SQ053ZzOXNQOahCcO3dcXBv+/RG75lqIei0qlxyI+Uomyy0bZx27WTleSxJMavq5//hbrxbE3efjpWwb1DFZu9N0qHcZU6xMFMEWjRJ0p1qh7UHTj8ZYVokg8PWpn0e3jU6ccMXS/EmXsuUDcmINAm8AmuhOBA+tz/majjxqyDr+jWLKYR0d2AK4DqZRqQ5l6Q1KqIGGca8mqa8ovIrCo25tl45pVGi7ByG0Be3SiRHc9UGP55nDIkfmYI476mcdXmaoLK116ZKVMqRXU43BboNp1Ylxw/Upz+l+n90q5FAgqk+7BLDO7ddyUBauh5ZbbhcP8uC8x/R95g+kzCdJUQ25hwW4nBTsjk7kxaB8RVMMZPD8Fys5FgEnhZwV1sfPYtYBVQxPUkF8ww/Mxu/EjO22SdjYMqLRZm+kLw/dRDJ10zNDOKmVBnBag+7U4LMwSIZavfuyoX4/lgwUeFd65u+uTidD6KZIc6EigO7BfTmaPGlFtIrnDJ7Oh2pkg/rwjZicr7AOd6xZlZy4eUzT98PH/Xj7rLlzrJOZCAQhMuo+HVs38rJxYlYpbg7eeL5O00YsuaOSFYnDIcw5us5BvH5MtY5UdIIsaKFluAqkrpSkNZEd47rUECnPXRQZMhLTuSqTwZ7QjkU+daYLI/dhpqTM3vooYhE9A6jvWCpu3MGpvBcHHxtWiy5a+H708fX8dP9WSfb2LDZrxcCkl1LGQxTnDUeDGD2gTEWjkW2fm5qJCUb/kNjZelP6rliuW2fmRHjDxqDWG864U24o5RTjJf6xWx5Dw6hUcPoOSB6j95LJbMQ92CCUWIDsH+fDUk6jrBHrCqCZ1QEgQanBz2PAY2BAwe4eufcLfZWE+zcfoy5pDRTH0Rm0QgfG16CDmwHW0yox4Uae57bdpVSeSlmOYwNgG8TNgJMZAFjd8/Z2SMQT8cXNuPdET94P9wvuXHI98jJbrC89JKvZLfABiyBnDZBEFIPlvr1q4Hc4H3xPkIpW8mxH9OHwtkDhZDQaaqIrkgGLlZV5AB7T/QffXaNhSUTZ7AkjD4/l9L3I8dD6oBEGtUJji07scLnKfC6ny1yGiAbW6CM5raNslxYv1TEfM/NioyK8TTxSBpa2U+bw1Q18deT+tdh2yBMzx77VCaJVdwkHdux3Ym7DCTx6yuOp7PAysNnqxMiZF3C5VGpMWV2a7PdNawnGX9OzqHJ308osTcQ04EaYTKKFKngDClyrRYyZf+jj9Lp7Hr4Y+StrnOmvH8QYthP05muRi7JuRg7covoUHrEB3ZgBHsK9+IDp3/nYb7+WX04JbctHGurmaWxbDRCYHgBebkS4m3uCW12XN19/yXNljOMPnRqRttU9egFo5ArR8s6gXY2VKx39s30FznQ+zb5IpviqLIUMyikDLnKDHiIGrrjbZ+mrmr0lHJ+7pb7SloXdQO+Mro0GSHCDIIh76oinytbOk0Qnt+lXls1tkR1vUqzNAIdgOhxkiKVbs2PqP0+vx9P96/Fe1OlSKKL7sUkqinmMhQbrYAiN6dSwRuQTcc+c3E/d8DC4n8n6SsMCaPClcwUfPHwzpo/gfqas8p/vy72CG+wpH7oyKEpqM3l1PnDBh46QtwGxnpX52NzDfRpp27tBsWZjEK9HpD40yEJ6UIQosaDMP8g5WtfqplUNRVpruQwgSYlMQmyKiISdQyQMf96P18el4nmzhhViM20n5nM6Pouu7G5VMnUKMDV6GbglgtQb7JYxLSW3KmWb7Bn0qO8V4U7B0hlgTQhbEDo14LOzMJA7GM2gsbZmx1Qunvt+X3djyTfFDsAe2xHugQWKBGF09wLYjiKeJL1AjeHB2YSMUAE1FyD4dDYh1LoczfGPeASozXI7nsqWCg2bVFBtagOCE1CsudNqZ8X4hyRyke0pTuHZqYzSKVN8SZxZFjnQDqCNMX1dq0XEa3wDMX/oNjzz8XK3XETONDhKkM21SmSg9g+cPGlwRXuzFDXUCLpmOe0NIgyQY4yAlRiRmdJDpjZPY2UPaF1vUFFpLLQoOma5p+E43nFbwtN+z8bG1ALO3iZ3uEVgAChd9wJQCzshgvAClcOKwTiBKzfov+weifMCX2SEt2REqpH4yNL2YCYAWg+BT8tYNM9AXN+gV4R73I6+3wZ2WTa0hUnRYNtbpBoR3HdPg7bZs+v8086e1eReNt5lfYBblDo3UPMWPS06fPAxAfitEWtaCM6v2vezZy2Y0LJagy1GG7A3ghPD2LxZcWL3uWUh4ghmbwMHiH4l4NvS0rthT+uFJg2/imxzM7JIAuquB5Gs5jE9K9h31p+8TdtpRCAU29k2YtGak4yeMOVC69jGxWnaDDCpYe2CCM4da/i0IsbPPzS0BNh0BFCafRrUZw5YyBqLWyYAZ/Lfjo/p7A340Efs53wuO6RqFu/C6YN+nQYl56YX0UH+kSXkraX8Tei1rPLRaVIVs0ZPA4NOi6bPHPVokapElFt4AQ8X9cm3LeEKKxZFrFwjJGrQYNmdbgiyidBQ/7RNKxxf3MgiAVBNOM8QTjS5BQ1QBM483NmMka3iVjniGMATVIcGpeEGABqDbh5O3UM37e07Z+qWeFLWtcIgWYqUutFZ5YgI7FDy/byUohlUFQlfIOMMGsyaDpZQn0uQxXJb/7glEfJUzhRmksB1bXCWWTDzdPD4xhYmiQzucc/13oYP51VsE+a0w9ZBA3A3cdAwIAQaO2iYnSzdU3JyOtbCEYwrWqM3cg+1puFWWtD7o3bMyoxSj4/3w3n5eY3sXpzlc2RENXLbG84TY2iSsZVVayCFLTKbtC41In/EoVtq85bVxIgkhnH4x71ASGpGbt7Lma11fIUdna0S8Jprmdn/8TnxLiiGogNb2d36nN+fh+/Tr8P8CPNXZNSZdsMeR+WPMbDgQe9vcBxbLR/Cn8v9eX7d18W6Kc8fWSfYUc5dffKZ7yyreJCzgm7cSiOyNlUsrFvWIh4dPAwAkk4nwZgGynZsoNT3n/vjeJ9XzJX8BqztfYtPC0p69wbQToA3wHGzWjYU3BuEVlBFXJj9YgSUmtzRHO+ARjZmBEpLy9AV97zQ9HeD91CKLlENdatHnKIasYsW/EIDiueUDEhzD614vN3I9CDY81FNqw28fSCljM2M+tCNfbpqG+QDjVjZ41+nbI/b0vz10CLSB1hng89sMcEd1PQI4LiWc//xsc/7i1OPtDRxPcgGnhufzk8+XNHhSCZZONqIYljsDsAq3asjmyBynfhHV1aM1syzxxShTZl7ILYFXmc0MBZkx8U/MOZqGUqqeD7zsmH9NHiWBfweBZPu+VAMYoPUkAi/+IxokYTtLaPiEAsvHrOvuK915KXVeUbWC4VfwrrDgzsLLpHqUcAP98fsxIKd9MPjNvl877ZJHCt2kpOv3+fb4W258sU40iNK9TngL2fGLsW0OguZHpXib/jixomhxok4LZtUcc8obi22D5i49YAzFcFHAyJoK7PTr886BNzB4W0OEItC4zI1j5IkPeA400gZ9XAWZBL6+MTC/GHRL5GX6rF8TT8/J47vNhSJIReiPopKUp/1o2h2kTTOD9x2vx0ZilWs73br9/T02ezDZeHBEWqtIDSrG3S1kVt/hT3BlgfDbGRid7SRyb1MkgWgADhSqA9wf6V/G2UXM0QM2NMZkNTK6qre3rCljgaOKI20hAYXhs7tfBt4dQbuUJfZWkFAoMXu67znm6FsyK3sjUZtf5BB+pbidLrkhg7JylJQ+x4uFf/SGfyBHnOIE+o+hyGQGELzI2fkJHNnUAhIyN7D744rTYslELhSo4x4KFkLupaZ0yIHfRi4AeRqml9AGEQ1IG/tU+BHDbKaCKLLBkWWmiAdNkdDqjOw90Sy3ix60+unY0q6wbsPYllTxFdykCzdy1oOQvuh2147jFxV5AaITOrb1lgDIzVqZc/RC6iAZFhVlljVvy16pVShKMwhNTfIkjoTYlfq4VmYzF3LSnvlqhs/ei3sXTF4TAhje2n29sLz8W25uh3GTyhaSCAPLpi9Df0qYIXZMgMlEp1/gsrmn4BXh4YkSfXUCIBA++OMYPnL+s7et+O5pOPqGWebzJkWBSQax8N09e16i/iHYtkhuC8NnDiAZZ2mh5me/Gy7UwQVnn4/nmduBfZU1alWrsZZx2+RFyMr6R1kV44KiFwvsTjgXHYE4sVqIOjRAP4YkF6YnF6CQ2W1DD9nbzH9eZvvGxQtCxGbHSVIRW1UOKsAk8FfTIigUQe272DFyIULWWhpIjELekc3eQGCqdIzp2MnQLYKCREqZ+geCgjIwPoXyT2DqZjCf2mYAFmpOQGn4+P5qMQ79cj6D8jB/SCkTB4PrK1aJ6ctN/VbhprdbQpiIEHbgrJWYb71/t58HHxHxbUFH/tMrC9I7j64u6xrtJ+s1+ZvfmoY/vaaL2cenx1Yh8d+X1eW7L6KhbVtsz9ZfvTxfue0i4qZuLaR4+nP5VaUdGq2UuSCh6cnHeJ5w5GxdQ87+y5wuPis3JalmRZcoN0Nem6qBueayrSh6EyswFPdyaGjMGvOFr7Pf/IVRGG/o0jC4cYv38vOi8y7lDNOYeihUmytWZcROTThBJTHMl34O0kQn3IvgmX0RHc+sfjWr7dQ/Hv94G/ds3Y+VraUQlZ006OrYxyyCh1Z0YJXAwSjR0Q9gXk0ObqHUKxVcvwuvMSG14rC8m3CLKIjmlJyYqHWKEDTvqg7BUspbcu/JrPn5eX7mk/zuaCTpNkAK8d7X05vllVKLJNAO2jsSvm+HI6XD2fXPD+/+PZl5m+clwHtqJvMvgAcdi9jO8u+Mywh0MtZlB/O2prei+VOrQK9g5T48VHDkrrxNLbby/ohj1/hrRtmdcUq6nQr50Z+fAQlfzve3c3PMglkNNvAcvgjiOHIVNak0yg5D/eThYsZKUkrO7u/rqdPp6rmvzZmp6H+lUzr6yXU6xuUMqzZBFQ++rSbTP3d9whSyonxX4/nxFYxSy6ie3mf42ktDIzckBL1N7l/7IBo+CCy43JOXnr09ynu1YtA/GotO+uh2yZvAQ4EmEaV3H0vl65vjUFGx9KLIVha/X66vHzO35fBf7DK0JYCjQaxBMpT8oa9xJcw3UVm7014mKBntcltypiqVtQnz5LpirpOchT6+cl9fMZOlc673eHOT9q2JGt6lvwHeVsvqmwiqUKy4Lt7UIEpYekEyh8kC/Sfd7tMfHsSJhQQBbG6GUKvO0J7JhRhU9H4iEKX4/1cSBqYJBxGIlx6lfQe0Cs+6FN9PUb5j/xxL5rCVKgP89WEsiiBHqHuRINtFSq948BqrcD5Poin8CouDOHmI2tELNbVr8PFH8ew9ODTH8TQRhJXj/M4gYYJRLr+N++3bZXXsOrKDLIdxFwNkVTdZgM7t1A/M4hciFSgtCMGhtFHRdAgArGC0OLNOMcvzG6dckTO3MlaJkXmkH0yKtfKyUdVeOzBJ9iKaGDDwP+oGNZ9lo/0uUp6xD1p96s9Qnv592PJfsQ45pVowDw/59DjZJNYGCkcUeUcqMnFehkzT5LNsla5Lz+dLX05uPNyKSh6KNEkurL34HdskElUyCT28ur0UbdIWciDFfQ0hCeFH5aIshLcpE9qDeUXCl0tVA+rXqUsmO7EagX6Soe6kcusdlS6yBSZTOTWsutYF5RGZDULYmZvgoZ/pguAdZLIFqGo4b2k5f3gS222PjArNQYEXw1iuDGIu8UeVxzIwY5GfKjEv5hbUKEqSkGnyT1hUYPPt9HImGHE3FEYPV04IeXIcmeDWLpTA7swhngjEizEoduWb4pFJG0jK4AoYUO00TNiNis6XX6gO/S+eDSY+fjy0AIEzSp5DRoiqpz3sUiZoqjZgsRshPrEoWNyaTca1lgl1oSGNzqc5x9ccbMCGNKPDvTRLTGBxC/N6LYNRVCBuRmkpcBawn5OFL6Btlo845djAWhsNHt3MaH0XD4+LlMFps2AXigoboB1Akmo0/1Ah4P5wohR7vWBvsHoZfq4L69brX0IdVBRvzYi+dehGK8Rew8+lz+KPhcDO9pakVi5yis4sJxLJ6tDHodoqcWM6mS9o1GW28z4nDUtiTbIkxpZtS+FEzowpqBONpyWJ58GSz9YK1K8hnFbQ4JGytQg5t+ey+vub7tuYFTs7Bjz5osKP4XMR8BMFIgVOrGFEyoTDmupJg9RMtUnu5uxzIB7vzSPZWVNcz/+cCYAX1uKpZ5FhpEtQ+XAGtB0IqN1NbzNaMOsHMAp0bM9y0W1YmgtDDyUuN+eNUoHv7GSWd84fsHSjdiLmJJN1qlngPIMN04rJll4oG9VmSxeJaCgbXI7GNETeDEixJYR48QlC1/r971/X/Ph5Gwr7tDQWLoW23WUrR4s5WPrVQZQALslmp1e1OHklWKBdegMozTXECV6BEFUtZNFS0EiA0L1YM1WWoQmvq6+g57bWR6MsboabNHRaLAyOz9TyHvQFggiCqzSoKtheS/8ooybAyu+jFCISJ4KwG1gIOVObLe2Sqi3kmClkC3Qr+BhNWib59w9cJnkXpsiCml9qKf58MTJwsMZTgYF2uBmdQ9H1QUqxoEcdA+XDsH14WuP1AK7TyOyIl6bjn8u4eU3lXtaswo6vF+DZJ4FkQBIxs2IZJ4WmX3Xp1NcY0nbx9rsmWQ96uz7tEgWNKghsaioQKs0931RdC/6CuvrhA9wvK59FoF/4l/EsMWEiocGvA3o1mQ6AH7AhGyNGPJ73bxP6BuzOiv9nZs3jEVR/qSlgcKOTtFcfd05QQ07qnPPHouKD7lhx+tRZNwYhwj2FrSEyfTbYtrXy/z2x8+CNo1GaQGIlksfgpCv5ToXRGXUK+vFD+sHb1CQivYghr+kjAgdCGK2ClRRTwDVUMqI/oyXUxiS/6+xK8htGwaCf+m5By0pUlK/UhSBmxqIWjcKkjiKD/l7KVmc5dIapLdcKDmkSO7uzM44wzehXJFl5E0R2OjMQDQjU5zBa445kcN2kqBUXPV6UEUxqmF3fh1PlSLLYOLSgdZOtqF3p/ufdngww+lKnu28GUIk9ijU4XsK4b8dboVGB2/SARqzpEywSgPEYCLaLxJgpjGoNAXuL69US5RUQ2ZepMsE1QFt5lPvNzVKolfq+jvTx7pn9mSaTBoKQqZHWElXo+MWEBjnL4rmjOintDFLKexE26a0F/MKOewIAsUyAwV30wlq8S3M3GKm7ae3Q5FIW/LzvHp46LW8RXVJk+prz7hlYuEopLXA64vpGqmVl+dky0253saX0eYgYjAmsPEGCsGnRyzeg2XouzxrEeS1R24sL3ZI1aW5BmcIHiURxwr8LdNco19Ubb8yybrlxK23aemar88dMYySvPFTDkQ3/vQ8PU7jp2bFhm5J2YPz4fRoy6O+HBloAjYfbFzivYGz2STMh5e/n/50I+5Oj9L58Hr/8JJypcUZfA+QMo4hjQpCwv2gp6of8/Fg0/Hq2GD7aT4e/1QK1EOpqSydMjxoLj4/HB/vVk94m4eYChNtC7gFIY2MElRxtPknH8n5DNdCKexeMwQaFcmBFdO2G7ocOEBAWRptYkJNDQ8XBKfSITnulOyCunQPtfAeT+kFFz/kJQScP6hGO0gmOohTug6pg3iFIfGXNpqq2DBFNq6w6k1DbDSNLQ0Yyj2lbl8f9Cst+p6DRSnIHgHwNNDUQRuH6ygScn3DKgaw1tZ2mIyxFG4VLju3PeqcDtjFc2SFpWxMWxqggfHUABMWqG1Heq9cX3LNDutgs2yZ8xm2jPDZaRRUhKOuA5TYUShxe+We04kvqR6wVgsZRkXTPrrNBmALEGgVbBqJYJ24BvgZUu6GtidvvICF9Hy81B9JSXpGYyb0UtNHAiEWCnsz3kFbxugxz7g02HICSgnnUGUOwp51Stl1FZHKIKd1Wpvm7IDt+VUKamQsoTstXLnxVsrKcAVx0+fDI+SEA5q8iNAApEE0Y8DC4CgVzKcTaK9Ba85BjsFBIdmLatRDNCwgQOlz0NKCKdvywHYe02VTZ4SGg5SbgVsc2FH7POE7rAbgA99g27sqS5bysBwoaScNriTs2rIUAhFgtLWmgA48f/yF/0Yg4udEbwmK/s2j/SiMbRXn383Ts2WulrbagV8H0/lkNela/1+vq6n90UyuUEnwdeBduhbmCq4x7aX4xiRQTND0Q0RD7wfxRtCUKEFTL2yNDuzSXgUgsFoNrXq/i922JTzrhda13101rDfD2JS9X9z425bmxBQroRILV3vvsV2jplYwnXR0k6Z3PVmf+6XDuSybZKTB9fRwtwmnwVoFM65doiFgPRBydNqkDMBgwO5pqFXmpV4ZQxynC3qpVqbc754bc16ms01NzFZlH24aZT5935h22ky13edG/fj65Wl8Oq6NvN++//j4+Ad2J+rOc4AOAA=="; \ No newline at end of file diff --git a/docs/classes/BoardState.html b/docs/classes/BoardState.html index d851500d..8938f8d2 100644 --- a/docs/classes/BoardState.html +++ b/docs/classes/BoardState.html @@ -1,4 +1,4 @@ -BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

constructor +BoardState | goban

Class BoardState

Hierarchy (view full)

Implements

Constructors

Properties

black_prisoners board board_is_repeating @@ -25,23 +25,23 @@ default to 19x19 if no board is provided.

Any state matrices (board, removal, etc..) provided will be cloned and must have the same dimensionality.

-

Parameters

Returns BoardState

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    -

    Parameters

    Returns boolean

Properties

black_prisoners: number
board_is_repeating: boolean
goban_callback?: GobanBase
height: number = 19
removal: boolean[][]
white_prisoners: number
width: number = 19

Methods

  • Returns true if the .board field from the other board is equal to this one

    +

    Parameters

    Returns boolean

  • Computes scoring locations for the board. If area_scoring is true, we will use area scoring rules, otherwise we will use territory scoring rules (which implies omitting territory in seki).

    -

    Parameters

    • area_scoring: boolean

    Returns ScoringLocations

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

  • x: number
  • y: number
  • force_removal: boolean = false

Returns {
    group: RawStoneString;
    removed: boolean;
}

\ No newline at end of file diff --git a/docs/classes/ConditionalMoveTree.html b/docs/classes/ConditionalMoveTree.html index 87d2d8f9..5164938d 100644 --- a/docs/classes/ConditionalMoveTree.html +++ b/docs/classes/ConditionalMoveTree.html @@ -1,4 +1,4 @@ -ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

constructor +ConditionalMoveTree | goban

Class ConditionalMoveTree

Constructors

Properties

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file +

Constructors

Properties

children: {
    [move: string]: ConditionalMoveTree;
}

Type declaration

move: null | string

Methods

\ No newline at end of file diff --git a/docs/classes/Goban.html b/docs/classes/Goban.html index fc3c7b65..ffa36637 100644 --- a/docs/classes/Goban.html +++ b/docs/classes/Goban.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
analysis_scoring_color?: string
analysis_scoring_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Clears any analysis scores on the board

    -

    Returns void

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Clears any analysis scores on the board

    +

    Returns void

  • Parameters

    • x: number
    • y: number

    Returns undefined | string

  • Parameters

    • x: number
    • y: number

    Returns undefined | string

  • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

    -

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • ev: TouchEvent | MouseEvent

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional removal: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional color: string
    • sync_review_move: boolean = true

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional mode: "put" | "clear"

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • Optional removal: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional color: string
    • sync_review_move: boolean = true

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional mode: "put" | "clear"

    Returns boolean

  • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

    -

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • new_ss: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • display_width: number
    • suppress_redraw: boolean = false

    Returns void

  • This is a callback that gets called by GobanEngine.setState to load +

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • new_ss: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • display_width: number
    • suppress_redraw: boolean = false

    Returns void

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanBase.html b/docs/classes/GobanBase.html index 13c8b3ee..67fad06b 100644 --- a/docs/classes/GobanBase.html +++ b/docs/classes/GobanBase.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

-
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

_destroyed: boolean = false
engine: GobanEngine
goban_id: number = ++last_goban_id

Base fields *

+
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • i: number
    • j: number

    Returns void

  • Parameters

    • Optional no_warp: boolean

    Returns void

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    -

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Parameters

    • Optional force_clear: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean

    Returns void

  • Parameters

    • container: any

    Returns void

  • Called when Engine.setState loads a previously saved board state.

    -

    Returns void

  • Parameters

    • msg_id: MessageID
    • Optional parameters: {
          [key: string]: any;
      }
      • [key: string]: any
    • Optional timeout: number

    Returns void

\ No newline at end of file +

Parameters

Returns JGOFMove

\ No newline at end of file diff --git a/docs/classes/GobanCanvas.html b/docs/classes/GobanCanvas.html index 3c36da0b..5fbc96f5 100644 --- a/docs/classes/GobanCanvas.html +++ b/docs/classes/GobanCanvas.html @@ -2,7 +2,7 @@ classes, types, and enums.

You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

-

Hierarchy (view full)

Implements

Constructors

Hierarchy (view full)

Implements

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__borders_initialized: boolean = false
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__set_board_height: number = -1
__set_board_width: number = -1
__update_move_tree: any = null
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
autoplaying_puzzle_move: boolean = false
board: HTMLCanvasElement
bounded_height: number
bounded_width: number
bounds: GobanBounds
byoyomi_label: string = ""
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
connectToReviewSent?: boolean
ctx: CanvasRenderingContext2D
current_cmove?: ConditionalMoveTree
current_pen_mark?: {
    color: string;
    points: [number, number];
}

Type declaration

  • color: string
  • points: [number, number]
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
drawing_enabled: boolean = true
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
handleShiftKey: ((ev) => void)

Type declaration

    • (ev): void
    • Parameters

      • ev: KeyboardEvent

      Returns void

heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
labeling_mode?: "put" | "clear"
last_clock?: AdHocClock
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_label_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
last_move?: MoveTree
last_move_opacity: number = 1
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_pen_position?: [number, number]
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
message_div?: HTMLDivElement
message_td?: HTMLElement
message_text?: HTMLDivElement
message_timeout?: number
metrics: GobanMetrics = ...
move_selected?: JGOFIntersection
move_tree_canvas?: HTMLCanvasElement
move_tree_container?: HTMLElement
move_tree_inner_container?: HTMLDivElement
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

parent: HTMLElement
pause_control?: AdHocPauseControl
paused_since?: number
pen_ctx?: CanvasRenderingContext2D
pen_layer?: HTMLCanvasElement
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
ready_to_draw: boolean = false
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean = false
shadow_ctx?: CanvasRenderingContext2D
shadow_layer?: HTMLCanvasElement
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
theme_black: GobanTheme
theme_black_stones: any[] = []
theme_black_text_color: string = HOT_PINK
theme_blank_text_color: string = HOT_PINK
theme_board: GobanTheme
theme_faded_line_color: string = HOT_PINK
theme_faded_star_color: string = HOT_PINK
theme_line_color: string = ""
theme_star_color: string = ""
theme_stone_radius: number = 10
theme_white: GobanTheme
theme_white_stones: any[] = []
theme_white_text_color: string = HOT_PINK
themes: GobanSelectedThemes = ...
title_div?: HTMLElement
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
THEMES: ThemesInterface = THEMES
THEMES_SORTED: {
    black: GobanTheme[];
    board: GobanTheme[];
    white: GobanTheme[];
    [key: string]: GobanTheme[];
} = THEMES_SORTED

Type declaration

setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get analyze_subtool(): string
  • Returns string

  • set analyze_subtool(analyze_subtool): void
  • Parameters

    • analyze_subtool: string

    Returns void

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

  • get review_controller_id(): undefined | number
  • Returns undefined | number

  • set review_controller_id(review_controller_id): void
  • Parameters

    • review_controller_id: undefined | number

    Returns void

  • get review_owner_id(): undefined | number
  • Returns undefined | number

  • set review_owner_id(review_owner_id): void
  • Parameters

    • review_owner_id: undefined | number

    Returns void

  • get submit_move(): undefined | (() => void)
  • Returns undefined | (() => void)

  • set submit_move(submit_move): void
  • Parameters

    • submit_move: undefined | (() => void)

    Returns void

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

    -

    Returns void

  • Parameters

    • event: TouchEvent | MouseEvent
    • double_tap: boolean
    • right_click: boolean
    • press_duration_ms: number

    Returns void

  • Parameters

    • event: TouchEvent | MouseEvent
    • double_tap: boolean
    • right_click: boolean
    • press_duration_ms: number

    Returns void

  • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

    -

    Returns GobanEngine

  • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

    -

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • This is a callback that gets called by GobanEngine.setState to load +

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional force_label: boolean
    • Optional force_put: boolean

    Returns boolean

  • Parameters

    Returns {
        remove: (() => any);
    }

    • remove: (() => any)
        • (): any
        • Returns any

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanEngine.html b/docs/classes/GobanEngine.html index 8afb6674..abd4634c 100644 --- a/docs/classes/GobanEngine.html +++ b/docs/classes/GobanEngine.html @@ -1,4 +1,4 @@ -GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

constructor +GobanEngine | goban

Class GobanEngine

Hierarchy (view full)

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    +

Constructors

Properties

_cur_move: MoveTree
_cur_review_move: undefined | MoveTree
_last_official_move: MoveTree
_outcome: string = ""
_phase: GobanEnginePhase = "play"
_rules: GobanEngineRules = "japanese"
_strict_seki_mode: boolean = false
_undo_requested?: number
_winner?: number | "black" | "white"
aga_handicap_scoring: boolean = false
allow_ko: boolean = false
allow_self_capture: boolean = false
allow_superko: boolean = false
automatic_stone_removal: boolean = false
black_prisoners: number
board_is_repeating: boolean
decoded_moves: JGOFMove[] = []
disable_analysis: boolean = false
dontStoreBoardHistory: boolean
free_handicap_placement: boolean = false
game_id: number = NaN
goban_callback?: GobanBase
group_ids?: number[]
handicap: number = NaN
handicap_rank_difference?: number
height: number = 19
initial_state: GobanEngineInitialState = ...
is_game_record: boolean = false
komi: number = NaN
latencies?: {
    [player_id: string]: number;
}

Type declaration

  • [player_id: string]: number
loading_sgf: boolean = false
move_before_jump?: MoveTree
move_tree: MoveTree
move_tree_layout_dirty: boolean = false
move_tree_layout_hash: {
    [coords: string]: MoveTree;
} = {}

Type declaration

move_tree_layout_vector: number[] = []
name: string = ""
needs_sealing?: JGOFSealingIntersection[]
parentEventEmitter?: EventEmitter<GobanEvents, any>
player_pool: {
    [id: number]: GobanEnginePlayerEntry;
}

Type declaration

players: {
    black: GobanEnginePlayerEntry;
    white: GobanEnginePlayerEntry;
} = ...

Type declaration

puzzle_collection: number = NaN
puzzle_description: string = "[missing puzzle description]"
puzzle_opponent_move_mode: PuzzleOpponentMoveMode = "manual"
puzzle_player_move_mode: PuzzlePlayerMoveMode = "free"
puzzle_rank: number = NaN
puzzle_type: string = "[missing puzzle type]"
removal: boolean[][]
rengo?: boolean
rengo_casual_mode: boolean
rengo_teams?: {
    [colour: string]: GobanEnginePlayerEntry[];
}

Type declaration

review_id?: number
score_handicap: boolean = false
score_prisoners: boolean = false
score_stones: boolean = false
score_territory: boolean = false
score_territory_in_seki: boolean = false
stalling_score_estimate?: StallingScoreEstimate
superko_algorithm: GobanEngineSuperKoAlgorithm = "psk"
territory_included_in_sgf: boolean = false
throw_all_errors?: boolean
time_control: JGOFTimeControl = ...
white_prisoners: number
width: number = 19

Accessors

  • get winner(): undefined | number | "black" | "white"
  • Returns undefined | number | "black" | "white"

  • set winner(winner): void
  • Parameters

    • winner: undefined | number | "black" | "white"

    Returns void

Methods

  • Returns {
        black: string;
        white: string;
    }

    • black: string
    • white: string
  • Computes the score of the current board state.

    If only_prisoners is true, we return the same data structure for convenience, but only the prisoners will be counted, other sources of points will be zero.

    -

    Parameters

    • Optional only_prisoners: boolean

    Returns Score

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    -

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • Parameters

    • from_turn: number
    • moves: string | AdHocPackedMove
    • Optional cb: ((x, y, edited, color) => void)
        • (x, y, edited, color): void
        • Parameters

          • x: number
          • y: number
          • edited: boolean
          • color: number

          Returns void

    Returns MoveTree[]

  • Returns a move string from the given official move number (aka branch point)

    +

    Returns {
        from: number;
        moves: string;
    }

    • from: number
    • moves: string
  • returns true if our current move is our last official move

    -

    Returns boolean

  • returns true if our current move is our last official move

    +

    Returns boolean

  • Returns the number of stones removed. If you want the coordinates of the stones removed, pass in a removed_stones array to append the moves to.

    -

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    -

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    -

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If +

    Parameters

    • x: number
    • y: number
    • Optional checkForKo: boolean
    • Optional errorOnSuperKo: boolean
    • Optional dontCheckForSuperKo: boolean
    • Optional dontCheckForSelfCapture: boolean
    • Optional isTrunkMove: boolean
    • Optional removed_stones: JGOFIntersection[]

    Returns number

  • Parameters

    • Optional player_id: number

    Returns "black" | "white" | "invalid"

  • Encodes an x,y pair or a move object like {x: 0, y: 0} into a move string like "A1"

    +

    Parameters

    Returns string

  • Parameters

    • x: number
    • y: number

    Returns string

  • Saves our current move as our last official move

    +

    Returns void

  • Parameters

    • x: number
    • y: number
    • Optional needs_sealing: boolean

    Returns void

  • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Toggles a group of stones for removal or restoration.

    By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

    -

    Parameters

    • x: number
    • y: number
    • force_removal: boolean = false

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

\ No newline at end of file +

Parameters

Returns GobanEngineConfig

\ No newline at end of file diff --git a/docs/classes/GobanError.html b/docs/classes/GobanError.html index 3a31219a..6e0312b7 100644 --- a/docs/classes/GobanError.html +++ b/docs/classes/GobanError.html @@ -1,2 +1,2 @@ -GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file +GobanError | goban

Class GobanError

Hierarchy (view full)

Constructors

Constructors

\ No newline at end of file diff --git a/docs/classes/GobanInteractive.html b/docs/classes/GobanInteractive.html index 60ed09cb..9433b3d1 100644 --- a/docs/classes/GobanInteractive.html +++ b/docs/classes/GobanInteractive.html @@ -1,7 +1,7 @@ GobanInteractive | goban

Class GobanInteractiveAbstract

This class serves as a functionality layer encapsulating core interactions we do with a Goban, we have it as a separate base class simply to help with code organization and to keep our Goban class size down.

-

Hierarchy (view full)

Constructors

Hierarchy (view full)

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

-
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any +

Constructors

Properties

__board_redraw_pen_layer_timer: any = null
__clock_timer?: Timeout
__draw_state: string[][]
__last_pt: {
    i: number;
    j: number;
    valid: boolean;
} = ...

Type declaration

  • i: number
  • j: number
  • valid: boolean
__update_move_tree: any = null
_analyze_subtool: string = "alternate"
_analyze_tool: AnalysisTool = "stone"
_mode: GobanModes = "play"
_review_controller_id?: number
_review_owner_id?: number
_score_estimator: null | ScoreEstimator = null
_submit_move?: (() => void)

Type declaration

    • (): void
    • Returns void

_title: string = "play"
analysis_move_counter: number
analysis_removal_last_position: {
    i: number;
    j: number;
} = ...

Type declaration

  • i: number
  • j: number
analysis_removal_state?: boolean
bounded_height: number
bounded_width: number
bounds: GobanBounds
chat_log: GobanChatLog = []
circle_radius: number
clock_should_be_paused_for_move_submission: boolean = false
colored_circles?: (undefined | ColoredCircle)[][]
conditional_path: string = ""
conditional_starting_color: "black" | "white" | "invalid" = "invalid"
conditional_tree: ConditionalMoveTree = ...
config: GobanConfig
current_cmove?: ConditionalMoveTree
currently_my_cmove: boolean = false
dirty_redraw: any = null
disconnectedFromGame: boolean = true
display_width?: number
done_loading_review: boolean = false
dont_draw_last_move: boolean
double_click_submit: boolean
draw_bottom_labels: boolean
draw_left_labels: boolean
draw_right_labels: boolean
draw_top_labels: boolean
edit_color?: "black" | "white"
engine: GobanEngine
errorHandler: ((e) => void)

Type declaration

    • (e): void
    • Parameters

      • e: Error

      Returns void

game_id: number
game_type: string
getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
goban_id: number = ++last_goban_id

Base fields *

+
heatmap?: NumberMatrix
height: number
highlight_movetree_moves: boolean
interactive: boolean
isInPushedAnalysis: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerController: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

isPlayerOwner: (() => boolean)

Type declaration

    • (): boolean
    • Returns boolean

label_character: string
label_mark: string = "[UNSET]"
last_clock?: AdHocClock
last_emitted_captured_stones: JGOFIntersection[] = []
last_emitted_clock?: JGOFClockWithTransmitting
last_hover_square?: JGOFIntersection
last_move?: MoveTree
last_move_radius: number
last_paused_by_player_state: null | boolean = null
last_paused_state: null | boolean = null
last_phase?: GobanEnginePhase
last_review_message: ReviewMessage
last_sound_played_for_a_stone_placement?: string
last_stone_sound: number
leavePushedAnalysis: (() => void)

Type declaration

    • (): void
    • Returns void

marked_analysis_score?: boolean[][]
move_selected?: JGOFIntersection
no_display: boolean
onError?: ((error) => void)

Type declaration

    • (error): void
    • Parameters

      • error: Error

      Returns void

on_game_screen: boolean
one_click_submit: boolean
original_square_size: number | ((goban) => number) | "auto"

Type declaration

    • (goban): number
    • Parameters

      Returns number

pause_control?: AdHocPauseControl
paused_since?: number
pen_marks: any[]
player_id: number
preloaded_data?: GobanConfig
previous_mode: string
puzzle_autoplace_delay: number
restrict_moves_to_movetree: boolean
review_had_gamedata: boolean
review_id: number
scoring_mode: boolean | "stalling-scoring-mode"
sendLatencyTimer?: Timeout
sent_timed_out_message: boolean
shift_key_is_down: boolean
show_move_numbers: boolean
show_variation_move_numbers: boolean
showing_scores: boolean = false
square_size: number = 10
stalling_score_estimate?: StallingScoreEstimate
stone_placement_enabled: boolean
stone_removal_auto_scoring_done?: boolean = false
variation_stone_opacity: number
visual_undo_request_indicator: boolean
width: number
setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

Type declaration

    • (newCallbacks): void
    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    -

    Returns boolean

Methods

  • Decodes any of the various ways we express moves that we've accumulated over the years into +

    Parameters

    Returns void

setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

Type declaration

    • (_catalog, _debug_mode?): void
    • Parameters

      Returns void

Accessors

  • get destroyed(): boolean
  • Returns boolean

  • get is_game_record(): boolean
  • True if the game is a game record of a real life game

    +

    Returns boolean

Methods

  • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

    -

    Parameters

    • coordinates: string

    Returns JGOFMove

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • perGameSettingAppliesToNonPlayers: boolean = false

    Returns boolean

  • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

    -

    Returns GobanEngine

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    -

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • colored_marks: {
          [key: string]: {
              color: string;
              move: string;
          };
      }
      • [key: string]: {
            color: string;
            move: string;
        }
        • color: string
        • move: string

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Called when a location is marked or unmarked for removal

    +

    Parameters

    • x: number
    • y: number
    • removed: boolean
    • emit_stone_removal_updated: boolean = true

    Returns void

  • Parameters

    • Optional set_override: "letters" | "numbers"

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • Optional drawSquare: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • coordinates: string
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

    -

    Parameters

    • marks: {
          [mark: string]: string;
      }
      • [mark: string]: string
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string
    • drawSquare: boolean = true

    Returns void

  • Parameters

    • Optional dont_jump_to_official_move: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional dont_draw: boolean

    Returns void

  • Parameters

    • msg_id: MessageID
    • Optional parameters: {
          [key: string]: any;
      }
      • [key: string]: any
    • Optional timeout: number

    Returns void

  • Parameters

    • x: number
    • y: number
    • mark: string | number
    • Optional force_label: boolean
    • Optional force_put: boolean

    Returns boolean

  • Parameters

    • x: number
    • y: number
    • anti_slip: boolean = true

    Returns {
        i: number;
        j: number;
        valid: boolean;
    }

    • i: number
    • j: number
    • valid: boolean
\ No newline at end of file +

Parameters

Returns void

\ No newline at end of file diff --git a/docs/classes/GobanMoveError.html b/docs/classes/GobanMoveError.html index 2adea80c..b20e265d 100644 --- a/docs/classes/GobanMoveError.html +++ b/docs/classes/GobanMoveError.html @@ -1,6 +1,6 @@ -GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

constructor +GobanMoveError | goban

Class GobanMoveError

Hierarchy (view full)

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file +

Constructors

Properties

coords: string
game_id: number
move_number: number
\ No newline at end of file diff --git a/docs/classes/GobanSocket.html b/docs/classes/GobanSocket.html index d77127d4..60ac1107 100644 --- a/docs/classes/GobanSocket.html +++ b/docs/classes/GobanSocket.html @@ -8,7 +8,7 @@
  • Optional promise support for sends
  • Latency tracking (doubling as keep alive)
  • -

    Type Parameters

    Hierarchy

    Constructors

    Type Parameters

    Hierarchy

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    authentication?: DataArgument<SendProtocol["authenticate"]>
    callbacks: Map<number, ((data?, error?) => void)> = ...

    Type declaration

      • (data?, error?): void
      • Parameters

        Returns void

    clock_drift: number = 0.0
    current_ping_interval: number
    last_request_id: number = 0
    latency: number = 0.0
    manually_disconnected: boolean = false
    ping_timer?: Timeout
    promises_in_flight: Map<number, {
        args: any[];
        command: string;
        reject: ((...args) => void);
        resolve: ((...args) => void);
    }> = ...

    Type declaration

    • args: any[]
    • command: string
    • reject: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    • resolve: ((...args) => void)
        • (...args): void
        • Parameters

          • Rest ...args: any[]

          Returns void

    reconnect_tries: number = 0
    reconnecting: boolean = false
    send_queue: (() => void)[] = []

    Type declaration

      • (): void
      • Returns void

    socket: WebSocket
    timeout_timer?: Timeout
    url: string

    Accessors

    Methods

    \ No newline at end of file diff --git a/docs/classes/GobanTheme.html b/docs/classes/GobanTheme.html index 9c217969..58606422 100644 --- a/docs/classes/GobanTheme.html +++ b/docs/classes/GobanTheme.html @@ -1,4 +1,4 @@ -GobanTheme | goban

    Class GobanTheme

    Constructors

    constructor +GobanTheme | goban

    Class GobanTheme

    Constructors

    Properties

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file +

    Constructors

    Properties

    name: string
    parent?: GobanTheme
    styles: {
        [style_name: string]: string;
    } = {}

    Type declaration

    • [style_name: string]: string

    Accessors

    Methods

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number
      • shadow_circle_color: string

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • shadow_cell: undefined | SVGGraphicsElement
      • cx: number
      • cy: number
      • radius: number
      • color: string

      Returns undefined | SVGElement

    • Parameters

      • ctx: CanvasRenderingContext2D
      • _shadow_ctx: null | CanvasRenderingContext2D
      • _stone: any
      • cx: number
      • cy: number
      • radius: number

      Returns void

    • Parameters

      • cell: SVGGraphicsElement
      • shadow_cell: undefined | SVGGraphicsElement
      • stone: string
      • cx: number
      • cy: number
      • radius: number

      Returns [SVGElement, undefined | SVGElement]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    • Parameters

      • _radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns any

    • Parameters

      • defs: SVGDefsElement
      • radius: number
      • _seed: number
      • _deferredRenderCallback: (() => void)
          • (): void
          • Returns void

      Returns string[]

    \ No newline at end of file diff --git a/docs/classes/MoveTree.html b/docs/classes/MoveTree.html index e1258c1c..11234a49 100644 --- a/docs/classes/MoveTree.html +++ b/docs/classes/MoveTree.html @@ -1,4 +1,4 @@ -MoveTree | goban

    Class MoveTree

    Constructors

    constructor +MoveTree | goban

    Class MoveTree

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    -
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      -

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      -

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      -

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      -

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      -

      Returns void

    \ No newline at end of file +

    Constructors

    Properties

    active_path_number: number = 0
    branches: MoveTree[]
    chat_log?: MoveTreeChatLine[]
    correct_answer: boolean = false
    edited: boolean
    engine: GobanEngine
    hint_next?: MoveTree
    id: number
    isobranch_hash?: string
    isobranches: any
    label: string = "[unset]"
    label_metrics?: any
    layout_cx: number = 0
    layout_cy: number = 0
    layout_x: number = 0
    layout_y: number = 0
    line_color: number
    marks?: MarkInterface[][]
    move_number: number
    parent: null | MoveTree
    pen_marks: MoveTreePenMarks = []
    played_by: undefined | number
    player_update: undefined | JGOFPlayerSummary
    pretty_coordinates: string
    stashed_marks: MarkInterface[][][] = []
    text: string
    trunk: boolean
    trunk_next?: MoveTree
    wrong_answer: boolean = false
    x: number
    y: number
    active_path_number: number = 0

    ** Layout & Rendering ***

    +
    current_line_color: number = 0
    isobranch_colors: {
        strong: string;
        weak: string;
    } = ...

    Type declaration

    • strong: string
    • weak: string
    line_colors: string[] = ...
    stone_padding: 3 = 3
    stone_radius: 11 = 11
    stone_square_size: number = ...

    Accessors

    • get stoneColor(): "black" | "white" | "empty"
    • Returns "black" | "white" | "empty"

    Methods

    • Calls a callback for each positions that has a mark on it

      +

      Parameters

      • fn: ((i, j) => void)
          • (i, j): void
          • Parameters

            • i: number
            • j: number

            Returns void

      Returns void

    • Returns true if there are any marks that have been set

      +

      Returns boolean

    • Parameters

      • x: number
      • min_y: number
      • layout_hash: {
            [coords: string]: MoveTree;
        }
      • line_color: number

      Returns number

    • Loads the state of this MoveTree node from a MoveTreeJson object

      +

      Parameters

      Returns void

    • Recomputes the isobranches for the entire tree. This needs to be called on the root node.

      +

      Returns void

    • Saves the current marks in our stash, restore them with popMarks

      +

      Returns void

    \ No newline at end of file diff --git a/docs/classes/SVGRenderer.html b/docs/classes/SVGRenderer.html index 707d77ec..198573da 100644 --- a/docs/classes/SVGRenderer.html +++ b/docs/classes/SVGRenderer.html @@ -2,7 +2,7 @@ classes, types, and enums.

    You can't create an instance of a Goban directly, you have to create an instance of one of the renderers, such as GobanSVG.

    -

    Hierarchy (view full)

    Implements

    Constructors

    Hierarchy (view full)

    Implements

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __set_board_height: number = -1
    __set_board_width: number = -1
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    autoplaying_puzzle_move: boolean = false
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    byoyomi_label: string = ""
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    coordinate_labels_layer?: SVGGraphicsElement
    current_cmove?: ConditionalMoveTree
    current_pen_mark?: {
        color: string;
        points: [number, number];
    }

    Type declaration

    • color: string
    • points: [number, number]
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    drawing_enabled: boolean = true
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    event_layer: HTMLDivElement
    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    grid: SVGGraphicsElement[][] = []
    grid_layer?: SVGGraphicsElement
    handleShiftKey: ((ev) => void)

    Type declaration

      • (ev): void
      • Parameters

        • ev: KeyboardEvent

        Returns void

    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    labeling_mode?: "put" | "clear"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_label_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    last_move?: MoveTree
    last_move_opacity: number = 1
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_pen_position?: [number, number]
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    lines_layer?: SVGGraphicsElement
    marked_analysis_score?: boolean[][]
    message_div?: HTMLDivElement
    message_td?: HTMLElement
    message_text?: HTMLDivElement
    message_timeout?: number
    metrics: GobanMetrics = ...
    move_selected?: JGOFIntersection
    move_tree_container?: HTMLElement
    move_tree_inner_container?: HTMLDivElement
    move_tree_svg?: SVGElement
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_layer?: SVGGraphicsElement
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    ready_to_draw: boolean = false
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shadow_grid: (undefined | SVGElement)[][] = []
    shadow_layer?: SVGGraphicsElement
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    svg: SVGElement
    svg_defs: SVGDefsElement
    theme_black: GobanTheme
    theme_black_stones: any[] = []
    theme_black_text_color: string = HOT_PINK
    theme_blank_text_color: string = HOT_PINK
    theme_board: GobanTheme
    theme_faded_line_color: string = HOT_PINK
    theme_faded_star_color: string = HOT_PINK
    theme_line_color: string = ""
    theme_star_color: string = ""
    theme_stone_radius: number = 10
    theme_white: GobanTheme
    theme_white_stones: any[] = []
    theme_white_text_color: string = HOT_PINK
    themes: GobanSelectedThemes = ...
    title_div?: HTMLElement
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

      -

      Parameters

      • coordinates: string

      Returns JGOFMove

    • Parameters

      • Optional force_clear: boolean

      Returns void

    • Parameters

      • Optional force_clear: boolean

      Returns void

    • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

      -

      Returns void

    • Parameters

      • event: TouchEvent | MouseEvent
      • double_tap: boolean
      • right_click: boolean
      • press_duration_ms: number

      Returns void

    • Parameters

      • event: TouchEvent | MouseEvent
      • double_tap: boolean
      • right_click: boolean
      • press_duration_ms: number

      Returns void

    • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

      -

      Returns GobanEngine

    • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

      -

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • x: number
      • y: number
      • mark: string | number
      • Optional force_label: boolean
      • Optional force_put: boolean

      Returns boolean

    • Parameters

      Returns {
          remove: (() => any);
      }

      • remove: (() => any)
          • (): any
          • Returns any

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/ScoreEstimator.html b/docs/classes/ScoreEstimator.html index 2e13ae90..c092d4b0 100644 --- a/docs/classes/ScoreEstimator.html +++ b/docs/classes/ScoreEstimator.html @@ -1,4 +1,4 @@ -ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    constructor +ScoreEstimator | goban

    Class ScoreEstimator

    Hierarchy (view full)

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Computes scoring locations for the board. If area_scoring is true, we +

    Constructors

    Properties

    amount: number = NaN
    autoscore: boolean = false
    autoscored_needs_sealing?: JGOFSealingIntersection[]
    autoscored_removed?: JGOFMove[]
    autoscored_state?: JGOFNumericPlayerColor[][]
    black: PlayerScore = ...
    black_prisoners: number
    board_is_repeating: boolean
    color_to_move: "black" | "white"
    engine: GobanEngine
    estimated_hard_score: number
    goban_callback?: GobanBase
    height: number = 19
    ownership: number[][]
    prefer_remote: boolean
    removal: boolean[][]
    territory: number[][]
    tolerance: number
    trials: number
    when_ready: Promise<void>
    white: PlayerScore = ...
    white_prisoners: number
    width: number = 19
    winner: string = ""

    Methods

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number
      • autoscore: boolean

      Returns Promise<void>

    • Parameters

      • trials: number
      • tolerance: number

      Returns Promise<void>

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Parameters

      • i: number
      • j: number
      • mod_key: boolean
      • press_duration_ms: number

      Returns void

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    • Parameters

      • estimated_score: number
      • ownership: number[][]
      • Optional score: number

      Returns void

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/classes/StoneString.html b/docs/classes/StoneString.html index 4866f02f..2002709c 100644 --- a/docs/classes/StoneString.html +++ b/docs/classes/StoneString.html @@ -1,6 +1,6 @@ StoneString | goban

    Class StoneString

    A StoneString instance represents a group of intersections that are connected to each other and are all the same color.

    -

    Constructors

    Constructors

    Properties

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      -

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's +

    Constructors

    Properties

    __added_neighbors: {
        [group_id: number]: boolean;
    }

    Type declaration

    • [group_id: number]: boolean
    id: number
    intersections: JGOFIntersection[]
    is_territory: boolean = false
    neighboring_space: StoneString[]
    neighboring_stone_strings: StoneString[]
    neighbors: StoneString[]
    territory_color: JGOFNumericPlayerColor = 0

    Methods

    • Adds a stone string to our neighbor list. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      Returns void

    • Add a stone to the group. This should probably only be called by StoneStringBuilder.

      +

      Parameters

      • x: number
      • y: number

      Returns void

    • Compute if this string is considered potential territory (if all of it's neighbors are the same color). NOTE: This does not perform any advanced logic to determine seki status or anything like that, this only looks to see if the string contains EMPTY locations and that all of the surrounding neighboring are the same color. This should probably only be called by StoneStringBuilder.

      -

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    • Parameters

      • fn: ((stone_string) => void)
          • (stone_string): void
          • Parameters

            Returns void

      Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/StoneStringBuilder.html b/docs/classes/StoneStringBuilder.html index acad71d7..e8528b6a 100644 --- a/docs/classes/StoneStringBuilder.html +++ b/docs/classes/StoneStringBuilder.html @@ -1,7 +1,7 @@ -StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    constructor +StoneStringBuilder | goban

    Class StoneStringBuilder

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file +

    Constructors

    Properties

    state: BoardState
    stone_string_id_map: number[][]
    stone_strings: StoneString[]

    Methods

    \ No newline at end of file diff --git a/docs/classes/TestGoban.html b/docs/classes/TestGoban.html index 2e85ee52..37cc673b 100644 --- a/docs/classes/TestGoban.html +++ b/docs/classes/TestGoban.html @@ -1,5 +1,5 @@ TestGoban | goban

    Class TestGoban

    This is a minimal implementation of Goban, primarily used for unit tests.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    parent: HTMLElement
    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    THEMES: ThemesInterface = THEMES
    THEMES_SORTED: {
        black: GobanTheme[];
        board: GobanTheme[];
        white: GobanTheme[];
        [key: string]: GobanTheme[];
    } = THEMES_SORTED

    Type declaration

    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes a move string like "A11" into a move object like {x: 0, y: 10}. Also handles the special cases like ".." and "pass" which map to {x: -1, y: -1}.

      -

      Parameters

      • coordinates: string

      Returns JGOFMove

    • Marks scores on the board when in analysis mode. Note: this will not clear existing scores, this is intentional as I think it's the expected behavior of reviewers

      -

      Returns void

    • Goban calls some abstract methods as part of the construction process. Because our subclasses might (and do) need to do some of their own config before these are called, we set this function to be called by our subclass after it's done it's own internal config stuff.

      -

      Returns GobanEngine

    • When we think our clock has runout, send a message to the server letting it know. Otherwise we have to wait for the server grace period to expire for it to time us out.

      -

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • msg_id: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    • Parameters

      • x: number
      • y: number
      • mark: string | number
      • Optional force_label: boolean
      • Optional force_put: boolean

      Returns boolean

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/classes/_internal_.OGSConnectivity.html b/docs/classes/_internal_.OGSConnectivity.html index 44859c6d..6a01d70b 100644 --- a/docs/classes/_internal_.OGSConnectivity.html +++ b/docs/classes/_internal_.OGSConnectivity.html @@ -2,7 +2,7 @@ that manages connections to the online-go.com servers.

    We have it as a separate base class simply to help with code organization and to keep our Goban class size down.

    -

    Hierarchy (view full)

    Constructors

    Hierarchy (view full)

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    -
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any +

    Constructors

    Properties

    __board_redraw_pen_layer_timer: any = null
    __clock_timer?: Timeout
    __draw_state: string[][]
    __last_pt: {
        i: number;
        j: number;
        valid: boolean;
    } = ...

    Type declaration

    • i: number
    • j: number
    • valid: boolean
    __update_move_tree: any = null
    analysis_move_counter: number
    analysis_removal_last_position: {
        i: number;
        j: number;
    } = ...

    Type declaration

    • i: number
    • j: number
    analysis_removal_state?: boolean
    bounded_height: number
    bounded_width: number
    bounds: GobanBounds
    chat_log: GobanChatLog = []
    circle_radius: number
    clock_should_be_paused_for_move_submission: boolean = false
    colored_circles?: (undefined | ColoredCircle)[][]
    conditional_path: string = ""
    conditional_starting_color: "black" | "white" | "invalid" = "invalid"
    conditional_tree: ConditionalMoveTree = ...
    config: GobanConfig
    connectToReviewSent?: boolean
    current_cmove?: ConditionalMoveTree
    currently_my_cmove: boolean = false
    dirty_redraw: any = null
    disconnectedFromGame: boolean = true
    display_width?: number
    done_loading_review: boolean = false
    dont_draw_last_move: boolean
    double_click_submit: boolean
    draw_bottom_labels: boolean
    draw_left_labels: boolean
    draw_right_labels: boolean
    draw_top_labels: boolean
    edit_color?: "black" | "white"
    engine: GobanEngine
    errorHandler: ((e) => void)

    Type declaration

      • (e): void
      • Parameters

        • e: Error

        Returns void

    game_id: number
    game_type: string
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    goban_id: number = ++last_goban_id

    Base fields *

    +
    heatmap?: NumberMatrix
    height: number
    highlight_movetree_moves: boolean
    interactive: boolean
    isInPushedAnalysis: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    label_character: string
    label_mark: string = "[UNSET]"
    last_clock?: AdHocClock
    last_emitted_clock?: JGOFClockWithTransmitting
    last_hover_square?: JGOFIntersection
    last_move?: MoveTree
    last_move_radius: number
    last_paused_by_player_state: null | boolean = null
    last_paused_state: null | boolean = null
    last_phase?: GobanEnginePhase
    last_review_message: ReviewMessage
    last_sound_played_for_a_stone_placement?: string
    last_stone_sound: number
    leavePushedAnalysis: (() => void)

    Type declaration

      • (): void
      • Returns void

    marked_analysis_score?: boolean[][]
    move_selected?: JGOFIntersection
    no_display: boolean
    onError?: ((error) => void)

    Type declaration

      • (error): void
      • Parameters

        • error: Error

        Returns void

    on_game_screen: boolean
    one_click_submit: boolean
    original_square_size: number | ((goban) => number) | "auto"

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    pause_control?: AdHocPauseControl
    paused_since?: number
    pen_marks: any[]
    player_id: number
    preloaded_data?: GobanConfig
    previous_mode: string
    puzzle_autoplace_delay: number
    restrict_moves_to_movetree: boolean
    review_had_gamedata: boolean
    review_id: number
    scoring_mode: boolean | "stalling-scoring-mode"
    sendLatencyTimer?: Timeout
    sent_timed_out_message: boolean = false
    shift_key_is_down: boolean
    show_move_numbers: boolean
    show_variation_move_numbers: boolean
    showing_scores: boolean = false
    socket_event_bindings: [keyof GobanSocketEvents, (() => void)][] = []
    square_size: number = 10
    stalling_score_estimate?: StallingScoreEstimate
    stone_placement_enabled: boolean
    stone_removal_auto_scoring_done?: boolean = false
    variation_stone_opacity: number
    visual_undo_request_indicator: boolean
    width: number
    setCallbacks: ((newCallbacks) => void) = setGobanCallbacks

    Type declaration

      • (newCallbacks): void
      • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

        -

        Parameters

        Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      -

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Decodes any of the various ways we express moves that we've accumulated over the years into +

      Parameters

      Returns void

    setTranslations: ((_catalog, _debug_mode?) => void) = setGobanTranslations

    Type declaration

      • (_catalog, _debug_mode?): void
      • Parameters

        Returns void

    Accessors

    • get analyze_subtool(): string
    • Returns string

    • set analyze_subtool(analyze_subtool): void
    • Parameters

      • analyze_subtool: string

      Returns void

    • get destroyed(): boolean
    • Returns boolean

    • get is_game_record(): boolean
    • True if the game is a game record of a real life game

      +

      Returns boolean

    • get review_controller_id(): undefined | number
    • Returns undefined | number

    • set review_controller_id(review_controller_id): void
    • Parameters

      • review_controller_id: undefined | number

      Returns void

    • get review_owner_id(): undefined | number
    • Returns undefined | number

    • set review_owner_id(review_owner_id): void
    • Parameters

      • review_owner_id: undefined | number

      Returns void

    • get submit_move(): undefined | (() => void)
    • Returns undefined | (() => void)

    • set submit_move(submit_move): void
    • Parameters

      • submit_move: undefined | (() => void)

      Returns void

    Methods

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Parameters

      • colored_marks: {
            [key: string]: {
                color: string;
                move: string;
            };
        }
        • [key: string]: {
              color: string;
              move: string;
          }
          • color: string
          • move: string

      Returns void

    • Called when a location is marked or unmarked for removal

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • This is a callback that gets called by GobanEngine.getState to save and board state as it pushes and pops state. Our renderers can override this to save state they need.

      -

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • This is a callback that gets called by GobanEngine.setState to load +

      Parameters

      • marks: {
            [mark: string]: string;
        }
        • [mark: string]: string
      • Optional dont_draw: boolean

      Returns void

    • Parameters

      • x: number
      • y: number
      • anti_slip: boolean = true

      Returns {
          i: number;
          j: number;
          valid: boolean;
      }

      • i: number
      • j: number
      • valid: boolean
    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/enums/JGOFNumericPlayerColor.html b/docs/enums/JGOFNumericPlayerColor.html index c1c7cd3d..c475140c 100644 --- a/docs/enums/JGOFNumericPlayerColor.html +++ b/docs/enums/JGOFNumericPlayerColor.html @@ -1,4 +1,4 @@ -JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    BLACK +JGOFNumericPlayerColor | goban

    Enumeration JGOFNumericPlayerColor

    Enumeration Members

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file +

    Enumeration Members

    BLACK: 1
    EMPTY: 0
    WHITE: 2
    \ No newline at end of file diff --git a/docs/enums/protocol.RemoteStorageReplication.html b/docs/enums/protocol.RemoteStorageReplication.html index 489c03d1..d14028e1 100644 --- a/docs/enums/protocol.RemoteStorageReplication.html +++ b/docs/enums/protocol.RemoteStorageReplication.html @@ -1,13 +1,13 @@ RemoteStorageReplication | goban

    Enumeration RemoteStorageReplication

    This enum defines the various replication strategies for the remote storage system. For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

    -

    Enumeration Members

    Enumeration Members

    LOCAL_OVERWRITES_REMOTE: 1

    Locally set data will overwrite remotely set data, but if not set will default to remotely set data

    -
    NONE: 0

    No replication of this change

    -
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    -
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    -
    \ No newline at end of file +
    NONE: 0

    No replication of this change

    +
    REMOTE_ONLY: 4

    Remotely set data, but do not update our local value

    +
    REMOTE_OVERWRITES_LOCAL: 2

    Remotely set data will overwrite locally set data

    +
    \ No newline at end of file diff --git a/docs/functions/adjust_estimate.html b/docs/functions/adjust_estimate.html index d1ae1383..5e10eeea 100644 --- a/docs/functions/adjust_estimate.html +++ b/docs/functions/adjust_estimate.html @@ -4,4 +4,4 @@
  • area_map: number[][]

    Representation of the ownership, 1=Black, -1=White, 0=Undecided using Area rules

  • score: number

    estimated score (not accounting for captures)

    -
  • Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file +

    Returns {
        ownership: Matrix<number>;
        score: number;
    }

    \ No newline at end of file diff --git a/docs/functions/allocateCanvasOrError.html b/docs/functions/allocateCanvasOrError.html index 3a6b9138..6201e252 100644 --- a/docs/functions/allocateCanvasOrError.html +++ b/docs/functions/allocateCanvasOrError.html @@ -5,4 +5,4 @@

    If string dimensions are used we'll use setAttribute, if numbers are used we'll set the canvas .width and .height parameter. This is for device scaling considerations when the given dimensions are scaled on HDPI devices.

    -

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file +

    Parameters

    Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/autoscore.html b/docs/functions/autoscore.html index 558370cb..2adea184 100644 --- a/docs/functions/autoscore.html +++ b/docs/functions/autoscore.html @@ -1 +1 @@ -autoscore | goban

    Function autoscore

    \ No newline at end of file +autoscore | goban

    Function autoscore

    \ No newline at end of file diff --git a/docs/functions/char2num.html b/docs/functions/char2num.html index a7008905..a9c9fd0e 100644 --- a/docs/functions/char2num.html +++ b/docs/functions/char2num.html @@ -1 +1 @@ -char2num | goban

    Function char2num

    \ No newline at end of file +char2num | goban

    Function char2num

    \ No newline at end of file diff --git a/docs/functions/cloneMatrix.html b/docs/functions/cloneMatrix.html index 124e66ef..df268e09 100644 --- a/docs/functions/cloneMatrix.html +++ b/docs/functions/cloneMatrix.html @@ -1,2 +1,2 @@ cloneMatrix | goban

    Function cloneMatrix

    • Returns a cloned copy of the provided matrix

      -

      Type Parameters

      • T

      Parameters

      • matrix: T[][]

      Returns T[][]

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/closeErrorCodeToString.html b/docs/functions/closeErrorCodeToString.html index f67b2bfe..725f3cf3 100644 --- a/docs/functions/closeErrorCodeToString.html +++ b/docs/functions/closeErrorCodeToString.html @@ -1 +1 @@ -closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file +closeErrorCodeToString | goban

    Function closeErrorCodeToString

    \ No newline at end of file diff --git a/docs/functions/color_blend.html b/docs/functions/color_blend.html index f0a817aa..63444210 100644 --- a/docs/functions/color_blend.html +++ b/docs/functions/color_blend.html @@ -1,2 +1,2 @@ color_blend | goban

    Function color_blend

    • Simple 50% blend of two colors in hex format

      -

      Parameters

      • c1: string
      • c2: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/computeAverageMoveTime.html b/docs/functions/computeAverageMoveTime.html index e4af07c2..260a4b08 100644 --- a/docs/functions/computeAverageMoveTime.html +++ b/docs/functions/computeAverageMoveTime.html @@ -1,2 +1,2 @@ computeAverageMoveTime | goban

    Function computeAverageMoveTime

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/createDeviceScaledCanvas.html b/docs/functions/createDeviceScaledCanvas.html index bb05d277..9d0e4e5d 100644 --- a/docs/functions/createDeviceScaledCanvas.html +++ b/docs/functions/createDeviceScaledCanvas.html @@ -1 +1 @@ -createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +createDeviceScaledCanvas | goban

    Function createDeviceScaledCanvas

    • Parameters

      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/createGoban.html b/docs/functions/createGoban.html index 93bf9d0a..932586ee 100644 --- a/docs/functions/createGoban.html +++ b/docs/functions/createGoban.html @@ -1 +1 @@ -createGoban | goban

    Function createGoban

    \ No newline at end of file +createGoban | goban

    Function createGoban

    \ No newline at end of file diff --git a/docs/functions/decodeCoordinate.html b/docs/functions/decodeCoordinate.html index 0d6a225e..cbc482d3 100644 --- a/docs/functions/decodeCoordinate.html +++ b/docs/functions/decodeCoordinate.html @@ -1,2 +1,2 @@ decodeCoordinate | goban

    Function decodeCoordinate

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/decodeGTPCoordinates.html b/docs/functions/decodeGTPCoordinates.html index 4d7ea26b..b146c392 100644 --- a/docs/functions/decodeGTPCoordinates.html +++ b/docs/functions/decodeGTPCoordinates.html @@ -1,2 +1,2 @@ decodeGTPCoordinates | goban

    Function decodeGTPCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodeMoves.html b/docs/functions/decodeMoves.html index ede7f97e..24a6ae61 100644 --- a/docs/functions/decodeMoves.html +++ b/docs/functions/decodeMoves.html @@ -1,3 +1,3 @@ decodeMoves | goban

    Function decodeMoves

    \ No newline at end of file +

    Parameters

    Returns JGOFMove[]

    \ No newline at end of file diff --git a/docs/functions/decodePrettyCoordinates.html b/docs/functions/decodePrettyCoordinates.html index 7b07fb44..ac40e8dc 100644 --- a/docs/functions/decodePrettyCoordinates.html +++ b/docs/functions/decodePrettyCoordinates.html @@ -1,2 +1,2 @@ decodePrettyCoordinates | goban

    Function decodePrettyCoordinates

    \ No newline at end of file +

    Parameters

    Returns JGOFMove

    \ No newline at end of file diff --git a/docs/functions/decodePrettyXCoordinate.html b/docs/functions/decodePrettyXCoordinate.html index cbb68c39..aa8ca00a 100644 --- a/docs/functions/decodePrettyXCoordinate.html +++ b/docs/functions/decodePrettyXCoordinate.html @@ -1,2 +1,2 @@ decodePrettyXCoordinate | goban

    Function decodePrettyXCoordinate

    • Decodes the pretty X coordinate to a number

      -

      Parameters

      • ch: string

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/deepClone.html b/docs/functions/deepClone.html index c75ddab0..5da9fd57 100644 --- a/docs/functions/deepClone.html +++ b/docs/functions/deepClone.html @@ -1,2 +1,2 @@ deepClone | goban

    Function deepClone

    \ No newline at end of file +

    Parameters

    Returns any

    \ No newline at end of file diff --git a/docs/functions/deepEqual.html b/docs/functions/deepEqual.html index 5c889ab0..e5809878 100644 --- a/docs/functions/deepEqual.html +++ b/docs/functions/deepEqual.html @@ -1,2 +1,2 @@ deepEqual | goban

    Function deepEqual

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/deviceCanvasScalingRatio.html b/docs/functions/deviceCanvasScalingRatio.html index 86826f47..2cd7ca7f 100644 --- a/docs/functions/deviceCanvasScalingRatio.html +++ b/docs/functions/deviceCanvasScalingRatio.html @@ -1 +1 @@ -deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file +deviceCanvasScalingRatio | goban

    Function deviceCanvasScalingRatio

    \ No newline at end of file diff --git a/docs/functions/elementOffset.html b/docs/functions/elementOffset.html index 8dca7acb..46bb2d74 100644 --- a/docs/functions/elementOffset.html +++ b/docs/functions/elementOffset.html @@ -1 +1 @@ -elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file +elementOffset | goban

    Function elementOffset

    • Parameters

      • element: HTMLElement

      Returns {
          left: number;
          top: number;
      }

      • left: number
      • top: number
    \ No newline at end of file diff --git a/docs/functions/encodeCoordinate.html b/docs/functions/encodeCoordinate.html index 52cf5326..6e0d4621 100644 --- a/docs/functions/encodeCoordinate.html +++ b/docs/functions/encodeCoordinate.html @@ -1,2 +1,2 @@ encodeCoordinate | goban

    Function encodeCoordinate

    • Encodes a single coordinate to a number

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/encodeMove.html b/docs/functions/encodeMove.html index fa997ef6..e48972f1 100644 --- a/docs/functions/encodeMove.html +++ b/docs/functions/encodeMove.html @@ -1 +1 @@ -encodeMove | goban

    Function encodeMove

    \ No newline at end of file +encodeMove | goban

    Function encodeMove

    \ No newline at end of file diff --git a/docs/functions/encodeMoveToArray.html b/docs/functions/encodeMoveToArray.html index 1db716e7..073ada7f 100644 --- a/docs/functions/encodeMoveToArray.html +++ b/docs/functions/encodeMoveToArray.html @@ -1 +1 @@ -encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file +encodeMoveToArray | goban

    Function encodeMoveToArray

    \ No newline at end of file diff --git a/docs/functions/encodeMoves.html b/docs/functions/encodeMoves.html index 4369553f..b85fd841 100644 --- a/docs/functions/encodeMoves.html +++ b/docs/functions/encodeMoves.html @@ -1 +1 @@ -encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file +encodeMoves | goban

    Function encodeMoves

    \ No newline at end of file diff --git a/docs/functions/encodeMovesToArray.html b/docs/functions/encodeMovesToArray.html index d113b2ba..5e78302a 100644 --- a/docs/functions/encodeMovesToArray.html +++ b/docs/functions/encodeMovesToArray.html @@ -1 +1 @@ -encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file +encodeMovesToArray | goban

    Function encodeMovesToArray

    \ No newline at end of file diff --git a/docs/functions/encodePrettyXCoordinate.html b/docs/functions/encodePrettyXCoordinate.html index 7ecee883..91141363 100644 --- a/docs/functions/encodePrettyXCoordinate.html +++ b/docs/functions/encodePrettyXCoordinate.html @@ -1,2 +1,2 @@ encodePrettyXCoordinate | goban

    Function encodePrettyXCoordinate

    • Encodes an X coordinate to a display encoding

      -

      Parameters

      • coor: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/escapeSGFText.html b/docs/functions/escapeSGFText.html index 9ee6876f..b8a74443 100644 --- a/docs/functions/escapeSGFText.html +++ b/docs/functions/escapeSGFText.html @@ -1 +1 @@ -escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file +escapeSGFText | goban

    Function escapeSGFText

    • Parameters

      • txt: string
      • escapeColon: boolean = false

      Returns string

    \ No newline at end of file diff --git a/docs/functions/getRandomInt.html b/docs/functions/getRandomInt.html index 44bcaad0..51d3b187 100644 --- a/docs/functions/getRandomInt.html +++ b/docs/functions/getRandomInt.html @@ -1,2 +1,2 @@ getRandomInt | goban

    Function getRandomInt

    • Returns a random integer between min (inclusive) and max (exclusive)

      -

      Parameters

      • min: number
      • max: number

      Returns number

    \ No newline at end of file +

    Parameters

    Returns number

    \ No newline at end of file diff --git a/docs/functions/getRelativeEventPosition.html b/docs/functions/getRelativeEventPosition.html index e054a709..dcb3a2c0 100644 --- a/docs/functions/getRelativeEventPosition.html +++ b/docs/functions/getRelativeEventPosition.html @@ -1,2 +1,2 @@ getRelativeEventPosition | goban

    Function getRelativeEventPosition

    • Returns {x,y} of the event relative to the event target

      -

      Parameters

      • event: TouchEvent | MouseEvent
      • Optional target: HTMLElement

      Returns {
          x: number;
          y: number;
      }

      • x: number
      • y: number
    \ No newline at end of file +

    Parameters

    Returns {
        x: number;
        y: number;
    }

    \ No newline at end of file diff --git a/docs/functions/getWorstMoves.html b/docs/functions/getWorstMoves.html index bf4b27c5..dd1050cd 100644 --- a/docs/functions/getWorstMoves.html +++ b/docs/functions/getWorstMoves.html @@ -1,4 +1,4 @@ getWorstMoves | goban

    Function getWorstMoves

    \ No newline at end of file +

    Parameters

    Returns AIReviewWorstMoveEntry[]

    \ No newline at end of file diff --git a/docs/functions/init_remote_ownership_estimator.html b/docs/functions/init_remote_ownership_estimator.html index b7c43cc4..817cccac 100644 --- a/docs/functions/init_remote_ownership_estimator.html +++ b/docs/functions/init_remote_ownership_estimator.html @@ -1 +1 @@ -init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file +init_remote_ownership_estimator | goban

    Function init_remote_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/init_wasm_ownership_estimator.html b/docs/functions/init_wasm_ownership_estimator.html index f1d48dad..0bd71cfe 100644 --- a/docs/functions/init_wasm_ownership_estimator.html +++ b/docs/functions/init_wasm_ownership_estimator.html @@ -1 +1 @@ -init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file +init_wasm_ownership_estimator | goban

    Function init_wasm_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/makeEmptyMatrix.html b/docs/functions/makeEmptyMatrix.html index 7c067ea4..28faaf6c 100644 --- a/docs/functions/makeEmptyMatrix.html +++ b/docs/functions/makeEmptyMatrix.html @@ -1 +1 @@ -makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file +makeEmptyMatrix | goban

    Function makeEmptyMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns (T | undefined)[][]

    \ No newline at end of file diff --git a/docs/functions/makeMatrix.html b/docs/functions/makeMatrix.html index 9e0c5748..e626f547 100644 --- a/docs/functions/makeMatrix.html +++ b/docs/functions/makeMatrix.html @@ -1 +1 @@ -makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file +makeMatrix | goban

    Function makeMatrix

    \ No newline at end of file diff --git a/docs/functions/makeObjectMatrix.html b/docs/functions/makeObjectMatrix.html index 6d115dc4..52de0fbc 100644 --- a/docs/functions/makeObjectMatrix.html +++ b/docs/functions/makeObjectMatrix.html @@ -1 +1 @@ -makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file +makeObjectMatrix | goban

    Function makeObjectMatrix

    • Type Parameters

      • T

      Parameters

      • width: number
      • height: number

      Returns T[][]

    \ No newline at end of file diff --git a/docs/functions/matricesAreEqual.html b/docs/functions/matricesAreEqual.html index 00df25fd..db67daa9 100644 --- a/docs/functions/matricesAreEqual.html +++ b/docs/functions/matricesAreEqual.html @@ -1,3 +1,3 @@ matricesAreEqual | goban

    Function matricesAreEqual

    • Returns true if the contents of the two 2d matrices are equal when the cells are compared with ===

      -

      Type Parameters

      • T

      Parameters

      • m1: T[][]
      • m2: T[][]

      Returns boolean

    \ No newline at end of file +

    Type Parameters

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/newlines_to_spaces.html b/docs/functions/newlines_to_spaces.html index 4bc98ec2..46517b3e 100644 --- a/docs/functions/newlines_to_spaces.html +++ b/docs/functions/newlines_to_spaces.html @@ -1,3 +1,3 @@ newlines_to_spaces | goban

    Function newlines_to_spaces

    • SGF "simple text", eg used in the LB property, we can't have newlines. This strips them and replaces them with spaces.

      -

      Parameters

      • txt: string

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/niceInterval.html b/docs/functions/niceInterval.html index aa77e781..66760d5e 100644 --- a/docs/functions/niceInterval.html +++ b/docs/functions/niceInterval.html @@ -1,4 +1,4 @@ niceInterval | goban

    Function niceInterval

    • Like setInterval, but debounces catchups (multiple invocation in rapid succession less than our desired interval) that happen in some browsers when tabs wake up from sleep. Cleared with the standard clearInterval.

      -

      Parameters

      • callback: (() => void)
          • (): void
          • Returns void

      • interval: number

      Returns ReturnType<typeof setInterval>

    \ No newline at end of file +

    Parameters

    Returns ReturnType<typeof setInterval>

    \ No newline at end of file diff --git a/docs/functions/num2char.html b/docs/functions/num2char.html index 04f07e12..a98cdf49 100644 --- a/docs/functions/num2char.html +++ b/docs/functions/num2char.html @@ -1 +1 @@ -num2char | goban

    Function num2char

    \ No newline at end of file +num2char | goban

    Function num2char

    \ No newline at end of file diff --git a/docs/functions/ojeSequenceToMoves.html b/docs/functions/ojeSequenceToMoves.html index 26b25ead..96f33471 100644 --- a/docs/functions/ojeSequenceToMoves.html +++ b/docs/functions/ojeSequenceToMoves.html @@ -1 +1 @@ -ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file +ojeSequenceToMoves | goban

    Function ojeSequenceToMoves

    \ No newline at end of file diff --git a/docs/functions/placeRenderedImageStone.html b/docs/functions/placeRenderedImageStone.html index 6ae092c5..26f8c4d2 100644 --- a/docs/functions/placeRenderedImageStone.html +++ b/docs/functions/placeRenderedImageStone.html @@ -1 +1 @@ -placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file +placeRenderedImageStone | goban

    Function placeRenderedImageStone

    • Parameters

      • ctx: CanvasRenderingContext2D
      • shadow_ctx: null | CanvasRenderingContext2D
      • stone: StoneType
      • cx: number
      • cy: number
      • radius: number

      Returns void

    \ No newline at end of file diff --git a/docs/functions/positionId.html b/docs/functions/positionId.html index 6a7579d6..2b7e8fe4 100644 --- a/docs/functions/positionId.html +++ b/docs/functions/positionId.html @@ -1 +1 @@ -positionId | goban

    Function positionId

    \ No newline at end of file +positionId | goban

    Function positionId

    \ No newline at end of file diff --git a/docs/functions/preRenderImageStone.html b/docs/functions/preRenderImageStone.html index 63fb18b5..13d565dd 100644 --- a/docs/functions/preRenderImageStone.html +++ b/docs/functions/preRenderImageStone.html @@ -1 +1 @@ -preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file +preRenderImageStone | goban

    Function preRenderImageStone

    \ No newline at end of file diff --git a/docs/functions/prettyCoordinates.html b/docs/functions/prettyCoordinates.html index 711cda46..d4a72947 100644 --- a/docs/functions/prettyCoordinates.html +++ b/docs/functions/prettyCoordinates.html @@ -1,2 +1,2 @@ prettyCoordinates | goban

    Function prettyCoordinates

    • Encodes an x,y pair to "pretty" coordinates, like "A3", or "K10"

      -

      Parameters

      • x: number
      • y: number
      • board_height: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/resizeDeviceScaledCanvas.html b/docs/functions/resizeDeviceScaledCanvas.html index 4677b8d5..77703f3e 100644 --- a/docs/functions/resizeDeviceScaledCanvas.html +++ b/docs/functions/resizeDeviceScaledCanvas.html @@ -1 +1 @@ -resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file +resizeDeviceScaledCanvas | goban

    Function resizeDeviceScaledCanvas

    • Parameters

      • canvas: HTMLCanvasElement
      • width: number
      • height: number

      Returns HTMLCanvasElement

    \ No newline at end of file diff --git a/docs/functions/setGobanCallbacks.html b/docs/functions/setGobanCallbacks.html index 156fb127..10831524 100644 --- a/docs/functions/setGobanCallbacks.html +++ b/docs/functions/setGobanCallbacks.html @@ -1,3 +1,3 @@ setGobanCallbacks | goban

    Function setGobanCallbacks

    • Set's callback functions to be called in various situations. You can set any or all of the callbacks, only the provided callbacks will be updated.

      -

      Parameters

      Returns void

    \ No newline at end of file +

    Parameters

    Returns void

    \ No newline at end of file diff --git a/docs/functions/setGobanRenderer.html b/docs/functions/setGobanRenderer.html index 5a5093e9..cdf735cc 100644 --- a/docs/functions/setGobanRenderer.html +++ b/docs/functions/setGobanRenderer.html @@ -1 +1 @@ -setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file +setGobanRenderer | goban

    Function setGobanRenderer

    • Parameters

      • _renderer: "canvas" | "svg"

      Returns void

    \ No newline at end of file diff --git a/docs/functions/set_local_ownership_estimator.html b/docs/functions/set_local_ownership_estimator.html index b4588c7e..4ae33c26 100644 --- a/docs/functions/set_local_ownership_estimator.html +++ b/docs/functions/set_local_ownership_estimator.html @@ -1 +1 @@ -set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file +set_local_ownership_estimator | goban

    Function set_local_ownership_estimator

    \ No newline at end of file diff --git a/docs/functions/shortDurationString.html b/docs/functions/shortDurationString.html index d667d3bb..afe8b527 100644 --- a/docs/functions/shortDurationString.html +++ b/docs/functions/shortDurationString.html @@ -1,2 +1,2 @@ shortDurationString | goban

    Function shortDurationString

    • Takes a number of seconds and returns a string like "1d 3h 2m 52s"

      -

      Parameters

      • seconds: number

      Returns string

    \ No newline at end of file +

    Parameters

    Returns string

    \ No newline at end of file diff --git a/docs/functions/sortMoves.html b/docs/functions/sortMoves.html index 32c2abee..45992b04 100644 --- a/docs/functions/sortMoves.html +++ b/docs/functions/sortMoves.html @@ -1,2 +1,2 @@ sortMoves | goban

    Function sortMoves

    \ No newline at end of file +

    Parameters

    Returns string

  • Parameters

    • moves: JGOFMove[]
    • width: number
    • height: number

    Returns JGOFMove[]

  • \ No newline at end of file diff --git a/docs/functions/translate._.html b/docs/functions/translate._.html index 845a8abf..add52cea 100644 --- a/docs/functions/translate._.html +++ b/docs/functions/translate._.html @@ -1 +1 @@ -_ | goban

    Function _

    \ No newline at end of file +_ | goban

    Function _

    \ No newline at end of file diff --git a/docs/functions/translate.interpolate.html b/docs/functions/translate.interpolate.html index 23f3c9be..493c2202 100644 --- a/docs/functions/translate.interpolate.html +++ b/docs/functions/translate.interpolate.html @@ -1 +1 @@ -interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file +interpolate | goban

    Function interpolate

    • Parameters

      • str: string
      • params: any

      Returns string

    \ No newline at end of file diff --git a/docs/functions/translate.setGobanTranslations.html b/docs/functions/translate.setGobanTranslations.html index 92fd65b7..491cff61 100644 --- a/docs/functions/translate.setGobanTranslations.html +++ b/docs/functions/translate.setGobanTranslations.html @@ -1 +1 @@ -setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file +setGobanTranslations | goban

    Function setGobanTranslations

    \ No newline at end of file diff --git a/docs/functions/validateCanvas.html b/docs/functions/validateCanvas.html index ea20c22c..44c53f6a 100644 --- a/docs/functions/validateCanvas.html +++ b/docs/functions/validateCanvas.html @@ -1,4 +1,4 @@ validateCanvas | goban

    Function validateCanvas

    • Validates that a canvas was created successfully and a 2d context can be allocated for it. If not, we call the GobanCore.canvasAllocationErrorHandler hook.

      -

      Parameters

      • canvas: null | HTMLCanvasElement
      • Optional err: Error
      • Optional width: string | number
      • Optional height: string | number

      Returns boolean

    \ No newline at end of file +

    Parameters

    Returns boolean

    \ No newline at end of file diff --git a/docs/functions/voronoi_estimate_ownership.html b/docs/functions/voronoi_estimate_ownership.html index 75a9f90d..521fa708 100644 --- a/docs/functions/voronoi_estimate_ownership.html +++ b/docs/functions/voronoi_estimate_ownership.html @@ -1,4 +1,4 @@ voronoi_estimate_ownership | goban

    Function voronoi_estimate_ownership

    \ No newline at end of file +

    Parameters

    Returns number[][]

    \ No newline at end of file diff --git a/docs/functions/wasm_estimate_ownership.html b/docs/functions/wasm_estimate_ownership.html index 7dfb9547..7f61b979 100644 --- a/docs/functions/wasm_estimate_ownership.html +++ b/docs/functions/wasm_estimate_ownership.html @@ -1 +1 @@ -wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file +wasm_estimate_ownership | goban

    Function wasm_estimate_ownership

    \ No newline at end of file diff --git a/docs/interfaces/AIReviewWorstMoveEntry.html b/docs/interfaces/AIReviewWorstMoveEntry.html index 03ab9445..1d7180d4 100644 --- a/docs/interfaces/AIReviewWorstMoveEntry.html +++ b/docs/interfaces/AIReviewWorstMoveEntry.html @@ -1,5 +1,5 @@ -AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta +AIReviewWorstMoveEntry | goban

    Interface AIReviewWorstMoveEntry

    interface AIReviewWorstMoveEntry {
        delta: number;
        move: JGOFIntersection;
        move_number: number;
        player: JGOFNumericPlayerColor;
    }

    Properties

    delta: number
    move_number: number
    \ No newline at end of file +

    Properties

    delta: number
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/AdHocClock.html b/docs/interfaces/AdHocClock.html index e1006f47..e1d592ef 100644 --- a/docs/interfaces/AdHocClock.html +++ b/docs/interfaces/AdHocClock.html @@ -1,4 +1,4 @@ -AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id +AdHocClock | goban

    Interface AdHocClock

    interface AdHocClock {
        black_player_id: number;
        black_time: number | AdHocPlayerClock;
        current_player: number;
        expiration: number;
        game_id: number;
        last_move: number;
        pause?: {
            pause_control: AdHocPauseControl;
            paused: boolean;
            paused_since: number;
        };
        paused_since?: number;
        start_mode?: boolean;
        title: string;
        white_player_id: number;
        white_time: number | AdHocPlayerClock;
    }

    Properties

    black_player_id: number

    OGS player id for black

    -
    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case +

    black_time: number | AdHocPlayerClock

    Time left on black's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.

    -
    current_player: number

    Current player to move

    -
    expiration: number

    Time the game will end if no move is played, in milliseconds since +

    current_player: number

    Current player to move

    +
    expiration: number

    Time the game will end if no move is played, in milliseconds since 1970. This is computed by adding together any main and overtime left on the clock. If start_mode is set, this is the number of milliseconds left on the start clock.

    -
    game_id: number

    OGS Game id

    -
    last_move: number

    Time the last move was made, in milliseconds since 1970

    -
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    -

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the +

    game_id: number

    OGS Game id

    +
    last_move: number

    Time the last move was made, in milliseconds since 1970

    +
    pause?: {
        pause_control: AdHocPauseControl;
        paused: boolean;
        paused_since: number;
    }

    If set, this AdHocClock is updating the pause state

    +

    Type declaration

    paused_since?: number

    Time the game was paused. This field erroneously exists even after the game has been resumed, this will be removed in these cases.

    -
    start_mode?: boolean

    If true, the game has not started and this is the count down until +

    start_mode?: boolean

    If true, the game has not started and this is the count down until the game is canceled if a move has not been played yet. If this is true, then the duration left on the start clock is stored in expiration (in ms)

    -
    title: string

    Title of the game. This field will be removed.

    -
    white_player_id: number

    OGS player id for white

    -
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case +

    title: string

    Title of the game. This field will be removed.

    +
    white_player_id: number

    OGS player id for white

    +
    white_time: number | AdHocPlayerClock

    Time left on white's clock. If this is a number (such as is the case with simple time), it is expressed in milliseconds.k

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AdHocFormat.html b/docs/interfaces/AdHocFormat.html index 2e2ed863..8ab1b7ae 100644 --- a/docs/interfaces/AdHocFormat.html +++ b/docs/interfaces/AdHocFormat.html @@ -1,8 +1,8 @@ AdHocFormat | goban

    Interface AdHocFormat

    The to-be-deprecated format used by Online-Go.com, will be replaced by JGOF as we develop a migration plan

    -
    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    interface AdHocFormat {
        black: AdHocPlayer;
        clock: AdHocClock;
        pause_control: AdHocPauseControl;
        time_control: JGOFTimeControl;
        white: AdHocPlayer;
    }

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file +

    Properties

    clock: AdHocClock
    pause_control: AdHocPauseControl
    time_control: JGOFTimeControl
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPauseControl.html b/docs/interfaces/AdHocPauseControl.html index e70c29f1..de120194 100644 --- a/docs/interfaces/AdHocPauseControl.html +++ b/docs/interfaces/AdHocPauseControl.html @@ -1,6 +1,6 @@ -AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused? +AdHocPauseControl | goban

    Interface AdHocPauseControl

    interface AdHocPauseControl {
        moderator_paused?: {
            moderator_id: number;
        };
        paused?: {
            pauses_left: number;
            pausing_player_id: number;
        };
        stone-removal?: true;
        system?: true;
        weekend?: true;
        [vacation: string]: any;
    }

    Indexable

    [vacation: string]: any

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file +

    Properties

    moderator_paused?: {
        moderator_id: number;
    }

    Type declaration

    • moderator_id: number
    paused?: {
        pauses_left: number;
        pausing_player_id: number;
    }

    Type declaration

    • pauses_left: number
    • pausing_player_id: number
    stone-removal?: true
    system?: true
    weekend?: true
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayer.html b/docs/interfaces/AdHocPlayer.html index d16fbc39..7896d923 100644 --- a/docs/interfaces/AdHocPlayer.html +++ b/docs/interfaces/AdHocPlayer.html @@ -1,3 +1,3 @@ -AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    id +AdHocPlayer | goban

    Interface AdHocPlayer

    interface AdHocPlayer {
        id: number;
        name: string;
    }

    Properties

    Properties

    id: number
    name: string
    \ No newline at end of file +

    Properties

    id: number
    name: string
    \ No newline at end of file diff --git a/docs/interfaces/AdHocPlayerClock.html b/docs/interfaces/AdHocPlayerClock.html index 6e015c85..6a513170 100644 --- a/docs/interfaces/AdHocPlayerClock.html +++ b/docs/interfaces/AdHocPlayerClock.html @@ -1,4 +1,4 @@ -AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time? +AdHocPlayerClock | goban

    Interface AdHocPlayerClock

    interface AdHocPlayerClock {
        block_time?: number;
        moves_left?: number;
        period_time?: number;
        periods?: number;
        skip_bonus?: boolean;
        thinking_time: number;
    }

    Properties

    block_time?: number

    Used with canadian time control. Time left (in seconds) to make the remainder of your moves in yu

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    -
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    -
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not +

    period_time?: number

    Used with byo-yomi time control. Length of each period, in seconds.

    +
    periods?: number

    Used with byo-yomi time control. Number of periods left.

    +
    skip_bonus?: boolean

    Used with fischer time control to denote that the next move should not increment the clock.

    -
    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and +

    thinking_time: number

    Thinking time left, in seconds. Also used as main time for byo-yomi and canadian clocks.

    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/AudioClockEvent.html b/docs/interfaces/AudioClockEvent.html index 91fb2048..6eac74ef 100644 --- a/docs/interfaces/AudioClockEvent.html +++ b/docs/interfaces/AudioClockEvent.html @@ -1,14 +1,14 @@ -AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    clock +AudioClockEvent | goban

    Interface AudioClockEvent

    interface AudioClockEvent {
        clock: JGOFPlayerClock;
        color: PlayerColor;
        countdown_seconds: number;
        in_overtime: boolean;
        player_id: string;
        time_control_system: JGOFTimeControlSystem;
    }

    Properties

    Full player clock information

    -

    The player whose turn it is

    -
    countdown_seconds: number

    Number of seconds left in the current period

    -
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have +

    The player whose turn it is

    +
    countdown_seconds: number

    Number of seconds left in the current period

    +
    in_overtime: boolean

    True if we are in overtime. This is only ever set for systems that have a concept of overtime.

    -
    player_id: string

    The player (id) whose turn it is

    -
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    -
    \ No newline at end of file +
    player_id: string

    The player (id) whose turn it is

    +
    time_control_system: JGOFTimeControlSystem

    Time control system being used by the clock

    +
    \ No newline at end of file diff --git a/docs/interfaces/BoardConfig.html b/docs/interfaces/BoardConfig.html index df4a194d..ebd00278 100644 --- a/docs/interfaces/BoardConfig.html +++ b/docs/interfaces/BoardConfig.html @@ -1,4 +1,4 @@ -BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners? +BoardConfig | goban

    Interface BoardConfig

    interface BoardConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        isobranch_hash?: string;
        player?: JGOFNumericPlayerColor;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Implemented by

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    isobranch_hash?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/CanvasRendererGobanConfig.html b/docs/interfaces/CanvasRendererGobanConfig.html index 7fe490db..266946ba 100644 --- a/docs/interfaces/CanvasRendererGobanConfig.html +++ b/docs/interfaces/CanvasRendererGobanConfig.html @@ -1,4 +1,4 @@ -CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +CanvasRendererGobanConfig | goban

    Interface CanvasRendererGobanConfig

    interface CanvasRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/ColoredCircle.html b/docs/interfaces/ColoredCircle.html index 70d9689d..04fff7cc 100644 --- a/docs/interfaces/ColoredCircle.html +++ b/docs/interfaces/ColoredCircle.html @@ -1,5 +1,5 @@ -ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color? +ColoredCircle | goban

    Interface ColoredCircle

    interface ColoredCircle {
        border_color?: string;
        border_width?: number;
        color: string;
        move: JGOFIntersection;
    }

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file +

    Properties

    border_color?: string
    border_width?: number
    color: string
    \ No newline at end of file diff --git a/docs/interfaces/ConditionalMoveResponseTree.html b/docs/interfaces/ConditionalMoveResponseTree.html index 8cf40065..0e6ee6f7 100644 --- a/docs/interfaces/ConditionalMoveResponseTree.html +++ b/docs/interfaces/ConditionalMoveResponseTree.html @@ -1 +1 @@ -ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file +ConditionalMoveResponseTree | goban

    Interface ConditionalMoveResponseTree

    interface ConditionalMoveResponseTree {
        [move: string]: ConditionalMoveResponse;
    }

    Indexable

    [move: string]: ConditionalMoveResponse
    \ No newline at end of file diff --git a/docs/interfaces/GobanBounds.html b/docs/interfaces/GobanBounds.html index d409f139..9cb60513 100644 --- a/docs/interfaces/GobanBounds.html +++ b/docs/interfaces/GobanBounds.html @@ -1,5 +1,5 @@ -GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    bottom +GobanBounds | goban

    Interface GobanBounds

    interface GobanBounds {
        bottom: number;
        left: number;
        right: number;
        top: number;
    }

    Properties

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file +

    Properties

    bottom: number
    left: number
    right: number
    top: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanCallbacks.html b/docs/interfaces/GobanCallbacks.html index 502a4490..d14cd565 100644 --- a/docs/interfaces/GobanCallbacks.html +++ b/docs/interfaces/GobanCallbacks.html @@ -1,4 +1,4 @@ -GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowMoveNumbers?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput? +GobanCallbacks | goban

    Interface GobanCallbacks

    interface GobanCallbacks {
        addCoordinatesToChatInput?: ((coordinates) => void);
        canvasAllocationErrorHandler?: ((note, error, extra) => void);
        customBlackStoneColor?: (() => string);
        customBlackStoneUrl?: (() => string);
        customBlackTextColor?: (() => string);
        customBoardColor?: (() => string);
        customBoardLineColor?: (() => string);
        customBoardUrl?: (() => string);
        customWhiteStoneColor?: (() => string);
        customWhiteStoneUrl?: (() => string);
        customWhiteTextColor?: (() => string);
        defaultConfig?: (() => any);
        getCDNReleaseBase?: (() => string);
        getClockDrift?: (() => number);
        getCoordinateDisplaySystem?: (() => "A1" | "1-1");
        getLocation?: (() => string);
        getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number");
        getNetworkLatency?: (() => number);
        getSelectedThemes?: (() => GobanSelectedThemes);
        getShowMoveNumbers?: (() => boolean);
        getShowVariationMoveNumbers?: (() => boolean);
        getSoundEnabled?: (() => boolean);
        getSoundVolume?: (() => number);
        isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean);
        toast?: ((message_id, duration) => void);
        updateScoreEstimation?: ((est_winning_color, number_of_points) => void);
        watchSelectedThemes?: ((cb) => {
            remove: (() => any);
        });
    }

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file +

    Properties

    addCoordinatesToChatInput?: ((coordinates) => void)

    Type declaration

      • (coordinates): void
      • Parameters

        • coordinates: string

        Returns void

    canvasAllocationErrorHandler?: ((note, error, extra) => void)

    Type declaration

      • (note, error, extra): void
      • Parameters

        • note: null | string
        • error: Error
        • extra: {
              height?: string | number;
              total_allocations_made: number;
              total_pixels_allocated: number;
              width?: string | number;
          }
          • Optional height?: string | number
          • total_allocations_made: number
          • total_pixels_allocated: number
          • Optional width?: string | number

        Returns void

    customBlackStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBlackTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardLineColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customBoardUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteStoneUrl?: (() => string)

    Type declaration

      • (): string
      • Returns string

    customWhiteTextColor?: (() => string)

    Type declaration

      • (): string
      • Returns string

    defaultConfig?: (() => any)

    Type declaration

      • (): any
      • Returns any

    getCDNReleaseBase?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getClockDrift?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getCoordinateDisplaySystem?: (() => "A1" | "1-1")

    Type declaration

      • (): "A1" | "1-1"
      • Returns "A1" | "1-1"

    getLocation?: (() => string)

    Type declaration

      • (): string
      • Returns string

    getMoveTreeNumbering?: (() => "none" | "move-coordinates" | "move-number")

    Type declaration

      • (): "none" | "move-coordinates" | "move-number"
      • Returns "none" | "move-coordinates" | "move-number"

    getNetworkLatency?: (() => number)

    Type declaration

      • (): number
      • Returns number

    getSelectedThemes?: (() => GobanSelectedThemes)

    Type declaration

    getShowMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getShowVariationMoveNumbers?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundEnabled?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    getSoundVolume?: (() => number)

    Type declaration

      • (): number
      • Returns number

    isAnalysisDisabled?: ((goban, perGameSettingAppliesToNonPlayers) => boolean)

    Type declaration

      • (goban, perGameSettingAppliesToNonPlayers): boolean
      • Parameters

        • goban: GobanBase
        • perGameSettingAppliesToNonPlayers: boolean

        Returns boolean

    toast?: ((message_id, duration) => void)

    Type declaration

      • (message_id, duration): void
      • Parameters

        • message_id: string
        • duration: number

        Returns void

    updateScoreEstimation?: ((est_winning_color, number_of_points) => void)

    Type declaration

      • (est_winning_color, number_of_points): void
      • Parameters

        • est_winning_color: "black" | "white"
        • number_of_points: number

        Returns void

    watchSelectedThemes?: ((cb) => {
        remove: (() => any);
    })

    Type declaration

      • (cb): {
            remove: (() => any);
        }
      • Parameters

        Returns {
            remove: (() => any);
        }

        • remove: (() => any)
            • (): any
            • Returns any

    \ No newline at end of file diff --git a/docs/interfaces/GobanCanvasInterface.html b/docs/interfaces/GobanCanvasInterface.html index 9bf58ba7..c2605691 100644 --- a/docs/interfaces/GobanCanvasInterface.html +++ b/docs/interfaces/GobanCanvasInterface.html @@ -1,4 +1,4 @@ -GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanCanvasInterface | goban

    Interface GobanCanvasInterface

    interface GobanCanvasInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindCanvasEvents(canvas): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanConfig.html b/docs/interfaces/GobanConfig.html index 2ed3f59d..1fa4ae29 100644 --- a/docs/interfaces/GobanConfig.html +++ b/docs/interfaces/GobanConfig.html @@ -1,4 +1,4 @@ -GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanConfig | goban

    Interface GobanConfig

    interface GobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineConfig.html b/docs/interfaces/GobanEngineConfig.html index 0c3454a6..3dc91a73 100644 --- a/docs/interfaces/GobanEngineConfig.html +++ b/docs/interfaces/GobanEngineConfig.html @@ -1,4 +1,4 @@ -GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +GobanEngineConfig | goban

    Interface GobanEngineConfig

    interface GobanEngineConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        clock?: GameClock;
        disable_analysis?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        latencies?: {
            [player_id: string]: number;
        };
        marks?: {
            [mark: string]: string;
        };
        move_tree?: MoveTreeJson;
        moves?: GobanMovesArray;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        tournament_id?: number;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_is_repeating?: boolean
    clock?: GameClock
    disable_analysis?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    move_tree?: MoveTreeJson
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    tournament_id?: number
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/GobanEngineInitialState.html b/docs/interfaces/GobanEngineInitialState.html index b59f1a25..4574a2eb 100644 --- a/docs/interfaces/GobanEngineInitialState.html +++ b/docs/interfaces/GobanEngineInitialState.html @@ -1,3 +1,3 @@ -GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    black? +GobanEngineInitialState | goban

    Interface GobanEngineInitialState

    interface GobanEngineInitialState {
        black?: string;
        white?: string;
    }

    Properties

    Properties

    black?: string
    white?: string
    \ No newline at end of file +

    Properties

    black?: string
    white?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEnginePlayerEntry.html b/docs/interfaces/GobanEnginePlayerEntry.html index e932e1c6..36c8a6b4 100644 --- a/docs/interfaces/GobanEnginePlayerEntry.html +++ b/docs/interfaces/GobanEnginePlayerEntry.html @@ -1,4 +1,4 @@ -GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones? +GobanEnginePlayerEntry | goban

    Interface GobanEnginePlayerEntry

    interface GobanEnginePlayerEntry {
        accepted_stones?: string;
        accepted_strict_seki_mode?: boolean;
        country?: string;
        id: number;
        name?: string;
        pro?: boolean;
        rank?: number;
        username: string;
    }

    Properties

    accepted_stones?: string

    The accepted stones for the stone removal phase that the player has accepted

    -
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    -
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    -
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file +
    accepted_strict_seki_mode?: boolean

    Whether or not the player has accepted scoring with strict seki mode on or not

    +
    country?: string
    id: number
    name?: string

    XXX: The server is using these, the client may or may not be, we need to normalize this

    +
    pro?: boolean
    rank?: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanEvents.html b/docs/interfaces/GobanEvents.html index 370989bc..5a05eb93 100644 --- a/docs/interfaces/GobanEvents.html +++ b/docs/interfaces/GobanEvents.html @@ -1,4 +1,4 @@ -GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board +GobanEvents | goban

    Interface GobanEvents

    interface GobanEvents {
        advance-to-next-board: (() => void);
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        audio-capture-stones: ((obj) => void);
        audio-clock: ((event) => void);
        audio-disconnected: (() => void);
        audio-enter-stone-removal: (() => void);
        audio-game-ended: ((winner) => void);
        audio-game-paused: (() => void);
        audio-game-resumed: (() => void);
        audio-game-started: ((obj) => void);
        audio-other-player-disconnected: ((obj) => void);
        audio-other-player-reconnected: ((obj) => void);
        audio-pass: (() => void);
        audio-reconnected: (() => void);
        audio-resume-game-from-stone-removal: (() => void);
        audio-stone: ((obj) => void);
        audio-undo-granted: (() => void);
        audio-undo-requested: (() => void);
        auto-resign: ((obj) => void);
        captured-stones: ((obj) => void);
        chat: ((d) => void);
        chat-remove: ((ids) => void);
        chat-reset: (() => void);
        clear-auto-resign: ((obj) => void);
        clear-message: (() => void);
        clock: ((clock) => void);
        conditional-moves.updated: (() => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        destroy: (() => void);
        engine.updated: ((engine) => void);
        error: ((d) => void);
        gamedata: ((d) => void);
        last_official_move: ((d) => void);
        load: ((config) => void);
        mode: ((d) => void);
        move-made: (() => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        played-by-click: ((player) => void);
        player-update: ((player) => void);
        puzzle-correct-answer: (() => void);
        puzzle-place: ((obj) => void);
        puzzle-wrong-answer: (() => void);
        review.load-end: (() => void);
        review.load-start: (() => void);
        review.sync-to-current-move: (() => void);
        review.updated: (() => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        set-for-removal: {
            removed: boolean;
            x: number;
            y: number;
        };
        show-message: ((message) => void);
        stalling_score_estimate: ((data?) => void);
        state_text: ((state) => void);
        stone-removal.accepted: (() => void);
        stone-removal.needs-sealing: ((positions) => void);
        stone-removal.updated: (() => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        submitting-move: ((tf) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        update: (() => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            -

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    advance-to-next-board: (() => void)

    Type declaration

      • (): void
      • Returns void

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    audio-capture-stones: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              already_captured: number;
              count: number;
          }
          • already_captured: number
          • count: number

        Returns void

    audio-clock: ((event) => void)

    Type declaration

    audio-disconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-enter-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-ended: ((winner) => void)

    Type declaration

      • (winner): void
      • Parameters

        • winner: "black" | "white" | "tie"

        Returns void

    audio-game-paused: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-resumed: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-game-started: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

            Player to move

            +

        Returns void

    audio-other-player-disconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-other-player-reconnected: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              player_id: number;
          }
          • player_id: number

        Returns void

    audio-pass: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-reconnected: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-resume-game-from-stone-removal: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-stone: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    audio-undo-granted: (() => void)

    Type declaration

      • (): void
      • Returns void

    audio-undo-requested: (() => void)

    Type declaration

      • (): void
      • Returns void

    auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number
          • game_id: number
          • player_id: number

        Returns void

    captured-stones: ((obj) => void)

    Type declaration

    chat: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    chat-remove: ((ids) => void)

    Type declaration

      • (ids): void
      • Parameters

        • ids: {
              chat_ids: string[];
          }
          • chat_ids: string[]

        Returns void

    chat-reset: (() => void)

    Type declaration

      • (): void
      • Returns void

    clear-auto-resign: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              game_id: number;
              player_id: number;
          }
          • game_id: number
          • player_id: number

        Returns void

    clear-message: (() => void)

    Type declaration

      • (): void
      • Returns void

    clock: ((clock) => void)

    Type declaration

    conditional-moves.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    destroy: (() => void)

    Type declaration

      • (): void
      • Returns void

    engine.updated: ((engine) => void)

    Type declaration

      • (engine): void
      • Parameters

        Returns void

    error: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    gamedata: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: any

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    load: ((config) => void)

    Type declaration

      • (config): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    move-made: (() => void)

    Type declaration

      • (): void
      • Returns void

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    played-by-click: ((player) => void)

    Type declaration

      • (player): void
      • Parameters

        • player: {
              player_id: number;
              x: number;
              y: number;
          }
          • player_id: number
          • x: number
          • y: number

        Returns void

    player-update: ((player) => void)

    Type declaration

    puzzle-correct-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    puzzle-place: ((obj) => void)

    Type declaration

      • (obj): void
      • Parameters

        • obj: {
              color: "black" | "white";
              height: number;
              width: number;
              x: number;
              y: number;
          }
          • color: "black" | "white"
          • height: number
          • width: number
          • x: number
          • y: number

        Returns void

    puzzle-wrong-answer: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-end: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.load-start: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.sync-to-current-move: (() => void)

    Type declaration

      • (): void
      • Returns void

    review.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    set-for-removal: {
        removed: boolean;
        x: number;
        y: number;
    }

    Type declaration

    • removed: boolean
    • x: number
    • y: number
    show-message: ((message) => void)

    Type declaration

      • (message): void
      • Parameters

        • message: {
              formatted: string;
              message_id: string;
              parameters?: {
                  [key: string]: any;
              };
          }
          • formatted: string
          • message_id: string
          • Optional parameters?: {
                [key: string]: any;
            }
            • [key: string]: any

        Returns void

    stalling_score_estimate: ((data?) => void)

    Type declaration

    state_text: ((state) => void)

    Type declaration

      • (state): void
      • Parameters

        • state: {
              show_moves_made_count?: boolean;
              title: string;
          }
          • Optional show_moves_made_count?: boolean
          • title: string

        Returns void

    stone-removal.accepted: (() => void)

    Type declaration

      • (): void
      • Returns void

    stone-removal.needs-sealing: ((positions) => void)

    Type declaration

    stone-removal.updated: (() => void)

    Type declaration

      • (): void
      • Returns void

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    submitting-move: ((tf) => void)

    Type declaration

      • (tf): void
      • Parameters

        • tf: boolean

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    update: (() => void)

    Type declaration

      • (): void
      • Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/GobanIOErrorMessageObject.html b/docs/interfaces/GobanIOErrorMessageObject.html index c1a058b3..eaaf3f24 100644 --- a/docs/interfaces/GobanIOErrorMessageObject.html +++ b/docs/interfaces/GobanIOErrorMessageObject.html @@ -1,3 +1,3 @@ -GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    message_id +GobanIOErrorMessageObject | goban

    Interface GobanIOErrorMessageObject

    interface GobanIOErrorMessageObject {
        message_id: "failed_to_load_sgf";
        url: string;
    }

    Properties

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file +

    Properties

    message_id: "failed_to_load_sgf"
    url: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanMetrics.html b/docs/interfaces/GobanMetrics.html index 331f845c..4173aff4 100644 --- a/docs/interfaces/GobanMetrics.html +++ b/docs/interfaces/GobanMetrics.html @@ -1,5 +1,5 @@ -GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    height +GobanMetrics | goban

    Interface GobanMetrics

    interface GobanMetrics {
        height: number;
        mid: number;
        offset: number;
        width: number;
    }

    Properties

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file +

    Properties

    height: number
    mid: number
    offset: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanMoveErrorMessageObject.html b/docs/interfaces/GobanMoveErrorMessageObject.html index fa0ec393..b74b929b 100644 --- a/docs/interfaces/GobanMoveErrorMessageObject.html +++ b/docs/interfaces/GobanMoveErrorMessageObject.html @@ -1,4 +1,4 @@ -GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords +GobanMoveErrorMessageObject | goban

    Interface GobanMoveErrorMessageObject

    interface GobanMoveErrorMessageObject {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    Properties

    coords: string
    move_number: number
    \ No newline at end of file +

    Properties

    coords: string
    move_number: number
    \ No newline at end of file diff --git a/docs/interfaces/GobanSelectedThemes.html b/docs/interfaces/GobanSelectedThemes.html index 456ca4d9..92f65c37 100644 --- a/docs/interfaces/GobanSelectedThemes.html +++ b/docs/interfaces/GobanSelectedThemes.html @@ -1,4 +1,6 @@ -GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        white: string;
    }

    Properties

    black +GobanSelectedThemes | goban

    Interface GobanSelectedThemes

    interface GobanSelectedThemes {
        black: string;
        board: string;
        removal-graphic: "x" | "square";
        removal-scale: number;
        white: string;
    }

    Properties

    black: string
    board: string
    white: string
    \ No newline at end of file +

    Properties

    black: string
    board: string
    removal-graphic: "x" | "square"
    removal-scale: number
    white: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanSocketEvents.html b/docs/interfaces/GobanSocketEvents.html index ea8b2adb..e74dc415 100644 --- a/docs/interfaces/GobanSocketEvents.html +++ b/docs/interfaces/GobanSocketEvents.html @@ -1,4 +1,4 @@ -GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR +GobanSocketEvents | goban

    Interface GobanSocketEvents

    interface GobanSocketEvents {
        ERROR: ((data) => void);
        HUP: (() => void);
        active-bots: ((data) => void);
        active_game: ((data) => void);
        automatch/cancel: ((data) => void);
        automatch/entry: ((data) => void);
        automatch/start: ((data) => void);
        chat-join: ((data) => void);
        chat-message: ((data) => void);
        chat-message-removed: ((data) => void);
        chat-part: ((data) => void);
        chat-topic: ((data) => void);
        chat-update-user: ((data) => void);
        connect: (() => void);
        disconnect: ((code) => void);
        game/:id/auto_resign: ((data) => void);
        game/:id/chat: ((data) => void);
        game/:id/chat/remove: ((data) => void);
        game/:id/clear_auto_resign: ((data) => void);
        game/:id/clock: ((data) => void);
        game/:id/conditional_moves: ((data) => void);
        game/:id/error: ((data) => void);
        game/:id/gamedata: ((data) => void);
        game/:id/latency: ((data) => void);
        game/:id/phase: ((data) => void);
        game/:id/removed_stones: ((data) => void);
        game/:id/removed_stones_accepted: ((data) => void);
        game/:id/reset-chats: (() => void);
        game/:id/stalling_score_estimate: ((data?) => void);
        game/:id/undo_accepted: ((data) => void);
        game/:id/undo_canceled: ((data) => void);
        game/:id/undo_requested: ((data) => void);
        gamelist-count: ((data) => void);
        gamelist-count-:channel: ((data) => void);
        hostinfo: ((data) => void);
        incident-report: ((data) => void);
        itc: ((data) => void);
        latency: ((latency, clock_drift) => void);
        net/pong: ((data) => void);
        notification: ((data) => void);
        private-message: ((data) => void);
        private-superchat: ((data) => void);
        reconnect: (() => void);
        remote_storage/sync_complete: (() => void);
        remote_storage/update: ((data) => void);
        review/:id/full_state: ((data) => void);
        review/:id/r: ((data) => void);
        score-estimator-enabled-state: ((data) => void);
        seekgraph/global: ((messages) => void);
        timeout: (() => void);
        ui-push: ((data) => void);
        unrecoverable_error: ((code, tag, message) => void);
        user/jwt: ((jwt) => void);
        user/state: ((data) => void);
        user/update: ((user) => void);
    }

    Hierarchy (view full)

    Properties

    ERROR HUP active-bots active_game @@ -56,16 +56,16 @@

    Properties

    ERROR: ((data) => void)

    An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

    -

    Type declaration

      • (data): void
      • Parameters

        • data: string | {
              errcode: string;
          }

        Returns void

    HUP: (() => void)

    The client should reload

    -

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    -

    Type declaration

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    -

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    +

    Type declaration

      • (data): void
      • Parameters

        • data: string | {
              errcode: string;
          }

        Returns void

    HUP: (() => void)

    The client should reload

    +

    Type declaration

      • (): void
      • Returns void

    active-bots: ((data) => void)

    Updates the list of bots that are connected and ready to the server

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [id: number]: User;
          }

        Returns void

    active_game: ((data) => void)

    Message to inform the client of an active game, or a change to an existing game

    +

    Type declaration

    automatch/cancel: ((data) => void)

    An automatch request was canceled

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/entry: ((data) => void)

    An automatch request is active

    +

    Type declaration

    automatch/start: ((data) => void)

    An automatch request was started

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              uuid: string;
          }
          • game_id: number
          • uuid: string

        Returns void

    chat-join: ((data) => void)

    User(s) joined a chat channel

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              users: User[];
          }
          • channel: string

            The channel

          • users: User[]

            List of users that joined

            -

        Returns void

    chat-message: ((data) => void)

    Chat message was received

    +

    Returns void

    chat-message: ((data) => void)

    Chat message was received

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              message: {
                  i?: string;
                  m: string;
                  t: number;
              };
              professional: boolean;
              ranking: number;
              system?: true;
              system_message_type?: "flood";
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

          • Optional country?: string

            Country the user is from

          • id: number

            User id of the sender

            @@ -78,14 +78,14 @@
          • Optional system?: true

            Whether it's a system message or not

          • Optional system_message_type?: "flood"
          • ui_class: string

            UI class of the sender

          • username: string

            Username of the sender

            -

        Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    +

    Returns void

    chat-message-removed: ((data) => void)

    A chat message should be removed from the display

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              uuid: string;
          }
          • channel: string

            The channel

          • uuid: string

            Message id. Note, despite the name, I don't think this is always a uuid in uuid format, just treat it as a string.

            -

        Returns void

    chat-part: ((data) => void)

    User left a chat channel

    +

    Returns void

    chat-part: ((data) => void)

    User left a chat channel

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              user: User;
          }
          • channel: string

            The channel

          • user: User

            User that left

            -

        Returns void

    chat-topic: ((data) => void)

    Channel topic was updated

    +

    Returns void

    chat-topic: ((data) => void)

    Channel topic was updated

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              country?: string;
              id: number;
              professional: boolean;
              ranking: number;
              timestamp: number;
              topic: string;
              ui_class: string;
              username: string;
          }
          • channel: string

            The channel

          • Optional country?: string

            Country of the user that changed the topic

          • id: number

            User id of the user that changed the topic

            @@ -95,40 +95,40 @@
          • topic: string

            The new topic

          • ui_class: string

            UI class of the user that changed the topic

          • username: string

            Username of the user that changed the topic

            -

        Returns void

    chat-update-user: ((data) => void)

    A user's profile was updated

    +

    Returns void

    chat-update-user: ((data) => void)

    A user's profile was updated

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel: string;
              old_player_id: number;
              user: User;
          }
          • channel: string

            The channel

          • old_player_id: number

            Player id entry that was update. This might change in the case of a guest logging in, in this case this will switch from being a negative (guest) id, to some positive id. It is not expected that a non guest id should change using this system.

          • user: User

            New user details

            -

        Returns void

    connect: (() => void)

    Type declaration

      • (): void
      • Returns void

    disconnect: ((code) => void)

    Type declaration

      • (code): void
      • Parameters

        • code: number

        Returns void

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    +

    Returns void

    connect: (() => void)

    Type declaration

      • (): void
      • Returns void

    disconnect: ((code) => void)

    Type declaration

      • (code): void
      • Parameters

        • code: number

        Returns void

    game/:id/auto_resign: ((data) => void)

    Informs the client the player is scheduled to resign if not cleared

    Type declaration

      • (data): void
      • Parameters

        • data: {
              expiration: number;
              game_id: number;
              player_id: number;
          }
          • expiration: number

            When the auto resign will happen

          • game_id: number

            The game id

          • player_id: number

            The player id

            -

        Returns void

    game/:id/chat: ((data) => void)

    A game chat message

    -

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    +

    Returns void

    game/:id/chat: ((data) => void)

    A game chat message

    +

    Type declaration

    game/:id/chat/remove: ((data) => void)

    Game chat lines should be removed

    Type declaration

      • (data): void
      • Parameters

        • data: {
              chat_ids: string[];
              game_id: number;
          }
          • chat_ids: string[]

            The chat ids

          • game_id: number

            The game id

            -

        Returns void

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    +

    Returns void

    game/:id/clear_auto_resign: ((data) => void)

    The auto resign for the given player has been cleared

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              player_id: number;
          }
          • game_id: number

            The game id

          • player_id: number

            The player id

            -

        Returns void

    game/:id/clock: ((data) => void)

    Game clock update

    -

    Type declaration

      • (data): void
      • Parameters

        Returns void

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    +

    Returns void

    game/:id/clock: ((data) => void)

    Game clock update

    +

    Type declaration

      • (data): void
      • Parameters

        Returns void

    game/:id/conditional_moves: ((data) => void)

    Update the conditional moves currently active

    Type declaration

      • (data): void
      • Parameters

        • data: {
              conditional_moves: ConditionalMoveResponse;
              game_id: number;
              move_number: number;
          }
          • conditional_moves: ConditionalMoveResponse

            The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

          • game_id: number

            The game id

          • move_number: number

            The move number from which the conditional moves are rooted in

            -

        Returns void

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    -

    Type declaration

      • (data): void
      • Parameters

        • data: string

        Returns void

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    -

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    +

    Returns void

    game/:id/error: ((data) => void)

    Error that should be displayed to the user

    +

    Type declaration

      • (data): void
      • Parameters

        • data: string

        Returns void

    game/:id/gamedata: ((data) => void)

    Update the entire game state

    +

    Type declaration

    game/:id/latency: ((data) => void)

    Update latency information for a player

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              latency: number;
              player_id: number;
          }
          • game_id: number

            The game id

          • latency: number

            The latency in milliseconds

          • player_id: number

            The player id

            -

        Returns void

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    -

    Type declaration

      • (data): void
      • Parameters

        • data: "play" | "stone removal" | "finished"

        Returns void

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              all_removed: string;
              removed: boolean;
              stones: string;
          } | {
              strict_seki_mode: boolean;
          }

        Returns void

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and +

    Returns void

    game/:id/phase: ((data) => void)

    The phase has changed for the game

    +

    Type declaration

      • (data): void
      • Parameters

        • data: "play" | "stone removal" | "finished"

        Returns void

    game/:id/removed_stones: ((data) => void)

    Update the state of the stone removal phase

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              all_removed: string;
              removed: boolean;
              stones: string;
          } | {
              strict_seki_mode: boolean;
          }

        Returns void

    game/:id/removed_stones_accepted: ((data) => void)

    The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

    Type declaration

      • (data): void
      • Parameters

        • data: {
              end_time: number;
              outcome: string;
              phase: "finished";
              player_id: number;
              players: {
                  black: User | {
                      accepted_stones: string;
                      accepted_strict_seki_mode: boolean;
                  };
                  white: User | {
                      accepted_stones: string;
                      accepted_strict_seki_mode: boolean;
                  };
              };
              score: Score;
              stones: string;
              strict_seki_mode: boolean;
              winner: number;
          }
          • end_time: number

            Timestamp in ms

            @@ -140,26 +140,26 @@
          • stones: string
          • strict_seki_mode: boolean

            True if Japanese strict seki mode was true. This will probably always be false and may be removed in the future.

          • winner: number

            Player id of the winner

            -

        Returns void

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    -

    Type declaration

      • (): void
      • Returns void

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    -

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    -

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    game/:id/reset-chats: (() => void)

    The chat log should be reset.

    +

    Type declaration

      • (): void
      • Returns void

    game/:id/stalling_score_estimate: ((data?) => void)

    A score estimation result has been broadcast, this is used for avoiding game stalling

    +

    Type declaration

    game/:id/undo_accepted: ((data) => void)

    Undo move has been accepted, the parameter is the new move number

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_canceled: ((data) => void)

    Undo request has been canceled, the parameter is the move number of the original request

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    game/:id/undo_requested: ((data) => void)

    Undo request has been requested, the parameter is the move number that we want to go back to

    +

    Type declaration

      • (data): void
      • Parameters

        • data: number

        Returns void

    gamelist-count: ((data) => void)

    Update number of live and correspondence games are currently being played

    Type declaration

      • (data): void
      • Parameters

        • data: {
              correspondence: number;
              live: number;
          }
          • correspondence: number

            Number of correspondence games

          • live: number

            Number of live games

            -

        Returns void

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being +

    Returns void

    gamelist-count-:channel: ((data) => void)

    Update number of live and correspondence games are currently being played in a particular channel

    Type declaration

      • (data): void
      • Parameters

        • data: {
              correspondence: number;
              live: number;
          }
          • correspondence: number

            Number of correspondence games

          • live: number

            Number of live games

            -

        Returns void

    hostinfo: ((data) => void)

    General host information for the termination server you +

    Returns void

    hostinfo: ((data) => void)

    General host information for the termination server you are connected to. This is a response to the hostinfo client message.

    Type declaration

      • (data): void
      • Parameters

        • data: {
              clients: number;
              hostname: string;
              uptime: number;
          }
          • clients: number

            Number of clients connected, if available

          • hostname: string

            The hostname of the server

          • uptime: number

            Number of seconds the server has been running

            -

        Returns void

    incident-report: ((data) => void)

    Incident report update

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              cleared_by_user?: boolean;
              created: string;
              id: number;
              moderator?: User;
              moderator_note: string;
              report_type: string;
              reported_conversation?: string;
              reported_game?: number;
              reported_review?: number;
              reported_user?: User;
              reporter_note: string;
              reporter_note_translation: {
                  source_language: string;
                  source_text: string;
                  target_language: string;
                  target_text: string;
              };
              reporting_user?: User;
              source: string;
              state: "pending" | "claimed" | "resolved";
              system_note: string;
              updated: string;
              url: string;
              was_helpful: boolean;
          }
          • Optional cleared_by_user?: boolean
          • created: string
          • id: number
          • Optional moderator?: User
          • moderator_note: string
          • report_type: string
          • Optional reported_conversation?: string
          • Optional reported_game?: number
          • Optional reported_review?: number
          • Optional reported_user?: User
          • reporter_note: string
          • reporter_note_translation: {
                source_language: string;
                source_text: string;
                target_language: string;
                target_text: string;
            }
            • source_language: string
            • source_text: string
            • target_language: string
            • target_text: string
          • Optional reporting_user?: User
          • source: string
          • state: "pending" | "claimed" | "resolved"
          • system_note: string
          • updated: string
          • url: string
          • was_helpful: boolean

        Returns void

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable +

    Returns void

    incident-report: ((data) => void)

    Incident report update

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              cleared_by_user?: boolean;
              created: string;
              id: number;
              moderator?: User;
              moderator_note: string;
              report_type: string;
              reported_conversation?: string;
              reported_game?: number;
              reported_review?: number;
              reported_user?: User;
              reporter_note: string;
              reporter_note_translation: {
                  source_language: string;
                  source_text: string;
                  target_language: string;
                  target_text: string;
              };
              reporting_user?: User;
              source: string;
              state: "pending" | "claimed" | "resolved";
              system_note: string;
              updated: string;
              url: string;
              was_helpful: boolean;
          }
          • Optional cleared_by_user?: boolean
          • created: string
          • id: number
          • Optional moderator?: User
          • moderator_note: string
          • report_type: string
          • Optional reported_conversation?: string
          • Optional reported_game?: number
          • Optional reported_review?: number
          • Optional reported_user?: User
          • reporter_note: string
          • reporter_note_translation: {
                source_language: string;
                source_text: string;
                target_language: string;
                target_text: string;
            }
            • source_language: string
            • source_text: string
            • target_language: string
            • target_text: string
          • Optional reporting_user?: User
          • source: string
          • state: "pending" | "claimed" | "resolved"
          • system_note: string
          • updated: string
          • url: string
          • was_helpful: boolean

        Returns void

    itc: ((data) => void)

    "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless @@ -168,17 +168,17 @@ the web client sending this will arrive on an android and ios instance)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              data: any;
              event: string;
          }
          • data: any

            User defined data

          • event: string

            User defined event string

            -

        Returns void

    latency: ((latency, clock_drift) => void)

    Type declaration

      • (latency, clock_drift): void
      • Parameters

        • latency: number
        • clock_drift: number

        Returns void

    net/pong: ((data) => void)

    Pong response from a ping

    +

    Returns void

    latency: ((latency, clock_drift) => void)

    Type declaration

      • (latency, clock_drift): void
      • Parameters

        • latency: number
        • clock_drift: number

        Returns void

    net/pong: ((data) => void)

    Pong response from a ping

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

          • server: number

            Server timestamp when it was received

            -

        Returns void

    notification: ((data) => void)

    A notification that should be displayed to the user +

    Returns void

    notification: ((data) => void)

    A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

    Type declaration

      • (data): void
      • Parameters

        • data: {
              id: string;
              type: string;
              [key: string]: any;
          }
          • [key: string]: any

            There are often more fields here

          • id: string

            The notification id

          • type: string

            The notification type

            -

        Returns void

    private-message: ((data) => void)

    A private message was received

    +

    Returns void

    private-message: ((data) => void)

    A private message was received

    Type declaration

      • (data): void
      • Parameters

        • data: {
              from: User;
              message: {
                  i: string;
                  m: string;
                  t: number;
              };
              superchat_enabled?: boolean;
              to: User;
          }
          • from: User

            Who sent the message

          • message: {
                i: string;
                m: string;
                t: number;
            }

            The message received

            • i: string

              Message id.

              @@ -188,7 +188,7 @@ is when a moderator needs to talk with a player and ignoring the moderator is not suitable thing to do.

            • to: User

              Your user id

              -

        Returns void

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A +

    Returns void

    private-superchat: ((data) => void)

    Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

    @@ -199,30 +199,30 @@
  • moderator_username: string

    The moderator username contacting the player

  • player_id: number

    Your id

  • player_username: string

    Your username

    -
  • Returns void

    reconnect: (() => void)

    Type declaration

      • (): void
      • Returns void

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage +

    Returns void

    reconnect: (() => void)

    Type declaration

      • (): void
      • Returns void

    remote_storage/sync_complete: (() => void)

    Notification that the server has completed sending all remote storage data and the client should now be up to date.

    -

    Type declaration

      • (): void
      • Returns void

    remote_storage/update: ((data) => void)

    Updates a key value pair

    +

    Type declaration

      • (): void
      • Returns void

    remote_storage/update: ((data) => void)

    Updates a key value pair

    Type declaration

      • (data): void
      • Parameters

        • data: {
              key: string;
              modified: string;
              replication: RemoteStorageReplication;
              value: any;
          }
          • key: string

            Key for the k/v pair

          • modified: string

            Timestamp of the update

          • replication: RemoteStorageReplication

            Replication mode

          • value: any

            Value of of the k/v pair

            -

        Returns void

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    -

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    -

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the +

    Returns void

    review/:id/full_state: ((data) => void)

    Replay of the entire full state of the review

    +

    Type declaration

    review/:id/r: ((data) => void)

    An incremental modification to the review stream

    +

    Type declaration

    score-estimator-enabled-state: ((data) => void)

    Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

    Type declaration

      • (data): void
      • Parameters

        • data: {
              game_id: number;
              shared_ip_with_player: boolean;
          }
          • game_id: number

            The game ID

          • shared_ip_with_player: boolean

            True if the client shares an IP with one of the players of the game

            -

        Returns void

    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

      • (): void
      • Returns void

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, +

    Returns void

    seekgraph/global: ((messages) => void)

    Type declaration

    timeout: (() => void)

    Type declaration

      • (): void
      • Returns void

    ui-push: ((data) => void)

    A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

    Type declaration

      • (data): void
      • Parameters

        • data: {
              data: string;
              event: string;
          }
          • data: string

            UI Push data

          • event: string

            UI Push event

            -

        Returns void

    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

      • (code, tag, message): void
      • Parameters

        • code: number
        • tag: string
        • message: string

        Returns void

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    -

    Type declaration

      • (jwt): void
      • Parameters

        • jwt: string

        Returns void

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for +

    Returns void

    unrecoverable_error: ((code, tag, message) => void)

    Type declaration

      • (code, tag, message): void
      • Parameters

        • code: number
        • tag: string
        • message: string

        Returns void

    user/jwt: ((jwt) => void)

    Update the user's JWT token

    +

    Type declaration

      • (jwt): void
      • Parameters

        • jwt: string

        Returns void

    user/state: ((data) => void)

    Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [player_id: number]: boolean;
          }
          • [player_id: number]: boolean

        Returns void

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              [player_id: number]: boolean;
          }
          • [player_id: number]: boolean

        Returns void

    user/update: ((user) => void)

    Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

    -

    Type declaration

      • (user): void
      • Parameters

        • user: User & {
              [extra: string]: any;
          }

        Returns void

    \ No newline at end of file +

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundCSS.html b/docs/interfaces/GobanThemeBackgroundCSS.html index beb866f6..7ed3fc45 100644 --- a/docs/interfaces/GobanThemeBackgroundCSS.html +++ b/docs/interfaces/GobanThemeBackgroundCSS.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color? +GobanThemeBackgroundCSS | goban

    Interface GobanThemeBackgroundCSS

    interface GobanThemeBackgroundCSS {
        background-color?: string;
        background-image?: string;
        background-size?: string;
    }

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file +

    Properties

    background-color?: string
    background-image?: string
    background-size?: string
    \ No newline at end of file diff --git a/docs/interfaces/GobanThemeBackgroundReactStyles.html b/docs/interfaces/GobanThemeBackgroundReactStyles.html index b733348f..8d0d0b0f 100644 --- a/docs/interfaces/GobanThemeBackgroundReactStyles.html +++ b/docs/interfaces/GobanThemeBackgroundReactStyles.html @@ -1,4 +1,4 @@ -GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor? +GobanThemeBackgroundReactStyles | goban

    Interface GobanThemeBackgroundReactStyles

    interface GobanThemeBackgroundReactStyles {
        backgroundColor?: string;
        backgroundImage?: string;
        backgroundSize?: string;
    }

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file +

    Properties

    backgroundColor?: string
    backgroundImage?: string
    backgroundSize?: string
    \ No newline at end of file diff --git a/docs/interfaces/JGOF.html b/docs/interfaces/JGOF.html index 94c53567..bdc0dd9a 100644 --- a/docs/interfaces/JGOF.html +++ b/docs/interfaces/JGOF.html @@ -1,14 +1,14 @@ JGOF | goban

    Interface JGOF

    JGOF (JSON Go Format) is an attempt at normalizing the AdHocFormat.

    -
    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    interface JGOF {
        ai_reviews?: {
            [id: string]: JGOFAIReview;
        };
        black?: JGOFPlayer | JGOFPlayer[];
        clock?: JGOFClock;
        jgof: 1;
        time_control?: JGOFTimeControl;
        white?: JGOFPlayer | JGOFPlayer[];
    }

    Properties

    ai_reviews?: {
        [id: string]: JGOFAIReview;
    }

    AI Review information computed for this game

    -

    Type declaration

    Player information for those playing Black

    -
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    -
    jgof: 1

    JGOF version number

    -
    time_control?: JGOFTimeControl

    Time control settings for the game

    -

    Player information for those playing White

    -
    \ No newline at end of file +

    Type declaration

    Player information for those playing Black

    +
    clock?: JGOFClock

    Current clock information, this is used for ongoing games

    +
    jgof: 1

    JGOF version number

    +
    time_control?: JGOFTimeControl

    Time control settings for the game

    +

    Player information for those playing White

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReview.html b/docs/interfaces/JGOFAIReview.html index 96a0838e..a8d1a28a 100644 --- a/docs/interfaces/JGOFAIReview.html +++ b/docs/interfaces/JGOFAIReview.html @@ -1,5 +1,5 @@ JGOFAIReview | goban

    Interface JGOFAIReview


    -
    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    interface JGOFAIReview {
        analyzed_variations?: {
            [var_key: string]: JGOFAIReviewMove;
        };
        date: number;
        engine: string;
        engine_version: string;
        error?: {
            coords: string;
            message_id: GobanMoveErrorMessageId;
            move_number: number;
        };
        id: string;
        moves: {
            [move_number: string]: JGOFAIReviewMove;
        };
        network: string;
        network_size: string;
        scores?: number[];
        strength: number;
        type: "fast" | "full";
        uuid: string;
        win_rate: number;
        win_rates?: number[];
    }

    Properties

    analyzed_variations?: {
        [var_key: string]: JGOFAIReviewMove;
    }

    Analysis of variations in the game.

    -

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    -
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    -

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    -

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    -
    strength: number
    type: "fast" | "full"

    A fast review typically only has a few moves reviewed, whereas a full +

    Type declaration

    date: number

    millisecond epoch time (ms from 1970 UTC)

    +
    engine: string
    engine_version: string
    error?: {
        coords: string;
        message_id: GobanMoveErrorMessageId;
        move_number: number;
    }

    If there was an error processing the review, it can be stored here

    +

    Type declaration

    id: string
    moves: {
        [move_number: string]: JGOFAIReviewMove;
    }

    Analysis of moves in the game.

    +

    Type declaration

    network: string
    network_size: string
    scores?: number[]

    predicted scores that black will win or lose by (negative for loss) for all moves

    +
    strength: number
    type: "fast" | "full"

    A fast review typically only has a few moves reviewed, whereas a full review is expected to have every move reviewed. Note that this sets an expectation but not a requirement on what values are stored in moves, and while games are being reviewed these objects will have zero or more entries in moves regardless of the type.

    -
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    -
    win_rates?: number[]

    predicted probability that black will win for all moves

    -
    \ No newline at end of file +
    uuid: string
    win_rate: number

    predicted probability that black will win the last move

    +
    win_rates?: number[]

    predicted probability that black will win for all moves

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMove.html b/docs/interfaces/JGOFAIReviewMove.html index 7c8f1a0c..cd0d00ae 100644 --- a/docs/interfaces/JGOFAIReviewMove.html +++ b/docs/interfaces/JGOFAIReviewMove.html @@ -1,13 +1,13 @@ -JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    branches +JGOFAIReviewMove | goban

    Interface JGOFAIReviewMove

    interface JGOFAIReviewMove {
        branches: JGOFAIReviewMoveVariation[];
        move: JGOFIntersection;
        move_number: number;
        ownership?: number[][];
        score?: number;
        win_rate: number;
    }

    Properties

    Followup move branches explored

    -

    The move that was played.

    -
    move_number: number

    The move number. This is 1 indexed.

    -
    ownership?: number[][]

    A width*height array of ownership values

    -
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    -
    win_rate: number

    Probability of black winning after this move was made

    -
    \ No newline at end of file +

    The move that was played.

    +
    move_number: number

    The move number. This is 1 indexed.

    +
    ownership?: number[][]

    A width*height array of ownership values

    +
    score?: number

    How many points black is predicted to win by (if positive, lose by if negative)

    +
    win_rate: number

    Probability of black winning after this move was made

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAIReviewMoveVariation.html b/docs/interfaces/JGOFAIReviewMoveVariation.html index 5baed639..8271f544 100644 --- a/docs/interfaces/JGOFAIReviewMoveVariation.html +++ b/docs/interfaces/JGOFAIReviewMoveVariation.html @@ -1,4 +1,4 @@ -JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? +JGOFAIReviewMoveVariation | goban

    Interface JGOFAIReviewMoveVariation

    interface JGOFAIReviewMoveVariation {
        lcb?: number;
        moves: JGOFIntersection[];
        policy?: number;
        score?: number;
        score_mean?: number;
        score_stdev?: number;
        utility?: number;
        utility_lcb?: number;
        visits: number;
        win_rate: number;
    }

    Properties

    lcb? moves policy? score? @@ -9,13 +9,13 @@ visits win_rate

    Properties

    lcb?: number

    lower confidence bound, both KataGo and LeelaZero provide this

    -

    Followup predicted moves by the AI

    -
    policy?: number

    From Leela Zero

    -
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    -
    score_mean?: number

    From KataGo

    -
    score_stdev?: number

    From KataGo

    -
    utility?: number

    From KataGo

    -
    utility_lcb?: number

    From KataGo

    -
    visits: number

    Number of times the AI considered the first move of this variation

    -
    win_rate: number

    Probability of black wining to report for this variation

    -
    \ No newline at end of file +

    Followup predicted moves by the AI

    +
    policy?: number

    From Leela Zero

    +
    score?: number

    How many points black is predicted to win for this variation (or lose by if negative)

    +
    score_mean?: number

    From KataGo

    +
    score_stdev?: number

    From KataGo

    +
    utility?: number

    From KataGo

    +
    utility_lcb?: number

    From KataGo

    +
    visits: number

    Number of times the AI considered the first move of this variation

    +
    win_rate: number

    Probability of black wining to report for this variation

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFAbsoluteTimeControl.html b/docs/interfaces/JGOFAbsoluteTimeControl.html index 3772e10b..419fbbf7 100644 --- a/docs/interfaces/JGOFAbsoluteTimeControl.html +++ b/docs/interfaces/JGOFAbsoluteTimeControl.html @@ -1,5 +1,5 @@ -JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends +JGOFAbsoluteTimeControl | goban

    Interface JGOFAbsoluteTimeControl

    interface JGOFAbsoluteTimeControl {
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "absolute";
        total_time: number;
    }

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    system: "absolute"
    total_time: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFByoYomiTimeControl.html b/docs/interfaces/JGOFByoYomiTimeControl.html index a34d6607..f12abdd9 100644 --- a/docs/interfaces/JGOFByoYomiTimeControl.html +++ b/docs/interfaces/JGOFByoYomiTimeControl.html @@ -1,7 +1,7 @@ -JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time +JGOFByoYomiTimeControl | goban

    Interface JGOFByoYomiTimeControl

    interface JGOFByoYomiTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        periods: number;
        speed: JGOFTimeControlSpeed;
        system: "byoyomi";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    periods: number
    system: "byoyomi"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFCanadianTimeControl.html b/docs/interfaces/JGOFCanadianTimeControl.html index 8fec844c..008d8ed6 100644 --- a/docs/interfaces/JGOFCanadianTimeControl.html +++ b/docs/interfaces/JGOFCanadianTimeControl.html @@ -1,7 +1,7 @@ -JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time +JGOFCanadianTimeControl | goban

    Interface JGOFCanadianTimeControl

    interface JGOFCanadianTimeControl {
        main_time: number;
        pause_on_weekends: boolean;
        period_time: number;
        speed: JGOFTimeControlSpeed;
        stones_per_period: number;
        system: "canadian";
    }

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file +

    Properties

    main_time: number
    pause_on_weekends: boolean
    period_time: number
    stones_per_period: number
    system: "canadian"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClock.html b/docs/interfaces/JGOFClock.html index ec705f02..db265d04 100644 --- a/docs/interfaces/JGOFClock.html +++ b/docs/interfaces/JGOFClock.html @@ -1,5 +1,5 @@ JGOFClock | goban

    Interface JGOFClock


    -
    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClock {
        black_clock: JGOFPlayerClock;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first move to be played. If this is true, start_time_left will be set.

    -
    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left on the start clock, when the clock reaches zero the game will be canceled.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFClockWithTransmitting.html b/docs/interfaces/JGOFClockWithTransmitting.html index 588f0ab5..b9fdca27 100644 --- a/docs/interfaces/JGOFClockWithTransmitting.html +++ b/docs/interfaces/JGOFClockWithTransmitting.html @@ -1,5 +1,5 @@ JGOFClockWithTransmitting | goban

    Interface JGOFClockWithTransmitting


    -
    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    interface JGOFClockWithTransmitting {
        black_clock: JGOFPlayerClock;
        black_move_transmitting: number;
        current_player: "black" | "white";
        current_player_id: string;
        pause_state?: JGOFPauseState;
        paused_since?: number;
        start_mode?: boolean;
        start_time_left?: number;
        stone_removal_time_left?: number;
        time_of_last_move: number;
        white_clock: JGOFPlayerClock;
        white_move_transmitting: number;
    }

    Hierarchy (view full)

    Properties

    black_clock: JGOFPlayerClock

    Time left on blacks clock.

    -
    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    -
    current_player_id: string

    Player ID of player to move

    -
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    -
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    -
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first +

    black_move_transmitting: number
    current_player: "black" | "white"

    Player to move, and thus player whose clock is running.

    +
    current_player_id: string

    Player ID of player to move

    +
    pause_state?: JGOFPauseState

    If this field is set, the game clocks are paused for one or more reasons.

    +
    paused_since?: number

    Time the game was paused, in milliseconds since 1970, as observed by the server

    +
    start_mode?: boolean

    True if the game has not begun yet and we are waiting for the first move to be played. If this is true, start_time_left will be set.

    -
    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left +

    start_time_left?: number

    If start_mode is true, this is the number of milliseconds left on the start clock, when the clock reaches zero the game will be canceled.

    -
    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of +

    stone_removal_time_left?: number

    If pause_State.stone_removal is true, this is the number of milliseconds left before the result is automatically accepted.

    -
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    -
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    -
    white_move_transmitting: number
    \ No newline at end of file +
    time_of_last_move: number

    Time the last move was made, in milliseconds since 1970, as observed by the server.

    +
    white_clock: JGOFPlayerClock

    Time left on whites clock.

    +
    white_move_transmitting: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFFischerTimeControl.html b/docs/interfaces/JGOFFischerTimeControl.html index 8a4b9f43..3f5c2a5f 100644 --- a/docs/interfaces/JGOFFischerTimeControl.html +++ b/docs/interfaces/JGOFFischerTimeControl.html @@ -1,7 +1,7 @@ -JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time +JGOFFischerTimeControl | goban

    Interface JGOFFischerTimeControl

    interface JGOFFischerTimeControl {
        initial_time: number;
        max_time: number;
        pause_on_weekends: boolean;
        speed: JGOFTimeControlSpeed;
        system: "fischer";
        time_increment: number;
    }

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file +

    Properties

    initial_time: number
    max_time: number
    pause_on_weekends: boolean
    system: "fischer"
    time_increment: number
    \ No newline at end of file diff --git a/docs/interfaces/JGOFIntersection.html b/docs/interfaces/JGOFIntersection.html index 11a0fb0e..bb857cf2 100644 --- a/docs/interfaces/JGOFIntersection.html +++ b/docs/interfaces/JGOFIntersection.html @@ -1,5 +1,5 @@ -JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x +JGOFIntersection | goban

    Interface JGOFIntersection

    interface JGOFIntersection {
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    x y

    Properties

    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFMove.html b/docs/interfaces/JGOFMove.html index 2ff75e04..400c69e8 100644 --- a/docs/interfaces/JGOFMove.html +++ b/docs/interfaces/JGOFMove.html @@ -1,4 +1,4 @@ -JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    blur? +JGOFMove | goban

    Interface JGOFMove

    interface JGOFMove {
        blur?: number;
        color?: JGOFNumericPlayerColor;
        edited?: boolean;
        played_by?: number;
        player_update?: JGOFPlayerSummary;
        removal_reason?: string;
        sgf_downloaded_by?: number[];
        timedelta?: number;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    -
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +

    Properties

    blur?: number
    edited?: boolean
    played_by?: number
    player_update?: JGOFPlayerSummary
    removal_reason?: string

    Stone removal reasoning, primarily for debugging

    +
    sgf_downloaded_by?: number[]
    timedelta?: number
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFNoneTimeControl.html b/docs/interfaces/JGOFNoneTimeControl.html index f40855ba..3ab6c3d1 100644 --- a/docs/interfaces/JGOFNoneTimeControl.html +++ b/docs/interfaces/JGOFNoneTimeControl.html @@ -1,4 +1,4 @@ -JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends +JGOFNoneTimeControl | goban

    Interface JGOFNoneTimeControl

    interface JGOFNoneTimeControl {
        pause_on_weekends: boolean;
        speed: "correspondence";
        system: "none";
    }

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    speed: "correspondence"
    system: "none"
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPauseState.html b/docs/interfaces/JGOFPauseState.html index 7a75f064..7935218d 100644 --- a/docs/interfaces/JGOFPauseState.html +++ b/docs/interfaces/JGOFPauseState.html @@ -1,16 +1,16 @@ -JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator? +JGOFPauseState | goban

    Interface JGOFPauseState

    interface JGOFPauseState {
        moderator?: string;
        player?: {
            pauses_left: number;
            player_id: string;
        };
        server?: true;
        stone_removal?: true;
        vacation?: {
            [player_id: string]: true;
        };
        weekend?: true;
    }

    Properties

    moderator?: string

    Paused by a moderator, value of this field is the moderator's id

    -
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    +
    player?: {
        pauses_left: number;
        player_id: string;
    }

    Paused by a player. The game can only be paused by one player at a time.

    Type declaration

    • pauses_left: number

      Number of pauses left for the pausing player.

    • player_id: string

      Player id of the player who paused the game.

      -
    server?: true

    Paused by the server

    -
    stone_removal?: true

    Paused because the game is in the stone removal phase

    -
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    +
    server?: true

    Paused by the server

    +
    stone_removal?: true

    Paused because the game is in the stone removal phase

    +
    vacation?: {
        [player_id: string]: true;
    }

    Paused because one or more players is on vacation

    Type declaration

    • [player_id: string]: true

      Player id that is on vacation

      -
    weekend?: true

    Paused because it is the weekend

    -
    \ No newline at end of file +
    weekend?: true

    Paused because it is the weekend

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayer.html b/docs/interfaces/JGOFPlayer.html index 49baadf9..29b0068c 100644 --- a/docs/interfaces/JGOFPlayer.html +++ b/docs/interfaces/JGOFPlayer.html @@ -1,5 +1,5 @@ -JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    id? +JGOFPlayer | goban

    Interface JGOFPlayer

    interface JGOFPlayer {
        id?: string;
        name: string;
    }

    Properties

    Properties

    id?: string

    Identifier for the player

    -
    name: string

    Name or username of the player

    -
    \ No newline at end of file +
    name: string

    Name or username of the player

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerClock.html b/docs/interfaces/JGOFPlayerClock.html index 3a53d31b..ac99399c 100644 --- a/docs/interfaces/JGOFPlayerClock.html +++ b/docs/interfaces/JGOFPlayerClock.html @@ -1,13 +1,13 @@ -JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClock | goban

    Interface JGOFPlayerClock

    interface JGOFPlayerClock {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFPlayerSummary.html b/docs/interfaces/JGOFPlayerSummary.html index dfffd53b..c7d47d9b 100644 --- a/docs/interfaces/JGOFPlayerSummary.html +++ b/docs/interfaces/JGOFPlayerSummary.html @@ -1,4 +1,4 @@ -JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players? +JGOFPlayerSummary | goban

    Interface JGOFPlayerSummary

    interface JGOFPlayerSummary {
        dropped_players?: {
            black?: number[];
            white?: number[];
        };
        players: {
            black: number;
            white: number;
        };
        rengo_teams: {
            black: number[];
            white: number[];
        };
    }

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file +

    Properties

    dropped_players?: {
        black?: number[];
        white?: number[];
    }

    Type declaration

    • Optional black?: number[]
    • Optional white?: number[]
    players: {
        black: number;
        white: number;
    }

    Type declaration

    • black: number
    • white: number
    rengo_teams: {
        black: number[];
        white: number[];
    }

    Type declaration

    • black: number[]
    • white: number[]
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSealingIntersection.html b/docs/interfaces/JGOFSealingIntersection.html index 1581479b..60b8dc03 100644 --- a/docs/interfaces/JGOFSealingIntersection.html +++ b/docs/interfaces/JGOFSealingIntersection.html @@ -1,8 +1,8 @@ -JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    color +JGOFSealingIntersection | goban

    Interface JGOFSealingIntersection

    interface JGOFSealingIntersection {
        color: JGOFNumericPlayerColor;
        x: number;
        y: number;
    }

    Hierarchy (view full)

    Properties

    Properties

    Color the intersection is probably presumed to be by the players, but is in fact empty.

    -
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    -
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    -
    \ No newline at end of file +
    x: number

    Horizontal coordinate, counting left to right, starting with zero

    +
    y: number

    Vertical coordinate, counting top to bottom, starting with zero

    +
    \ No newline at end of file diff --git a/docs/interfaces/JGOFSimpleTimeControl.html b/docs/interfaces/JGOFSimpleTimeControl.html index 206d7b28..ab2de345 100644 --- a/docs/interfaces/JGOFSimpleTimeControl.html +++ b/docs/interfaces/JGOFSimpleTimeControl.html @@ -1,5 +1,5 @@ -JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends +JGOFSimpleTimeControl | goban

    Interface JGOFSimpleTimeControl

    interface JGOFSimpleTimeControl {
        pause_on_weekends: boolean;
        per_move: number;
        speed: JGOFTimeControlSpeed;
        system: "simple";
    }

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file +

    Properties

    pause_on_weekends: boolean
    per_move: number
    system: "simple"
    \ No newline at end of file diff --git a/docs/interfaces/MarkInterface.html b/docs/interfaces/MarkInterface.html index e74303d5..ea31f9c9 100644 --- a/docs/interfaces/MarkInterface.html +++ b/docs/interfaces/MarkInterface.html @@ -1,4 +1,4 @@ -MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black? +MarkInterface | goban

    Interface MarkInterface

    interface MarkInterface {
        black?: boolean;
        blue_move?: boolean;
        chat_triangle?: boolean;
        circle?: boolean;
        color?: string;
        cross?: boolean;
        hint?: boolean;
        letter?: string;
        mark_x?: boolean;
        needs_sealing?: boolean;
        remove?: boolean;
        score?: string;
        square?: boolean;
        stone_removed?: boolean;
        sub_triangle?: boolean;
        subscript?: string;
        transient_letter?: string;
        triangle?: boolean;
        white?: boolean;
        [label: string]: string | boolean | undefined;
    }

    Indexable

    [label: string]: string | boolean | undefined

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file +

    Properties

    black?: boolean
    blue_move?: boolean
    chat_triangle?: boolean
    circle?: boolean
    color?: string
    cross?: boolean
    hint?: boolean
    letter?: string
    mark_x?: boolean
    needs_sealing?: boolean
    remove?: boolean
    score?: string
    square?: boolean
    stone_removed?: boolean
    sub_triangle?: boolean
    subscript?: string
    transient_letter?: string
    triangle?: boolean
    white?: boolean
    \ No newline at end of file diff --git a/docs/interfaces/MoveCommand.html b/docs/interfaces/MoveCommand.html index 4f804ccf..048922c5 100644 --- a/docs/interfaces/MoveCommand.html +++ b/docs/interfaces/MoveCommand.html @@ -1,5 +1,5 @@ -MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    blur? +MoveCommand | goban

    Interface MoveCommand

    interface MoveCommand {
        blur?: number;
        clock?: JGOFPlayerClock;
        game_id: number;
        move: string;
    }

    Properties

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file +

    Properties

    blur?: number
    game_id: number
    move: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLine.html b/docs/interfaces/MoveTreeChatLine.html index ed2e071f..d56935e8 100644 --- a/docs/interfaces/MoveTreeChatLine.html +++ b/docs/interfaces/MoveTreeChatLine.html @@ -1,3 +1,3 @@ -MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    body +MoveTreeChatLine | goban

    Interface MoveTreeChatLine

    interface MoveTreeChatLine {
        body: MoveTreeChatLineBody;
        username: string;
    }

    Properties

    Properties

    username: string
    \ No newline at end of file +

    Properties

    username: string
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeChatLineBody.html b/docs/interfaces/MoveTreeChatLineBody.html index 17d42947..2ae2f97a 100644 --- a/docs/interfaces/MoveTreeChatLineBody.html +++ b/docs/interfaces/MoveTreeChatLineBody.html @@ -1,5 +1,5 @@ -MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    from +MoveTreeChatLineBody | goban

    Interface MoveTreeChatLineBody

    interface MoveTreeChatLineBody {
        from: number;
        moves: string | AdHocPackedMove;
        name: string;
        type: "analysis";
    }

    Properties

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file +

    Properties

    from: number
    moves: string | AdHocPackedMove
    name: string
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/MoveTreeJson.html b/docs/interfaces/MoveTreeJson.html index ac40578e..b0e0908a 100644 --- a/docs/interfaces/MoveTreeJson.html +++ b/docs/interfaces/MoveTreeJson.html @@ -1,4 +1,4 @@ -MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches? +MoveTreeJson | goban

    Interface MoveTreeJson

    interface MoveTreeJson {
        branches?: MoveTreeJson[];
        correct_answer?: boolean;
        marks?: {
            marks: MarkInterface;
            x: number;
            y: number;
        }[];
        pen_marks?: MoveTreePenMarks;
        text?: string;
        trunk_next?: MoveTreeJson;
        wrong_answer?: boolean;
        x: number;
        y: number;
    }

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file +

    Properties

    branches?: MoveTreeJson[]
    correct_answer?: boolean
    marks?: {
        marks: MarkInterface;
        x: number;
        y: number;
    }[]

    Type declaration

    pen_marks?: MoveTreePenMarks
    text?: string
    trunk_next?: MoveTreeJson
    wrong_answer?: boolean
    x: number
    y: number
    \ No newline at end of file diff --git a/docs/interfaces/PlayerScore.html b/docs/interfaces/PlayerScore.html index 3de2a22a..09672642 100644 --- a/docs/interfaces/PlayerScore.html +++ b/docs/interfaces/PlayerScore.html @@ -1,8 +1,8 @@ -PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap +PlayerScore | goban

    Interface PlayerScore

    interface PlayerScore {
        handicap: number;
        komi: number;
        prisoners: number;
        scoring_positions: string;
        stones: number;
        territory: number;
        total: number;
    }

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file +

    Properties

    handicap: number
    komi: number
    prisoners: number
    scoring_positions: string
    stones: number
    territory: number
    total: number
    \ No newline at end of file diff --git a/docs/interfaces/PuzzleConfig.html b/docs/interfaces/PuzzleConfig.html index fd73cc13..ed1a4dd4 100644 --- a/docs/interfaces/PuzzleConfig.html +++ b/docs/interfaces/PuzzleConfig.html @@ -1,4 +1,4 @@ -PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners? +PuzzleConfig | goban

    Interface PuzzleConfig

    interface PuzzleConfig {
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_is_repeating?: boolean;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        isobranch_hash?: string;
        marks?: {
            [mark: string]: string;
        };
        mode?: string;
        move_tree?: MoveTreeJson;
        name?: string;
        player?: JGOFNumericPlayerColor;
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        removal?: boolean[][];
        white_prisoners?: number;
        width?: number;
    }

    Hierarchy (view full)

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file +

    Properties

    black_prisoners?: number
    board_is_repeating?: boolean
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    isobranch_hash?: string
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: string
    move_tree?: MoveTreeJson
    name?: string
    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    removal?: boolean[][]
    white_prisoners?: number
    width?: number
    \ No newline at end of file diff --git a/docs/interfaces/ReviewMessage.html b/docs/interfaces/ReviewMessage.html index 29385ab4..6d3287ab 100644 --- a/docs/interfaces/ReviewMessage.html +++ b/docs/interfaces/ReviewMessage.html @@ -1,7 +1,7 @@ ReviewMessage | goban

    Interface ReviewMessage

    Reviews are constructed by a stream of modifications messages, this interface describes the format of those modification messages. A message can contain any number of the fields listed.

    -
    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    interface ReviewMessage {
        chat?: {
            channel: string;
            chat_id: string;
            date: number;
            from: number;
            moves: string | AdHocPackedMove;
            player_id: number;
        };
        clearpen?: boolean;
        controller?: number | {
            id: number;
            username: string;
        };
        delete?: number;
        f?: number;
        gamedata?: GobanEngineConfig;
        k?: {
            [mark: string]: string;
        };
        m?: string;
        om?: [number, number, number];
        owner?: number | {
            id: number;
            username: string;
        };
        pen?: string;
        player_update?: JGOFPlayerSummary;
        pp?: [number, number];
        remove-chat?: string;
        review_id?: number;
        t?: string;
        t+?: string;
        ts?: number;
        undo?: boolean;
    }

    Properties

    chat? clearpen? controller? delete? @@ -23,24 +23,24 @@

    Properties

    chat?: {
        channel: string;
        chat_id: string;
        date: number;
        from: number;
        moves: string | AdHocPackedMove;
        player_id: number;
    }

    Chat message

    Type declaration

    • channel: string
    • chat_id: string
    • date: number
    • from: number

      Turn number

    • moves: string | AdHocPackedMove

      this might just be "string", i'm not entirely sure

      -
    • player_id: number
    clearpen?: boolean

    Clears the pen drawings on the node

    -
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    -

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    -
    f?: number

    from (move number)

    -

    Initial gamedata to review

    -
    k?: {
        [mark: string]: string;
    }

    Marks made

    -

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    -
    om?: [number, number, number]

    official move [reviewing live game]

    -
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    -

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    -
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    -
    pp?: [number, number]

    pen point

    -
    remove-chat?: string

    Remove's the given chat by id

    -
    review_id?: number

    The review ID. This is used when sending from the client to the server, +

  • player_id: number
  • clearpen?: boolean

    Clears the pen drawings on the node

    +
    controller?: number | {
        id: number;
        username: string;
    }

    Sets the controller of the review

    +

    Type declaration

    • id: number
    • username: string
    delete?: number

    Delete

    +
    f?: number

    from (move number)

    +

    Initial gamedata to review

    +
    k?: {
        [mark: string]: string;
    }

    Marks made

    +

    Type declaration

    • [mark: string]: string
    m?: string

    Moves made

    +
    om?: [number, number, number]

    official move [reviewing live game]

    +
    owner?: number | {
        id: number;
        username: string;
    }

    Sets the owner of the review

    +

    Type declaration

    • id: number
    • username: string
    pen?: string

    pen color / pen start

    +
    player_update?: JGOFPlayerSummary

    Updated information about the players, such as name etc.

    +
    pp?: [number, number]

    pen point

    +
    remove-chat?: string

    Remove's the given chat by id

    +
    review_id?: number

    The review ID. This is used when sending from the client to the server, but is not sent by the server back to the client (as the id is encoded in the message event name)

    -
    t?: string

    text note for the current node

    -
    t+?: string

    text append to the current node

    -
    ts?: number

    timestamp (ms)

    -
    undo?: boolean

    official undo [reviewing live game]

    -
    \ No newline at end of file +
    t?: string

    text note for the current node

    +
    t+?: string

    text append to the current node

    +
    ts?: number

    timestamp (ms)

    +
    undo?: boolean

    official undo [reviewing live game]

    +
    \ No newline at end of file diff --git a/docs/interfaces/SVGRendererGobanConfig.html b/docs/interfaces/SVGRendererGobanConfig.html index 44ac2c1a..65b1092c 100644 --- a/docs/interfaces/SVGRendererGobanConfig.html +++ b/docs/interfaces/SVGRendererGobanConfig.html @@ -1,4 +1,4 @@ -SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring? +SVGRendererGobanConfig | goban

    Interface SVGRendererGobanConfig

    interface SVGRendererGobanConfig {
        aga_handicap_scoring?: boolean;
        allow_ko?: boolean;
        allow_self_capture?: boolean;
        allow_superko?: boolean;
        auth?: string;
        automatic_stone_removal?: boolean;
        black_player_id?: number;
        black_prisoners?: number;
        board?: JGOFNumericPlayerColor[][];
        board_div?: HTMLElement;
        board_is_repeating?: boolean;
        bounds?: GobanBounds;
        chat_log?: GobanChatLog;
        circle_radius?: number;
        clock?: GameClock;
        connect_to_chat?: number | boolean;
        disable_analysis?: boolean;
        display_width?: number;
        dont_draw_last_move?: boolean;
        dont_show_messages?: boolean;
        double_click_submit?: boolean;
        draw_bottom_labels?: boolean;
        draw_left_labels?: boolean;
        draw_right_labels?: boolean;
        draw_top_labels?: boolean;
        end_time?: number;
        errors?: {
            error: string;
            stack: any;
        }[];
        free_handicap_placement?: boolean;
        game_date?: string;
        game_id?: string | number;
        game_name?: string;
        game_type?: "temporary";
        getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting);
        group_ids?: number[];
        handicap?: number;
        handicap_rank_difference?: number;
        height?: number;
        initial_player?: PlayerColor;
        initial_state?: GobanEngineInitialState;
        interactive?: boolean;
        isInPushedAnalysis?: (() => boolean);
        isPlayerController?: (() => boolean);
        isPlayerOwner?: (() => boolean);
        is_game_record?: boolean;
        isobranch_hash?: string;
        komi?: number;
        ladder?: number;
        ladder_id?: number;
        last_move_opacity?: number;
        last_move_radius?: number;
        latencies?: {
            [player_id: string]: number;
        };
        leavePushedAnalysis?: (() => void);
        malkovich_log?: GobanChatLog;
        marks?: {
            [mark: string]: string;
        };
        mode?: GobanModes;
        move_tree?: MoveTreeJson;
        move_tree_container?: HTMLElement;
        moves?: GobanMovesArray;
        name?: string;
        needs_sealing?: JGOFSealingIntersection[];
        ogs?: {
            black_dead_stones: string;
            black_seki_eyes: string;
            black_stones: string;
            black_territory: string;
            white_dead_stones: string;
            white_seki_eyes: string;
            white_stones: string;
            white_territory: string;
        };
        ogs_import?: boolean;
        onError?: ((err) => void);
        onScoreEstimationUpdated?: ((winning_color, points) => void);
        one_click_submit?: boolean;
        opponent_plays_first_after_resume?: boolean;
        original_disable_analysis?: boolean;
        original_sgf?: string;
        outcome?: string;
        pause_control?: AdHocPauseControl;
        paused_since?: number;
        phase?: GobanEnginePhase;
        player?: JGOFNumericPlayerColor;
        player_id?: number;
        player_pool?: {
            [id: number]: GobanEnginePlayerEntry;
        };
        players?: {
            black: GobanEnginePlayerEntry;
            white: GobanEnginePlayerEntry;
        };
        puzzle_autoplace_delay?: number;
        puzzle_collection?: number;
        puzzle_description?: string;
        puzzle_opponent_move_mode?: PuzzleOpponentMoveMode;
        puzzle_player_move_mode?: PuzzlePlayerMoveMode;
        puzzle_rank?: number;
        puzzle_type?: string;
        ranked?: boolean;
        removal?: boolean[][];
        removed?: string | JGOFMove[];
        rengo?: boolean;
        rengo_casual_mode?: boolean;
        rengo_teams?: {
            black: GobanEnginePlayerEntry[];
            white: GobanEnginePlayerEntry[];
        };
        review_id?: number;
        reviews?: {
            [review_id: number]: GobanEnginePlayerEntry;
        };
        rules?: GobanEngineRules;
        score?: Score;
        score_handicap?: boolean;
        score_passes?: boolean;
        score_prisoners?: boolean;
        score_stones?: boolean;
        score_territory?: boolean;
        score_territory_in_seki?: boolean;
        server_socket?: GobanSocket<ClientToServer, ServerToClient>;
        spectator_log?: GobanChatLog;
        square_size?: number | "auto" | ((goban) => number);
        stalling_score_estimate?: StallingScoreEstimate;
        start_time?: number;
        strict_seki_mode?: boolean;
        superko_algorithm?: GobanEngineSuperKoAlgorithm;
        throw_all_errors?: boolean;
        time_control?: JGOFTimeControl;
        time_per_move?: number;
        title_div?: HTMLElement;
        tournament_id?: number;
        username?: string;
        variation_stone_opacity?: number;
        visual_undo_request_indicator?: boolean;
        white_must_pass_last?: boolean;
        white_player_id?: number;
        white_prisoners?: number;
        width?: number;
        winner?: number | "black" | "white";
    }

    Hierarchy (view full)

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    -
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    -
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase +

    Properties

    aga_handicap_scoring?: boolean
    allow_ko?: boolean
    allow_self_capture?: boolean
    allow_superko?: boolean
    auth?: string
    automatic_stone_removal?: boolean
    black_player_id?: number
    black_prisoners?: number
    board_div?: HTMLElement
    board_is_repeating?: boolean
    bounds?: GobanBounds
    chat_log?: GobanChatLog
    circle_radius?: number
    clock?: GameClock
    connect_to_chat?: number | boolean
    disable_analysis?: boolean
    display_width?: number
    dont_draw_last_move?: boolean
    dont_show_messages?: boolean
    double_click_submit?: boolean
    draw_bottom_labels?: boolean
    draw_left_labels?: boolean
    draw_right_labels?: boolean
    draw_top_labels?: boolean
    end_time?: number
    errors?: {
        error: string;
        stack: any;
    }[]

    Type declaration

    • error: string
    • stack: any
    free_handicap_placement?: boolean
    game_date?: string
    game_id?: string | number
    game_name?: string
    game_type?: "temporary"
    getPuzzlePlacementSetting?: (() => PuzzlePlacementSetting)
    group_ids?: number[]
    handicap?: number
    handicap_rank_difference?: number
    height?: number
    initial_player?: PlayerColor
    initial_state?: GobanEngineInitialState
    interactive?: boolean
    isInPushedAnalysis?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerController?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    isPlayerOwner?: (() => boolean)

    Type declaration

      • (): boolean
      • Returns boolean

    is_game_record?: boolean
    isobranch_hash?: string
    komi?: number
    ladder?: number
    ladder_id?: number
    last_move_opacity?: number
    last_move_radius?: number
    latencies?: {
        [player_id: string]: number;
    }

    Type declaration

    • [player_id: string]: number
    leavePushedAnalysis?: (() => void)

    Type declaration

      • (): void
      • Returns void

    malkovich_log?: GobanChatLog
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    mode?: GobanModes
    move_tree?: MoveTreeJson
    move_tree_container?: HTMLElement
    name?: string
    needs_sealing?: JGOFSealingIntersection[]

    Intersections that need to be sealed before scoring should happen

    +
    ogs?: {
        black_dead_stones: string;
        black_seki_eyes: string;
        black_stones: string;
        black_territory: string;
        white_dead_stones: string;
        white_seki_eyes: string;
        white_stones: string;
        white_territory: string;
    }

    Type declaration

    • black_dead_stones: string
    • black_seki_eyes: string
    • black_stones: string
    • black_territory: string
    • white_dead_stones: string
    • white_seki_eyes: string
    • white_stones: string
    • white_territory: string
    ogs_import?: boolean

    Deprecated, I don't think we need this anymore, but need to be sure

    +
    onError?: ((err) => void)

    Type declaration

      • (err): void
      • Parameters

        • err: Error

        Returns void

    onScoreEstimationUpdated?: ((winning_color, points) => void)

    Type declaration

      • (winning_color, points): void
      • Parameters

        • winning_color: "black" | "white"
        • points: number

        Returns void

    one_click_submit?: boolean
    opponent_plays_first_after_resume?: boolean
    original_disable_analysis?: boolean
    original_sgf?: string
    outcome?: string
    pause_control?: AdHocPauseControl
    paused_since?: number
    player_id?: number
    player_pool?: {
        [id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    players?: {
        black: GobanEnginePlayerEntry;
        white: GobanEnginePlayerEntry;
    }

    Type declaration

    puzzle_autoplace_delay?: number
    puzzle_collection?: number
    puzzle_description?: string
    puzzle_opponent_move_mode?: PuzzleOpponentMoveMode
    puzzle_player_move_mode?: PuzzlePlayerMoveMode
    puzzle_rank?: number
    puzzle_type?: string
    ranked?: boolean
    removal?: boolean[][]
    removed?: string | JGOFMove[]

    Removed stones in stone removal phase Passing an array of JGOFMove objects is preferred, the string format exists for historical backwards compatibility. It is an encoded move string, e.g. "aa" for A19

    -
    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and +

    rengo?: boolean
    rengo_casual_mode?: boolean
    rengo_teams?: {
        black: GobanEnginePlayerEntry[];
        white: GobanEnginePlayerEntry[];
    }

    Type declaration

    review_id?: number
    reviews?: {
        [review_id: number]: GobanEnginePlayerEntry;
    }

    Type declaration

    score?: Score
    score_handicap?: boolean
    score_passes?: boolean
    score_prisoners?: boolean
    score_stones?: boolean
    score_territory?: boolean
    score_territory_in_seki?: boolean
    spectator_log?: GobanChatLog
    square_size?: number | "auto" | ((goban) => number)

    Type declaration

      • (goban): number
      • Parameters

        Returns number

    stalling_score_estimate?: StallingScoreEstimate
    start_time?: number
    strict_seki_mode?: boolean
    superko_algorithm?: GobanEngineSuperKoAlgorithm
    throw_all_errors?: boolean

    When loading initial state or moves, by default GobanEngine will try and handle bad data by just resorting to 'edit placing' moves. If this is true, then those errors are thrown instead.

    -
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file +
    time_control?: JGOFTimeControl
    time_per_move?: number
    title_div?: HTMLElement
    tournament_id?: number
    username?: string
    variation_stone_opacity?: number
    visual_undo_request_indicator?: boolean
    white_must_pass_last?: boolean
    white_player_id?: number
    white_prisoners?: number
    width?: number
    winner?: number | "black" | "white"
    \ No newline at end of file diff --git a/docs/interfaces/SVGStoneParameters.html b/docs/interfaces/SVGStoneParameters.html index c5277097..8a7b3e73 100644 --- a/docs/interfaces/SVGStoneParameters.html +++ b/docs/interfaces/SVGStoneParameters.html @@ -1,7 +1,7 @@ -SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill? +SVGStoneParameters | goban

    Interface SVGStoneParameters

    interface SVGStoneParameters {
        fill?: string;
        gradient?: {
            cx?: number;
            cy?: number;
            fx?: number;
            fy?: number;
            r?: number;
            stops: SVGStop[];
            type?: "radial" | "linear";
            x1?: number;
            x2?: number;
            y1?: number;
            y2?: number;
        };
        id: string;
        stroke?: string;
        stroke_scale?: number;
        url?: string;
    }

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file +

    Properties

    fill?: string
    gradient?: {
        cx?: number;
        cy?: number;
        fx?: number;
        fy?: number;
        r?: number;
        stops: SVGStop[];
        type?: "radial" | "linear";
        x1?: number;
        x2?: number;
        y1?: number;
        y2?: number;
    }

    Type declaration

    • Optional cx?: number
    • Optional cy?: number
    • Optional fx?: number
    • Optional fy?: number
    • Optional r?: number
    • stops: SVGStop[]
    • Optional type?: "radial" | "linear"
    • Optional x1?: number
    • Optional x2?: number
    • Optional y1?: number
    • Optional y2?: number
    id: string
    stroke?: string
    stroke_scale?: number
    url?: string
    \ No newline at end of file diff --git a/docs/interfaces/SVGStop.html b/docs/interfaces/SVGStop.html index cc32936b..b79202c1 100644 --- a/docs/interfaces/SVGStop.html +++ b/docs/interfaces/SVGStop.html @@ -1,3 +1,3 @@ -SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    color +SVGStop | goban

    Interface SVGStop

    interface SVGStop {
        color: string;
        offset: number;
    }

    Properties

    Properties

    color: string
    offset: number
    \ No newline at end of file +

    Properties

    color: string
    offset: number
    \ No newline at end of file diff --git a/docs/interfaces/Score.html b/docs/interfaces/Score.html index 7210d6fb..ff994cce 100644 --- a/docs/interfaces/Score.html +++ b/docs/interfaces/Score.html @@ -1,3 +1,3 @@ -Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    black +Score | goban

    Interface Score

    interface Score {
        black: PlayerScore;
        white: PlayerScore;
    }

    Properties

    Properties

    \ No newline at end of file +

    Properties

    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateRequest.html b/docs/interfaces/ScoreEstimateRequest.html index 45595c89..eea70e18 100644 --- a/docs/interfaces/ScoreEstimateRequest.html +++ b/docs/interfaces/ScoreEstimateRequest.html @@ -1,4 +1,4 @@ -ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    autoscore? +ScoreEstimateRequest | goban

    Interface ScoreEstimateRequest

    interface ScoreEstimateRequest {
        autoscore?: boolean;
        black_prisoners?: number;
        board_state: JGOFNumericPlayerColor[][];
        height: number;
        jwt: string;
        komi?: number;
        player_to_move: "black" | "white";
        rules: GobanEngineRules;
        white_prisoners?: number;
        width: number;
    }

    Properties

    Properties

    autoscore?: boolean

    Whether to run autoscoring logic. If true, player_to_move is essentially ignored as we compute estimates with each player moving first in turn.

    -
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file +
    black_prisoners?: number
    board_state: JGOFNumericPlayerColor[][]
    height: number
    jwt: string
    komi?: number
    player_to_move: "black" | "white"
    white_prisoners?: number
    width: number
    \ No newline at end of file diff --git a/docs/interfaces/ScoreEstimateResponse.html b/docs/interfaces/ScoreEstimateResponse.html index 919cfd07..cb6ba46c 100644 --- a/docs/interfaces/ScoreEstimateResponse.html +++ b/docs/interfaces/ScoreEstimateResponse.html @@ -1,13 +1,13 @@ -ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state? +ScoreEstimateResponse | goban

    Interface ScoreEstimateResponse

    interface ScoreEstimateResponse {
        autoscored_board_state?: JGOFNumericPlayerColor[][];
        autoscored_needs_sealing?: JGOFSealingIntersection[];
        autoscored_removed?: JGOFMove[];
        ownership: number[][];
        score?: number;
        win_rate?: number;
    }

    Properties

    autoscored_board_state?: JGOFNumericPlayerColor[][]

    Board state after autoscoring logic has been run. Only defined if autoscore was true in the request.

    -
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    -
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    -
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    -
    score?: number

    Estimated score

    -
    win_rate?: number

    Estimated win rate

    -
    \ No newline at end of file +
    autoscored_needs_sealing?: JGOFSealingIntersection[]

    Coordinates that still need sealing

    +
    autoscored_removed?: JGOFMove[]

    Intersections that are dead or dame. Only defined if autoscore was true in the request.

    +
    ownership: number[][]

    Matrix of ownership estimates ranged from -1 (white) to 1 (black)

    +
    score?: number

    Estimated score

    +
    win_rate?: number

    Estimated win rate

    +
    \ No newline at end of file diff --git a/docs/interfaces/ScoringLocations.html b/docs/interfaces/ScoringLocations.html index 8034527f..b2221f09 100644 --- a/docs/interfaces/ScoringLocations.html +++ b/docs/interfaces/ScoringLocations.html @@ -1,3 +1,3 @@ -ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    black +ScoringLocations | goban

    Interface ScoringLocations

    interface ScoringLocations {
        black: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
        white: {
            locations: JGOFIntersection[];
            stones: number;
            territory: number;
        };
    }

    Properties

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    white: {
        locations: JGOFIntersection[];
        stones: number;
        territory: number;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/StateUpdateEvents.html b/docs/interfaces/StateUpdateEvents.html index 85f789f6..3506f9cb 100644 --- a/docs/interfaces/StateUpdateEvents.html +++ b/docs/interfaces/StateUpdateEvents.html @@ -1,4 +1,4 @@ -StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool +StateUpdateEvents | goban

    Interface StateUpdateEvents

    interface StateUpdateEvents {
        analyze_subtool: ((d) => void);
        analyze_tool: ((d) => void);
        cur_move: ((d) => void);
        cur_review_move: ((d) => void);
        last_official_move: ((d) => void);
        mode: ((d) => void);
        outcome: ((d) => void);
        paused: ((d) => void);
        phase: ((d) => void);
        review_controller_id: ((d) => void);
        review_owner_id: ((d) => void);
        rules: ((d) => void);
        score_estimate: ((d) => void);
        stalling_score_estimate: ((data?) => void);
        strict_seki_mode: ((d) => void);
        submit_move: ((d) => void);
        title: ((d) => void);
        undo_canceled: (() => void);
        undo_requested: ((d) => void);
        winner: ((d) => void);
    }

    Hierarchy (view full)

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file +

    Properties

    analyze_subtool: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    analyze_tool: ((d) => void)

    Type declaration

    cur_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    cur_review_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    last_official_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        Returns void

    mode: ((d) => void)

    Type declaration

    outcome: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    paused: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    phase: ((d) => void)

    Type declaration

    review_controller_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    review_owner_id: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    rules: ((d) => void)

    Type declaration

    score_estimate: ((d) => void)

    Type declaration

    stalling_score_estimate: ((data?) => void)

    Type declaration

    strict_seki_mode: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: boolean

        Returns void

    submit_move: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | (() => void)

        Returns void

    title: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: string

        Returns void

    undo_canceled: (() => void)

    Type declaration

      • (): void
      • Returns void

    undo_requested: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    winner: ((d) => void)

    Type declaration

      • (d): void
      • Parameters

        • d: undefined | number

        Returns void

    \ No newline at end of file diff --git a/docs/interfaces/ThemesInterface.html b/docs/interfaces/ThemesInterface.html index b3984693..d606f9fa 100644 --- a/docs/interfaces/ThemesInterface.html +++ b/docs/interfaces/ThemesInterface.html @@ -1,4 +1,4 @@ -ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    black +ThemesInterface | goban

    Interface ThemesInterface

    interface ThemesInterface {
        black: {
            [name: string]: typeof GobanTheme;
        };
        board: {
            [name: string]: typeof GobanTheme;
        };
        white: {
            [name: string]: typeof GobanTheme;
        };
        [key: string]: {
            [name: string]: typeof GobanTheme;
        };
    }

    Indexable

    [key: string]: {
        [name: string]: typeof GobanTheme;
    }

    Properties

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file +

    Properties

    black: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    board: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    white: {
        [name: string]: typeof GobanTheme;
    }

    Type declaration

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AbsoluteClock.html b/docs/interfaces/_internal_.AbsoluteClock.html index a3e645d3..da02f602 100644 --- a/docs/interfaces/_internal_.AbsoluteClock.html +++ b/docs/interfaces/_internal_.AbsoluteClock.html @@ -1,2 +1,2 @@ -AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file +AbsoluteClock | goban

    Interface AbsoluteClock

    interface AbsoluteClock {
        thinking_time: number;
    }

    Properties

    Properties

    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AnalysisComment.html b/docs/interfaces/_internal_.AnalysisComment.html index 82a949c2..70da552f 100644 --- a/docs/interfaces/_internal_.AnalysisComment.html +++ b/docs/interfaces/_internal_.AnalysisComment.html @@ -1,8 +1,8 @@ -AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move? +AnalysisComment | goban

    Interface AnalysisComment

    interface AnalysisComment {
        branch_move?: number;
        from?: number;
        marks?: {
            [mark: string]: string;
        };
        moves?: string;
        name?: string;
        pen_marks?: unknown[];
        type: "analysis";
    }

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file +

    Properties

    branch_move?: number
    from?: number
    marks?: {
        [mark: string]: string;
    }

    Type declaration

    • [mark: string]: string
    moves?: string
    name?: string
    pen_marks?: unknown[]
    type: "analysis"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.AutoscoreResults.html b/docs/interfaces/_internal_.AutoscoreResults.html index e6cc4490..99c8a3ef 100644 --- a/docs/interfaces/_internal_.AutoscoreResults.html +++ b/docs/interfaces/_internal_.AutoscoreResults.html @@ -1,5 +1,5 @@ -AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing +AutoscoreResults | goban

    Interface AutoscoreResults

    interface AutoscoreResults {
        needs_sealing: JGOFSealingIntersection[];
        removed: JGOFMove[];
        result: JGOFNumericPlayerColor[][];
        sealed_result: JGOFNumericPlayerColor[][];
    }

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file +

    Properties

    needs_sealing: JGOFSealingIntersection[]
    removed: JGOFMove[]
    sealed_result: JGOFNumericPlayerColor[][]
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html index b0ecba56..9b10dde7 100644 --- a/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html +++ b/docs/interfaces/_internal_.BoardStateWithIsobranchHash.html @@ -1,4 +1,4 @@ -BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners +BoardStateWithIsobranchHash | goban

    Interface BoardStateWithIsobranchHash

    interface BoardStateWithIsobranchHash {
        black_prisoners: number;
        board: JGOFNumericPlayerColor[][];
        board_is_repeating: boolean;
        goban_callback?: GobanBase;
        height: number;
        isobranch_hash?: string;
        player: JGOFNumericPlayerColor;
        removal: boolean[][];
        white_prisoners: number;
        width: number;
        boardEquals(other): boolean;
        clearRemoved(): void;
        cloneBoard(): JGOFNumericPlayerColor[][];
        cloneBoardState(): BoardState;
        computeScoringLocations(area_scoring): ScoringLocations;
        countLiberties(raw_stone_string): number;
        foreachNeighbor(pt_or_raw_stone_string, callback): void;
        getNeighboringRawStoneStrings(raw_stone_string): RawStoneString[];
        getRawStoneString(x, y, clearMarks): RawStoneString;
        setRemoved(x, y, removed, emit_stone_removal_updated?): void;
        toggleSingleGroupRemoval(x, y, force_removal?): {
            group: RawStoneString;
            removed: boolean;
        };
    }

    Hierarchy (view full)

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by +

    Properties

    black_prisoners: number
    board_is_repeating: boolean
    goban_callback?: GobanBase
    height: number = 19
    isobranch_hash?: string

    The isobranch hash is a hash of the board state. This field is used by the move tree to detect isomorphic branches. This field is populated when recomputeIsoBranches is called.

    -
    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    removal: boolean[][]
    white_prisoners: number
    width: number = 19

    Methods

    • Sets a position as being removed or not removed. If emit_stone_removal_updated is set to false, the "stone-removal.updated" event will not be emitted, and it is up to the caller to emit this event appropriately.

      -

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      +

      Parameters

      • x: number
      • y: number
      • removed: boolean
      • emit_stone_removal_updated: boolean = true

      Returns void

    • Toggles a group of stones for removal or restoration.

      By default, if we are marking a group for removal but the group is almost certainly alive (two eyes, etc), this will result in a no-op, unless force_removal is set to true.

      -

      Parameters

      • x: number
      • y: number
      • force_removal: boolean = false

      Returns {
          group: RawStoneString;
          removed: boolean;
      }

    \ No newline at end of file +

    Parameters

    Returns {
        group: RawStoneString;
        removed: boolean;
    }

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ByoYomiClock.html b/docs/interfaces/_internal_.ByoYomiClock.html index 55c399ae..3005c094 100644 --- a/docs/interfaces/_internal_.ByoYomiClock.html +++ b/docs/interfaces/_internal_.ByoYomiClock.html @@ -1,5 +1,5 @@ -ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time +ByoYomiClock | goban

    Interface ByoYomiClock

    interface ByoYomiClock {
        period_time: number;
        period_time_left?: number;
        periods: number;
        thinking_time: number;
    }

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    period_time: number
    period_time_left?: number
    periods: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.CanadianClock.html b/docs/interfaces/_internal_.CanadianClock.html index e4ef5b4e..4e649005 100644 --- a/docs/interfaces/_internal_.CanadianClock.html +++ b/docs/interfaces/_internal_.CanadianClock.html @@ -1,4 +1,4 @@ -CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time +CanadianClock | goban

    Interface CanadianClock

    interface CanadianClock {
        block_time: number;
        moves_left: number;
        thinking_time: number;
    }

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file +

    Properties

    block_time: number
    moves_left: number
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ErrorResponse.html b/docs/interfaces/_internal_.ErrorResponse.html index bb417283..cfc03742 100644 --- a/docs/interfaces/_internal_.ErrorResponse.html +++ b/docs/interfaces/_internal_.ErrorResponse.html @@ -1,3 +1,3 @@ -ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    code +ErrorResponse | goban

    Interface ErrorResponse

    interface ErrorResponse {
        code: string;
        message: string;
    }

    Properties

    Properties

    code: string
    message: string
    \ No newline at end of file +

    Properties

    code: string
    message: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.FischerClock.html b/docs/interfaces/_internal_.FischerClock.html index 782d6fec..e6bd7efe 100644 --- a/docs/interfaces/_internal_.FischerClock.html +++ b/docs/interfaces/_internal_.FischerClock.html @@ -1,3 +1,3 @@ -FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus +FischerClock | goban

    Interface FischerClock

    interface FischerClock {
        skip_bonus: boolean;
        thinking_time: number;
    }

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file +

    Properties

    skip_bonus: boolean
    thinking_time: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GameListPlayer.html b/docs/interfaces/_internal_.GameListPlayer.html index ebd01581..80e97eca 100644 --- a/docs/interfaces/_internal_.GameListPlayer.html +++ b/docs/interfaces/_internal_.GameListPlayer.html @@ -1,7 +1,7 @@ -GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted +GameListPlayer | goban

    Interface GameListPlayer

    interface GameListPlayer {
        accepted: boolean;
        id: number;
        professional: boolean;
        rank: number;
        ratings: {
            overall: {
                deviation: number;
                rating: number;
                volatility: number;
            };
            version: number;
        };
        username: string;
    }

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file +

    Properties

    accepted: boolean
    id: number
    professional: boolean
    rank: number
    ratings: {
        overall: {
            deviation: number;
            rating: number;
            volatility: number;
        };
        version: number;
    }

    Type declaration

    • overall: {
          deviation: number;
          rating: number;
          volatility: number;
      }
      • deviation: number
      • rating: number
      • volatility: number
    • version: number
    username: string
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSVGInterface.html b/docs/interfaces/_internal_.GobanSVGInterface.html index 1b07acad..2bc43cfd 100644 --- a/docs/interfaces/_internal_.GobanSVGInterface.html +++ b/docs/interfaces/_internal_.GobanSVGInterface.html @@ -1,4 +1,4 @@ -GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine +GobanSVGInterface | goban

    Interface GobanSVGInterface

    interface GobanSVGInterface {
        engine: GobanEngine;
        move_tree_container?: HTMLElement;
        clearAnalysisDrawing(): void;
        clearMessage(): void;
        destroy(): void;
        disablePen(): void;
        drawPenMarks(pen_marks): void;
        drawSquare(i, j): void;
        enablePen(): void;
        move_tree_bindEvents(svg): void;
        move_tree_redraw(no_warp?): void;
        setByoYomiLabel(label): void;
        setLastMoveOpacity(opacity): void;
        setMoveTreeContainer(container): void;
        showMessage(message_id_or_error, parameters?, timeout?): void;
    }

    Implemented by

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • container: HTMLElement

      Returns void

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file +

    Properties

    engine: GobanEngine
    move_tree_container?: HTMLElement

    Methods

    • Parameters

      • container: HTMLElement

      Returns void

    • Parameters

      • message_id_or_error: MessageID
      • Optional parameters: {
            [key: string]: any;
        }
        • [key: string]: any
      • Optional timeout: number

      Returns void

    \ No newline at end of file diff --git a/docs/interfaces/_internal_.GobanSocketOptions.html b/docs/interfaces/_internal_.GobanSocketOptions.html index f1fa1873..af9a9a2d 100644 --- a/docs/interfaces/_internal_.GobanSocketOptions.html +++ b/docs/interfaces/_internal_.GobanSocketOptions.html @@ -1,7 +1,7 @@ -GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping? +GobanSocketOptions | goban

    Interface GobanSocketOptions

    interface GobanSocketOptions {
        dont_ping?: boolean;
        ping_interval?: number;
        quiet?: boolean;
        timeout_delay?: number;
    }

    Properties

    dont_ping?: boolean

    Don't automatically send pings

    -
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    -
    timeout_delay?: number
    \ No newline at end of file +
    ping_interval?: number
    quiet?: boolean

    Don't log connection/disconnect things

    +
    timeout_delay?: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html index 1f976cad..e2b4621b 100644 --- a/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html +++ b/docs/interfaces/_internal_.JGOFPlayerClockWithTimedOut.html @@ -1,4 +1,4 @@ -JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left? +JGOFPlayerClockWithTimedOut | goban

    Interface JGOFPlayerClockWithTimedOut

    interface JGOFPlayerClockWithTimedOut {
        block_time_left?: number;
        main_time: number;
        moves_left?: number;
        period_time_left?: number;
        periods_left?: number;
        timed_out: boolean;
    }

    Hierarchy (view full)

    Properties

    block_time_left?: number

    Used with canadian time control. Time left in milliseconds to make the remainder of your moves in the current block

    -
    main_time: number

    Main time left on the clock, in milliseconds.

    -
    moves_left?: number

    Used with canadian time control. Number of moves left before a new +

    main_time: number

    Main time left on the clock, in milliseconds.

    +
    moves_left?: number

    Used with canadian time control. Number of moves left before a new block of time.

    -
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    -
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    -
    timed_out: boolean
    \ No newline at end of file +
    period_time_left?: number

    Used with byo-yomi time control. Time left on the period time, in milliseconds.

    +
    periods_left?: number

    Used with byo-yomi time control. Number of periods left.

    +
    timed_out: boolean
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html index 390cba6d..0b7d8f09 100644 --- a/docs/interfaces/_internal_.MoveTreeViewPortInterface.html +++ b/docs/interfaces/_internal_.MoveTreeViewPortInterface.html @@ -1,7 +1,7 @@ -MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +MoveTreeViewPortInterface | goban

    Interface MoveTreeViewPortInterface

    interface MoveTreeViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ReviewComment.html b/docs/interfaces/_internal_.ReviewComment.html index 999cfda4..663b5fb0 100644 --- a/docs/interfaces/_internal_.ReviewComment.html +++ b/docs/interfaces/_internal_.ReviewComment.html @@ -1,3 +1,3 @@ -ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    review_id +ReviewComment | goban

    Interface ReviewComment

    interface ReviewComment {
        review_id: number;
        type: "review";
    }

    Properties

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file +

    Properties

    review_id: number
    type: "review"
    \ No newline at end of file diff --git a/docs/interfaces/_internal_.ViewPortInterface.html b/docs/interfaces/_internal_.ViewPortInterface.html index 07885529..b75b81a5 100644 --- a/docs/interfaces/_internal_.ViewPortInterface.html +++ b/docs/interfaces/_internal_.ViewPortInterface.html @@ -1,7 +1,7 @@ -ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx +ViewPortInterface | goban

    Interface ViewPortInterface

    interface ViewPortInterface {
        maxx: number;
        maxy: number;
        minx: number;
        miny: number;
        offset_x: number;
        offset_y: number;
    }

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file +

    Properties

    maxx: number
    maxy: number
    minx: number
    miny: number
    offset_x: number
    offset_y: number
    \ No newline at end of file diff --git a/docs/interfaces/protocol.AIServerToClient.html b/docs/interfaces/protocol.AIServerToClient.html index 0fc7c4bb..6d1c5dc2 100644 --- a/docs/interfaces/protocol.AIServerToClient.html +++ b/docs/interfaces/protocol.AIServerToClient.html @@ -1,6 +1,6 @@ AIServerToClient | goban

    Interface AIServerToClient

    interface AIServerToClient {
        net/pong: ((data) => void);
        [uuid: string]: ((data) => void);
    }

    Indexable

    [uuid: string]: ((data) => void)

    AI review messages are streamed back to the AI review UUID.

    -
      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

      • (data): void
      • Parameters

        • data: any

        Returns void

    Properties

    Properties

    net/pong: ((data) => void)

    Pong response from a ping

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              server: number;
          }
          • client: number

            Client timestamp that was sent

          • server: number

            Server timestamp when it was received

            -

        Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.AutomatchPreferences.html b/docs/interfaces/protocol.AutomatchPreferences.html index a048deca..2a08bef4 100644 --- a/docs/interfaces/protocol.AutomatchPreferences.html +++ b/docs/interfaces/protocol.AutomatchPreferences.html @@ -1,4 +1,4 @@ -AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap +AutomatchPreferences | goban

    Interface AutomatchPreferences

    interface AutomatchPreferences {
        handicap: {
            condition: AutomatchCondition;
            value: "enabled" | "disabled";
        };
        lower_rank_diff: number;
        rules: {
            condition: AutomatchCondition;
            value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
        };
        size_speed_options: {
            size: Size;
            speed: Speed;
        }[];
        time_control: {
            condition: AutomatchCondition;
            value: {
                initial_time?: number;
                main_time?: number;
                max_time?: number;
                pause_on_weekends?: boolean;
                per_move?: number;
                period_time?: number;
                periods?: number;
                stones_per_period?: number;
                system: "fischer" | "byoyomi" | "canadian" | "simple";
                time_increment?: number;
            };
        };
        timestamp?: number;
        upper_rank_diff: number;
        uuid: string;
    }

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file +

    Properties

    handicap: {
        condition: AutomatchCondition;
        value: "enabled" | "disabled";
    }

    Type declaration

    lower_rank_diff: number
    rules: {
        condition: AutomatchCondition;
        value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz";
    }

    Type declaration

    • condition: AutomatchCondition
    • value: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
    size_speed_options: {
        size: Size;
        speed: Speed;
    }[]

    Type declaration

    time_control: {
        condition: AutomatchCondition;
        value: {
            initial_time?: number;
            main_time?: number;
            max_time?: number;
            pause_on_weekends?: boolean;
            per_move?: number;
            period_time?: number;
            periods?: number;
            stones_per_period?: number;
            system: "fischer" | "byoyomi" | "canadian" | "simple";
            time_increment?: number;
        };
    }

    Type declaration

    • condition: AutomatchCondition
    • value: {
          initial_time?: number;
          main_time?: number;
          max_time?: number;
          pause_on_weekends?: boolean;
          per_move?: number;
          period_time?: number;
          periods?: number;
          stones_per_period?: number;
          system: "fischer" | "byoyomi" | "canadian" | "simple";
          time_increment?: number;
      }
      • Optional initial_time?: number
      • Optional main_time?: number
      • Optional max_time?: number
      • Optional pause_on_weekends?: boolean
      • Optional per_move?: number
      • Optional period_time?: number
      • Optional periods?: number
      • Optional stones_per_period?: number
      • system: "fischer" | "byoyomi" | "canadian" | "simple"
      • Optional time_increment?: number
    timestamp?: number
    upper_rank_diff: number
    uuid: string
    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToAIServer.html b/docs/interfaces/protocol.ClientToAIServer.html index b9a7fee1..4875992d 100644 --- a/docs/interfaces/protocol.ClientToAIServer.html +++ b/docs/interfaces/protocol.ClientToAIServer.html @@ -1,6 +1,6 @@ ClientToAIServer | goban

    Interface ClientToAIServer

    This is an exhaustive list of the messages that the client can send to the AI servers.

    -
    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToAIServer {
        ai-analyze-position: ((data) => any);
        ai-analyze-subscribe: ((data) => void);
        ai-analyze-unsubscribe: ((data) => void);
        ai-analyze-variation: ((data) => void);
        ai-relay-analyzed-position: ((data) => any);
        ai-review-connect: ((data) => void);
        ai-review-disconnect: ((data) => void);
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        net/ping: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • rules: RuleSet

    Ruleset to use

  • uuid: string

    UUID identifying the request

  • white_prisoners: number

    Number of captures white has

    -
  • Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

            +

        Returns any

    ai-analyze-subscribe: ((data) => void)

    Subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-unsubscribe: ((data) => void)

    Un-subscribers to analyze position calls

    +

    Type declaration

      • (data): void
      • Parameters

        • data: {
              channel_id: string;
          }
          • channel_id: string

        Returns void

    ai-analyze-variation: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              from: number;
              game_id: string | number;
              uuid: string;
              variation: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

          • from: number

            The move number we're branching from

          • game_id: string | number

            The game id we're analyzing

          • uuid: string

            AI UUID

          • variation: string

            Move string

            -

        Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    +

    Returns void

    ai-relay-analyzed-position: ((data) => any)

    Relay an already analyzed position out to any other viewers

    Type declaration

      • (data): any
      • Parameters

        • data: {
              channel_id: string;
              data: any;
          }
          • channel_id: string

            Channel identifier, for instance ai-position-analysis-stream-review-

            -
          • data: any

        Returns any

    ai-review-connect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              game_id: string | number;
              uuid: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

            +
          • data: any

        Returns any

    ai-review-connect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              ai_review_id: string | number;
              game_id: string | number;
              uuid: string;
          }
          • ai_review_id: string | number

            The AI review id we're basing our analysis off of

          • game_id: string | number

            The game id we're reviewing

          • uuid: string

            AI UUID

            -

        Returns void

    ai-review-disconnect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

            AI UUID

            -

        Returns void

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    +

    Returns void

    ai-review-disconnect: ((data) => void)

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

            AI UUID

            +

        Returns void

    authenticate: ((data) => undefined | {
        id: number;
        username: string;
    })

    Authenticate with the server.

    Prior to authentication, you should perform a GET request to /api/v1/ui/config to get the current configuration. Within the returned JSON @@ -47,7 +47,7 @@

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be +

    Returns undefined | {
        id: number;
        username: string;
    }

    net/ping: ((data) => void)

    Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -55,4 +55,4 @@

    Type declaration

      • (data): void
      • Parameters

        • data: {
              client: number;
              drift: number;
              latency: number;
          }
          • client: number

            Client timestamp - milliseconds since epoch

          • drift: number

            Last clock drift measurement, or 0

          • latency: number

            Last latency measurement, or 0

            -

        Returns void

    \ No newline at end of file +

    Returns void

    \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServer.html b/docs/interfaces/protocol.ClientToServer.html index fcec742b..8e88f689 100644 --- a/docs/interfaces/protocol.ClientToServer.html +++ b/docs/interfaces/protocol.ClientToServer.html @@ -11,7 +11,7 @@
     {
    bot_apikey?: string;
    bot_username?: string;
    client?: string;
    client_version?: string;
    device_id?: string;
    jwt: string;
    language?: string;
    language_version?: string;
    user_agent?: string;
    }

    and you can expect to receive back either undefined or {id: number, username: string}

    -
    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

    interface ClientToServer {
        authenticate: ((data) => undefined | {
            id: number;
            username: string;
        });
        automatch/cancel: ((data) => void);
        automatch/find_match: ((data) => void);
        automatch/list: ((data) => void);
        bot/config: ((config) => void);
        bot/status: ((data) => void);
        challenge/keepalive: ((data) => void);
        chat/join: ((data) => void);
        chat/part: ((data) => void);
        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        });
        chat/pm/close: ((data) => void);
        chat/pm/load: ((data) => void);
        chat/pm/superchat: ((data) => void);
        chat/remove: ((data) => void);
        chat/remove_all: ((data) => void);
        chat/send: ((data) => void);
        chat/topic: ((data) => void);
        game/annul: ((data) => void);
        game/cancel: ((data) => void);
        game/chat: ((data) => void);
        game/chat/remove: ((data) => void);
        game/clear_delayed_resign: ((data) => void);
        game/conditional_moves/set: ((data) => void);
        game/connect: ((data) => void);
        game/delayed_resign: ((data) => void);
        game/disconnect: ((data) => void);
        game/latency: ((data) => void);
        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[]);
        game/move: ((data) => void);
        game/pause: ((data) => void);
        game/prevent_escaping: ((data) => void);
        game/prevent_stalling: ((data) => void);
        game/removed_stones/accept: ((data) => void);
        game/removed_stones/reject: ((data) => void);
        game/removed_stones/set: ((data) => void);
        game/resign: ((data) => void);
        game/resume: ((data) => void);
        game/timed_out: ((data) => void);
        game/undo/accept: ((data) => void);
        game/undo/cancel: ((data) => void);
        game/undo/request: ((data) => void);
        gamelist/count/subscribe: ((data) => void);
        gamelist/count/unsubscribe: ((data) => void);
        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        });
        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        });
        itc: ((data) => void);
        net/ping: ((data) => void);
        notification/delete: ((data) => void);
        remote_storage/remove: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/set: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        remote_storage/sync: ((data) => {
            error?: string;
            retry?: boolean;
        } | {
            success: true;
        });
        review/append: ((data) => void);
        review/chat: ((data) => void);
        review/chat/remove: ((data) => void);
        review/connect: ((data) => void);
        review/disconnect: ((data) => void);
        seek_graph/connect: ((data) => void);
        seek_graph/disconnect: ((data) => void);
        stats/online: ((data) => number);
        ui-pushes/subscribe: ((data) => void);
        ui-pushes/unsubscribe: ((data) => void);
        user/monitor: ((data) => void);
    }

    Hierarchy (view full)

    Properties

  • Optional language?: string

    ISO 639-1 language code used on this device.

  • Optional language_version?: string

    The version of the translation dictionary.

  • Optional user_agent?: string

    Browser user agent (or websocket library)

    -
  • Returns undefined | {
        id: number;
        username: string;
    }

    automatch/cancel: ((data) => void)

    Cancel a match request

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {
              uuid: string;
          }
          • uuid: string

        Returns void

    automatch/find_match: ((data) => void)

    Request a match via the automatch system

    -

    Type declaration

    automatch/list: ((data) => void)

    Get active automatch entries for the current user

    -

    Type declaration

      • (data): void
      • Parameters

        • data: {}

          Returns void

      bot/config: ((config) => void)

      Updates the config for the bot

      -

      Type declaration

        • (config): void
        • Parameters

          • config: any

          Returns void

      bot/status: ((data) => void)

      Update the number of games that the bot is currently playing

      -

      Type declaration

        • (data): void
        • Parameters

          • data: {
                ongoing_blitz_count: number;
                ongoing_correspondence_count: number;
                ongoing_live_count: number;
            }
            • ongoing_blitz_count: number
            • ongoing_correspondence_count: number
            • ongoing_live_count: number

          Returns void

      challenge/keepalive: ((data) => void)

      Message to let the server know the client is still interested +

      Returns undefined | {
          id: number;
          username: string;
      }

      automatch/cancel: ((data) => void)

      Cancel a match request

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {
                uuid: string;
            }
            • uuid: string

          Returns void

      automatch/find_match: ((data) => void)

      Request a match via the automatch system

      +

      Type declaration

      automatch/list: ((data) => void)

      Get active automatch entries for the current user

      +

      Type declaration

        • (data): void
        • Parameters

          • data: {}

            Returns void

        bot/config: ((config) => void)

        Updates the config for the bot

        +

        Type declaration

          • (config): void
          • Parameters

            • config: any

            Returns void

        bot/status: ((data) => void)

        Update the number of games that the bot is currently playing

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  ongoing_blitz_count: number;
                  ongoing_correspondence_count: number;
                  ongoing_live_count: number;
              }
              • ongoing_blitz_count: number
              • ongoing_correspondence_count: number
              • ongoing_live_count: number

            Returns void

        challenge/keepalive: ((data) => void)

        Message to let the server know the client is still interested in the specified blitz or live challenge. These should be sent about once a second to prevent the server from canceling the challenge.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  challenge_id: number;
                  game_id: number;
              }
              • challenge_id: number
              • game_id: number

            Returns void

        chat/join: ((data) => void)

        Join a chat channel

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  challenge_id: number;
                  game_id: number;
              }
              • challenge_id: number
              • game_id: number

            Returns void

        chat/join: ((data) => void)

        Join a chat channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to join

                -

            Returns void

        chat/part: ((data) => void)

        Leave a channel

        +

        Returns void

        chat/part: ((data) => void)

        Leave a channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
              }
              • channel: string

                Channel to leave

                -

            Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        +

        Returns void

        chat/pm: ((data) => undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        })

        Send a private message to another user

        Type declaration

          • (data): undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }
          • Parameters

            • data: {
                  as_system?: true;
                  message: string;
                  player_id: number;
                  uid: string;
                  username: string;
              }
              • Optional as_system?: true

                Moderator option to send the chat from the system not from their personal PM

              • message: string

                Message text

              • player_id: number

                Player ID of the recipient

              • uid: string

                UUID for the message

              • username: string

                Username of the recipient

                -

            Returns undefined | {
                from: User;
                message: {
                    i: string;
                    m: string;
                    t: number;
                };
                to: {
                    id: number;
                    username: string;
                };
            }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an +

        Returns undefined | {
            from: User;
            message: {
                i: string;
                m: string;
                t: number;
            };
            to: {
                id: number;
                username: string;
            };
        }

        chat/pm/close: ((data) => void)

        Closes the current user's private message session with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/load: ((data) => void)

        Loads the current user's private message session history with the given player id

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

            Returns void

        chat/pm/superchat: ((data) => void)

        Begins a "super chat" session with the given player id, which creates an unclosable dialog if enable is true, and makes the dialog closable again if enable is false. This is only available to moderators.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  enable: boolean;
                  player_id: number;
                  username: string;
              }
              • enable: boolean

                Set to true if you want the modal to be unclosable, false if you want the modal to be closable again

              • player_id: number
              • username: string

                Username of the recipient

                -

            Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        +

        Returns void

        chat/remove: ((data) => void)

        Moderator only command to remove a single chat message

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  uuid: string;
              }
              • uuid: string

            Returns void

        chat/remove_all: ((data) => void)

        Moderator only command to remove all chat messages for a given player

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  player_id: number;
              }
              • player_id: number

                Player id to remove all messages for

                -

            Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        +

        Returns void

        chat/send: ((data) => void)

        Sends a chat message to the given channel

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  message: string;
                  uuid: string;
              }
              • channel: string

                Channel to send the message to

              • message: string

                Message text

              • uuid: string

                ID for the message

                -

            Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players +

        Returns void

        chat/topic: ((data) => void)

        Sets a channel topic

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  topic: string;
              }
              • channel: string
              • topic: string

            Returns void

        game/annul: ((data) => void)

        In Japanese rules, if the game is found to be repeating, the players may opt to annul the entire game and start over.

        This is largely undesired in an online setting and support for this will probably be removed in the future, dont' bother implementing this.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the +

        Returns void

        game/cancel: ((data) => void)

        Cancels a game. This is effectively the same as resign, except the game will not be ranked. This is only allowed within the first few moves of the game. (See GobanEngine.gameCanBeCancelled for cancellation )

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/chat: ((data) => void)

        Sends a chat message to a game

        +

        Returns void

        game/chat: ((data) => void)

        Sends a chat message to a game

        Type declaration

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response +

        Returns void

        game/chat/remove: ((data) => void)

        Moderator only command to remove a single chat message from a game

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel: string;
                  chat_id: string;
                  game_id: number;
              }
              • channel: string
              • chat_id: string
              • game_id: number

            Returns void

        game/clear_delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/conditional_moves/set: ((data) => void)

        Sets conditional moves to be made on behalf of the player in response to a move by the opponent.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  conditional_moves: ConditionalMoveResponse;
                  game_id: number;
                  move_number: number;
              }
              • conditional_moves: ConditionalMoveResponse

                The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

              • game_id: number

                The game id

              • move_number: number

                The move number from which the conditional moves are rooted in

                -

            Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game +

        Returns void

        game/connect: ((data) => void)

        Connect to a game. Once connected, the client will receive game updates relevant to the game.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  chat?: boolean;
                  game_id: number;
              }
              • Optional chat?: boolean

                If true, the client will receive the game chat log and new chat events

              • game_id: number

                The game id to connect to

                -

            Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        -

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used +

        Returns void

        game/delayed_resign: ((data) => void)

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                +

            Returns void

        game/disconnect: ((data) => void)

        Disconnect from a game. This will stop game updates for a particular game.

        +

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns void

        game/latency: ((data) => void)

        Update your latency information for a particular game. This is used for clock synchronization. It is not strictly required, however strongly suggested for live games.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  latency: number;
              }
              • game_id: number

                The game id

              • latency: number

                Network latency, measured in milliseconds. See net/ping to measure this.

                -

            Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily +

        Returns void

        game/log: ((data) => {
            data: any;
            event: string;
            timestamp: string;
        }[])

        Returns an event log for the given game. This is primarily for moderation purposes, although the endpoint is generally available to all users.

        -

        Type declaration

          • (data): {
                data: any;
                event: string;
                timestamp: string;
            }[]
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns {
                data: any;
                event: string;
                timestamp: string;
            }[]

        game/move: ((data) => void)

        Submit a move for a game

        +

        Type declaration

          • (data): {
                data: any;
                event: string;
                timestamp: string;
            }[]
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

            Returns {
                data: any;
                event: string;
                timestamp: string;
            }[]

        game/move: ((data) => void)

        Submit a move for a game

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  blur?: number;
                  clock?: JGOFPlayerClock;
                  game_id: number;
                  move: string;
              }
              • Optional blur?: number

                Maximum number of milliseconds the client was out of focus between the last move and this move

              • Optional clock?: JGOFPlayerClock

                Clock according to the client. If this is within the margin of @@ -168,18 +168,18 @@ clock value. If not provided, the server clock will be used.

              • game_id: number

                The game id

              • move: string

                The move number to play at

                -

            Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        +

        Returns void

        game/pause: ((data) => void)

        Pauses the game clocks

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning +

        Returns void

        game/prevent_escaping: ((data) => void)

        Request the server end a game that someone has left without resigning from

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  annul: boolean;
                  game_id: number;
                  winner: "black" | "white";
              }
              • annul: boolean

                Request that the game be annulled or not

              • game_id: number

                The game id

              • winner: "black" | "white"

                The proposed winner

                -

            Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the +

        Returns void

        game/prevent_stalling: ((data) => void)

        Request the server end a game that is being stalled by one of the players. This will only work if the server agrees in the outcome.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  winner: "black" | "white";
              }
              • game_id: number

                The game id

              • winner: "black" | "white"

                The proposed winner

                -

            Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same +

        Returns void

        game/removed_stones/accept: ((data) => void)

        Accepts the stones as removed. Once both players have accepted the same stones, the stone removal phase will conclude and the game will finish.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  stones: string;
                  strict_seki_mode: boolean;
              }
              • game_id: number

                The game id

              • stones: string

                All of the stones that are accepted as removed, and all @@ -190,9 +190,9 @@ era of the game, the official client no longer displays this as an option to the user as it was very largely unused and was a large source of confusion.

                -

            Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        +

        Returns void

        game/removed_stones/reject: ((data) => void)

        Rejects the removed stones and resumes the game from the stone removal phase

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        +

        Returns void

        game/removed_stones/set: ((data) => void)

        Sets removed stones in the stone removal phase.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  needs_sealing?: JGOFSealingIntersection[];
                  removed: boolean;
                  stones: string | JGOFMove[];
                  strict_seki_mode?: boolean;
              }
              • game_id: number

                The game id

              • Optional needs_sealing?: JGOFSealingIntersection[]

                List of intersections that need to be sealed before the game can be correctly scored. Note, if this is undefined, the value will not @@ -208,47 +208,47 @@ option to the user as it was very largely unused and was a large source of confusion. This field is deprecated and will likely be removed in the future.

                -

            Returns void

        game/resign: ((data) => void)

        Resigns from the game

        +

        Returns void

        game/resign: ((data) => void)

        Resigns from the game

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        +

        Returns void

        game/resume: ((data) => void)

        Resumes the game clocks

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out +

        Returns void

        game/timed_out: ((data) => void)

        Inform the server that the client believes it's clock has timed out and the game should be ended in a timeout. This is not strictly necessary to implement as the server will also timeout games, however there is a grace period to account for network latency, so well behaved clients can (and should) send this message to be very exact with timeouts.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
              }
              • game_id: number

                The game id

                -

            Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        +

        Returns void

        game/undo/accept: ((data) => void)

        Accepts an undo

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        +

        Returns void

        game/undo/cancel: ((data) => void)

        Cancels an undo request

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        +

        Returns void

        game/undo/request: ((data) => void)

        Requests an undo

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  game_id: number;
                  move_number: number;
              }
              • game_id: number

                The game id

              • move_number: number

                The current move number

                -

            Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. +

        Returns void

        gamelist/count/subscribe: ((data) => void)

        Connects to the game list count. Once connected you'll start receiving gamelist-count or gamelist-count-${channel} messages.

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to subscribe to. If no channel is provided, the global server counts will be sent

                -

            Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        +

        Returns void

        gamelist/count/unsubscribe: ((data) => void)

        Disconnects from the game list count

        Type declaration

          • (data): void
          • Parameters

            • data: {
                  channel?: string;
              }
              • Optional channel?: string

                The group or tournament channel to unsubscribe from. If no channel is provided, the global server counts will be unsubscribed from

                -

            Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        +

        Returns void

        gamelist/query: ((data) => undefined | {
            by: string;
            from: number;
            limit: number;
            list: string;
            results: GameListEntry[];
            size: number;
            where: GameListWhere;
        })

        Queries the server for a list of games

        Type declaration

          • (data): undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }
          • Parameters

            • data: {
                  channel?: string;
                  from: number;
                  limit: number;
                  list: "live" | "corr" | "kidsgo";
                  sort_by: "rank";
                  where: GameListWhere;
              }
              • Optional channel?: string

                The group or tournament channel to query

              • from: number

                The number of games to skip before returning results

              • limit: number

                Number of games to return, between 1 and 300

              • list: "live" | "corr" | "kidsgo"
              • sort_by: "rank"
              • where: GameListWhere

                Filtering options

                -

            Returns undefined | {
                by: string;
                from: number;
                limit: number;
                list: string;
                results: GameListEntry[];
                size: number;
                where: GameListWhere;
            }

        hostinfo: ((data) => {
            clients: number;
            ggs-version: string;
            hostname: string;
            uptime: number;
        })

        Retrieve host information for the termination server you are connected to

        -

        Type declaration

          • (data): {
                clients: number;
                ggs-version: string;
                hostname: string;
                uptime: number;
            }
          • Parameters

            • data: {}

              Returns {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }

              • clients: number
              • ggs-version: string
              • hostname: string
              • uptime: number
          itc: ((data) => void)

          Sends an "Inter Tab Communication" message to all other connected +

          Returns undefined | {
              by: string;
              from: number;
              limit: number;
              list: string;
              results: GameListEntry[];
              size: number;
              where: GameListWhere;
          }

          hostinfo: ((data) => {
              clients: number;
              ggs-version: string;
              hostname: string;
              uptime: number;
          })

          Retrieve host information for the termination server you are connected to

          +

          Type declaration

            • (data): {
                  clients: number;
                  ggs-version: string;
                  hostname: string;
                  uptime: number;
              }
            • Parameters

              • data: {}

                Returns {
                    clients: number;
                    ggs-version: string;
                    hostname: string;
                    uptime: number;
                }

                • clients: number
                • ggs-version: string
                • hostname: string
                • uptime: number
            itc: ((data) => void)

            Sends an "Inter Tab Communication" message to all other connected clients for the current user. This includes other devices, so the "Tab" part is a bit of a misnomer.

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                  • event: string

                    User defined event string

                    -

                Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns void

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -256,37 +256,37 @@

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      drift: number;
                      latency: number;
                  }
                  • client: number

                    Client timestamp - milliseconds since epoch

                  • drift: number

                    Last clock drift measurement, or 0

                  • latency: number

                    Last latency measurement, or 0

                    -

                Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            +

            Returns void

            notification/delete: ((data) => void)

            Deletes a notification

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      notification_id: string;
                  }
                  • notification_id: string

                Returns void

            remote_storage/remove: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Remove the given key from remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/set: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Set the given key in the remote storage system for this user

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            -

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the +

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            remote_storage/sync: ((data) => {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            })

            Requests all updated key/value pairs for this user since the provided timestamp (as as ISO 8601 string).

            For more details on the remote storage replication system see: https://github.com/online-go/online-go.com/blob/devel/src/lib/data.ts

            Type declaration

              • (data): {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }
              • Parameters

                • data: {
                      since: string;
                  }
                  • since: string

                    ISO 8601 timestamp. Updates made after this timestamp will be sent to the client.

                    -

                Returns {
                    error?: string;
                    retry?: boolean;
                } | {
                    success: true;
                }

            review/append: ((data) => void)

            Append a review action to the review log.

            -

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            +

            Returns {
                error?: string;
                retry?: boolean;
            } | {
                success: true;
            }

            review/append: ((data) => void)

            Append a review action to the review log.

            +

            Type declaration

            review/chat: ((data) => void)

            Sends a chat message to a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      body: string;
                      from: number;
                      moves: string;
                      review_id: number;
                  }
                  • body: string

                    The chat message

                  • from: number

                    The root of the branch the user is viewing

                  • moves: string

                    The analysis branch the user is viewing

                  • review_id: number

                    The review id

                    -

                Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            +

            Returns void

            review/chat/remove: ((data) => void)

            Moderator only command to remove a single chat message from a game

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      chat_id: string;
                      review_id: number;
                  }
                  • channel: string
                  • chat_id: string
                  • review_id: number

                Returns void

            review/connect: ((data) => void)

            Connects to a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            +

            Returns void

            review/disconnect: ((data) => void)

            Disconnects from a review

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      review_id: number;
                  }
                  • review_id: number

                    The review id

                    -

                Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" +

            Returns void

            seek_graph/connect: ((data) => void)

            Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            seek_graph/disconnect: ((data) => void)

            Un-Subscribes to the seek graph events. The channel is required to be "global" for now and the foreseeable future.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: "global";
                  }
                  • channel: "global"

                Returns void

            stats/online: ((data) => number)

            Request the number of unique authenticated players online within the given interval

            Type declaration

              • (data): number
              • Parameters

                • data: {
                      interval: number;
                  }
                  • interval: number

                    Interval in seconds

                    -

                Returns number

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      user_ids: number[];
                  }
                  • user_ids: number[]

                Returns void

            \ No newline at end of file +

            Returns number

            ui-pushes/subscribe: ((data) => void)

            Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            ui-pushes/unsubscribe: ((data) => void)

            Un-Subscribes to UI related push event messages sent to a particular channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                  }
                  • channel: string

                Returns void

            user/monitor: ((data) => void)

            Subscribes to online status updates for the given player ids

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      user_ids: number[];
                  }
                  • user_ids: number[]

                Returns void

            \ No newline at end of file diff --git a/docs/interfaces/protocol.ClientToServerBase.html b/docs/interfaces/protocol.ClientToServerBase.html index 20e152e1..9e5ff785 100644 --- a/docs/interfaces/protocol.ClientToServerBase.html +++ b/docs/interfaces/protocol.ClientToServerBase.html @@ -1,5 +1,5 @@ ClientToServerBase | goban

            Interface ClientToServerBase

            Messages that clients send, regardless of target server

            -
            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            interface ClientToServerBase {
                authenticate: ((data) => undefined | {
                    id: number;
                    username: string;
                });
                net/ping: ((data) => void);
            }

            Hierarchy (view full)

            Properties

            authenticate: ((data) => undefined | {
                id: number;
                username: string;
            })

            Authenticate with the server.

            Prior to authentication, you should perform a GET request to @@ -16,7 +16,7 @@

          • Optional language?: string

            ISO 639-1 language code used on this device.

          • Optional language_version?: string

            The version of the translation dictionary.

          • Optional user_agent?: string

            Browser user agent (or websocket library)

            -
          • Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be +

            Returns undefined | {
                id: number;
                username: string;
            }

            net/ping: ((data) => void)

            Sends a ping to the server. This message should be sent regularly. The default interval is 10 seconds. This keeps the connection alive and allows a client to measure clock drift and latency, both of which @@ -24,4 +24,4 @@

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      drift: number;
                      latency: number;
                  }
                  • client: number

                    Client timestamp - milliseconds since epoch

                  • drift: number

                    Last clock drift measurement, or 0

                  • latency: number

                    Last latency measurement, or 0

                    -

                Returns void

            \ No newline at end of file +

            Returns void

            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatAnalysisMessage.html b/docs/interfaces/protocol.GameChatAnalysisMessage.html index 272ea93a..14198f96 100644 --- a/docs/interfaces/protocol.GameChatAnalysisMessage.html +++ b/docs/interfaces/protocol.GameChatAnalysisMessage.html @@ -1,4 +1,4 @@ -GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move? +GameChatAnalysisMessage | goban

            Interface GameChatAnalysisMessage

            interface GameChatAnalysisMessage {
                branch_move?: number;
                engine_analysis?: {
                    score?: number;
                    visits?: number;
                    win_rate: number;
                    [key: string]: number | undefined;
                };
                from?: number;
                marks?: {
                    [mark: string]: string;
                };
                moves?: string;
                name?: string;
                pen_marks?: unknown[];
                type: "analysis";
            }

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file +

            Properties

            branch_move?: number
            engine_analysis?: {
                score?: number;
                visits?: number;
                win_rate: number;
                [key: string]: number | undefined;
            }

            Type declaration

            • [key: string]: number | undefined
            • Optional score?: number
            • Optional visits?: number
            • win_rate: number
            from?: number
            marks?: {
                [mark: string]: string;
            }

            Type declaration

            • [mark: string]: string
            moves?: string
            name?: string
            pen_marks?: unknown[]
            type: "analysis"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatLine.html b/docs/interfaces/protocol.GameChatLine.html index 10e31b3d..4e3fd9d6 100644 --- a/docs/interfaces/protocol.GameChatLine.html +++ b/docs/interfaces/protocol.GameChatLine.html @@ -1,4 +1,4 @@ -GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            body +GameChatLine | goban

            Interface GameChatLine

            interface GameChatLine {
                body: string | AnalysisComment | ReviewComment;
                channel: string;
                chat_id: string;
                date: number;
                from?: number;
                move_number: number;
                moves?: string;
                player_id: number;
                username?: string;
            }

            Properties

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file +

            Properties

            channel: string
            chat_id: string
            date: number
            from?: number
            move_number: number
            moves?: string
            player_id: number
            username?: string
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatMessage.html b/docs/interfaces/protocol.GameChatMessage.html index db77269e..d8104342 100644 --- a/docs/interfaces/protocol.GameChatMessage.html +++ b/docs/interfaces/protocol.GameChatMessage.html @@ -1,3 +1,3 @@ -GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            channel +GameChatMessage | goban

            Interface GameChatMessage

            interface GameChatMessage {
                channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban";
                line: GameChatLine;
            }

            Properties

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file +

            Properties

            channel: "main" | "malkovich" | "hidden" | "personal" | "spectator" | "shadowban"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatReviewMessage.html b/docs/interfaces/protocol.GameChatReviewMessage.html index cf26f3cd..4e2ba13a 100644 --- a/docs/interfaces/protocol.GameChatReviewMessage.html +++ b/docs/interfaces/protocol.GameChatReviewMessage.html @@ -1,3 +1,3 @@ -GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            review_id +GameChatReviewMessage | goban

            Interface GameChatReviewMessage

            interface GameChatReviewMessage {
                review_id: number;
                type: "review";
            }

            Properties

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file +

            Properties

            review_id: number
            type: "review"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameChatTranslatedMessage.html b/docs/interfaces/protocol.GameChatTranslatedMessage.html index 849daaab..5f49a07d 100644 --- a/docs/interfaces/protocol.GameChatTranslatedMessage.html +++ b/docs/interfaces/protocol.GameChatTranslatedMessage.html @@ -1,3 +1,3 @@ -GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            en +GameChatTranslatedMessage | goban

            Interface GameChatTranslatedMessage

            interface GameChatTranslatedMessage {
                en: string;
                type: "translated";
                [lang: string]: string;
            }

            Indexable

            [lang: string]: string

            Properties

            Properties

            en: string
            type: "translated"
            \ No newline at end of file +

            Properties

            en: string
            type: "translated"
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameClock.html b/docs/interfaces/protocol.GameClock.html index 5acef6de..28550c1e 100644 --- a/docs/interfaces/protocol.GameClock.html +++ b/docs/interfaces/protocol.GameClock.html @@ -1,4 +1,4 @@ -GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id +GameClock | goban

            Interface GameClock

            interface GameClock {
                black_player_id: number;
                black_time?: ClockTime;
                current_player: number;
                expiration: number;
                expiration_delta?: number;
                game_id: number;
                last_move: number;
                now?: number;
                pause?: {
                    pause_control?: {
                        [key: string]: boolean;
                    };
                    paused?: boolean;
                    paused_since?: number;
                };
                pause_delta?: number;
                paused_since?: number;
                start_mode?: boolean;
                stone_removal_expiration?: number;
                stone_removal_mode?: boolean;
                title: string;
                white_player_id: number;
                white_time?: ClockTime;
            }

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file +

            Properties

            black_player_id: number
            black_time?: ClockTime
            current_player: number
            expiration: number
            expiration_delta?: number
            game_id: number
            last_move: number
            now?: number
            pause?: {
                pause_control?: {
                    [key: string]: boolean;
                };
                paused?: boolean;
                paused_since?: number;
            }

            Type declaration

            • Optional pause_control?: {
                  [key: string]: boolean;
              }
              • [key: string]: boolean
            • Optional paused?: boolean
            • Optional paused_since?: number
            pause_delta?: number
            paused_since?: number
            start_mode?: boolean
            stone_removal_expiration?: number
            stone_removal_mode?: boolean
            title: string
            white_player_id: number
            white_time?: ClockTime
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListEntry.html b/docs/interfaces/protocol.GameListEntry.html index 4b9269d6..6823d89f 100644 --- a/docs/interfaces/protocol.GameListEntry.html +++ b/docs/interfaces/protocol.GameListEntry.html @@ -1,4 +1,4 @@ -GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants? +GameListEntry | goban

            Interface GameListEntry

            interface GameListEntry {
                _participants?: number[];
                black: GameListPlayer;
                bot_game?: boolean;
                clock_expiration: number;
                dropped_player: number;
                group_ids?: number[];
                group_ids_map?: {
                    [id: string]: boolean;
                };
                handicap?: number;
                height: number;
                id: number;
                in_beginning?: boolean;
                in_end?: boolean;
                in_middle?: boolean;
                kidsgo_game?: boolean;
                komi?: number;
                ladder_id?: number;
                malkovich_present?: boolean;
                move_number: number;
                name: string;
                paused: boolean;
                phase: string;
                player_to_move: number;
                private: boolean;
                ranked?: boolean;
                rengo: boolean;
                rengo_casual_mode: boolean;
                rengo_teams: {
                    black: User[];
                    white: User[];
                };
                socket_id?: any;
                time_per_move: number;
                tournament_id?: number;
                white: GameListPlayer;
                width: number;
            }

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file +

            Properties

            _participants?: number[]
            bot_game?: boolean
            clock_expiration: number
            dropped_player: number
            group_ids?: number[]
            group_ids_map?: {
                [id: string]: boolean;
            }

            Type declaration

            • [id: string]: boolean
            handicap?: number
            height: number
            id: number
            in_beginning?: boolean
            in_end?: boolean
            in_middle?: boolean
            kidsgo_game?: boolean
            komi?: number
            ladder_id?: number
            malkovich_present?: boolean
            move_number: number
            name: string
            paused: boolean
            phase: string
            player_to_move: number
            private: boolean
            ranked?: boolean
            rengo: boolean
            rengo_casual_mode: boolean
            rengo_teams: {
                black: User[];
                white: User[];
            }

            Type declaration

            socket_id?: any
            time_per_move: number
            tournament_id?: number
            width: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.GameListWhere.html b/docs/interfaces/protocol.GameListWhere.html index fe9382c5..01f499d1 100644 --- a/docs/interfaces/protocol.GameListWhere.html +++ b/docs/interfaces/protocol.GameListWhere.html @@ -1,5 +1,5 @@ GameListWhere | goban

            Interface GameListWhere

            Parameters for the gamelist/query message

            -
            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            interface GameListWhere {
                hide_13x13?: boolean;
                hide_19x19?: boolean;
                hide_9x9?: boolean;
                hide_beginning?: boolean;
                hide_bot_games?: boolean;
                hide_end?: boolean;
                hide_even?: boolean;
                hide_handicap?: boolean;
                hide_ladder?: boolean;
                hide_middle?: boolean;
                hide_open?: boolean;
                hide_other?: boolean;
                hide_ranked?: boolean;
                hide_tournament?: boolean;
                hide_unranked?: boolean;
                ladder_id?: number;
                malk_only?: boolean;
                players?: number[];
                rengo_only?: boolean;
                tournament_id?: number;
            }

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file +

            Properties

            hide_13x13?: boolean
            hide_19x19?: boolean
            hide_9x9?: boolean
            hide_beginning?: boolean
            hide_bot_games?: boolean
            hide_end?: boolean
            hide_even?: boolean
            hide_handicap?: boolean
            hide_ladder?: boolean
            hide_middle?: boolean
            hide_open?: boolean
            hide_other?: boolean
            hide_ranked?: boolean
            hide_tournament?: boolean
            hide_unranked?: boolean
            ladder_id?: number
            malk_only?: boolean
            players?: number[]
            rengo_only?: boolean
            tournament_id?: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.Glicko2.html b/docs/interfaces/protocol.Glicko2.html index 2a647f11..b2d5292e 100644 --- a/docs/interfaces/protocol.Glicko2.html +++ b/docs/interfaces/protocol.Glicko2.html @@ -1,5 +1,5 @@ -Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation +Glicko2 | goban

            Interface Glicko2

            interface Glicko2 {
                deviation: number;
                games_played?: number;
                rating: number;
                volatility: number;
            }

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file +

            Properties

            deviation: number
            games_played?: number
            rating: number
            volatility: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphChallengeMessage.html b/docs/interfaces/protocol.SeekgraphChallengeMessage.html index 335570a8..fbe69b5f 100644 --- a/docs/interfaces/protocol.SeekgraphChallengeMessage.html +++ b/docs/interfaces/protocol.SeekgraphChallengeMessage.html @@ -1,4 +1,4 @@ -SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id +SeekgraphChallengeMessage | goban

            Interface SeekgraphChallengeMessage

            interface SeekgraphChallengeMessage {
                challenge_id: number;
                challenger_color: "black" | "white" | "automatic";
                disable_analysis: boolean;
                game_id: number;
                handicap: null | number;
                height: number;
                invite_only: boolean;
                komi: null | number;
                max_rank: number;
                min_rank: number;
                name: string;
                professional: boolean;
                ranked: boolean;
                ranking: number;
                rengo: boolean;
                rengo_auto_start: boolean;
                rengo_black_team: number[];
                rengo_casual_mode: boolean;
                rengo_nominees: number[];
                rengo_participants: number[];
                rengo_white_team: number[];
                rules: string;
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                time_per_move: number;
                user_id: number;
                username: string;
                uuid: string;
                width: number;
            }

            Properties

            challenge_id: number

            The ID of the challenge

            -
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            -
            disable_analysis: boolean

            If analysis is disabled

            -
            game_id: number

            The game ID

            -
            handicap: null | number

            The game handicap

            -
            height: number

            Board height

            -
            invite_only: boolean

            If the game is only joinable by invitation

            -
            komi: null | number

            Komi

            -
            max_rank: number

            Maximum rank allowed to accept the game

            -
            min_rank: number

            Minimum rank allowed to accept the game

            -
            name: string

            Game name

            -
            professional: boolean

            If they are a professional player

            -
            ranked: boolean

            If the game is ranked

            -
            ranking: number

            Their ranking *

            -
            rengo: boolean

            If it's a rengo game

            -
            rengo_auto_start: boolean

            If the rengo game will automatically start

            -
            rengo_black_team: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            -
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            -
            rengo_participants: number[]

            All player ids involved in the game

            -
            rengo_white_team: number[]

            Player ids of the players on the White team

            -
            rules: string

            Rules being used

            -
            time_control: string

            Time control system type

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            time_per_move: number

            Average time per move

            -
            user_id: number

            User id of the player who is looking for a game

            -
            username: string

            Username of the player looking for the game

            -
            uuid: string

            A UUID for the invitation

            -
            width: number

            Board width

            -
            \ No newline at end of file +
            challenger_color: "black" | "white" | "automatic"

            Color the accepting player will be

            +
            disable_analysis: boolean

            If analysis is disabled

            +
            game_id: number

            The game ID

            +
            handicap: null | number

            The game handicap

            +
            height: number

            Board height

            +
            invite_only: boolean

            If the game is only joinable by invitation

            +
            komi: null | number

            Komi

            +
            max_rank: number

            Maximum rank allowed to accept the game

            +
            min_rank: number

            Minimum rank allowed to accept the game

            +
            name: string

            Game name

            +
            professional: boolean

            If they are a professional player

            +
            ranked: boolean

            If the game is ranked

            +
            ranking: number

            Their ranking *

            +
            rengo: boolean

            If it's a rengo game

            +
            rengo_auto_start: boolean

            If the rengo game will automatically start

            +
            rengo_black_team: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode: boolean

            If the game is a casual rengo game

            +
            rengo_nominees: number[]

            Player ids of people that have been nominated to play

            +
            rengo_participants: number[]

            All player ids involved in the game

            +
            rengo_white_team: number[]

            Player ids of the players on the White team

            +
            rules: string

            Rules being used

            +
            time_control: string

            Time control system type

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            time_per_move: number

            Average time per move

            +
            user_id: number

            User id of the player who is looking for a game

            +
            username: string

            Username of the player looking for the game

            +
            uuid: string

            A UUID for the invitation

            +
            width: number

            Board width

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphDeleteMessage.html b/docs/interfaces/protocol.SeekgraphDeleteMessage.html index a37a1fe8..d07c5dd8 100644 --- a/docs/interfaces/protocol.SeekgraphDeleteMessage.html +++ b/docs/interfaces/protocol.SeekgraphDeleteMessage.html @@ -1,5 +1,5 @@ -SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            challenge_id +SeekgraphDeleteMessage | goban

            Interface SeekgraphDeleteMessage

            interface SeekgraphDeleteMessage {
                challenge_id: number;
                delete: true;
            }

            Properties

            Properties

            challenge_id: number

            The ID of the challenge

            -
            delete: true

            The entry should be deleted if this field exists and is true

            -
            \ No newline at end of file +
            delete: true

            The entry should be deleted if this field exists and is true

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.SeekgraphStartedMessage.html b/docs/interfaces/protocol.SeekgraphStartedMessage.html index 2f9cb692..b0baf278 100644 --- a/docs/interfaces/protocol.SeekgraphStartedMessage.html +++ b/docs/interfaces/protocol.SeekgraphStartedMessage.html @@ -1,4 +1,4 @@ -SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black +SeekgraphStartedMessage | goban

            Interface SeekgraphStartedMessage

            interface SeekgraphStartedMessage {
                black: User;
                challenge_id: number;
                creator: number;
                game_id: number;
                game_started?: true;
                rengo?: true;
                rengo_auto_start?: boolean;
                rengo_black_team?: number[];
                rengo_casual_mode?: boolean;
                rengo_white_team?: number[];
                time_control: string;
                time_control_parameters: JGOFTimeControl;
                white: User;
            }

            Properties

            black: User

            Black player

            -
            challenge_id: number

            The ID of the challenge

            -
            creator: number

            Player ID of the creator

            -
            game_id: number

            The game id

            -
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            -
            rengo?: true

            Rengo game if true

            -
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            -
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            -
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            -
            rengo_white_team?: number[]

            Player ids of the players on the White team

            -
            time_control: string

            Time control system

            -
            time_control_parameters: JGOFTimeControl

            Time control parameters

            -
            white: User

            White player

            -
            \ No newline at end of file +
            challenge_id: number

            The ID of the challenge

            +
            creator: number

            Player ID of the creator

            +
            game_id: number

            The game id

            +
            game_started?: true

            If exists and is true, the game has been started and the entry should be removed from the seek graph

            +
            rengo?: true

            Rengo game if true

            +
            rengo_auto_start?: boolean

            Whether the rengo game with automatically start

            +
            rengo_black_team?: number[]

            Player ids of the players on the Black team

            +
            rengo_casual_mode?: boolean

            Wether it's a Casual mode rengo game

            +
            rengo_white_team?: number[]

            Player ids of the players on the White team

            +
            time_control: string

            Time control system

            +
            time_control_parameters: JGOFTimeControl

            Time control parameters

            +
            white: User

            White player

            +
            \ No newline at end of file diff --git a/docs/interfaces/protocol.ServerToClient.html b/docs/interfaces/protocol.ServerToClient.html index faf4c7d9..865a2dbf 100644 --- a/docs/interfaces/protocol.ServerToClient.html +++ b/docs/interfaces/protocol.ServerToClient.html @@ -1,5 +1,5 @@ ServerToClient | goban

            Interface ServerToClient

            interface ServerToClient {
                ERROR: ((data) => void);
                HUP: (() => void);
                active-bots: ((data) => void);
                active_game: ((data) => void);
                automatch/cancel: ((data) => void);
                automatch/entry: ((data) => void);
                automatch/start: ((data) => void);
                chat-join: ((data) => void);
                chat-message: ((data) => void);
                chat-message-removed: ((data) => void);
                chat-part: ((data) => void);
                chat-topic: ((data) => void);
                chat-update-user: ((data) => void);
                game/:id/auto_resign: ((data) => void);
                game/:id/chat: ((data) => void);
                game/:id/chat/remove: ((data) => void);
                game/:id/clear_auto_resign: ((data) => void);
                game/:id/clock: ((data) => void);
                game/:id/conditional_moves: ((data) => void);
                game/:id/error: ((data) => void);
                game/:id/gamedata: ((data) => void);
                game/:id/latency: ((data) => void);
                game/:id/phase: ((data) => void);
                game/:id/removed_stones: ((data) => void);
                game/:id/removed_stones_accepted: ((data) => void);
                game/:id/reset-chats: (() => void);
                game/:id/stalling_score_estimate: ((data?) => void);
                game/:id/undo_accepted: ((data) => void);
                game/:id/undo_canceled: ((data) => void);
                game/:id/undo_requested: ((data) => void);
                gamelist-count: ((data) => void);
                gamelist-count-:channel: ((data) => void);
                hostinfo: ((data) => void);
                incident-report: ((data) => void);
                itc: ((data) => void);
                net/pong: ((data) => void);
                notification: ((data) => void);
                private-message: ((data) => void);
                private-superchat: ((data) => void);
                remote_storage/sync_complete: (() => void);
                remote_storage/update: ((data) => void);
                review/:id/full_state: ((data) => void);
                review/:id/r: ((data) => void);
                score-estimator-enabled-state: ((data) => void);
                seekgraph/global: ((messages) => void);
                ui-push: ((data) => void);
                user/jwt: ((jwt) => void);
                user/state: ((data) => void);
                user/update: ((user) => void);
                [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"];
            }

            Hierarchy (view full)

            Indexable

            [k: `gamelist-count-${string}`]: ServerToClient["gamelist-count-:channel"]

            A move was made on a game

            -

            Properties

            Properties

            ERROR HUP active-bots active_game @@ -51,16 +51,16 @@

            Properties

            ERROR: ((data) => void)

            An error occurred, the message string should be displayed to the user. For a list of errcode's used, see https://github.com/online-go/online-go.com/blob/devel/src/components/Errcode/Errcode.tsx

            -

            Type declaration

              • (data): void
              • Parameters

                • data: string | {
                      errcode: string;
                  }

                Returns void

            HUP: (() => void)

            The client should reload

            -

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            -

            Type declaration

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            -

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            +

            Type declaration

              • (data): void
              • Parameters

                • data: string | {
                      errcode: string;
                  }

                Returns void

            HUP: (() => void)

            The client should reload

            +

            Type declaration

              • (): void
              • Returns void

            active-bots: ((data) => void)

            Updates the list of bots that are connected and ready to the server

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [id: number]: User;
                  }

                Returns void

            active_game: ((data) => void)

            Message to inform the client of an active game, or a change to an existing game

            +

            Type declaration

            automatch/cancel: ((data) => void)

            An automatch request was canceled

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      uuid: string;
                  }
                  • uuid: string

                Returns void

            automatch/entry: ((data) => void)

            An automatch request is active

            +

            Type declaration

            automatch/start: ((data) => void)

            An automatch request was started

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      uuid: string;
                  }
                  • game_id: number
                  • uuid: string

                Returns void

            chat-join: ((data) => void)

            User(s) joined a chat channel

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      users: User[];
                  }
                  • channel: string

                    The channel

                  • users: User[]

                    List of users that joined

                    -

                Returns void

            chat-message: ((data) => void)

            Chat message was received

            +

            Returns void

            chat-message: ((data) => void)

            Chat message was received

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      message: {
                          i?: string;
                          m: string;
                          t: number;
                      };
                      professional: boolean;
                      ranking: number;
                      system?: true;
                      system_message_type?: "flood";
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                  • Optional country?: string

                    Country the user is from

                  • id: number

                    User id of the sender

                    @@ -73,14 +73,14 @@
                  • Optional system?: true

                    Whether it's a system message or not

                  • Optional system_message_type?: "flood"
                  • ui_class: string

                    UI class of the sender

                  • username: string

                    Username of the sender

                    -

                Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            +

            Returns void

            chat-message-removed: ((data) => void)

            A chat message should be removed from the display

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      uuid: string;
                  }
                  • channel: string

                    The channel

                  • uuid: string

                    Message id. Note, despite the name, I don't think this is always a uuid in uuid format, just treat it as a string.

                    -

                Returns void

            chat-part: ((data) => void)

            User left a chat channel

            +

            Returns void

            chat-part: ((data) => void)

            User left a chat channel

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      user: User;
                  }
                  • channel: string

                    The channel

                  • user: User

                    User that left

                    -

                Returns void

            chat-topic: ((data) => void)

            Channel topic was updated

            +

            Returns void

            chat-topic: ((data) => void)

            Channel topic was updated

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      country?: string;
                      id: number;
                      professional: boolean;
                      ranking: number;
                      timestamp: number;
                      topic: string;
                      ui_class: string;
                      username: string;
                  }
                  • channel: string

                    The channel

                  • Optional country?: string

                    Country of the user that changed the topic

                  • id: number

                    User id of the user that changed the topic

                    @@ -90,40 +90,40 @@
                  • topic: string

                    The new topic

                  • ui_class: string

                    UI class of the user that changed the topic

                  • username: string

                    Username of the user that changed the topic

                    -

                Returns void

            chat-update-user: ((data) => void)

            A user's profile was updated

            +

            Returns void

            chat-update-user: ((data) => void)

            A user's profile was updated

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      channel: string;
                      old_player_id: number;
                      user: User;
                  }
                  • channel: string

                    The channel

                  • old_player_id: number

                    Player id entry that was update. This might change in the case of a guest logging in, in this case this will switch from being a negative (guest) id, to some positive id. It is not expected that a non guest id should change using this system.

                  • user: User

                    New user details

                    -

                Returns void

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            +

            Returns void

            game/:id/auto_resign: ((data) => void)

            Informs the client the player is scheduled to resign if not cleared

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      expiration: number;
                      game_id: number;
                      player_id: number;
                  }
                  • expiration: number

                    When the auto resign will happen

                  • game_id: number

                    The game id

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/chat: ((data) => void)

            A game chat message

            -

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            +

            Returns void

            game/:id/chat: ((data) => void)

            A game chat message

            +

            Type declaration

            game/:id/chat/remove: ((data) => void)

            Game chat lines should be removed

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      chat_ids: string[];
                      game_id: number;
                  }
                  • chat_ids: string[]

                    The chat ids

                  • game_id: number

                    The game id

                    -

                Returns void

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            +

            Returns void

            game/:id/clear_auto_resign: ((data) => void)

            The auto resign for the given player has been cleared

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/clock: ((data) => void)

            Game clock update

            -

            Type declaration

              • (data): void
              • Parameters

                Returns void

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            +

            Returns void

            game/:id/clock: ((data) => void)

            Game clock update

            +

            Type declaration

              • (data): void
              • Parameters

                Returns void

            game/:id/conditional_moves: ((data) => void)

            Update the conditional moves currently active

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      conditional_moves: ConditionalMoveResponse;
                      game_id: number;
                      move_number: number;
                  }
                  • conditional_moves: ConditionalMoveResponse

                    The conditional moves. The top level should be an array that looks like [null, { ... }] where the second element contains the responses to the opponent's move.

                  • game_id: number

                    The game id

                  • move_number: number

                    The move number from which the conditional moves are rooted in

                    -

                Returns void

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            -

            Type declaration

              • (data): void
              • Parameters

                • data: string

                Returns void

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            -

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            +

            Returns void

            game/:id/error: ((data) => void)

            Error that should be displayed to the user

            +

            Type declaration

              • (data): void
              • Parameters

                • data: string

                Returns void

            game/:id/gamedata: ((data) => void)

            Update the entire game state

            +

            Type declaration

            game/:id/latency: ((data) => void)

            Update latency information for a player

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      latency: number;
                      player_id: number;
                  }
                  • game_id: number

                    The game id

                  • latency: number

                    The latency in milliseconds

                  • player_id: number

                    The player id

                    -

                Returns void

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            -

            Type declaration

              • (data): void
              • Parameters

                • data: "play" | "stone removal" | "finished"

                Returns void

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      all_removed: string;
                      removed: boolean;
                      stones: string;
                  } | {
                      strict_seki_mode: boolean;
                  }

                Returns void

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and +

            Returns void

            game/:id/phase: ((data) => void)

            The phase has changed for the game

            +

            Type declaration

              • (data): void
              • Parameters

                • data: "play" | "stone removal" | "finished"

                Returns void

            game/:id/removed_stones: ((data) => void)

            Update the state of the stone removal phase

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      all_removed: string;
                      removed: boolean;
                      stones: string;
                  } | {
                      strict_seki_mode: boolean;
                  }

                Returns void

            game/:id/removed_stones_accepted: ((data) => void)

            The stone removal phase has been completed, this is the final state and indicates a phase change to the given phase (should always be "finished")

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      end_time: number;
                      outcome: string;
                      phase: "finished";
                      player_id: number;
                      players: {
                          black: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                          white: User | {
                              accepted_stones: string;
                              accepted_strict_seki_mode: boolean;
                          };
                      };
                      score: Score;
                      stones: string;
                      strict_seki_mode: boolean;
                      winner: number;
                  }
                  • end_time: number

                    Timestamp in ms

                    @@ -135,26 +135,26 @@
                  • stones: string
                  • strict_seki_mode: boolean

                    True if Japanese strict seki mode was true. This will probably always be false and may be removed in the future.

                  • winner: number

                    Player id of the winner

                    -

                Returns void

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            -

            Type declaration

              • (): void
              • Returns void

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            -

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            -

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            game/:id/reset-chats: (() => void)

            The chat log should be reset.

            +

            Type declaration

              • (): void
              • Returns void

            game/:id/stalling_score_estimate: ((data?) => void)

            A score estimation result has been broadcast, this is used for avoiding game stalling

            +

            Type declaration

            game/:id/undo_accepted: ((data) => void)

            Undo move has been accepted, the parameter is the new move number

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_canceled: ((data) => void)

            Undo request has been canceled, the parameter is the move number of the original request

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            game/:id/undo_requested: ((data) => void)

            Undo request has been requested, the parameter is the move number that we want to go back to

            +

            Type declaration

              • (data): void
              • Parameters

                • data: number

                Returns void

            gamelist-count: ((data) => void)

            Update number of live and correspondence games are currently being played

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      correspondence: number;
                      live: number;
                  }
                  • correspondence: number

                    Number of correspondence games

                  • live: number

                    Number of live games

                    -

                Returns void

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being +

            Returns void

            gamelist-count-:channel: ((data) => void)

            Update number of live and correspondence games are currently being played in a particular channel

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      correspondence: number;
                      live: number;
                  }
                  • correspondence: number

                    Number of correspondence games

                  • live: number

                    Number of live games

                    -

                Returns void

            hostinfo: ((data) => void)

            General host information for the termination server you +

            Returns void

            hostinfo: ((data) => void)

            General host information for the termination server you are connected to. This is a response to the hostinfo client message.

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      clients: number;
                      hostname: string;
                      uptime: number;
                  }
                  • clients: number

                    Number of clients connected, if available

                  • hostname: string

                    The hostname of the server

                  • uptime: number

                    Number of seconds the server has been running

                    -

                Returns void

            incident-report: ((data) => void)

            Incident report update

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      cleared_by_user?: boolean;
                      created: string;
                      id: number;
                      moderator?: User;
                      moderator_note: string;
                      report_type: string;
                      reported_conversation?: string;
                      reported_game?: number;
                      reported_review?: number;
                      reported_user?: User;
                      reporter_note: string;
                      reporter_note_translation: {
                          source_language: string;
                          source_text: string;
                          target_language: string;
                          target_text: string;
                      };
                      reporting_user?: User;
                      source: string;
                      state: "pending" | "claimed" | "resolved";
                      system_note: string;
                      updated: string;
                      url: string;
                      was_helpful: boolean;
                  }
                  • Optional cleared_by_user?: boolean
                  • created: string
                  • id: number
                  • Optional moderator?: User
                  • moderator_note: string
                  • report_type: string
                  • Optional reported_conversation?: string
                  • Optional reported_game?: number
                  • Optional reported_review?: number
                  • Optional reported_user?: User
                  • reporter_note: string
                  • reporter_note_translation: {
                        source_language: string;
                        source_text: string;
                        target_language: string;
                        target_text: string;
                    }
                    • source_language: string
                    • source_text: string
                    • target_language: string
                    • target_text: string
                  • Optional reporting_user?: User
                  • source: string
                  • state: "pending" | "claimed" | "resolved"
                  • system_note: string
                  • updated: string
                  • url: string
                  • was_helpful: boolean

                Returns void

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable +

            Returns void

            incident-report: ((data) => void)

            Incident report update

            +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      cleared_by_user?: boolean;
                      created: string;
                      id: number;
                      moderator?: User;
                      moderator_note: string;
                      report_type: string;
                      reported_conversation?: string;
                      reported_game?: number;
                      reported_review?: number;
                      reported_user?: User;
                      reporter_note: string;
                      reporter_note_translation: {
                          source_language: string;
                          source_text: string;
                          target_language: string;
                          target_text: string;
                      };
                      reporting_user?: User;
                      source: string;
                      state: "pending" | "claimed" | "resolved";
                      system_note: string;
                      updated: string;
                      url: string;
                      was_helpful: boolean;
                  }
                  • Optional cleared_by_user?: boolean
                  • created: string
                  • id: number
                  • Optional moderator?: User
                  • moderator_note: string
                  • report_type: string
                  • Optional reported_conversation?: string
                  • Optional reported_game?: number
                  • Optional reported_review?: number
                  • Optional reported_user?: User
                  • reporter_note: string
                  • reporter_note_translation: {
                        source_language: string;
                        source_text: string;
                        target_language: string;
                        target_text: string;
                    }
                    • source_language: string
                    • source_text: string
                    • target_language: string
                    • target_text: string
                  • Optional reporting_user?: User
                  • source: string
                  • state: "pending" | "claimed" | "resolved"
                  • system_note: string
                  • updated: string
                  • url: string
                  • was_helpful: boolean

                Returns void

            itc: ((data) => void)

            "Inter Tab Communication" message. This is a client utility to enable relaying of messages between devices - the event and data are application defined, the server blindly relays to all connected devices for the sending user. Note this is relayed to all devices regardless @@ -163,17 +163,17 @@ the web client sending this will arrive on an android and ios instance)

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: any;
                      event: string;
                  }
                  • data: any

                    User defined data

                  • event: string

                    User defined event string

                    -

                Returns void

            net/pong: ((data) => void)

            Pong response from a ping

            +

            Returns void

            net/pong: ((data) => void)

            Pong response from a ping

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      client: number;
                      server: number;
                  }
                  • client: number

                    Client timestamp that was sent

                  • server: number

                    Server timestamp when it was received

                    -

                Returns void

            notification: ((data) => void)

            A notification that should be displayed to the user +

            Returns void

            notification: ((data) => void)

            A notification that should be displayed to the user These are not strongly modeled, see https://github.com/online-go/online-go.com/blob/devel/src/components/Notifications/Notifications.tsx as a reference for what types there are and what data they contain

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      id: string;
                      type: string;
                      [key: string]: any;
                  }
                  • [key: string]: any

                    There are often more fields here

                  • id: string

                    The notification id

                  • type: string

                    The notification type

                    -

                Returns void

            private-message: ((data) => void)

            A private message was received

            +

            Returns void

            private-message: ((data) => void)

            A private message was received

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      from: User;
                      message: {
                          i: string;
                          m: string;
                          t: number;
                      };
                      superchat_enabled?: boolean;
                      to: User;
                  }
                  • from: User

                    Who sent the message

                  • message: {
                        i: string;
                        m: string;
                        t: number;
                    }

                    The message received

                    • i: string

                      Message id.

                      @@ -183,7 +183,7 @@ is when a moderator needs to talk with a player and ignoring the moderator is not suitable thing to do.

                    • to: User

                      Your user id

                      -

                Returns void

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A +

            Returns void

            private-superchat: ((data) => void)

            Notify the client that a private message "super chat" has started. A super chat is an undismissable chat sent by a moderator. It should take all focus and not let the client do anything until the conversation is resolved (the enable flag is set to false)

            @@ -194,30 +194,30 @@
          • moderator_username: string

            The moderator username contacting the player

          • player_id: number

            Your id

          • player_username: string

            Your username

            -
          • Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage +

            Returns void

            remote_storage/sync_complete: (() => void)

            Notification that the server has completed sending all remote storage data and the client should now be up to date.

            -

            Type declaration

              • (): void
              • Returns void

            remote_storage/update: ((data) => void)

            Updates a key value pair

            +

            Type declaration

              • (): void
              • Returns void

            remote_storage/update: ((data) => void)

            Updates a key value pair

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      key: string;
                      modified: string;
                      replication: RemoteStorageReplication;
                      value: any;
                  }
                  • key: string

                    Key for the k/v pair

                  • modified: string

                    Timestamp of the update

                  • replication: RemoteStorageReplication

                    Replication mode

                  • value: any

                    Value of of the k/v pair

                    -

                Returns void

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            -

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            -

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the +

            Returns void

            review/:id/full_state: ((data) => void)

            Replay of the entire full state of the review

            +

            Type declaration

            review/:id/r: ((data) => void)

            An incremental modification to the review stream

            +

            Type declaration

            score-estimator-enabled-state: ((data) => void)

            Notifies the client whether the the client shares an IP with one of the players of the game. This is used to disable the score estimator in anonymous browsing windows for players of a game when the score estimator is disabled for the game.

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      game_id: number;
                      shared_ip_with_player: boolean;
                  }
                  • game_id: number

                    The game ID

                  • shared_ip_with_player: boolean

                    True if the client shares an IP with one of the players of the game

                    -

                Returns void

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, +

            Returns void

            seekgraph/global: ((messages) => void)

            Type declaration

            ui-push: ((data) => void)

            A UI Push notification. The event and data are not well defined here, they come as a result to subscribing to ui push channels with ui-pushes/subscribe.

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      data: string;
                      event: string;
                  }
                  • data: string

                    UI Push data

                  • event: string

                    UI Push event

                    -

                Returns void

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            -

            Type declaration

              • (jwt): void
              • Parameters

                • jwt: string

                Returns void

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for +

            Returns void

            user/jwt: ((jwt) => void)

            Update the user's JWT token

            +

            Type declaration

              • (jwt): void
              • Parameters

                • jwt: string

                Returns void

            user/state: ((data) => void)

            Updates whether a user is online or not. Subscribe to these updates for particular users using the user/monitor command.

            -

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [player_id: number]: boolean;
                  }
                  • [player_id: number]: boolean

                Returns void

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User +

            Type declaration

              • (data): void
              • Parameters

                • data: {
                      [player_id: number]: boolean;
                  }
                  • [player_id: number]: boolean

                Returns void

            user/update: ((user) => void)

            Update user information. For other players, this has the standard User fields, when this is the current user, it can have additional fields that are found in the ui/config

            -

            Type declaration

              • (user): void
              • Parameters

                • user: User & {
                      [extra: string]: any;
                  }

                Returns void

            \ No newline at end of file +

            Type declaration

            \ No newline at end of file diff --git a/docs/interfaces/protocol.StallingScoreEstimate.html b/docs/interfaces/protocol.StallingScoreEstimate.html index 3c56b058..8555381f 100644 --- a/docs/interfaces/protocol.StallingScoreEstimate.html +++ b/docs/interfaces/protocol.StallingScoreEstimate.html @@ -1,8 +1,8 @@ -StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id +StallingScoreEstimate | goban

            Interface StallingScoreEstimate

            interface StallingScoreEstimate {
                game_id: number;
                move_number: number;
                ownership: any[];
                predicted_winner: "black" | "white";
                removed: string;
                score: number;
                win_rate: number;
            }

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file +

            Properties

            game_id: number
            move_number: number
            ownership: any[]
            predicted_winner: "black" | "white"
            removed: string
            score: number
            win_rate: number
            \ No newline at end of file diff --git a/docs/interfaces/protocol.User.html b/docs/interfaces/protocol.User.html index d8678679..8a05c9d6 100644 --- a/docs/interfaces/protocol.User.html +++ b/docs/interfaces/protocol.User.html @@ -1,8 +1,8 @@ -User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country? +User | goban

            Interface User

            interface User {
                country?: string;
                id: number;
                professional?: boolean;
                ranking?: number;
                ratings?: {
                    [speed_size: string]: Glicko2;
                };
                ui_class?: string;
                username: string;
            }

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file +

            Properties

            country?: string
            id: number
            professional?: boolean
            ranking?: number
            ratings?: {
                [speed_size: string]: Glicko2;
            }

            Type declaration

            ui_class?: string
            username: string
            \ No newline at end of file diff --git a/docs/interfaces/translate.GobanStrings.html b/docs/interfaces/translate.GobanStrings.html index d7cd5ddb..0ecd06ea 100644 --- a/docs/interfaces/translate.GobanStrings.html +++ b/docs/interfaces/translate.GobanStrings.html @@ -1,4 +1,4 @@ -GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd +GobanStrings | goban

            Interface GobanStrings

            interface GobanStrings {
                %sd: string;
                %sh: string;
                %sm: string;
                %ss: string;
                %swk: string;
                A stone has already been placed here: string;
                Anime: string;
                Black: string;
                Black Walnut: string;
                Black to move: string;
                Book: string;
                Bright Kaya: string;
                Control passed to %s: string;
                Custom: string;
                Enter the label you want to add to the board: string;
                Error: string;
                Error submitting move: string;
                Game Finished: string;
                Glass: string;
                Granite: string;
                HNG: string;
                HNG Night: string;
                Illegal Ko Move: string;
                Illegal board repetition: string;
                Kaya: string;
                Loading...: string;
                Move is suicidal: string;
                Night: string;
                Night Play: string;
                Persimmon: string;
                Plain: string;
                Processing...: string;
                Red Oak: string;
                Review: string;
                Self-capture is not allowed: string;
                Shell: string;
                Slate: string;
                Stone Removal: string;
                Stone Removal Phase: string;
                Submitting...: string;
                Synchronization error, reloading: string;
                The game would be repeating with that move, please play somewhere else first: string;
                White: string;
                White to move: string;
                Worn Glass: string;
                Your move: string;
                Your move - opponent passed: string;
            }

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file +

            Properties

            %sd: string
            %sh: string
            %sm: string
            %ss: string
            %swk: string
            A stone has already been placed here: string
            Anime: string
            Black: string
            Black Walnut: string
            Black to move: string
            Book: string
            Bright Kaya: string
            Control passed to %s: string
            Custom: string
            Enter the label you want to add to the board: string
            Error: string
            Error submitting move: string
            Game Finished: string
            Glass: string
            Granite: string
            HNG: string
            HNG Night: string
            Illegal Ko Move: string
            Illegal board repetition: string
            Kaya: string
            Loading...: string
            Move is suicidal: string
            Night: string
            Night Play: string
            Persimmon: string
            Plain: string
            Processing...: string
            Red Oak: string
            Review: string
            Self-capture is not allowed: string
            Shell: string
            Slate: string
            Stone Removal: string
            Stone Removal Phase: string
            Submitting...: string
            Synchronization error, reloading: string
            The game would be repeating with that move, please play somewhere else first: string
            White: string
            White to move: string
            Worn Glass: string
            Your move: string
            Your move - opponent passed: string
            \ No newline at end of file diff --git a/docs/modules/protocol.html b/docs/modules/protocol.html index 3fd7a5b5..c93694aa 100644 --- a/docs/modules/protocol.html +++ b/docs/modules/protocol.html @@ -59,7 +59,7 @@ for backwards compatibility.

            -

            Index

            Enumerations

            Index

            Enumerations

            Interfaces

            AIServerToClient AutomatchPreferences ClientToAIServer diff --git a/docs/modules/translate.html b/docs/modules/translate.html index d892a38c..3ea9edfa 100644 --- a/docs/modules/translate.html +++ b/docs/modules/translate.html @@ -1,4 +1,4 @@ -translate | goban

            Namespace translate

            Index

            Interfaces

            GobanStrings +translate | goban

            Namespace translate

            Index

            Interfaces

            Functions

            _ interpolate setGobanTranslations diff --git a/docs/types/AdHocPackedMove.html b/docs/types/AdHocPackedMove.html index debee3af..a470678a 100644 --- a/docs/types/AdHocPackedMove.html +++ b/docs/types/AdHocPackedMove.html @@ -1 +1 @@ -AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file +AdHocPackedMove | goban

            Type alias AdHocPackedMove

            AdHocPackedMove: [number, number, number?, JGOFNumericPlayerColor?, {
                [index: string]: any;
            }?]
            \ No newline at end of file diff --git a/docs/types/AnalysisSubTool.html b/docs/types/AnalysisSubTool.html index 88ad3321..da65b310 100644 --- a/docs/types/AnalysisSubTool.html +++ b/docs/types/AnalysisSubTool.html @@ -1 +1 @@ -AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file +AnalysisSubTool | goban

            Type alias AnalysisSubTool

            AnalysisSubTool: "black" | "white" | "alternate" | "letters" | "numbers" | string
            \ No newline at end of file diff --git a/docs/types/AnalysisTool.html b/docs/types/AnalysisTool.html index 53c8d7bb..3c34dfdf 100644 --- a/docs/types/AnalysisTool.html +++ b/docs/types/AnalysisTool.html @@ -1 +1 @@ -AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file +AnalysisTool | goban

            Type alias AnalysisTool

            AnalysisTool: "stone" | "draw" | "label" | "score" | "removal"
            \ No newline at end of file diff --git a/docs/types/BoardTransform.html b/docs/types/BoardTransform.html index 7dc42eb2..618e6ab0 100644 --- a/docs/types/BoardTransform.html +++ b/docs/types/BoardTransform.html @@ -9,4 +9,4 @@

            The "easy to understand" part is that the id can be compared visually to the board position

            The downside is that the id string can be moderately long for boards with lots of stones

            -

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file +

            Type declaration

              • (x, y): {
                    x: number;
                    y: number;
                }
              • Parameters

                • x: number
                • y: number

                Returns {
                    x: number;
                    y: number;
                }

                • x: number
                • y: number
            \ No newline at end of file diff --git a/docs/types/ConditionalMoveResponse.html b/docs/types/ConditionalMoveResponse.html index 0166cd57..4c134b83 100644 --- a/docs/types/ConditionalMoveResponse.html +++ b/docs/types/ConditionalMoveResponse.html @@ -1,3 +1,3 @@ ConditionalMoveResponse | goban

            Type alias ConditionalMoveResponse

            ConditionalMoveResponse: [string | null, ConditionalMoveResponseTree]

            A branch in the conditional move tree, consists of the response move and the sub-tree of the next possible moves

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/DataArgument.html b/docs/types/DataArgument.html index b5013c08..abaea45f 100644 --- a/docs/types/DataArgument.html +++ b/docs/types/DataArgument.html @@ -1 +1 @@ -DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +DataArgument | goban

            Type alias DataArgument<Entry>

            DataArgument<Entry>: Entry extends ((...args) => void)
                ? A[0]
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/GobanChatLog.html b/docs/types/GobanChatLog.html index a0440b46..f2fd3d8a 100644 --- a/docs/types/GobanChatLog.html +++ b/docs/types/GobanChatLog.html @@ -1 +1 @@ -GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file +GobanChatLog | goban

            Type alias GobanChatLog

            GobanChatLog: GameChatLine[]
            \ No newline at end of file diff --git a/docs/types/GobanEnginePhase.html b/docs/types/GobanEnginePhase.html index 4cdc5dd5..77bb4eb1 100644 --- a/docs/types/GobanEnginePhase.html +++ b/docs/types/GobanEnginePhase.html @@ -1 +1 @@ -GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file +GobanEnginePhase | goban

            Type alias GobanEnginePhase

            GobanEnginePhase: "play" | "stone removal" | "finished"
            \ No newline at end of file diff --git a/docs/types/GobanEngineRules.html b/docs/types/GobanEngineRules.html index 93bc42bb..d7b63f06 100644 --- a/docs/types/GobanEngineRules.html +++ b/docs/types/GobanEngineRules.html @@ -1 +1 @@ -GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file +GobanEngineRules | goban

            Type alias GobanEngineRules

            GobanEngineRules: "chinese" | "aga" | "japanese" | "korean" | "ing" | "nz"
            \ No newline at end of file diff --git a/docs/types/GobanEngineSuperKoAlgorithm.html b/docs/types/GobanEngineSuperKoAlgorithm.html index fe929ea0..beeed3d4 100644 --- a/docs/types/GobanEngineSuperKoAlgorithm.html +++ b/docs/types/GobanEngineSuperKoAlgorithm.html @@ -1 +1 @@ -GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file +GobanEngineSuperKoAlgorithm | goban

            Type alias GobanEngineSuperKoAlgorithm

            GobanEngineSuperKoAlgorithm: "psk" | "csk" | "ssk" | "noresult" | "ing"
            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageId.html b/docs/types/GobanErrorMessageId.html index 7b8762b0..a388064b 100644 --- a/docs/types/GobanErrorMessageId.html +++ b/docs/types/GobanErrorMessageId.html @@ -1 +1 @@ -GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file +GobanErrorMessageId | goban

            Type alias GobanErrorMessageId

            \ No newline at end of file diff --git a/docs/types/GobanErrorMessageObject.html b/docs/types/GobanErrorMessageObject.html index e4f808ad..3734fc95 100644 --- a/docs/types/GobanErrorMessageObject.html +++ b/docs/types/GobanErrorMessageObject.html @@ -1 +1 @@ -GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file +GobanErrorMessageObject | goban

            Type alias GobanErrorMessageObject

            \ No newline at end of file diff --git a/docs/types/GobanIOErrorMessageId.html b/docs/types/GobanIOErrorMessageId.html index a39175fd..d5d5dd3a 100644 --- a/docs/types/GobanIOErrorMessageId.html +++ b/docs/types/GobanIOErrorMessageId.html @@ -1 +1 @@ -GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file +GobanIOErrorMessageId | goban

            Type alias GobanIOErrorMessageId

            GobanIOErrorMessageId: "failed_to_load_sgf"
            \ No newline at end of file diff --git a/docs/types/GobanModes.html b/docs/types/GobanModes.html index 536c1d38..266c5840 100644 --- a/docs/types/GobanModes.html +++ b/docs/types/GobanModes.html @@ -1 +1 @@ -GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file +GobanModes | goban

            Type alias GobanModes

            GobanModes: "play" | "puzzle" | "score estimation" | "analyze" | "conditional"
            \ No newline at end of file diff --git a/docs/types/GobanMoveErrorMessageId.html b/docs/types/GobanMoveErrorMessageId.html index 492ccefe..1a7aa870 100644 --- a/docs/types/GobanMoveErrorMessageId.html +++ b/docs/types/GobanMoveErrorMessageId.html @@ -1 +1 @@ -GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file +GobanMoveErrorMessageId | goban

            Type alias GobanMoveErrorMessageId

            GobanMoveErrorMessageId: "stone_already_placed_here" | "illegal_self_capture" | "illegal_ko_move" | "illegal_board_repetition" | "move_error"
            \ No newline at end of file diff --git a/docs/types/GobanMovesArray.html b/docs/types/GobanMovesArray.html index bc9c4432..2a665ab3 100644 --- a/docs/types/GobanMovesArray.html +++ b/docs/types/GobanMovesArray.html @@ -1 +1 @@ -GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file +GobanMovesArray | goban

            Type alias GobanMovesArray

            GobanMovesArray: AdHocPackedMove[] | JGOFMove[]
            \ No newline at end of file diff --git a/docs/types/GobanRenderer.html b/docs/types/GobanRenderer.html index 2bef4a2e..95bd8163 100644 --- a/docs/types/GobanRenderer.html +++ b/docs/types/GobanRenderer.html @@ -1 +1 @@ -GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file +GobanRenderer | goban

            Type alias GobanRenderer

            GobanRenderer: GobanCanvas | SVGRenderer
            \ No newline at end of file diff --git a/docs/types/GobanRendererConfig.html b/docs/types/GobanRendererConfig.html index a030d3b2..d13e77ac 100644 --- a/docs/types/GobanRendererConfig.html +++ b/docs/types/GobanRendererConfig.html @@ -1 +1 @@ -GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file +GobanRendererConfig | goban

            Type alias GobanRendererConfig

            \ No newline at end of file diff --git a/docs/types/JGOFTimeControl.html b/docs/types/JGOFTimeControl.html index 65b0eb93..0d612bc7 100644 --- a/docs/types/JGOFTimeControl.html +++ b/docs/types/JGOFTimeControl.html @@ -1 +1 @@ -JGOFTimeControl | goban
            \ No newline at end of file +JGOFTimeControl | goban
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSpeed.html b/docs/types/JGOFTimeControlSpeed.html index 9c35827b..d41a39a1 100644 --- a/docs/types/JGOFTimeControlSpeed.html +++ b/docs/types/JGOFTimeControlSpeed.html @@ -1 +1 @@ -JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "live" | "correspondence"
            \ No newline at end of file +JGOFTimeControlSpeed | goban

            Type alias JGOFTimeControlSpeed

            JGOFTimeControlSpeed: "blitz" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/types/JGOFTimeControlSystem.html b/docs/types/JGOFTimeControlSystem.html index 889f1972..e0657b07 100644 --- a/docs/types/JGOFTimeControlSystem.html +++ b/docs/types/JGOFTimeControlSystem.html @@ -1 +1 @@ -JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file +JGOFTimeControlSystem | goban

            Type alias JGOFTimeControlSystem

            JGOFTimeControlSystem: "fischer" | "byoyomi" | "canadian" | "simple" | "absolute" | "none"
            \ No newline at end of file diff --git a/docs/types/LabelPosition.html b/docs/types/LabelPosition.html index eedcf958..04a01248 100644 --- a/docs/types/LabelPosition.html +++ b/docs/types/LabelPosition.html @@ -1 +1 @@ -LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file +LabelPosition | goban

            Type alias LabelPosition

            LabelPosition: "all" | "none" | "top-left" | "top-right" | "bottom-right" | "bottom-left"
            \ No newline at end of file diff --git a/docs/types/Matrix.html b/docs/types/Matrix.html index 11895310..e267af16 100644 --- a/docs/types/Matrix.html +++ b/docs/types/Matrix.html @@ -1 +1 @@ -Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file +Matrix | goban

            Type alias Matrix<T>

            Matrix<T>: T[][]

            Type Parameters

            • T
            \ No newline at end of file diff --git a/docs/types/MoveTreePenMarks.html b/docs/types/MoveTreePenMarks.html index 7c717f92..16b1614c 100644 --- a/docs/types/MoveTreePenMarks.html +++ b/docs/types/MoveTreePenMarks.html @@ -1 +1 @@ -MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file +MoveTreePenMarks | goban

            Type alias MoveTreePenMarks

            MoveTreePenMarks: {
                color: string;
                points: number[];
            }[]

            Type declaration

            • color: string
            • points: number[]
            \ No newline at end of file diff --git a/docs/types/NumberMatrix.html b/docs/types/NumberMatrix.html index 0bbeb078..bd022d9a 100644 --- a/docs/types/NumberMatrix.html +++ b/docs/types/NumberMatrix.html @@ -1 +1 @@ -NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file +NumberMatrix | goban

            Type alias NumberMatrix

            NumberMatrix: Matrix<number>
            \ No newline at end of file diff --git a/docs/types/PlayerColor.html b/docs/types/PlayerColor.html index 2faf895b..cecc9dbd 100644 --- a/docs/types/PlayerColor.html +++ b/docs/types/PlayerColor.html @@ -1 +1 @@ -PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file +PlayerColor | goban

            Type alias PlayerColor

            PlayerColor: "black" | "white"
            \ No newline at end of file diff --git a/docs/types/ProtocolResponseType.html b/docs/types/ProtocolResponseType.html index 76dbaab5..5749d538 100644 --- a/docs/types/ProtocolResponseType.html +++ b/docs/types/ProtocolResponseType.html @@ -1 +1 @@ -ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file +ProtocolResponseType | goban

            Type alias ProtocolResponseType<Entry>

            ProtocolResponseType<Entry>: Entry extends ((...args) => infer R)
                ? R
                : never

            Type Parameters

            • Entry
            \ No newline at end of file diff --git a/docs/types/PuzzleOpponentMoveMode.html b/docs/types/PuzzleOpponentMoveMode.html index 282751c7..58b5d721 100644 --- a/docs/types/PuzzleOpponentMoveMode.html +++ b/docs/types/PuzzleOpponentMoveMode.html @@ -1 +1 @@ -PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file +PuzzleOpponentMoveMode | goban

            Type alias PuzzleOpponentMoveMode

            PuzzleOpponentMoveMode: "manual" | "automatic"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlacementSetting.html b/docs/types/PuzzlePlacementSetting.html index eacaf2e2..34d51cb6 100644 --- a/docs/types/PuzzlePlacementSetting.html +++ b/docs/types/PuzzlePlacementSetting.html @@ -1 +1 @@ -PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file +PuzzlePlacementSetting | goban

            Type alias PuzzlePlacementSetting

            PuzzlePlacementSetting: {
                mode: "play";
            } | {
                color: JGOFNumericPlayerColor;
                mode: "setup";
            } | {
                color: 0;
                mode: "place";
            }

            Type declaration

            • mode: "play"

            Type declaration

            Type declaration

            • color: 0
            • mode: "place"
            \ No newline at end of file diff --git a/docs/types/PuzzlePlayerMoveMode.html b/docs/types/PuzzlePlayerMoveMode.html index 68d35779..069efe27 100644 --- a/docs/types/PuzzlePlayerMoveMode.html +++ b/docs/types/PuzzlePlayerMoveMode.html @@ -1 +1 @@ -PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file +PuzzlePlayerMoveMode | goban

            Type alias PuzzlePlayerMoveMode

            PuzzlePlayerMoveMode: "free" | "fixed"
            \ No newline at end of file diff --git a/docs/types/RawStoneString.html b/docs/types/RawStoneString.html index 27aeeb42..de9105b6 100644 --- a/docs/types/RawStoneString.html +++ b/docs/types/RawStoneString.html @@ -1,2 +1,2 @@ RawStoneString | goban

            Type alias RawStoneString

            RawStoneString: JGOFIntersection[]

            A raw stone string is simply an array of intersections

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/StringMatrix.html b/docs/types/StringMatrix.html index 99f3c319..d76a2842 100644 --- a/docs/types/StringMatrix.html +++ b/docs/types/StringMatrix.html @@ -1 +1 @@ -StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file +StringMatrix | goban

            Type alias StringMatrix

            StringMatrix: Matrix<string>
            \ No newline at end of file diff --git a/docs/types/_internal_.ClockTime.html b/docs/types/_internal_.ClockTime.html index f23319c6..50440810 100644 --- a/docs/types/_internal_.ClockTime.html +++ b/docs/types/_internal_.ClockTime.html @@ -1 +1 @@ -ClockTime | goban
            \ No newline at end of file +ClockTime | goban
            \ No newline at end of file diff --git a/docs/types/_internal_.DebugOutput.html b/docs/types/_internal_.DebugOutput.html index 28306643..1f9338c3 100644 --- a/docs/types/_internal_.DebugOutput.html +++ b/docs/types/_internal_.DebugOutput.html @@ -1,2 +1,2 @@ DebugOutput | goban

            Type alias DebugOutput

            DebugOutput: string

            -
            \ No newline at end of file +
            \ No newline at end of file diff --git a/docs/types/_internal_.LocalEstimator.html b/docs/types/_internal_.LocalEstimator.html index 5835305b..3133e8fd 100644 --- a/docs/types/_internal_.LocalEstimator.html +++ b/docs/types/_internal_.LocalEstimator.html @@ -5,4 +5,4 @@
          • trials: number

            number of playouts. Not applicable to all estimators, but higher generally means higher accuracy and higher compute cost

          • tolerance: number

            (0.0-1.0) confidence required to mark an intersection not neutral.

            -
          • Returns NumberMatrix

            \ No newline at end of file +

            Returns NumberMatrix

            \ No newline at end of file diff --git a/docs/types/_internal_.MessageID.html b/docs/types/_internal_.MessageID.html index f4166361..73f17df8 100644 --- a/docs/types/_internal_.MessageID.html +++ b/docs/types/_internal_.MessageID.html @@ -1 +1 @@ -MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file +MessageID | goban

            Type alias MessageID

            MessageID: GobanMoveErrorMessageId | "error" | "error_submitting_move" | "loading" | "processing" | "self_capture_not_allowed" | "server_message" | "illegal_ko_move" | "synchronization_error"
            \ No newline at end of file diff --git a/docs/types/_internal_.NoneClock.html b/docs/types/_internal_.NoneClock.html index 48b14446..fe731c6f 100644 --- a/docs/types/_internal_.NoneClock.html +++ b/docs/types/_internal_.NoneClock.html @@ -1 +1 @@ -NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file +NoneClock | goban

            Type alias NoneClock

            NoneClock: undefined
            \ No newline at end of file diff --git a/docs/types/_internal_.SimpleClock.html b/docs/types/_internal_.SimpleClock.html index 5cc47f05..0d1901b0 100644 --- a/docs/types/_internal_.SimpleClock.html +++ b/docs/types/_internal_.SimpleClock.html @@ -1 +1 @@ -SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file +SimpleClock | goban

            Type alias SimpleClock

            SimpleClock: number
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneType.html b/docs/types/_internal_.StoneType.html index dd81b71f..f220aa37 100644 --- a/docs/types/_internal_.StoneType.html +++ b/docs/types/_internal_.StoneType.html @@ -1 +1 @@ -StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file +StoneType | goban

            Type alias StoneType

            StoneType: {
                shadow: HTMLCanvasElement;
                stone: HTMLCanvasElement;
            }

            Type declaration

            • shadow: HTMLCanvasElement
            • stone: HTMLCanvasElement
            \ No newline at end of file diff --git a/docs/types/_internal_.StoneTypeArray.html b/docs/types/_internal_.StoneTypeArray.html index b6bf917c..9c1089f9 100644 --- a/docs/types/_internal_.StoneTypeArray.html +++ b/docs/types/_internal_.StoneTypeArray.html @@ -1 +1 @@ -StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file +StoneTypeArray | goban

            Type alias StoneTypeArray

            StoneTypeArray: StoneType[]
            \ No newline at end of file diff --git a/docs/types/protocol.AutomatchCondition.html b/docs/types/protocol.AutomatchCondition.html index 834ae98d..8bbe6848 100644 --- a/docs/types/protocol.AutomatchCondition.html +++ b/docs/types/protocol.AutomatchCondition.html @@ -1 +1 @@ -AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file +AutomatchCondition | goban

            Type alias AutomatchCondition

            AutomatchCondition: "required" | "preferred" | "no-preference"
            \ No newline at end of file diff --git a/docs/types/protocol.RuleSet.html b/docs/types/protocol.RuleSet.html index 5dd5ef51..0cfca618 100644 --- a/docs/types/protocol.RuleSet.html +++ b/docs/types/protocol.RuleSet.html @@ -1 +1 @@ -RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file +RuleSet | goban

            Type alias RuleSet

            RuleSet: "japanese" | "chinese" | "aga" | "korean" | "nz" | "ing"
            \ No newline at end of file diff --git a/docs/types/protocol.Size.html b/docs/types/protocol.Size.html index 9f07cfd3..0c66e2a3 100644 --- a/docs/types/protocol.Size.html +++ b/docs/types/protocol.Size.html @@ -1 +1 @@ -Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file +Size | goban

            Type alias Size

            Size: "9x9" | "13x13" | "19x19"
            \ No newline at end of file diff --git a/docs/types/protocol.Speed.html b/docs/types/protocol.Speed.html index ff700e7f..cf1529b2 100644 --- a/docs/types/protocol.Speed.html +++ b/docs/types/protocol.Speed.html @@ -1 +1 @@ -Speed | goban

            Type alias Speed

            Speed: "blitz" | "live" | "correspondence"
            \ No newline at end of file +Speed | goban

            Type alias Speed

            Speed: "blitz" | "live" | "correspondence"
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TOLERANCE.html b/docs/variables/AUTOSCORE_TOLERANCE.html index 6ce04d9d..e32f56d8 100644 --- a/docs/variables/AUTOSCORE_TOLERANCE.html +++ b/docs/variables/AUTOSCORE_TOLERANCE.html @@ -1 +1 @@ -AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file +AUTOSCORE_TOLERANCE | goban

            Variable AUTOSCORE_TOLERANCEConst

            AUTOSCORE_TOLERANCE: 0.1 = 0.1
            \ No newline at end of file diff --git a/docs/variables/AUTOSCORE_TRIALS.html b/docs/variables/AUTOSCORE_TRIALS.html index bf754e95..9e2712ea 100644 --- a/docs/variables/AUTOSCORE_TRIALS.html +++ b/docs/variables/AUTOSCORE_TRIALS.html @@ -1 +1 @@ -AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file +AUTOSCORE_TRIALS | goban

            Variable AUTOSCORE_TRIALSConst

            AUTOSCORE_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/GOBAN_FONT.html b/docs/variables/GOBAN_FONT.html index cdd5ae30..b608ce6f 100644 --- a/docs/variables/GOBAN_FONT.html +++ b/docs/variables/GOBAN_FONT.html @@ -1 +1 @@ -GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file +GOBAN_FONT | goban

            Variable GOBAN_FONTConst

            GOBAN_FONT: "Verdana,Arial,sans-serif" = "Verdana,Arial,sans-serif"
            \ No newline at end of file diff --git a/docs/variables/MARK_TYPES.html b/docs/variables/MARK_TYPES.html index fe9609f3..fac35cbd 100644 --- a/docs/variables/MARK_TYPES.html +++ b/docs/variables/MARK_TYPES.html @@ -1 +1 @@ -MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file +MARK_TYPES | goban

            Variable MARK_TYPESConst

            MARK_TYPES: (keyof MarkInterface)[] = ...
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html index 20bb939a..7fc35d08 100644 --- a/docs/variables/SCORE_ESTIMATION_TOLERANCE.html +++ b/docs/variables/SCORE_ESTIMATION_TOLERANCE.html @@ -1 +1 @@ -SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file +SCORE_ESTIMATION_TOLERANCE | goban

            Variable SCORE_ESTIMATION_TOLERANCEConst

            SCORE_ESTIMATION_TOLERANCE: 0.3 = 0.3
            \ No newline at end of file diff --git a/docs/variables/SCORE_ESTIMATION_TRIALS.html b/docs/variables/SCORE_ESTIMATION_TRIALS.html index 3524df0b..f6adbc07 100644 --- a/docs/variables/SCORE_ESTIMATION_TRIALS.html +++ b/docs/variables/SCORE_ESTIMATION_TRIALS.html @@ -1 +1 @@ -SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file +SCORE_ESTIMATION_TRIALS | goban

            Variable SCORE_ESTIMATION_TRIALSConst

            SCORE_ESTIMATION_TRIALS: 1000 = 1000
            \ No newline at end of file diff --git a/docs/variables/THEMES.html b/docs/variables/THEMES.html index 7558ce13..e3df7112 100644 --- a/docs/variables/THEMES.html +++ b/docs/variables/THEMES.html @@ -1 +1 @@ -THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file +THEMES | goban

            Variable THEMESConst

            THEMES: ThemesInterface = ...
            \ No newline at end of file diff --git a/docs/variables/THEMES_SORTED.html b/docs/variables/THEMES_SORTED.html index 29cc5e03..a173b4df 100644 --- a/docs/variables/THEMES_SORTED.html +++ b/docs/variables/THEMES_SORTED.html @@ -1 +1 @@ -THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file +THEMES_SORTED | goban

            Variable THEMES_SORTEDConst

            THEMES_SORTED: {
                black: GobanTheme[];
                board: GobanTheme[];
                white: GobanTheme[];
                [key: string]: GobanTheme[];
            } = ...

            Type declaration

            \ No newline at end of file diff --git a/docs/variables/callbacks.html b/docs/variables/callbacks.html index 4528cb64..3e5a5b34 100644 --- a/docs/variables/callbacks.html +++ b/docs/variables/callbacks.html @@ -1 +1 @@ -callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file +callbacks | goban

            Variable callbacksConst

            callbacks: GobanCallbacks = ...
            \ No newline at end of file diff --git a/docs/variables/remote_estimate_ownership.html b/docs/variables/remote_estimate_ownership.html index e8c9ab6f..49415fa6 100644 --- a/docs/variables/remote_estimate_ownership.html +++ b/docs/variables/remote_estimate_ownership.html @@ -1 +1 @@ -remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file +remote_estimate_ownership | goban

            Variable remote_estimate_ownership

            remote_estimate_ownership: ((req) => Promise<ScoreEstimateResponse>) | undefined

            Type declaration

            \ No newline at end of file