{"id":311914,"date":"2020-10-23T09:00:38","date_gmt":"2020-10-23T09:00:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=311914"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=311914","title":{"rendered":"DagazServer: \u041a\u0430\u043a \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u041f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u044f \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u043e\u043d\u0442\u044d\u0434\u0449\u0438\u043a. \u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u044d\u043d\u0434\u043e\u043c. \u041b\u044e\u0431\u043e\u0432\u044c \u043a \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u0430\u043c \u2014 \u0432\u043e\u0442 \u0447\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u044f \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 web-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439. \u041d\u043e\u0432\u044b\u0439, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u0435 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 JavaScript, \u044f \u0438\u0437\u0443\u0447\u0430\u043b \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. \u0414\u043e\u043f\u0443\u0441\u043a\u0430\u044e, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0435 \u0438\u0437 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u043b, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u0443\u0436\u0430\u0441\u043d\u0443\u0442\u044c \u043e\u043f\u044b\u0442\u043d\u044b\u0445 web-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043d\u043e \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u0442\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435. \u042d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u0432\u043e \u0432\u0441\u0451\u043c \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043b\u044e\u0431\u0438\u0442\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0435\u043b\u043e\u0447\u0438, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u043d\u044c \u043c\u043e\u0435\u0433\u043e \u043b\u0435\u0441\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/a7\/gv\/zy\/a7gvzynraneaz6j531jgz_widai.jpeg\"><\/div>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421 \u0447\u0435\u0433\u043e \u0432\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0424\u0430\u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0433\u0440\u0430\u043c\u0438 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 \u0441 <a href=\"http:\/\/www.zillions-of-games.com\/\" rel=\"nofollow\">Zillions of Games<\/a>. \u0422\u043e \u0447\u0442\u043e \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u044b \u2014 \u043d\u043e\u0432\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0431\u044b\u043b\u043e. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 ZRF \u2014 Lisp-\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"http:\/\/www.zillions-of-games.com\/cgi-bin\/zilligames\/submissions.cgi?searchauthor=498\" rel=\"nofollow\">\u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0433\u0440<\/a>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438\u0433\u0440\u044b \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 ZRF \u043f\u0440\u043e\u0441\u0442\u043e, \u0438\u0433\u0440\u044b \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u044b\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a \u043c\u0430\u043b\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0432 ZRF \u043d\u0435\u0442 \u0441\u0430\u043c\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0418 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"lisp\">(define not-0?   (or (flag? $1-08)       (flag? $1-04)       (flag? $1-02)       (flag? $1-01)   ) )  (define inc    (if (flag? $1-01)        (set-flag $1-01 false)        (if (flag? $1-02)            (set-flag $1-02 false)            (if (flag? $1-04)                (set-flag $1-04 false)                (if (flag? $1-08)                    (set-flag $1-08 false)                 else                    (set-flag $1-08 true)                )             else                (set-flag $1-04 true)            )         else            (set-flag $1-02 true)        )     else        (set-flag $1-01 true)    ) )  (define dec    (if (not-flag? $1-01)        (set-flag $1-01 true)        (if (not-flag? $1-02)            (set-flag $1-02 true)            (if (not-flag? $1-04)                (set-flag $1-04 true)                (if (not-flag? $1-08)                    (set-flag $1-08 true)                 else                    (set-flag $1-08 false)                )             else                (set-flag $1-04 false)            )         else            (set-flag $1-02 false)        )     else        (set-flag $1-01 false)    ) )  (define sum    (while (not-0? $2)        (inc $1)        (dec $2)    ) ) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412 <a href=\"http:\/\/www.zillions-of-games.com\/cgi-bin\/zilligames\/submissions.cgi?do=show;id=1452\" rel=\"nofollow\">Axiom Development Kit<\/a> \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u0413\u0440\u0435\u0433\u043e\u043c \u0428\u043c\u0438\u0434\u0442\u043e\u043c, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0430 \u0431\u044b\u043b\u043e \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u0430\u044f\u0437\u044b\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0434\u0438\u0430\u043b\u0435\u043a\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)\" rel=\"nofollow\">Forth<\/a>-\u0430, \u0447\u0442\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438. \u0421\u0430\u043c\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e \u0441\u043e\u0431\u043e\u0439, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u0434\u0435, \u0445\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 API, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Zillions \u0431\u043e\u0442\u043e\u0432. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Axiom \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0440\u0435\u0448\u0430\u043b\u0430 \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a Zillions \u2014 \u0438\u0433\u0440\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Windows \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0441 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>  \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c <a href=\"http:\/\/hgm.nubati.net\/jocly\/jocly-master\/examples\/browser\/control.html\" rel=\"nofollow\">Jocly<\/a> \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u0430\u043b\u043e \u043c\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0433\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 JavaScript \u043c\u043e\u0433\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\" rel=\"nofollow\">Dagaz<\/a>. \u0427\u0442\u043e-\u0442\u043e \u044f \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 <a href=\"https:\/\/github.com\/mi-g\/jocly\" rel=\"nofollow\">Jocly<\/a>, \u0430 \u0447\u0442\u043e-\u0442\u043e \u0443 <a href=\"http:\/\/zanefisher.github.io\/nine-tile-cyvasse\/\" rel=\"nofollow\">\u0417\u0435\u0439\u043d\u0430 \u0424\u0438\u0448\u0435\u0440\u0430<\/a>. \u0422\u0430\u043a\u0436\u0435 \u043a\u0430\u043a Zillions, Dagaz \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 ZRF (\u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b \u043d\u043e\u0432\u044b\u0445 \u0438\u0433\u0440 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e), \u043d\u043e \u043d\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e (\u0447\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0438\u0437-\u0437\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438), \u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\/tree\/master\/utils\/z2j\" rel=\"nofollow\">\u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439<\/a>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u044d\u0442\u043e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"lisp\">(define checker-shift (    $1 (verify empty?)    (if (in-zone? promotion)       (add King)     else       add    ) ))  (define checker-jump (    $1 (verify enemy?)     capture     $1 (verify empty?)    (if (in-zone? promotion)        (add-partial King continue-type)     else        (add-partial jump-type)    ) ))  (define king-shift (    $1 (while empty?        add $1    ) ))  (define king-jump (    $1 (while empty?  $1)    (verify enemy?)    $1 (while empty?        mark        (while empty?            (opposite $1)        )         capture        back        (add-partial continue-type) $1    ) ))  (define king-continue (    $1 (while empty?         $1 (verify not-last-from?)    )    (verify enemy?)     $1 (while empty?        mark        (while empty?            (opposite $1)        )         capture        back        (add-partial continue-type) $1    ) ))  (game   (title &quot;Russian Checkers&quot;)    (players White Black)   (turn-order White Black)   (move-priorities jump-type normal-type)    (board      (image &quot;images\/8x8.bmp&quot;)      (grid          (start-rectangle 2 2 52 52)          (dimensions            (&quot;a\/b\/c\/d\/e\/f\/g\/h&quot; (50 0)) ; files            (&quot;8\/7\/6\/5\/4\/3\/2\/1&quot; (0 50)) ; ranks          )          (directions (ne 1 -1) (nw -1 -1) (se 1 1) (sw -1 1))      )      (symmetry Black (nw se) (se nw) (ne sw) (sw ne))      (zone (name promotion) (players White)            (positions b8 d8 f8 h8)      )      (zone (name promotion) (players Black)            (positions a1 c1 e1 g1)      )   )    (piece      (name Man)      (image White &quot;images\/wman.bmp&quot;             Black &quot;images\/bman.bmp&quot;)      (moves          (move-type jump-type)          (checker-jump nw) (checker-jump ne) (checker-jump sw) (checker-jump se)          (move-type normal-type)          (checker-shift nw) (checker-shift ne)      )   )   (piece      (name King)      (image White &quot;images\/wdamone.bmp&quot;             Black &quot;images\/bdamone.bmp&quot;)      (moves          (move-type jump-type)          (king-jump nw) (king-jump ne) (king-jump sw) (king-jump se)          (move-type continue-type)          (king-continue nw) (king-continue ne)           (king-continue sw) (king-continue se)          (move-type normal-type)          (king-shift nw) (king-shift ne) (king-shift sw) (king-shift se)      )   )    (board-setup     (White (Man a1 c1 e1 g1  b2 d2 f2 h2  a3 c3 e3 g3) )     (Black (Man b8 d8 f8 h8  a7 c7 e7 g7  b6 d6 f6 h6) )   ) ) <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">ZRF = {     JUMP:          0,     IF:            1,     FORK:          2,     FUNCTION:      3,     IN_ZONE:       4,     FLAG:          5,     SET_FLAG:      6,     POS_FLAG:      7,     SET_POS_FLAG:  8,     ATTR:          9,     SET_ATTR:      10,     PROMOTE:       11,     MODE:          12,     ON_BOARD_DIR:  13,     ON_BOARD_POS:  14,     PARAM:         15,     LITERAL:       16,     VERIFY:        20 };  Dagaz.Model.BuildDesign = function(design) {     design.checkVersion(&quot;z2j&quot;, &quot;2&quot;);     design.checkVersion(&quot;animate-captures&quot;, &quot;false&quot;);     design.checkVersion(&quot;smart-moves&quot;, &quot;true&quot;);     design.checkVersion(&quot;show-hints&quot;, &quot;false&quot;);     design.checkVersion(&quot;show-blink&quot;, &quot;true&quot;);     design.checkVersion(&quot;deferred-captures&quot;, &quot;true&quot;);     design.checkVersion(&quot;advisor-wait&quot;, &quot;5&quot;);      design.addDirection(&quot;ne&quot;);     design.addDirection(&quot;se&quot;);     design.addDirection(&quot;sw&quot;);     design.addDirection(&quot;nw&quot;);      design.addPlayer(&quot;White&quot;, [2, 3, 0, 1]);     design.addPlayer(&quot;Black&quot;, [2, 3, 0, 1]);      design.addPosition(&quot;a8&quot;, [0, 9, 0, 0]);     design.addPosition(&quot;b8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;c8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;d8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;e8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;f8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;g8&quot;, [0, 9, 7, 0]);     design.addPosition(&quot;h8&quot;, [0, 0, 7, 0]);     design.addPosition(&quot;a7&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g7&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h7&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a6&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g6&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h6&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a5&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g5&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h5&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a4&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g4&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h4&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a3&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g3&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h3&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a2&quot;, [-7, 9, 0, 0]);     design.addPosition(&quot;b2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;c2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;d2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;e2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;f2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;g2&quot;, [-7, 9, 7, -9]);     design.addPosition(&quot;h2&quot;, [0, 0, 7, -9]);     design.addPosition(&quot;a1&quot;, [-7, 0, 0, 0]);     design.addPosition(&quot;b1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;c1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;d1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;e1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;f1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;g1&quot;, [-7, 0, 0, -9]);     design.addPosition(&quot;h1&quot;, [0, 0, 0, -9]);      design.addZone(&quot;promotion&quot;, 1, [1, 3, 5, 7]);     design.addZone(&quot;promotion&quot;, 2, [56, 58, 60, 62]);     design.addZone(&quot;best&quot;, 1, [26, 21]);     design.addZone(&quot;best&quot;, 2, [37, 42]);      design.addCommand(0, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(0, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(0, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(0, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(0, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(0, ZRF.FUNCTION,\t26);\t\/\/ capture     design.addCommand(0, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(0, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(0, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(0, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(0, ZRF.IN_ZONE,\t0);\t\/\/ promotion     design.addCommand(0, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(0, ZRF.IF,\t5);     design.addCommand(0, ZRF.PROMOTE,\t1);\t\/\/ King     design.addCommand(0, ZRF.MODE,\t2);\t\/\/ continue-type     design.addCommand(0, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(0, ZRF.JUMP,\t3);     design.addCommand(0, ZRF.MODE,\t0);\t\/\/ jump-type     design.addCommand(0, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(0, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(1, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(1, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(1, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(1, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(1, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(1, ZRF.IN_ZONE,\t0);\t\/\/ promotion     design.addCommand(1, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(1, ZRF.IF,\t4);     design.addCommand(1, ZRF.PROMOTE,\t1);\t\/\/ King     design.addCommand(1, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(1, ZRF.JUMP,\t2);     design.addCommand(1, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(1, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(2, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(2, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(2, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(2, ZRF.IF,\t4);     design.addCommand(2, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.JUMP,\t-5);     design.addCommand(2, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(2, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(2, ZRF.PARAM,\t2);\t\/\/ $3     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(2, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(2, ZRF.IF,\t18);     design.addCommand(2, ZRF.FUNCTION,\t6);\t\/\/ mark     design.addCommand(2, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(2, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(2, ZRF.IF,\t5);     design.addCommand(2, ZRF.PARAM,\t3);\t\/\/ $4     design.addCommand(2, ZRF.FUNCTION,\t23);\t\/\/ opposite     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.JUMP,\t-6);     design.addCommand(2, ZRF.FUNCTION,\t26);\t\/\/ capture     design.addCommand(2, ZRF.FUNCTION,\t7);\t\/\/ back     design.addCommand(2, ZRF.FORK,\t4);     design.addCommand(2, ZRF.MODE,\t2);\t\/\/ continue-type     design.addCommand(2, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(2, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(2, ZRF.PARAM,\t4);\t\/\/ $5     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.JUMP,\t-19);     design.addCommand(2, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(3, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(3, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.IF,\t7);     design.addCommand(3, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.FUNCTION,\t4);\t\/\/ last-from?     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(3, ZRF.JUMP,\t-8);     design.addCommand(3, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(3, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(3, ZRF.PARAM,\t2);\t\/\/ $3     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.IF,\t18);     design.addCommand(3, ZRF.FUNCTION,\t6);\t\/\/ mark     design.addCommand(3, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.IF,\t5);     design.addCommand(3, ZRF.PARAM,\t3);\t\/\/ $4     design.addCommand(3, ZRF.FUNCTION,\t23);\t\/\/ opposite     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.JUMP,\t-6);     design.addCommand(3, ZRF.FUNCTION,\t26);\t\/\/ capture     design.addCommand(3, ZRF.FUNCTION,\t7);\t\/\/ back     design.addCommand(3, ZRF.FORK,\t4);     design.addCommand(3, ZRF.MODE,\t2);\t\/\/ continue-type     design.addCommand(3, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(3, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(3, ZRF.PARAM,\t4);\t\/\/ $5     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.JUMP,\t-19);     design.addCommand(3, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(4, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(4, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(4, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(4, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(4, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(4, ZRF.IF,\t7);     design.addCommand(4, ZRF.FORK,\t3);     design.addCommand(4, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(4, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(4, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(4, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(4, ZRF.JUMP,\t-8);     design.addCommand(4, ZRF.FUNCTION,\t28);\t\/\/ end      design.addPriority(0);\t\t\t\/\/ jump-type     design.addPriority(1);\t\t\t\/\/ normal-type      design.addPiece(&quot;Man&quot;, 0, 20);     design.addMove(0, 0, [3, 3], 0);     design.addMove(0, 0, [0, 0], 0);     design.addMove(0, 0, [2, 2], 0);     design.addMove(0, 0, [1, 1], 0);     design.addMove(0, 1, [3], 1);     design.addMove(0, 1, [0], 1);      design.addPiece(&quot;King&quot;, 1, 100);     design.addMove(1, 2, [3, 3, 3, 3, 3], 0, 10);     design.addMove(1, 2, [0, 0, 0, 0, 0], 0, 10);     design.addMove(1, 2, [2, 2, 2, 2, 2], 0, 10);     design.addMove(1, 2, [1, 1, 1, 1, 1], 0, 10);     design.addMove(1, 3, [3, 3, 3, 3, 3], 2, 10);     design.addMove(1, 3, [0, 0, 0, 0, 0], 2, 10);     design.addMove(1, 3, [2, 2, 2, 2, 2], 2, 10);     design.addMove(1, 3, [1, 1, 1, 1, 1], 2, 10);     design.addMove(1, 4, [3, 3], 1, 10);     design.addMove(1, 4, [0, 0], 1, 10);     design.addMove(1, 4, [2, 2], 1, 10);     design.addMove(1, 4, [1, 1], 1, 10);      design.setup(&quot;White&quot;, &quot;Man&quot;, 56);     design.setup(&quot;White&quot;, &quot;Man&quot;, 58);     design.setup(&quot;White&quot;, &quot;Man&quot;, 60);     design.setup(&quot;White&quot;, &quot;Man&quot;, 62);     design.setup(&quot;White&quot;, &quot;Man&quot;, 49);     design.setup(&quot;White&quot;, &quot;Man&quot;, 51);     design.setup(&quot;White&quot;, &quot;Man&quot;, 53);     design.setup(&quot;White&quot;, &quot;Man&quot;, 55);     design.setup(&quot;White&quot;, &quot;Man&quot;, 40);     design.setup(&quot;White&quot;, &quot;Man&quot;, 42);     design.setup(&quot;White&quot;, &quot;Man&quot;, 44);     design.setup(&quot;White&quot;, &quot;Man&quot;, 46);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 1);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 3);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 5);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 7);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 8);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 10);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 12);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 14);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 17);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 19);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 21);     design.setup(&quot;Black&quot;, &quot;Man&quot;, 23); }  Dagaz.View.configure = function(view) {     view.defBoard(&quot;Board&quot;);     view.defPiece(&quot;WhiteMan&quot;, &quot;White Man&quot;);     view.defPiece(&quot;BlackMan&quot;, &quot;Black Man&quot;);     view.defPiece(&quot;WhiteKing&quot;, &quot;White King&quot;);     view.defPiece(&quot;BlackKing&quot;, &quot;Black King&quot;);       view.defPosition(&quot;a8&quot;, 2, 2, 50, 50);     view.defPosition(&quot;b8&quot;, 52, 2, 50, 50);     view.defPosition(&quot;c8&quot;, 102, 2, 50, 50);     view.defPosition(&quot;d8&quot;, 152, 2, 50, 50);     view.defPosition(&quot;e8&quot;, 202, 2, 50, 50);     view.defPosition(&quot;f8&quot;, 252, 2, 50, 50);     view.defPosition(&quot;g8&quot;, 302, 2, 50, 50);     view.defPosition(&quot;h8&quot;, 352, 2, 50, 50);     view.defPosition(&quot;a7&quot;, 2, 52, 50, 50);     view.defPosition(&quot;b7&quot;, 52, 52, 50, 50);     view.defPosition(&quot;c7&quot;, 102, 52, 50, 50);     view.defPosition(&quot;d7&quot;, 152, 52, 50, 50);     view.defPosition(&quot;e7&quot;, 202, 52, 50, 50);     view.defPosition(&quot;f7&quot;, 252, 52, 50, 50);     view.defPosition(&quot;g7&quot;, 302, 52, 50, 50);     view.defPosition(&quot;h7&quot;, 352, 52, 50, 50);     view.defPosition(&quot;a6&quot;, 2, 102, 50, 50);     view.defPosition(&quot;b6&quot;, 52, 102, 50, 50);     view.defPosition(&quot;c6&quot;, 102, 102, 50, 50);     view.defPosition(&quot;d6&quot;, 152, 102, 50, 50);     view.defPosition(&quot;e6&quot;, 202, 102, 50, 50);     view.defPosition(&quot;f6&quot;, 252, 102, 50, 50);     view.defPosition(&quot;g6&quot;, 302, 102, 50, 50);     view.defPosition(&quot;h6&quot;, 352, 102, 50, 50);     view.defPosition(&quot;a5&quot;, 2, 152, 50, 50);     view.defPosition(&quot;b5&quot;, 52, 152, 50, 50);     view.defPosition(&quot;c5&quot;, 102, 152, 50, 50);     view.defPosition(&quot;d5&quot;, 152, 152, 50, 50);     view.defPosition(&quot;e5&quot;, 202, 152, 50, 50);     view.defPosition(&quot;f5&quot;, 252, 152, 50, 50);     view.defPosition(&quot;g5&quot;, 302, 152, 50, 50);     view.defPosition(&quot;h5&quot;, 352, 152, 50, 50);     view.defPosition(&quot;a4&quot;, 2, 202, 50, 50);     view.defPosition(&quot;b4&quot;, 52, 202, 50, 50);     view.defPosition(&quot;c4&quot;, 102, 202, 50, 50);     view.defPosition(&quot;d4&quot;, 152, 202, 50, 50);     view.defPosition(&quot;e4&quot;, 202, 202, 50, 50);     view.defPosition(&quot;f4&quot;, 252, 202, 50, 50);     view.defPosition(&quot;g4&quot;, 302, 202, 50, 50);     view.defPosition(&quot;h4&quot;, 352, 202, 50, 50);     view.defPosition(&quot;a3&quot;, 2, 252, 50, 50);     view.defPosition(&quot;b3&quot;, 52, 252, 50, 50);     view.defPosition(&quot;c3&quot;, 102, 252, 50, 50);     view.defPosition(&quot;d3&quot;, 152, 252, 50, 50);     view.defPosition(&quot;e3&quot;, 202, 252, 50, 50);     view.defPosition(&quot;f3&quot;, 252, 252, 50, 50);     view.defPosition(&quot;g3&quot;, 302, 252, 50, 50);     view.defPosition(&quot;h3&quot;, 352, 252, 50, 50);     view.defPosition(&quot;a2&quot;, 2, 302, 50, 50);     view.defPosition(&quot;b2&quot;, 52, 302, 50, 50);     view.defPosition(&quot;c2&quot;, 102, 302, 50, 50);     view.defPosition(&quot;d2&quot;, 152, 302, 50, 50);     view.defPosition(&quot;e2&quot;, 202, 302, 50, 50);     view.defPosition(&quot;f2&quot;, 252, 302, 50, 50);     view.defPosition(&quot;g2&quot;, 302, 302, 50, 50);     view.defPosition(&quot;h2&quot;, 352, 302, 50, 50);     view.defPosition(&quot;a1&quot;, 2, 352, 50, 50);     view.defPosition(&quot;b1&quot;, 52, 352, 50, 50);     view.defPosition(&quot;c1&quot;, 102, 352, 50, 50);     view.defPosition(&quot;d1&quot;, 152, 352, 50, 50);     view.defPosition(&quot;e1&quot;, 202, 352, 50, 50);     view.defPosition(&quot;f1&quot;, 252, 352, 50, 50);     view.defPosition(&quot;g1&quot;, 302, 352, 50, 50);     view.defPosition(&quot;h1&quot;, 352, 352, 50, 50); } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u0430, \u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u0440\u0443\u0434\u043d\u0435\u0435, \u0437\u0430\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u043e\u0441\u043a\u0435, \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044e. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043d\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0438\u0433\u0443\u0440, \u0430 \u043a \u0438\u0433\u0440\u0435 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 ZRF. \u042f \u0438 \u043d\u0435 \u043f\u044b\u0442\u0430\u044e\u0441\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 Dagaz \u0435\u0441\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 &quot;<a href=\"https:\/\/glukkazan.github.io\/checkers\/russian-checkers.htm\" rel=\"nofollow\">\u0420\u0443\u0441\u0441\u043a\u0438\u0445 \u0448\u0430\u0448\u043a\u0430\u0445<\/a>&quot;, \u043a\u0430\u043a \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0448\u0430\u0448\u0435\u0447\u043d\u044b\u0445 \u0438\u0433\u0440 \u0441 \u00ab\u043b\u0435\u0442\u0430\u044e\u0449\u0438\u043c\u0438\u00bb \u0434\u0430\u043c\u043a\u0430\u043c\u0438, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u043e &quot;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D1%83%D1%80%D0%B5%D1%86%D0%BA%D0%B8%D0%B9_%D1%83%D0%B4%D0%B0%D1%80\" rel=\"nofollow\">\u0422\u0443\u0440\u0435\u0446\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u0440\u0430<\/a>&quot; \u2014 \u0432\u0437\u044f\u0442\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0443\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0441 \u0434\u043e\u0441\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0445\u043e\u0434\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">(function() {  Dagaz.Model.deferredStrike = true;  var checkVersion = Dagaz.Model.checkVersion;  Dagaz.Model.checkVersion = function(design, name, value) {   if (name != &quot;deferred-captures&quot;) {      checkVersion(design, name, value);   } }  var CheckInvariants = Dagaz.Model.CheckInvariants;  Dagaz.Model.CheckInvariants = function(board) {   _.chain(board.moves)    .filter(function(move) {         return move.actions.length &gt; 0;     })    .each(function(move) {         var mx = _.chain(move.actions)          .map(function(action) {               return action[3];           }).max().value();           var actions = [];           _.each(move.actions, function(action) {               var pn = action[3];               if ((action[0] !== null) &amp;&amp; (action[1] === null)) {                   pn = mx;               }               actions.push([ action[0], action[1], action[2], pn ]);           });           move.actions = actions;     });   CheckInvariants(board); }  })(); <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u043e\u0434\u043e\u0432 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 ZRF-\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u0433\u0440\u044b, \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b, \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0442\u044c \u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\/blob\/master\/src\/debug\/games\/checkers\/deferred-captures.js\" rel=\"nofollow\">deferred-captures<\/a>, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u043c \u0432\u044b\u0448\u0435. \u0422\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u0430\u044f\u0437\u044b\u043a\u0430 ZRF.<\/p>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 Dagaz \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0422\u0430\u043a, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\/blob\/master\/src\/debug\/kernel\/view\/2d\/2d-view-full.js\" rel=\"nofollow\">\u043c\u043e\u0434\u0443\u043b\u044c<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u0443\u044e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0440\u0430\u043d\u0435\u0435. \u0422\u0435\u043f\u0435\u0440\u044c canvas \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0440\u0435\u0433\u0438\u043e\u043d\u044b, \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043e\u043a\u043d\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0438\u0433\u0443\u0440 \u0438 \u043f\u0440. \u0412 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442 \u043a \u043d\u043e\u0432\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u043d\u043e\u0432\u044b\u0439 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\/blob\/master\/src\/debug\/kernel\/controller\/app-full.js\" rel=\"nofollow\">\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440<\/a>, \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 <a href=\"https:\/\/github.com\/GlukKazan\/Dagaz\/blob\/master\/src\/debug\/kernel\/controller\/app-v2.js\" rel=\"nofollow\">\u0441\u0442\u0430\u0440\u043e\u0433\u043e<\/a> \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0432 \u043d\u043e\u0432\u043e\u043c \u0441\u0442\u0438\u043b\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">ZRF = {     JUMP:          0,     IF:            1,     FORK:          2,     FUNCTION:      3,     IN_ZONE:       4,     FLAG:          5,     SET_FLAG:      6,     POS_FLAG:      7,     SET_POS_FLAG:  8,     ATTR:          9,     SET_ATTR:      10,     PROMOTE:       11,     MODE:          12,     ON_BOARD_DIR:  13,     ON_BOARD_POS:  14,     PARAM:         15,     LITERAL:       16,     VERIFY:        20 };  Dagaz.Model.BuildDesign = function(design) {      design.checkVersion(&quot;z2j&quot;, &quot;2&quot;);     design.checkVersion(&quot;smart-moves&quot;, &quot;false&quot;);     design.checkVersion(&quot;show-blink&quot;, &quot;false&quot;);     design.checkVersion(&quot;show-hints&quot;, &quot;false&quot;);     design.checkVersion(&quot;show-captures&quot;, &quot;false&quot;);     design.checkVersion(&quot;dtc-extension&quot;, &quot;extended&quot;);      var g = design.addGrid();     g.addScale(&quot;A\/B\/C\/D\/E\/F\/G\/H&quot;); g.addScale(&quot;8\/7\/6\/5\/4\/3\/2\/1&quot;);     g.addDirection(&quot;n&quot;,[ 0, -1]); g.addDirection(&quot;nw&quot;,[-1, -1]);     g.addDirection(&quot;e&quot;,[ 1,  0]); g.addDirection(&quot;ne&quot;,[ 1, -1]);     g.addDirection(&quot;w&quot;,[-1,  0]); g.addDirection(&quot;sw&quot;,[-1,  1]);     g.addDirection(&quot;s&quot;,[ 0,  1]); g.addDirection(&quot;se&quot;,[ 1,  1]);     design.addPlayer(&quot;White&quot;, [6, 7, 4, 5, 2, 3, 0, 1]);     design.addPlayer(&quot;Black&quot;, [6, 5, 2, 7, 4, 1, 0, 3]);     g.addPositions();     design.addPosition([&quot;RWP&quot;, &quot;RWN&quot;, &quot;RWB&quot;, &quot;RWR&quot;, &quot;RWQ&quot;, &quot;RWK&quot;, &quot;RBP&quot;, &quot;RBN&quot;, &quot;RBB&quot;, &quot;RBR&quot;, &quot;RBQ&quot;, &quot;RBK&quot;, &quot;UP&quot;, &quot;DN&quot;]);      design.addZone(&quot;last-rank&quot;,  1, [0, 1, 2, 3, 4, 5, 6, 7]);     design.addZone(&quot;last-rank&quot;,  2, [56, 57, 58, 59, 60, 61, 62, 63]);     design.addZone(&quot;third-rank&quot;, 1, [40, 41, 42, 43, 44, 45, 46, 47]);     design.addZone(&quot;third-rank&quot;, 2, [16, 17, 18, 19, 20, 21, 22, 23]);      design.addCommand(0, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(0, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(0, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(0, ZRF.IN_ZONE,\t1);\t\/\/ third-rank     design.addCommand(0, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(0, ZRF.IF,\t11);     design.addCommand(0, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(0, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(0, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(0, ZRF.FORK,\t3);     design.addCommand(0, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(0, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(0, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(0, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(0, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(0, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(0, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(0, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(0, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(0, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(0, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(1, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(1, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(1, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(1, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(1, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(1, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(1, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(2, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(2, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.FUNCTION,\t2);\t\/\/ enemy?     design.addCommand(2, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(2, ZRF.FUNCTION,\t5);\t\/\/ last-to?     design.addCommand(2, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(2, ZRF.LITERAL,\t0);\t\/\/ Pawn     design.addCommand(2, ZRF.FUNCTION,\t10);\t\/\/ piece?     design.addCommand(2, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(2, ZRF.FUNCTION,\t26);\t\/\/ capture     design.addCommand(2, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.FUNCTION,\t6);\t\/\/ mark     design.addCommand(2, ZRF.PARAM,\t2);\t\/\/ $3     design.addCommand(2, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(2, ZRF.FUNCTION,\t4);\t\/\/ last-from?     design.addCommand(2, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(2, ZRF.FUNCTION,\t7);\t\/\/ back     design.addCommand(2, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(2, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(3, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(3, ZRF.IN_ZONE,\t0);\t\/\/ last-rank     design.addCommand(3, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(3, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(3, ZRF.FUNCTION,\t21);\t\/\/ position     design.addCommand(3, ZRF.ON_BOARD_DIR,\t7);\t\/\/ name     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.IF,\t9);     design.addCommand(3, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(3, ZRF.IF,\t4);     design.addCommand(3, ZRF.FORK,\t3);     design.addCommand(3, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(3, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(3, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(3, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(3, ZRF.JUMP,\t-10);     design.addCommand(3, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(3, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(3, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(3, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(3, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(4, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(4, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(4, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(4, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(4, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(4, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(4, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(5, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(5, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(5, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(5, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(5, ZRF.FUNCTION,\t0);\t\/\/ not     design.addCommand(5, ZRF.IF,\t7);     design.addCommand(5, ZRF.FORK,\t3);     design.addCommand(5, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(5, ZRF.FUNCTION,\t28);\t\/\/ end     design.addCommand(5, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(5, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(5, ZRF.JUMP,\t-8);     design.addCommand(5, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(5, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(6, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(6, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(6, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(6, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(6, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(7, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(7, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(7, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(7, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(7, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(7, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(7, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(7, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(7, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(7, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(7, ZRF.PARAM,\t2);\t\/\/ $3     design.addCommand(7, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(7, ZRF.FUNCTION,\t3);\t\/\/ friend?     design.addCommand(7, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(7, ZRF.LITERAL,\t3);\t\/\/ Rook     design.addCommand(7, ZRF.FUNCTION,\t10);\t\/\/ piece?     design.addCommand(7, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(7, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(7, ZRF.PARAM,\t3);\t\/\/ $4     design.addCommand(7, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(7, ZRF.PARAM,\t4);\t\/\/ $5     design.addCommand(7, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(7, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(7, ZRF.FUNCTION,\t28);\t\/\/ end      design.addCommand(8, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(8, ZRF.PARAM,\t0);\t\/\/ $1     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(8, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(8, ZRF.PARAM,\t1);\t\/\/ $2     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(8, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(8, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(8, ZRF.PARAM,\t2);\t\/\/ $3     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.FUNCTION,\t1);\t\/\/ empty?     design.addCommand(8, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(8, ZRF.PARAM,\t3);\t\/\/ $4     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.FUNCTION,\t3);\t\/\/ friend?     design.addCommand(8, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(8, ZRF.LITERAL,\t3);\t\/\/ Rook     design.addCommand(8, ZRF.FUNCTION,\t10);\t\/\/ piece?     design.addCommand(8, ZRF.FUNCTION,\t20);\t\/\/ verify     design.addCommand(8, ZRF.FUNCTION,\t24);\t\/\/ from     design.addCommand(8, ZRF.PARAM,\t4);\t\/\/ $5     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.PARAM,\t5);\t\/\/ $6     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.PARAM,\t6);\t\/\/ $7     design.addCommand(8, ZRF.FUNCTION,\t22);\t\/\/ navigate     design.addCommand(8, ZRF.FUNCTION,\t25);\t\/\/ to     design.addCommand(8, ZRF.FUNCTION,\t28);\t\/\/ end      design.addPiece(&quot;Pawn&quot;, 0);     design.addMove(0, 0, [0, 0], 0);     design.addMove(0, 1, [1], 0);     design.addMove(0, 1, [3], 0);     design.addMove(0, 2, [2, 0, 0], 0);     design.addMove(0, 2, [4, 0, 0], 0);      design.addPiece(&quot;Knight&quot;, 1);     design.addMove(1, 4, [0, 1], 0);     design.addMove(1, 4, [0, 3], 0);     design.addMove(1, 4, [6, 5], 0);     design.addMove(1, 4, [6, 7], 0);     design.addMove(1, 4, [2, 3], 0);     design.addMove(1, 4, [2, 7], 0);     design.addMove(1, 4, [4, 1], 0);     design.addMove(1, 4, [4, 5], 0);      design.addPiece(&quot;Bishop&quot;, 2);     design.addMove(2, 5, [1, 1], 0);     design.addMove(2, 5, [3, 3], 0);     design.addMove(2, 5, [5, 5], 0);     design.addMove(2, 5, [7, 7], 0);      design.addPiece(&quot;Rook&quot;, 3);     design.addMove(3, 5, [0, 0], 0);     design.addMove(3, 5, [2, 2], 0);     design.addMove(3, 5, [4, 4], 0);     design.addMove(3, 5, [6, 6], 0);      design.addPiece(&quot;Queen&quot;, 4);     design.addMove(4, 5, [0, 0], 0);     design.addMove(4, 5, [1, 1], 0);     design.addMove(4, 5, [2, 2], 0);     design.addMove(4, 5, [3, 3], 0);     design.addMove(4, 5, [4, 4], 0);     design.addMove(4, 5, [5, 5], 0);     design.addMove(4, 5, [6, 6], 0);     design.addMove(4, 5, [7, 7], 0);      design.addPiece(&quot;King&quot;, 5);     design.addMove(5, 6, [0], 0);     design.addMove(5, 6, [1], 0);     design.addMove(5, 6, [2], 0);     design.addMove(5, 6, [3], 0);     design.addMove(5, 6, [4], 0);     design.addMove(5, 6, [5], 0);     design.addMove(5, 6, [6], 0);     design.addMove(5, 6, [7], 0);     design.addMove(5, 7, [2, 2, 2, 4, 4], 1);     design.addMove(5, 8, [4, 4, 4, 4, 2, 2, 2], 1);      design.addPiece(&quot;PawnR&quot;, 6);     design.addPiece(&quot;KnightR&quot;, 7);     design.addPiece(&quot;BishopR&quot;, 8);     design.addPiece(&quot;RookR&quot;, 9);     design.addPiece(&quot;QueenR&quot;, 10);     design.addPiece(&quot;KingR&quot;, 11);      design.setup(&quot;White&quot;, &quot;Pawn&quot;, [&quot;A2&quot;, &quot;B2&quot;, &quot;C2&quot;, &quot;D2&quot;, &quot;E2&quot;, &quot;F2&quot;, &quot;G2&quot;, &quot;H2&quot;]);     design.setup(&quot;White&quot;, &quot;Knight&quot;, [&quot;B1&quot;, &quot;G1&quot;]);     design.setup(&quot;White&quot;, &quot;Bishop&quot;, [&quot;C1&quot;, &quot;F1&quot;]);     design.setup(&quot;White&quot;, &quot;Rook&quot;, [&quot;A1&quot;, &quot;H1&quot;]);     design.setup(&quot;White&quot;, &quot;Queen&quot;, [&quot;D1&quot;]);     design.setup(&quot;White&quot;, &quot;King&quot;, [&quot;E1&quot;]);     design.setup(&quot;White&quot;, &quot;PawnR&quot;, [&quot;RWP&quot;]);     design.setup(&quot;White&quot;, &quot;KnightR&quot;, [&quot;RWN&quot;]);     design.setup(&quot;White&quot;, &quot;BishopR&quot;, [&quot;RWB&quot;]);     design.setup(&quot;White&quot;, &quot;RookR&quot;, [&quot;RWR&quot;]);     design.setup(&quot;White&quot;, &quot;QueenR&quot;, [&quot;RWQ&quot;]);     design.setup(&quot;White&quot;, &quot;KingR&quot;, [&quot;RWK&quot;]);      design.setup(&quot;Black&quot;, &quot;Pawn&quot;, [&quot;A7&quot;, &quot;B7&quot;, &quot;C7&quot;, &quot;D7&quot;, &quot;E7&quot;, &quot;F7&quot;, &quot;G7&quot;, &quot;H7&quot;]);     design.setup(&quot;Black&quot;, &quot;Knight&quot;, [&quot;B8&quot;, &quot;G8&quot;]);     design.setup(&quot;Black&quot;, &quot;Bishop&quot;, [&quot;C8&quot;, &quot;F8&quot;]);     design.setup(&quot;Black&quot;, &quot;Rook&quot;, [&quot;A8&quot;, &quot;H8&quot;]);     design.setup(&quot;Black&quot;, &quot;Queen&quot;, [&quot;D8&quot;]);     design.setup(&quot;Black&quot;, &quot;King&quot;, [&quot;E8&quot;]);     design.setup(&quot;Black&quot;, &quot;PawnR&quot;, [&quot;RBP&quot;]);     design.setup(&quot;Black&quot;, &quot;KnightR&quot;, [&quot;RBN&quot;]);     design.setup(&quot;Black&quot;, &quot;BishopR&quot;, [&quot;RBB&quot;]);     design.setup(&quot;Black&quot;, &quot;RookR&quot;, [&quot;RBR&quot;]);     design.setup(&quot;Black&quot;, &quot;QueenR&quot;, [&quot;RBQ&quot;]);     design.setup(&quot;Black&quot;, &quot;KingR&quot;, [&quot;RBK&quot;]); }  Dagaz.View.configure = function(view) {      var b = view.root.addRegion(70, 0, 540, 540);     b.addBoard(&quot;WhiteBoard&quot;, [0]);     b.addBoard(&quot;BlackBoard&quot;, [1]);     var g = b.addGrid(31, 31, 89, 89);     g.addScale(&quot;A\/B\/C\/D\/E\/F\/G\/H&quot;, 60, 0);     g.addScale(&quot;8\/7\/6\/5\/4\/3\/2\/1&quot;, 0, 60);     g.addTurns(0, [0]);     g.addTurns(1, [1]);      var r = view.root.addRegion(630, 0, 120, 540);     r.addBoard(&quot;rpw&quot;, [0]);     r.addBoard(&quot;rpb&quot;, [1]);      r.addPosition(&quot;RWP&quot;,  1,  41, 58, 58, [0]);     r.addPosition(&quot;RWN&quot;,  1, 121, 58, 58, [0]);     r.addPosition(&quot;RWB&quot;,  1, 201, 58, 58, [0]);     r.addPosition(&quot;RWR&quot;,  1, 281, 58, 58, [0]);     r.addPosition(&quot;RWQ&quot;,  1, 361, 58, 58, [0]);     r.addPosition(&quot;RWK&quot;,  1, 441, 58, 58, [0]);     r.addPosition(&quot;RBP&quot;, 61,  41, 58, 58, [0]);     r.addPosition(&quot;RBN&quot;, 61, 121, 58, 58, [0]);     r.addPosition(&quot;RBB&quot;, 61, 201, 58, 58, [0]);     r.addPosition(&quot;RBR&quot;, 61, 281, 58, 58, [0]);     r.addPosition(&quot;RBQ&quot;, 61, 361, 58, 58, [0]);     r.addPosition(&quot;RBK&quot;, 61, 441, 58, 58, [0]);      r.addPosition(&quot;RBP&quot;,  1,  41, 58, 58, [1]);     r.addPosition(&quot;RBN&quot;,  1, 121, 58, 58, [1]);     r.addPosition(&quot;RBB&quot;,  1, 201, 58, 58, [1]);     r.addPosition(&quot;RBR&quot;,  1, 281, 58, 58, [1]);     r.addPosition(&quot;RBQ&quot;,  1, 361, 58, 58, [1]);     r.addPosition(&quot;RBK&quot;,  1, 441, 58, 58, [1]);     r.addPosition(&quot;RWP&quot;, 61,  41, 58, 58, [1]);     r.addPosition(&quot;RWN&quot;, 61, 121, 58, 58, [1]);     r.addPosition(&quot;RWB&quot;, 61, 201, 58, 58, [1]);     r.addPosition(&quot;RWR&quot;, 61, 281, 58, 58, [1]);     r.addPosition(&quot;RWQ&quot;, 61, 361, 58, 58, [1]);     r.addPosition(&quot;RWK&quot;, 61, 441, 58, 58, [1]);      var d = view.root.addRegion(770, 0, 120, 540, true, undefined, Dagaz.Model.drawDivision, Dagaz.Controller.eventDivision);     d.addBoard(&quot;div&quot;);     d.addPosition(&quot;UP&quot;, 1, 1, 120, 30);     d.addPosition(&quot;DN&quot;, 1, 510, 120, 30);      view.addPiece([&quot;WhitePawn&quot;, &quot;WhiteKnight&quot;, &quot;WhiteBishop&quot;, &quot;WhiteRook&quot;, &quot;WhiteQueen&quot;, &quot;WhiteKing&quot;], Dagaz.View.drawPiece);     view.addPiece([&quot;BlackPawn&quot;, &quot;BlackKnight&quot;, &quot;BlackBishop&quot;, &quot;BlackRook&quot;, &quot;BlackQueen&quot;, &quot;BlackKing&quot;], Dagaz.View.drawPiece);     view.addPiece([&quot;WhitePawnR&quot;, &quot;BlackPawnR&quot;, &quot;WhiteKnightR&quot;, &quot;BlackKnightR&quot;, &quot;WhiteBishopR&quot;, &quot;BlackBishopR&quot;, &quot;WhiteRookR&quot;, &quot;BlackRookR&quot;, &quot;WhiteQueenR&quot;, &quot;BlackQueenR&quot;, &quot;WhiteKingR&quot;, &quot;BlackKingR&quot;], Dagaz.View.drawRes);     view.addPiece([&quot;PawnWhite&quot;, &quot;SmallPawnWhite&quot;, &quot;KnightWhite&quot;, &quot;SmallKnightWhite&quot;, &quot;BishopWhite&quot;, &quot;SmallBishopWhite&quot;, &quot;RookWhite&quot;, &quot;SmallRookWhite&quot;, &quot;QueenWhite&quot;, &quot;SmallQueenWhite&quot;, &quot;KingWhite&quot;, &quot;SmallKingWhite&quot;]);     view.addPiece([&quot;PawnBlack&quot;, &quot;SmallPawnBlack&quot;, &quot;KnightBlack&quot;, &quot;SmallKnightBlack&quot;, &quot;BishopBlack&quot;, &quot;SmallBishopBlack&quot;, &quot;RookBlack&quot;, &quot;SmallRookBlack&quot;, &quot;QueenBlack&quot;, &quot;SmallQueenBlack&quot;, &quot;KingBlack&quot;, &quot;SmallKingBlack&quot;]);     view.addPiece([&quot;two&quot;, &quot;d0&quot;, &quot;d1&quot;, &quot;d2&quot;, &quot;d3&quot;, &quot;d4&quot;, &quot;d5&quot;, &quot;d6&quot;, &quot;d7&quot;, &quot;d8&quot;, &quot;d9&quot;, &quot;plus&quot;, &quot;minus&quot;, &quot;question&quot;]);     view.addPiece([&quot;db&quot;, &quot;dw&quot;, &quot;ub&quot;, &quot;uw&quot;]); }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0421\u0430\u043c\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u043e\u0436\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u043a\u043e\u043c\u0430\u043d\u0434 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u043a\u043e\u0440\u043e \u0443\u0439\u0442\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">(function() {  var step = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp; !ctx.isFriend()) {         ctx.end();     } }  var pawnShift = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp; ctx.isEmpty()) {         if (ctx.inZone(0)) {             ctx.promote(4);         }             ctx.end();     } }  var pawnLeap = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp; ctx.isEnemy()) {         if (ctx.inZone(0)) {             ctx.promote(4);         }             ctx.end();     } }  var pawnJump = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp;          ctx.isEmpty() &amp;&amp;          ctx.inZone(1) &amp;&amp;          ctx.go(params, 0) &amp;&amp;          ctx.isEmpty()) {         ctx.end();     } }  var enPassant = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp;         ctx.isEnemy() &amp;&amp;         ctx.isPiece(0)) {         ctx.capture();         if (ctx.go(params, 1)) {             ctx.put();             if (ctx.go(params, 1) &amp;&amp;                 ctx.isLastFrom()) {                 ctx.end();             }         }     } }  var jump = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp;          ctx.go(params, 1) &amp;&amp;         !ctx.isFriend()) {         ctx.end();     } }  var slide = function(ctx, params) {     while (ctx.go(params, 0)) {         if (ctx.isFriend()) break;         ctx.end();         if (!ctx.isEmpty()) break;     } }  var O_O = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp;         ctx.isEmpty() &amp;&amp;         ctx.go(params, 0) &amp;&amp;         ctx.isEmpty()) {         ctx.put();         if (ctx.go(params, 0) &amp;&amp;             ctx.isFriend() &amp;&amp;             ctx.isPiece(1)) {             ctx.take();             if (ctx.go(params, 1) &amp;&amp;                 ctx.go(params, 1)) {                 ctx.end();             }         }     } }  var O_O_O = function(ctx, params) {     if (ctx.go(params, 0) &amp;&amp;         ctx.isEmpty() &amp;&amp;         ctx.go(params, 0) &amp;&amp;         ctx.isEmpty()) {         ctx.put();         if (ctx.go(params, 0) &amp;&amp;             ctx.isEmpty() &amp;&amp;             ctx.go(params, 0) &amp;&amp;             ctx.isFriend() &amp;&amp;             ctx.isPiece(1)) {             ctx.take();             if (ctx.go(params, 1) &amp;&amp;                 ctx.go(params, 1) &amp;&amp;                 ctx.go(params, 1)) {                 ctx.end();             }         }     } }  games.model.BuildDesign = function(design) {     design.checkVersion(&quot;smart-moves&quot;, &quot;false&quot;);      design.addDirection(&quot;w&quot;);  \/\/ 0     design.addDirection(&quot;e&quot;);  \/\/ 1     design.addDirection(&quot;s&quot;);  \/\/ 2     design.addDirection(&quot;ne&quot;); \/\/ 3     design.addDirection(&quot;n&quot;);  \/\/ 4     design.addDirection(&quot;se&quot;); \/\/ 5     design.addDirection(&quot;sw&quot;); \/\/ 6     design.addDirection(&quot;nw&quot;); \/\/ 7      design.addPlayer(&quot;White&quot;, [1, 0, 4, 6, 2, 7, 3, 5]);     design.addPlayer(&quot;Black&quot;, [0, 1, 4, 5, 2, 3, 7, 6]);      design.addPosition(&quot;a8&quot;, [0, 1, 8, 0, 0, 9, 0, 0]);     design.addPosition(&quot;b8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;c8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;d8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;e8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;f8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;g8&quot;, [-1, 1, 8, 0, 0, 9, 7, 0]);     design.addPosition(&quot;h8&quot;, [-1, 0, 8, 0, 0, 0, 7, 0]);     design.addPosition(&quot;a7&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g7&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h7&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a6&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g6&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h6&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a5&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g5&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h5&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a4&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g4&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h4&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a3&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g3&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h3&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a2&quot;, [0, 1, 8, -7, -8, 9, 0, 0]);     design.addPosition(&quot;b2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;c2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;d2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;e2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;f2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;g2&quot;, [-1, 1, 8, -7, -8, 9, 7, -9]);     design.addPosition(&quot;h2&quot;, [-1, 0, 8, 0, -8, 0, 7, -9]);     design.addPosition(&quot;a1&quot;, [0, 1, 0, -7, -8, 0, 0, 0]);     design.addPosition(&quot;b1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;c1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;d1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;e1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;f1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;g1&quot;, [-1, 1, 0, -7, -8, 0, 0, -9]);     design.addPosition(&quot;h1&quot;, [-1, 0, 0, 0, -8, 0, 0, -9]);      design.addZone(&quot;last-rank&quot;, 1, [&quot;a8&quot;, &quot;b8&quot;, &quot;c8&quot;, &quot;d8&quot;, &quot;e8&quot;, &quot;f8&quot;, &quot;g8&quot;, &quot;h8&quot;]);     design.addZone(&quot;last-rank&quot;, 2, [&quot;a1&quot;, &quot;b1&quot;, &quot;c1&quot;, &quot;d1&quot;, &quot;e1&quot;, &quot;f1&quot;, &quot;g1&quot;, &quot;h1&quot;]);     design.addZone(&quot;third-rank&quot;, 1, [&quot;a3&quot;, &quot;b3&quot;, &quot;c3&quot;, &quot;d3&quot;, &quot;e3&quot;, &quot;f3&quot;, &quot;g3&quot;, &quot;h3&quot;]);     design.addZone(&quot;third-rank&quot;, 2, [&quot;a6&quot;, &quot;b6&quot;, &quot;c6&quot;, &quot;d6&quot;, &quot;e6&quot;, &quot;f6&quot;, &quot;g6&quot;, &quot;h6&quot;]);      design.addPiece(&quot;Pawn&quot;, 0, 2);     design.addMove(0, pawnShift, [4], 0);     design.addMove(0, pawnJump, [4], 0);     design.addMove(0, pawnLeap, [7], 0);     design.addMove(0, pawnLeap, [3], 0);     design.addMove(0, enPassant, [1, 4], 0);     design.addMove(0, enPassant, [0, 4], 0);      design.addPiece(&quot;Rook&quot;, 1, 10);     design.addMove(1, slide, [4], 0);     design.addMove(1, slide, [2], 0);     design.addMove(1, slide, [0], 0);     design.addMove(1, slide, [1], 0);      design.addPiece(&quot;Knight&quot;, 2, 6);     design.addMove(2, jump, [4, 7], 0);     design.addMove(2, jump, [4, 3], 0);     design.addMove(2, jump, [2, 6], 0);     design.addMove(2, jump, [2, 5], 0);     design.addMove(2, jump, [0, 7], 0);     design.addMove(2, jump, [0, 6], 0);     design.addMove(2, jump, [1, 3], 0);     design.addMove(2, jump, [1, 5], 0);      design.addPiece(&quot;Bishop&quot;, 3, 6);     design.addMove(3, slide, [7], 0);     design.addMove(3, slide, [6], 0);     design.addMove(3, slide, [3], 0);     design.addMove(3, slide, [5], 0);      design.addPiece(&quot;Queen&quot;, 4, 18);     design.addMove(4, slide, [4], 0);     design.addMove(4, slide, [2], 0);     design.addMove(4, slide, [0], 0);     design.addMove(4, slide, [1], 0);     design.addMove(4, slide, [7], 0);     design.addMove(4, slide, [6], 0);     design.addMove(4, slide, [3], 0);     design.addMove(4, slide, [5], 0);      design.addPiece(&quot;King&quot;, 5, 1000);     design.addMove(5, step, [4], 0);     design.addMove(5, step, [2], 0);     design.addMove(5, step, [0], 0);     design.addMove(5, step, [1], 0);     design.addMove(5, step, [7], 0);     design.addMove(5, step, [6], 0);     design.addMove(5, step, [3], 0);     design.addMove(5, step, [5], 0);     design.addMove(5, O_O, [1, 0], 1);     design.addMove(5, O_O_O, [0, 1], 1);      design.setup(&quot;White&quot;, &quot;Pawn&quot;, [&quot;a2&quot;, &quot;b2&quot;, &quot;c2&quot;, &quot;d2&quot;, &quot;e2&quot;, &quot;f2&quot;, &quot;g2&quot;, &quot;h2&quot;]);     design.setup(&quot;White&quot;, &quot;Rook&quot;, [&quot;a1&quot;, &quot;h1&quot;]);     design.setup(&quot;White&quot;, &quot;Knight&quot;, [&quot;b1&quot;, &quot;g1&quot;]);     design.setup(&quot;White&quot;, &quot;Bishop&quot;, [&quot;c1&quot;, &quot;f1&quot;]);     design.setup(&quot;White&quot;, &quot;Queen&quot;, [&quot;d1&quot;]);     design.setup(&quot;White&quot;, &quot;King&quot;, [&quot;e1&quot;]);     design.setup(&quot;Black&quot;, &quot;Pawn&quot;, [&quot;a7&quot;, &quot;b7&quot;, &quot;c7&quot;, &quot;d7&quot;, &quot;e7&quot;, &quot;f7&quot;, &quot;g7&quot;, &quot;h7&quot;]);     design.setup(&quot;Black&quot;, &quot;Rook&quot;, [&quot;a8&quot;, &quot;h8&quot;]);     design.setup(&quot;Black&quot;, &quot;Knight&quot;, [&quot;b8&quot;, &quot;g8&quot;]);     design.setup(&quot;Black&quot;, &quot;Bishop&quot;, [&quot;c8&quot;, &quot;f8&quot;]);     design.setup(&quot;Black&quot;, &quot;Queen&quot;, [&quot;d8&quot;]);     design.setup(&quot;Black&quot;, &quot;King&quot;, [&quot;e8&quot;]); }  })();<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0442 Z2J (\u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f ZRF \u0432 JavaScript), \u0442\u0430\u043a \u0438 \u043e\u0442 \u0441\u0430\u043c\u043e\u0433\u043e ZRF. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438, \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 JavaScript. \u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u0433\u0440\u044b, \u0435\u0449\u0451 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435.  <\/div>\n<\/p><\/div>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u0438 <a href=\"https:\/\/glukkazan.github.io\/\" rel=\"nofollow\">\u0438\u0433\u0440\u044b<\/a>. \u041c\u043d\u043e\u0433\u043e \u0438\u0433\u0440, \u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0435 \u0438\u0433\u0440\u044b, \u0437\u0430 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u0438\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u2014 \u044d\u0442\u043e \u0442\u043e, \u0432\u043e \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043a\u0435\u043c-\u0442\u043e. \u0412 \u044d\u0442\u043e\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0433\u0440 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u0442\u043e\u0432, \u043d\u043e \u0438\u0433\u0440\u0430\u043b\u0438 \u043e\u043d\u0438 \u0441\u043b\u0430\u0431\u043e, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0428\u0430\u0445\u043c\u0430\u0442 \u0438\u043b\u0438 \u0413\u043e, \u044f \u043d\u0435 \u043f\u0438\u0442\u0430\u043b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u043b\u043b\u044e\u0437\u0438\u0439 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u0442\u0430, \u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u041e\u0442\u0447\u0430\u0441\u0442\u0438, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u043c\u043d\u043e\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u043e \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u0451\u043d \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0445 \u0438\u0433\u0440.<\/p>\n<p>  \u0420\u0430\u0434\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u043b\u0430 \u0431\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Dagaz, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0438\u0433\u0440\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 Internet, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u043e \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0441 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u0431\u0430\u043a\u044d\u043d\u0434\u043e\u043c \u0438 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u043e \u0445\u043e\u0431\u0431\u0438-\u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u044f \u0431\u044b\u043b \u043d\u0435 \u0433\u043e\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u044d\u0442\u043e \u0434\u0435\u043d\u044c\u0433\u0438.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043e\u0451 \u043d\u0430\u0447\u0430\u043b\u044c\u0441\u0442\u0432\u043e \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0432 \u043a\u0443\u0440\u0441\u0435 \u043c\u043e\u0435\u0433\u043e \u0443\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0433\u0440\u0430\u043c\u0438. \u0418\u043d\u043e\u0433\u0434\u0430 \u044f \u043f\u0440\u043e\u0432\u043e\u0436\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0438\u0442\u0430\u043f\u044b \u043d\u0430 \u044d\u0442\u0443 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u043c\u044b, \u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u044b <a href=\"https:\/\/habr.com\/ru\/post\/514426\/\">\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043b\u0438<\/a> \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u0443\u0440\u043d\u0438\u0440, \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u0433\u0440\u044b \u0432 &quot;<a href=\"https:\/\/glukkazan.github.io\/go\/atari-go.htm\" rel=\"nofollow\">Atari Go<\/a>&quot; \u0441\u0440\u0435\u0434\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0418 \u0432\u043e\u0442, \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0434\u043d\u044f\u0445, \u043e\u0442\u0434\u0435\u043b \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u0441 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043b\u043e\u044f\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u043e\u0442\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u043e\u043c \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430, \u0438\u0433\u0440 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u00ab\u0431\u043e\u043d\u0443\u0441\u043e\u0432\u00bb, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u0438\u0434\u043e\u043a, \u043f\u0440\u0438 \u043f\u043e\u0431\u0435\u0434\u0430\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043c\u0435\u043d\u044f \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0440\u0430\u0434\u043e\u0432\u0430\u043b\u043e.  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0430\u043a, \u0432\u043e\u043b\u0435\u0439-\u043d\u0435\u0432\u043e\u043b\u0435\u0439, \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u0431\u0430\u043a\u044d\u043d\u0434. \u042f \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/nestjs.com\/\" rel=\"nofollow\">Nest<\/a>. \u0412\u043e \u043f\u0435\u0440\u0432\u044b\u0445, \u0434\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.typescriptlang.org\/\" rel=\"nofollow\">TypeScript<\/a>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u0441\u0435 \u044d\u0442\u0438 <a href=\"https:\/\/docs.nestjs.com\/controllers\" rel=\"nofollow\">\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/a>, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0442\u043e\u0442 \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u0439 \u044d\u043d\u0442\u0435\u0440\u043f\u0440\u0430\u0439\u0437, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u043f\u0440\u0438\u0432\u044b\u043a. \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0443 Nest-\u0430 \u0432\u0441\u0451 \u0442\u043e\u0442 \u0436\u0435 <a href=\"https:\/\/expressjs.com\/ru\/\" rel=\"nofollow\">Express<\/a>, \u043d\u043e \u043a\u043e\u0434 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u0435\u0435 \u2014 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e. <a href=\"https:\/\/swagger.io\/\" rel=\"nofollow\">Swagger<\/a> \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/docs.nestjs.com\/openapi\/introduction\" rel=\"nofollow\">\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a<\/a> \u043a\u043e\u0434\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u0451 \u043d\u043e\u0432\u044b\u0445 \u0438 \u043d\u043e\u0432\u044b\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0441 REST API \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u0430\u043c\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"http:\/\/games.dtco.ru\/api\/swagger\/\" rel=\"nofollow\">\u0442\u0430\u043a<\/a> \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 <a href=\"http:\/\/games.dtco.ru\/api\/swagger-json\" rel=\"nofollow\">\u0442\u0430\u043a<\/a>.<\/p>\n<p>  \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u043e\u043e\u0431\u0449\u0435, \u044f \u0438\u0437 \u0442\u0435\u0445 \u043b\u044e\u0434\u0435\u0439, \u043a\u043e\u043c\u0443 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0438\u0441\u0430\u0442\u044c SQL \u0437\u0430\u043f\u0440\u043e\u0441, \u0447\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0435\u043c\u0443\u0434\u0440\u043e\u0441\u0442\u044f\u0445 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c ORM. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f <a href=\"https:\/\/docs.nestjs.com\/recipes\/sql-typeorm\" rel=\"nofollow\">\u0441\u0434\u0435\u043b\u0430\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a>. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <a href=\"https:\/\/typeorm.io\/#\/\" rel=\"nofollow\">TypeORM<\/a> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0441\u0435 \u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0443\u0441\u0442\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044f \u0432\u044b\u0431\u0440\u0430\u043b <a href=\"https:\/\/www.postgresql.org\/download\/\" rel=\"nofollow\">PostgreSQL<\/a>, \u043d\u043e \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/www.mysql.com\/\" rel=\"nofollow\">MySQL<\/a>, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0414\u043b\u044f \u043c\u0435\u043d\u044f, \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u043d\u0435\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u0433\u0440, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0438\u0433\u0440\u043e\u0432\u044b\u043c \u0441\u0435\u0441\u0441\u0438\u044f\u043c, \u0432\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u043e\u0434\u044b, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0451 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u044b \u043f\u043e \u0441\u0435\u0442\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f6\/m_\/fa\/f6m_fa_ht3-supj1xj_1jai3tsu.png\"><\/div>\n<p>  \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/ormconfig.json\" rel=\"nofollow\">ormconfig.json<\/a> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0442\u0438\u043f\u0430 \u043b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f, \u0442\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u044c \u043a \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (entities) \u0438 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0437\u0430 \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f TypeORM. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c SQL-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 TypeScript-\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u043c\u0443<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne, JoinColumn, Check, Unique } from &quot;typeorm&quot;; import { users } from &quot;.\/users&quot;; import { game_sessions } from &quot;.\/game_sessions&quot;; import { game_results } from &quot;.\/game_results&quot;;  @Entity() @Unique([&quot;session_id&quot;, &quot;player_num&quot;]) @Check(`&quot;is_ai&quot; in (0, 1)`) export class user_games {     @PrimaryGeneratedColumn()     id: number;      @Index()     @Column({ nullable: false })     user_id: number;     @ManyToOne(type =&gt; users)     @JoinColumn({ name: &quot;user_id&quot; })     user: users;      @Index()     @Column({ nullable: false })     session_id: number;     @ManyToOne(type =&gt; game_sessions)     @JoinColumn({ name: &quot;session_id&quot; })     session: game_sessions;      @Index()     @Column({ nullable: true })     result_id: number;     @ManyToOne(type =&gt; game_results)     @JoinColumn({ name: &quot;result_id&quot; })     result: game_results;      @Column({ nullable: true })     score: number;      @Column()     player_num: number;      @Column({ default: 0 })     is_ai: number;      @Column({ nullable: true })     time_limit: number; }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0444\u043b\u0430\u0433 synchronize \u0432 ormconfig.json \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 true). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/typeorm.io\/#\/entities\" rel=\"nofollow\">\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439<\/a> \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u041d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u2014 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0434\u0435\u043b\u0430. \u041d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0432 TypeORM \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <a href=\"https:\/\/typeorm.io\/#\/migrations\" rel=\"nofollow\">\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/a>. \u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0440\u0430 SQL-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0434\u043b\u044f \u043d\u0430\u043a\u0430\u0442\u0430 \u0438 \u043e\u0442\u043a\u0430\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0427\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0440\u043e\u0434\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import {MigrationInterface, QueryRunner} from &quot;typeorm&quot;;  export class init1592210976213 implements MigrationInterface {      public async up(queryRunner: QueryRunner): Promise&lt;any&gt; {         await queryRunner.query(`insert into contact_types(id, name) values(1, 'EMail')`);          await queryRunner.query(`insert into token_types(id, name) values(1, 'Access')`);         await queryRunner.query(`insert into token_types(id, name) values(2, 'Refresh')`);          await queryRunner.query(`insert into game_results(id, name) values(1, 'Won')`);         await queryRunner.query(`insert into game_results(id, name) values(2, 'Lose')`);         await queryRunner.query(`insert into game_results(id, name) values(3, 'Draw')`);          await queryRunner.query(`insert into users(is_admin, login, pass) values(1, 'root', 'root')`);     }      public async down(queryRunner: QueryRunner): Promise&lt;any&gt; {         await queryRunner.query(`delete from users`);         await queryRunner.query(`delete from game_statuses`);         await queryRunner.query(`delete from game_results`);         await queryRunner.query(`delete from token_types`);         await queryRunner.query(`delete from contact_types`);         await queryRunner.query(`delete from realms`);     } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u0438, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f TypeScript, \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u0432\u044b\u0440\u0438\u0441\u0442\u0430\u044f (\u0438 \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 TypeScript-\u0430).<\/p>\n<pre><code class=\"plaintext\">npm install -g ts-node ts-node .\/node_modules\/typeorm\/cli.js migration:run <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043e\u043d\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f migrations) \u0438 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8216;typeorm migration:revert&#8217;.  <\/div>\n<\/p><\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0432\u0435\u0449\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u2014 \u044d\u0442\u043e <a href=\"https:\/\/docs.nestjs.com\/techniques\/authentication\" rel=\"nofollow\">\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/a>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043e\u043d\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u043d \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/JSON_Web_Token\" rel=\"nofollow\">JWT<\/a>. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f Nest-\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/src\/auth\/local.strategy.ts\" rel=\"nofollow\">\u0442\u043e\u0439<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/src\/auth\/jwt.strategy.ts\" rel=\"nofollow\">\u0438\u043d\u043e\u0439<\/a> \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 (\u0432\u0441\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/src\/auth\/auth.service.ts\" rel=\"nofollow\">\u0441\u0435\u0440\u0432\u0438\u0441<\/a>). \u0421\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b \u0432 <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/src\/auth\/local-auth.guard.ts\" rel=\"nofollow\">guard<\/a>-\u044b \u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e.<\/p>\n<pre><code class=\"javascript\">  @UseGuards(LocalAuthGuard)   @Post('api\/auth\/login')   async login(@Request() req) {     const device: string = req.headers['x-forwarded-for'] ||                             req.connection.remoteAddress;     const r = await this.authService.login(req.user, device);     return r;   } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f JWT \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 (\u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u043e\u0439\u0434\u0451\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u043a\u0430\u043a <a href=\"https:\/\/tools.ietf.org\/html\/rfc6750\" rel=\"nofollow\">bearer<\/a> \u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c JWT-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u0412\u0442\u043e\u0440\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 URL \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0441 \u044d\u0442\u0438\u043c \u0441\u0432\u044f\u0437\u0430\u043d \u043e\u0434\u0438\u043d \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u0443\u0435\u0442\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u0431\u0430\u043a\u044d\u043d\u0434\u0430, \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0435\u0449\u0451 \u0438 \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 <a href=\"https:\/\/angular.io\/\" rel=\"nofollow\">Angular<\/a>-\u0435. \u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f <a href=\"https:\/\/github.com\/GlukKazan\/ActivateBonus\" rel=\"nofollow\">\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430<\/a>, \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0431\u043e\u043d\u0443\u0441\u043e\u0432, \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f. \u0412\u0430\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0442\u043e, \u0447\u0442\u043e \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u043c\u0435\u044e\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0438, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 URL (\u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u043e\u043c). \u0422\u043e \u0435\u0441\u0442\u044c, \u0443 \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434\u0430 \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0441\u0432\u043e\u0439, \u0430 \u0443 \u0431\u0430\u043a\u044d\u043d\u0434\u0430 \u0441\u0432\u043e\u0439. \u0412\u043e\u043f\u0440\u043e\u0441 \u0432 \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u0445 \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c?<\/p>\n<p>  \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0421\u043e\u0437\u0434\u0430\u0451\u043c <a href=\"https:\/\/github.com\/GlukKazan\/ActivateBonus\/blob\/main\/proxy.conf.json\" rel=\"nofollow\">\u0444\u0430\u0439\u043b<\/a> \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8216;ng serve &#8212;proxy-config proxy.conf.json&#8217; \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0431\u0430\u043a\u044d\u043d\u0434 \u0442\u043e\u0436\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u043a\u043e\u043d\u0435\u0447\u043d\u043e). \u0412\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 &#8216;\/api&#8217; \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u0430\u043a\u044d\u043d\u0434. \u041d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 TCP-\u043f\u043e\u0440\u0442\u0430 \u0432 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 Nest-\u0435:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">main.ts<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import { NestFactory } from '@nestjs\/core'; import { AppModule } from '.\/app.module'; import { NestExpressApplication } from &quot;@nestjs\/platform-express&quot;; import { join } from 'path'; import { NotFoundExceptionFilter } from '.\/frontend.catch';  async function bootstrap() {   const app = await NestFactory.create&lt;NestExpressApplication&gt;(     AppModule,   );    app.useStaticAssets(join(__dirname, '\/..\/public'), {prefix: '\/'});   app.setBaseViewsDir(join(__dirname, '\/..\/public'));   app.useGlobalFilters(new NotFoundExceptionFilter());    app.enableCors();   await app.listen(3000); } bootstrap(); <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">frontend.catch.ts<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import { NotFoundException, Catch, ExceptionFilter, ArgumentsHost, HttpException } from &quot;@nestjs\/common&quot;; import { resolve } from 'path';  @Catch(NotFoundException) export class NotFoundExceptionFilter implements ExceptionFilter {   catch(exception: HttpException, host: ArgumentsHost) {     const ctx = host.switchToHttp();     const response = ctx.getResponse();     response.sendFile(resolve('public\/index.html'));   } }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0443\u0447\u0438\u043c \u0431\u0430\u043a\u044d\u043d\u0434 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u041a\u043e\u0440\u0435\u043d\u044c \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 public, \u0442\u043e \u0435\u0441\u0442\u044c, \u0444\u0430\u0439\u043b\u044b Nest \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043c. \u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0430\u0439\u0442\u0438 \u043d\u0435 \u0443\u0434\u0430\u0441\u0442\u0441\u044f? \u041d\u0430 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/src\/frontend.catch.ts\" rel=\"nofollow\">frontend.catch.ts<\/a>, \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 &#8216;public\/index.html&#8217;, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434\u0443 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c URL. \u042d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Single-page_application\" rel=\"nofollow\">SPA<\/a> Angular-\u0430.  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0436\u0438\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0438\u0437 Internet. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c, \u0441\u0442\u043e\u0438\u0442 \u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043e\u0442 HTTP-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043a HTTPS (\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043b\u043e\u0433\u0438\u043d\u043e\u0432 \u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0443\u0434\u0430\u0447\u043d\u0430\u044f \u043c\u044b\u0441\u043b\u044c). \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, Nest \u044d\u0442\u043e \u0442\u043e\u0436\u0435 <a href=\"https:\/\/docs.nestjs.com\/faq\/multiple-servers\" rel=\"nofollow\">\u0443\u043c\u0435\u0435\u0442<\/a>, \u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435, \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 proxy <a href=\"https:\/\/nginx.org\/ru\/\" rel=\"nofollow\">Nginx<\/a>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"nginx\">server { \tlisten 80; \tlisten 443 ssl;         ssl_certificate \/etc\/nginx\/ssl\/certificate.crt;         ssl_certificate_key \/etc\/nginx\/ssl\/private.key;         ssl_verify_client off; \t \tserver_name games.dtco.ru; \tlocation \/ { \t\tindex index.html; \t\tproxy_pass http:\/\/localhost:3000\/; \t} } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0417\u0434\u0435\u0441\u044c, \u043f\u0440\u0430\u0432\u0434\u0430, \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043b\u043e\u0436\u043a\u0438 \u0434\u0451\u0433\u0442\u044f<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435, \u0432 Linux \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0435\u0433\u043e \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441. \u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u0432\u044b\u043b\u0438\u043b\u043e\u0441\u044c \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 dagaz.service \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"plaintext\">[Unit] Description=Dagaz Server After=network-online.target  [Service] Restart=on-failure Type=simple User=dagaz WorkingDirectory=\/home\/dagaz\/Downloads\/DagazServer-master ExecStart=\/usr\/bin\/npm start  [Install] WantedBy=multi-user.target <\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u043d\u0435\u043b\u0430\u0434\u043d\u043e\u0435? \u0414\u0430-\u0434\u0430, \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0435\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8216;npm start&#8217;, \u0442\u043e \u0435\u0441\u0442\u044c, \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e \u0437\u0430\u043d\u043e\u0432\u043e \u0438\u0437 TypeScript-\u0430. \u0427\u0442\u043e \u043c\u0435\u043d\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043f\u043e\u0439\u0442\u0438 \u043d\u0430 \u044d\u0442\u043e? \u041d\u0430\u0447\u043d\u0443 \u0438\u0437\u0434\u0430\u043b\u0435\u043a\u0430. \u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u043c\u043d\u0435 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\">nest build cd build node main.js <\/code><\/pre>\n<p>  \u041d\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e TypeORM, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c ormconfig.json, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0421\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435, \u044d\u0442\u043e \u043d\u0435 \u0431\u0435\u0434\u0430. \u0415\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">database.provider.ts<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import { createConnection } from 'typeorm'; import { dbOptions } from '..\/app.config';  export const databaseProviders = [   {     provide: 'DATABASE_CONNECTION',     useFactory: async () =&gt; await createConnection(       dbOptions     ),   }, ];<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">app.config.ts<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">import &quot;reflect-metadata&quot;; import { ConnectionOptions } from &quot;typeorm&quot;;  export let dbOptions: ConnectionOptions = {     type: &quot;postgres&quot;,     host: &quot;127.0.0.1&quot;,     port: 5433,     username: &quot;dagaz&quot;,     password: &quot;dagaz&quot;,     database: &quot;dagaz&quot;,     migrationsTableName: &quot;migrations&quot;,     synchronize: false,     logging: false,     entities: [         &quot;src\/entity\/**\/*.{ts,js}&quot;,         &quot;.\/entity\/**\/*.{ts,js}&quot;     ] }<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441. \u0412 entities \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 (\u044d\u0442\u043e \u043f\u0443\u0442\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c TypeORM \u0438\u0449\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445). \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0430 \u043f\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u0434\u0451\u0442 \u0443\u0436\u0435 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u0424\u0430\u0439\u043b ormconfig.json, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u043c, \u043e\u043d \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>  \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0434\u043e\u0431\u0440\u044b\u0439 \u0441\u043e\u0432\u0435\u0442. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0439\u0442\u0435 synchronize \u0432 false \u0432\u0441\u0435\u0433\u0434\u0430, \u0435\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043a\u0430\u0436\u0443 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u044f \u0432\u043e\u0437\u0438\u043b\u0441\u044f \u043d\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u042d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043d\u0435\u0441\u0442\u0438 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u00ab\u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435\u00bb \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f TypeORM \u043f\u043e\u043b\u044f. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u0432\u0441\u0451 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c. \u041d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439\u0442\u0435 \u043c\u043e\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  \u0421\u043e\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0435 \u043d\u0430\u0434\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c TypeScript), \u043d\u043e \u0443\u0432\u044b, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u044f \u043d\u0435 \u0441\u043c\u043e\u0433.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">C:\\Users\\User\\dagaz-server&gt;npm run build  &gt; dagaz-server@0.0.1 prebuild C:\\Users\\User\\dagaz-server &gt; rimraf dist   &gt; dagaz-server@0.0.1 build C:\\Users\\User\\dagaz-server &gt; tsc -p tsconfig.build.json  node_modules\/@nestjs\/swagger\/dist\/type-helpers\/omit-type.helper.d.ts:2:90 - error TS1005: ',' expected.  2 export declare function OmitType&lt;T, K extends keyof T&gt;(classRef: Type&lt;T&gt;, keys: readonly K[]): Type&lt;Omit&lt;T, typeof keys[number]&gt;&gt;;                                                                                            ~  node_modules\/@nestjs\/swagger\/dist\/type-helpers\/omit-type.helper.d.ts:2:91 - error TS1005: ',' expected.  2 export declare function OmitType&lt;T, K extends keyof T&gt;(classRef: Type&lt;T&gt;, keys: readonly K[]): Type&lt;Omit&lt;T, typeof keys[number]&gt;&gt;;                                                                                             ~  node_modules\/@nestjs\/swagger\/dist\/type-helpers\/pick-type.helper.d.ts:2:90 - error TS1005: ',' expected.  2 export declare function PickType&lt;T, K extends keyof T&gt;(classRef: Type&lt;T&gt;, keys: readonly K[]): Type&lt;Pick&lt;T, typeof keys[number]&gt;&gt;;                                                                                            ~  node_modules\/@nestjs\/swagger\/dist\/type-helpers\/pick-type.helper.d.ts:2:91 - error TS1005: ',' expected.  2 export declare function PickType&lt;T, K extends keyof T&gt;(classRef: Type&lt;T&gt;, keys: readonly K[]): Type&lt;Pick&lt;T, typeof keys[number]&gt;&gt;;  Found 4 errors.  npm ERR! code ELIFECYCLE npm ERR! errno 2 npm ERR! dagaz-server@0.0.1 build: `tsc -p tsconfig.build.json` npm ERR! Exit status 2 npm ERR! npm ERR! Failed at the dagaz-server@0.0.1 build script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.  npm ERR! A complete log of this run can be found in: npm ERR!     C:\\Users\\User\\AppData\\Roaming\\npm-cache\\_logs\\2020-10-21T09_33_58_253Z-debug.log<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043b\u0435\u0442\u044f\u0442 \u043e\u0442\u043a\u0443\u0434\u0430-\u0442\u043e \u0438\u0437 \u043d\u0435\u0434\u0440 @nestjs\/swagger. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 TypeScript-\u0430 \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0441 \u044d\u0442\u0438\u043c \u0431\u043e\u0440\u043e\u0442\u044c\u0441\u044f, \u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u043d\u0435, \u044f \u0437\u0430\u0438\u043d\u0442\u0440\u0438\u0433\u043e\u0432\u0430\u043d. \u0410 \u0441\u0431\u043e\u0440\u043a\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435, \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u043a\u043e\u043f\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u043c Swagger-\u043e\u043c (\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439, \u0434\u0430). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u044f \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 Swagger-\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8216;npm start&#8217;.  <\/div>\n<\/p><\/div>\n<p>  \u0410 \u0447\u0442\u043e \u0441 \u0438\u0433\u0440\u0430\u043c\u0438? \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0431\u044b\u043b\u0438, \u043d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u0433\u0440\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c (\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441 \u043f\u0440\u0438 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0435). \u0412 \u044d\u0442\u043e\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c <a href=\"https:\/\/jquery.com\/\" rel=\"nofollow\">jQuery<\/a> (\u043a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0442\u0440\u0451\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043c\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u0440\u043e\u043c\u0435 \u043d\u0435\u0451 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"http:\/\/underscorejs.ru\/\" rel=\"nofollow\">Underscore<\/a> \u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 <a href=\"https:\/\/www.npmjs.com\/package\/seedrandom\" rel=\"nofollow\">Seedrandom<\/a>). \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u0432\u0435\u043b\u0430\u0441\u044c \u043a \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/public\/games\/common-scripts\/app-v2-net.js\" rel=\"nofollow\">\u043c\u043e\u0434\u0443\u043b\u044f<\/a>.<\/p>\n<pre><code class=\"javascript\">var SERVICE = &quot;\/api\/&quot;;  var inProgress = false; var auth = null; ... var authorize = function() {   if (auth !== null) return;   inProgress = true;   $.ajax({      url: SERVICE + &quot;auth\/anonymous&quot;,      type: &quot;GET&quot;,      dataType: &quot;json&quot;,      success: function(data) {          auth = data.access_token;          console.log('Auth: Succeed ' + auth);          inProgress = false;      },      error: function() {          Dagaz.Controller.app.state = STATE.STOP;          alert('Auth: Error!');      },      statusCode: {         401: function() {              Dagaz.Controller.app.state = STATE.STOP;              alert('Auth: Bad User!');         },         500: function() {              Dagaz.Controller.app.state = STATE.STOP;              alert('Auth: Internal Error!');         }      }   }); } ... App.prototype.exec = function() {   this.view.configure();   ...   this.view.draw(this.canvas);   if (inProgress) return;   authorize();   ... } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0451\u043b \u0432\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043c\u043d\u0435 \u043c\u043e\u043c\u0435\u043d\u0442<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0433\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e REST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 JWT-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043a\u0430\u043a \u00ab\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0439\u00bb \u0441\u0431\u043e\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0433\u0440\u0430 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u043b\u0430\u0441\u044c). \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b, \u043b\u0435\u0442\u0430\u044e\u0449\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 Nginx-\u043e\u043c \u0438 Nest-\u043e\u043c.<\/p>\n<pre><code class=\"plaintext\">tcpdump -vv -i any -s 4906 \/var\/log\/dagaz.pcap <\/code><\/pre>\n<p>  \u0412\u043e\u0442 <a href=\"https:\/\/games.dtco.ru\/log\/dagaz.pcap\" rel=\"nofollow\">\u0447\u0442\u043e<\/a> \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cr\/gj\/yz\/crgjyz3bdsh4y3bf2iotmelqequ.png\"><\/div>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 IPv4 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 IPv6 \u2014 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 (403). \u042f \u043e\u0431\u043b\u0430\u0437\u0438\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 Nest-\u0430, \u043d\u043e \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 (\u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b\u0441\u043b\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442 \u2014 \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u044b\u0441\u043b\u0443\u0448\u0430\u0442\u044c). \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, IPv6 \u043d\u0430 Loopback-\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">sysctl.conf<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6=1 <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.  <\/div>\n<\/p><\/div>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u0430 \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430 \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0433\u0440 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445. \u0412 \u044d\u0442\u043e\u043c, \u043c\u043d\u0435 \u043f\u043e\u043c\u043e\u0433 <a href=\"https:\/\/habr.com\/ru\/users\/jonic\/\" class=\"user_link\">jonic<\/a> (\u0437\u0430 \u0447\u0442\u043e \u044f \u043e\u0447\u0435\u043d\u044c \u0435\u043c\u0443 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d). \u0411\u044b\u043b\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/public\/games\/autofit.js\" rel=\"nofollow\">\u0443\u043c\u0435\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/a> canvas, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u044f \u0438\u0433\u0440\u0430, \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0438\u043b\u0438 \u043f\u043b\u0430\u043d\u0448\u0435\u0442\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f, \u0430 \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0448\u0438\u0440\u0438\u043d\u0430 canvas-\u0430 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0441\u043e\u0442\u0443 \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u043b\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<\/p>\n<p>  <a href=\"https:\/\/games.dtco.ru\/games\/filler.html\" rel=\"nofollow\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ku\/fl\/nk\/kuflnkyqtw22zwwiwvofoltlihk.png\"><\/div>\n<p><\/a><br \/>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0441\u0442\u0430\u043b\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u043e\u043c \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430 \u0438\u0433\u0440 \u0432 \u0435\u0434\u0438\u043d\u043e\u0435 \u043c\u0435\u043d\u044e, \u0441 \u043a\u0440\u0430\u0442\u043a\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u0433\u0440, \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430\u043c\u0438 \u043f\u043e\u0431\u0435\u0434 \u0438 \u043f\u043e\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430\u043c\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 \u0432 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0441\u0432\u0435\u0441\u0442\u0438 \u0441 \u0443\u043c\u0430, \u041a\u0438\u0440\u0438\u043b\u043b \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u0438\u043b <a href=\"https:\/\/gulpjs.com\/\" rel=\"nofollow\">Gulp<\/a> \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 <a href=\"https:\/\/github.com\/GlukKazan\/DagazServer\/blob\/master\/gulpfile.js\" rel=\"nofollow\">\u0441\u0431\u043e\u0440\u043a\u0438<\/a> \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435:<\/p>\n<p>  <a href=\"http:\/\/games.dtco.ru\/games\/index.html\" rel=\"nofollow\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wq\/6n\/lx\/wq6nlxyzc7buxmnnvmik_j3emp8.png\"><\/div>\n<p><\/a><br \/>  \u0412\u043e\u0442 \u0442\u0430\u043a, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Nest-\u0430, jQuery, Nginx-\u0430 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u043b\u0438 \u0432\u0435\u0437\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 Internet-\u0435 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u041a\u043e\u043c\u0443 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0435\u0449\u0451.<\/p>\n<div class=\"oembed\"><iframe id=\"5f928f7f2c0608e1441a4033\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f928f7f2c0608e1441a4033\"><\/iframe><\/div>\n<p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/523714\/\"> https:\/\/habr.com\/ru\/post\/523714\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u041f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u044f \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u043e\u043d\u0442\u044d\u0434\u0449\u0438\u043a. \u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u0430\u043a\u044d\u043d\u0434\u043e\u043c. \u041b\u044e\u0431\u043e\u0432\u044c \u043a \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u043c \u0438\u0433\u0440\u0430\u043c \u2014 \u0432\u043e\u0442 \u0447\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u044f \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 web-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439. \u041d\u043e\u0432\u044b\u0439, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043c\u043d\u0435 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 JavaScript, \u044f \u0438\u0437\u0443\u0447\u0430\u043b \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. \u0414\u043e\u043f\u0443\u0441\u043a\u0430\u044e, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u0435 \u0438\u0437 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u043b, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u0443\u0436\u0430\u0441\u043d\u0443\u0442\u044c \u043e\u043f\u044b\u0442\u043d\u044b\u0445 web-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043d\u043e \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u0441\u0442\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435. \u042d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u043a \u0432\u043e \u0432\u0441\u0451\u043c \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043b\u044e\u0431\u0438\u0442\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u043e\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0435\u043b\u043e\u0447\u0438, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u0441\u0435\u043d\u044c \u043c\u043e\u0435\u0433\u043e \u043b\u0435\u0441\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/a7\/gv\/zy\/a7gvzynraneaz6j531jgz_widai.jpeg\"><\/div>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-311914","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=311914"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/311914\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=311914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=311914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=311914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}