{"id":496881,"date":"2026-10-01T09:49:47","date_gmt":"2026-10-01T09:49:47","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=496881"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=496881","title":{"rendered":"\u041c\u044b\u0448\u044c 1000 \u0413\u0446 \u043d\u0430 macOS 26: NSEvent \u0434\u0430\u0451\u0442 ~119 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, GCMouse ~844. \u0417\u0430\u043c\u0435\u0440 \u0442\u0440\u0435\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u044b\u0448\u044c \u043d\u0430 1000 \u0413\u0446, \u044d\u043a\u0440\u0430\u043d MacBook Pro \u043d\u0430 120 \u0413\u0446. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 <code>CGEventTap<\/code> \u0443\u0432\u0438\u0434\u0435\u043b 843,5 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. <code>NSEvent.mouseMoved<\/code> \u0432 \u043e\u043a\u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Cocoa-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b 118,5, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0434\u0440 \u044d\u043a\u0440\u0430\u043d\u0430. <code>GCMouse<\/code> \u0438\u0437 GameController \u043e\u0442\u0434\u0430\u043b 843,6 \u0438 \u0432 \u043c\u043e\u0451\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 \u043d\u0438 \u043e \u043a\u0430\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043b. \u041d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, 17 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 Swift, \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0435\u0433\u043e \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.<\/p>\n<p>\u0412\u0441\u0451 \u0441\u043d\u044f\u0442\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u044b\u0448\u0438, \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u043a\u0435 \u0438 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 macOS, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u0443 \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435.<\/p>\n<h3>\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u043f\u0440\u043e\u0441<\/h3>\n<p>\u041f\u0440\u0438\u0446\u0435\u043b \u0432 \u0448\u0443\u0442\u0435\u0440\u0435 \u043d\u0430 MacBook \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0430\u0442\u043d\u044b\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 100+ fps. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0443\u0436\u0435 \u043c\u0435\u0440\u0438\u043b NSEvent: \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0440\u0430\u0437 \u0432 \u043a\u0430\u0434\u0440 \u044d\u043a\u0440\u0430\u043d\u0430, \u043a\u0430\u043a \u0438 \u0437\u0434\u0435\u0441\u044c. \u041d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Apple \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0434 <a href=\"https:\/\/developer.apple.com\/forums\/thread\/811024\" rel=\"noopener nofollow\">Changes in Mouse Event Reporting Frequency in macOS 26.2<\/a>, \u0441\u0443\u0434\u044f \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u043e \u0442\u043e\u043c \u0436\u0435. \u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 26.2, \u044f \u043d\u0435 \u0437\u043d\u0430\u044e: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043d\u044f\u0442\u044b \u043d\u0430 26.6.2. \u041c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u043e \u0434\u0440\u0443\u0433\u043e\u0435: \u043f\u0440\u043e\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0430\u043a \u0436\u0435 \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0434\u0430\u0451\u0442 GameController. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<h3>\u0421\u0442\u0435\u043d\u0434<\/h3>\n<p>MacBook Pro 14&#8243; (M3 Pro), macOS 26.6.2, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d 120 \u0413\u0446 (\u043a\u0430\u0434\u0440 8,33 \u043c\u0441). \u041c\u044b\u0448\u044c Logitech G309 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a LIGHTSPEED, \u043e\u043f\u0440\u043e\u0441 1000 \u0413\u0446. \u041e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434, 25 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f 2026: \u044f \u0432\u043e\u0434\u0438\u043b \u043c\u044b\u0448\u044c\u044e \u043f\u043e \u043e\u043a\u043d\u0443, \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. <code>NSEvent<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0414\u0440\u0443\u0433\u0438\u0445 \u043c\u044b\u0448\u0435\u0439, \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u0442.<\/p>\n<p>\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 (<code>CGEventTap<\/code> \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0442\u0430\u043f\u00bb):<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u043e\u0442\u043e\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0413\u0434\u0435 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0442\u0430\u043f (<code>CGEventTap<\/code>, listen-only)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u043e AppKit, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0435\u0441\u0441\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0435\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>NSEvent<\/code>, local monitor<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e, \u0447\u0442\u043e AppKit \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u043a\u043d\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u0434\u043d\u0430 \u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GCMouse<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">GameController<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>lastEventTimestamp<\/code>, \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0427\u0438\u0441\u043b\u0430 \u0441\u043d\u044f\u0442\u044b \u043d\u0435 \u0442\u0435\u043c \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 (\u043c\u044b\u0448\u044c) \u0442\u0430\u043f \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u0432\u044b\u0434\u0430\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043e\u043a\u043d\u043e \u0441 NSEvent \u0438 GCMouse \u0431\u044b\u043b\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043e \u0441\u0432\u043e\u0438\u043c bundle id \u0438 \u0431\u0435\u0437 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0448\u0451\u043b \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043e \u043d\u0451\u043c \u043d\u0438\u0436\u0435. \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435. \u042d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 \u0442\u0430\u043f, \u0430 \u043d\u0435 \u0441\u0430\u043c HID: \u0437\u0430\u043f\u0438\u0441\u0438 IOHIDManager \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u043d\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u043b\u0451\u0442 \u043c\u044b\u0448\u044c\u00bb \u0437\u0434\u0435\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0438\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u043f\u00bb.<\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u0439\u043c\u0435\u0440 \u0448\u0451\u043b \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0438 \u0442\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0448\u043b\u0438 \u043f\u0443\u0441\u0442\u044b\u043c\u0438: \u044f \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b \u043c\u044b\u0448\u044c. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, 20,058 \u0441. \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0442\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u00ab\u043f\u043e\u043b\u043e\u0441\u0430 \u043a\u0430\u0434\u0440\u0430\u00bb \u2014 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u043e\u0442 6 \u0434\u043e 10 \u043c\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">p99<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u043a\u043e\u0440\u043e\u0447\u0435 2 \u043c\u0441<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0442\u0430\u043f<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 919<\/p>\n<\/td>\n<td>\n<p align=\"left\">843,5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0,99 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">5,90 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">88,3 %<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>NSEvent<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">2 377<\/p>\n<\/td>\n<td>\n<p align=\"left\">118,5<\/p>\n<\/td>\n<td>\n<p align=\"left\">8,07 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">14,87 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">0,3 %<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GCMouse<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">16 921<\/p>\n<\/td>\n<td>\n<p align=\"left\">843,6<\/p>\n<\/td>\n<td>\n<p align=\"left\">0,99 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">5,96 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">87,5 %<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/54b\/4cd\/267\/54b4cd267e53699bfeb4f51eaa7d582b.png\" alt=\"\u041e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 100 \u043c\u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u0442\u0430\u043f (90 \u0441\u043e\u0431\u044b\u0442\u0438\u0439), NSEvent (12, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0434\u0440 8,33 \u043c\u0441), GCMouse (90). \u041d\u0438\u0436\u0435 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0437\u0430 \u0432\u0441\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/\/post_images\/54b\/4cd\/267\/54b4cd267e53699bfeb4f51eaa7d582b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/\/post_images\/54b\/4cd\/267\/54b4cd267e53699bfeb4f51eaa7d582b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 100 \u043c\u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u0442\u0430\u043f (90 \u0441\u043e\u0431\u044b\u0442\u0438\u0439), NSEvent (12, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0434\u0440 8,33 \u043c\u0441), GCMouse (90). \u041d\u0438\u0436\u0435 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0437\u0430 \u0432\u0441\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043f \u0438 GCMouse \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b: \u043c\u0435\u0434\u0438\u0430\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u0441\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0442\u044b\u0441\u044f\u0447. \u0423 NSEvent 91,0 % \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u043e\u043b\u043e\u0441\u0435 6\u201310 \u043c\u0441. GCMouse \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u043e <code>lastEventTimestamp<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443, \u043d\u0438\u0436\u0435.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 1000 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443? \u041f\u0440\u043e\u0441\u0442\u043e\u044f\u043c\u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c: \u043f\u0430\u0443\u0437 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 20 \u043c\u0441 \u0431\u044b\u043b\u043e \u0434\u0435\u0441\u044f\u0442\u044c, \u0432\u043c\u0435\u0441\u0442\u0435 0,3 \u0441 \u0438\u0437 20. \u0411\u0435\u0437 \u043d\u0438\u0445 \u0442\u0430\u043f \u0434\u0430\u0451\u0442 \u043e\u043a\u043e\u043b\u043e 856 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0440\u043e\u0432\u043d\u044b\u0435: \u043c\u0435\u0434\u0438\u0430\u043d\u0430 0,99 \u043c\u0441, p90 2,11 \u043c\u0441. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u043f \u0432\u0438\u0434\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 850 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u043d\u0435 1000, \u044f \u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u044f\u043b: \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0441\u0442\u0438 \u043c\u044b\u0448\u044c, \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c IOHIDManager, \u0430 \u0435\u0451 \u043d\u0435\u0442.<\/p>\n<h3>NSEvent \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/h3>\n<p>\u041d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f NSEvent \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c 7,12 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043f\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 8, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 9), \u0432 94,9 % \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u0432\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0421\u0430\u043c\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043f\u043e X (\u0441\u0443\u043c\u043c\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439) \u0443 \u0442\u0430\u043f\u0430 83 743, \u0443 NSEvent 83 611; \u043f\u043e Y \u043e\u0431\u0435 \u0441\u0443\u043c\u043c\u044b \u0440\u0430\u0432\u043d\u044b 18 894. \u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 0,2 % \u043f\u043e X, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043a\u043b\u0435\u0439\u043a\u0438. \u041f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0434\u0440\u0430. \u041a\u0430\u043a \u044d\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u0446\u0435\u043b\u0435, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e.<\/p>\n<h3>GCMouse: 17 \u0441\u0442\u0440\u043e\u043a<\/h3>\n<pre><code class=\"swift\">import GameControllerlet queue = DispatchQueue(label: \"mouse\", qos: .userInteractive)func attach(_ mouse: GCMouse) {    mouse.handlerQueue = queue                       \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0434\u0451\u0442 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043d\u0435 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439    mouse.mouseInput?.mouseMovedHandler = { input, dx, dy in        \/\/ dx, dy: \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 (Float); \u0437\u043d\u0430\u043a dy \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d NSEvent.deltaY (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e).        \/\/ input.lastEventTimestamp \u0432 \u043c\u043e\u0438\u0445 \u043b\u043e\u0433\u0430\u0445 \u2014 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix, \u0430 \u043d\u0435 \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.        print(dx, dy, input.lastEventTimestamp)    }}GCMouse.mice().forEach(attach)                       \/\/ \u043c\u044b\u0448\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430NotificationCenter.default.addObserver(forName: .GCMouseDidConnect, object: nil, queue: .main) { note in    if let mouse = note.object as? GCMouse { attach(mouse) }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430: \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 (<code>RunLoop<\/code>, <code>NSApplication.run()<\/code>) \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, \u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441 <code>queue: .main<\/code> \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 GCMouse, \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435, \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b: \u0443 <code>GCController<\/code> \u0435\u0441\u0442\u044c <code>shouldMonitorBackgroundEvents<\/code>, \u0434\u043b\u044f \u043c\u044b\u0448\u0438 \u044f \u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b. \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044f \u0432\u044b\u043d\u0435\u0441 \u043d\u0430 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u0447\u0442\u043e\u0431\u044b \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043c\u0435\u0442\u043a\u0438. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0412\u0441\u0435 16 924 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>dx<\/code> \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 \u0446\u0435\u043b\u044b\u0435.<\/p>\n<h3>\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u0435\u043b\u044c\u0442<\/h3>\n<p>\u0421\u0443\u043c\u043c\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043f\u043e X \u0437\u0430 \u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a: 83 743 \u0443 \u0442\u0430\u043f\u0430 \u0438 95 680 \u0443 GCMouse, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 1,143 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435. \u041f\u043e Y 18 894 \u043f\u0440\u043e\u0442\u0438\u0432 21 694 (\u0432 1,148 \u0440\u0430\u0437\u0430). \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u043a\u043d\u0430 \u043e\u0442 50 \u043c\u0441 \u0434\u043e 1 \u0441 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u043a\u043d\u0430\u043c, \u043d\u0430\u043a\u043b\u043e\u043d \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 GCMouse \u043a \u0442\u0430\u043f\u0443 \u043f\u043e X \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 1,137 \u0434\u043e 1,148 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430. \u041f\u043e \u043a\u0432\u0430\u0440\u0442\u0438\u043b\u044f\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0446\u0435\u043d\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u043c\u0435\u0436\u0434\u0443 1,12 \u0438 1,20 (\u0442\u043e\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430). \u042f\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b, \u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0432\u0430\u0440\u0442\u0438\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430, \u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e. \u0423 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043e\u043d \u0442\u043e\u0442 \u0436\u0435: \u043f\u043e X 25 066 \u043f\u0440\u043e\u0442\u0438\u0432 28 754 (1,147), \u043f\u043e Y 18 247 \u043f\u0440\u043e\u0442\u0438\u0432 20 959 (1,149).<\/p>\n<p>\u0412 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 SDK \u0443 <code>mouseMovedHandler<\/code> \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u044c\u0442\u0430 \u00ab\u0441\u044b\u0440\u0430\u044f\u00bb \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0441\u043f\u043e\u0440\u044f\u0442, \u043d\u043e \u0438 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442: \u0441 \u043e\u0442\u0441\u0447\u0451\u0442\u0430\u043c\u0438 HID \u044f \u0434\u0435\u043b\u044c\u0442\u044b \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b. \u0415\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b <code>defaults read -g com.apple.mouse.scaling<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b 0.875, \u0430 1\/0,875 = 1,143, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043c\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c. \u041d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b 29 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f, \u0430 \u043d\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0438 \u0443 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0442\u043e\u0442 \u0436\u0435, \u0445\u043e\u0442\u044f \u043a\u043b\u044e\u0447\u0430 <code>com.apple.trackpad.scaling<\/code> \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0422\u0430\u043a \u0447\u0442\u043e \u00ab\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u00bb \u043f\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0430, \u0430 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e. \u042f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b.<\/p>\n<h3>\u041c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430<\/h3>\n<p>\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f GCMouse \u044f \u0431\u0440\u0430\u043b \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (<code>ProcessInfo.processInfo.systemUptime<\/code>), \u0430 \u043d\u0435 \u043f\u043e <code>lastEventTimestamp<\/code>. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0440\u0438.<\/p>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u044b. \u041c\u0435\u0442\u043a\u0438 \u0442\u0430\u043f\u0430 \u0438 NSEvent \u0438\u0434\u0443\u0442 \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043b\u043e\u0433\u0430\u0445 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435: 744709,998853. <code>lastEventTimestamp<\/code> \u2014 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix: \u0432 \u043b\u043e\u0433\u0435 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u043c\u0435\u0442\u043a\u0430 1790332272,76, \u0442\u043e \u0435\u0441\u0442\u044c 25 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f 2026, 10:31:12 UTC. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u043a\u0430\u043a <code>Date() \u2212 systemUptime<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435, \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u043e\u0436\u0438\u0442 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0443: 232 \u0448\u0430\u0433\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430 16 924 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u0441\u0435 \u0440\u043e\u0432\u043d\u043e \u043f\u043e 1 \u043c\u043a\u0441. \u041d\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u044d\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442, \u043d\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0430\u043c\u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044b. \u0423 817 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u0437 16 924 (4,8 %) \u043c\u0435\u0442\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0435\u0441\u0442\u044c \u0438 51 \u0442\u0440\u043e\u0439\u043a\u0430. \u0423 \u0442\u0430\u043f\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u0442, \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b 44 \u043c\u043a\u0441. \u0412 720 \u0438\u0437 \u044d\u0442\u0438\u0445 817 \u043f\u0430\u0440 \u0434\u0435\u043b\u044c\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044b, \u043d\u0435 \u0437\u043d\u0430\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043c\u044b\u0441\u043b \u043c\u0435\u0442\u043a\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u043d\u0430 7 \u043c\u043a\u0441 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 15 \u043c\u043a\u0441, p99 61 \u043c\u043a\u0441), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u043d\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412\u044b\u0437\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 GCMouse \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 0,13 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043f\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 0,19 \u043c\u0441, p99 0,75 \u043c\u0441, \u043f\u043e \u0432\u0441\u0435\u043c 16 924 \u0432\u044b\u0437\u043e\u0432\u0430\u043c). NSEvent \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 0,71 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 1,76 \u043c\u0441, p99 5,95 \u043c\u0441). \u0414\u0432\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438. \u0423 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u0435\u0442\u043a\u0430, \u0432\u0438\u0434\u0438\u043c\u043e, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0438\u0437 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u043f\u0430\u0447\u043a\u0438 \u0436\u0434\u0430\u043b \u0434\u043e\u043b\u044c\u0448\u0435. \u0418 \u044f \u0438\u0441\u0445\u043e\u0436\u0443 \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0430 \u0442\u0430\u043f\u0430 \u0438 <code>systemUptime<\/code> \u0438\u0434\u0443\u0442 \u043f\u043e \u043e\u0434\u043d\u0438\u043c \u0447\u0430\u0441\u0430\u043c: \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0442\u0430\u043f\u0430 \u0438 NSEvent \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0434\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<h3>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0422\u0430\u043f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f, \u043f\u043e\u043a\u0430 \u044f \u043d\u0435 \u0432\u044b\u0434\u0430\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0443: \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>nil<\/code>. \u041a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f listen-only \u0442\u0430\u043f\u0430 \u043d\u0430 26.6.2, \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b. \u0421\u0443\u0434\u044f \u043f\u043e API (<code>IOHIDCheckAccess<\/code> \u0441 <code>kIOHIDRequestTypeListenEvent<\/code>), \u0442\u043e\u0442 \u0436\u0435 \u00ab\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430\u00bb \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a IOHIDManager. \u0412 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u044f \u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u043b\u0447\u0438\u0442 \u043e\u043d \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438, \u043d\u0435 \u0437\u043d\u0430\u044e.<\/p>\n<p>\u0421 GCMouse \u0442\u0430\u043a: \u043e\u043a\u043d\u043e \u0441 NSEvent \u0438 GCMouse \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043e \u0441\u0432\u043e\u0438\u043c bundle id, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. <code>IOHIDCheckAccess<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>unknown<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u043e\u00bb, \u0430 \u043d\u0435 \u00ab\u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e\u00bb. \u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f. \u042d\u0442\u043e \u043c\u043e\u0451 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435, \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043b\u043e\u0433\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043d\u0435\u0442. \u041f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0435\u0433\u043e \u043b\u043e\u0433\u0430 \u0441\u0442\u043e\u0438\u0442 <code>granted<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442.<\/p>\n<h3>\u0422\u0440\u0435\u043a\u043f\u0430\u0434 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c<\/h3>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u0437\u0430\u043c\u0435\u0440 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430, \u043e\u043a\u043e\u043b\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u043e\u0433\u043e \u0436\u0435 \u0434\u043d\u044f, \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a 20,227 \u0441. \u0422\u0430\u043f: 2 365 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (116,9 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443), GCMouse: 2 365 (116,9), NSEvent: 2 290 (113,2), \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 75 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438\u043b\u0438 3,2 %, \u043c\u0435\u043d\u044c\u0448\u0435. \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0430\u0440\u0430: \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0430\u043f\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043d\u0435 \u0431\u044b\u0432\u0430\u043b\u043e, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f 3,3 %. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u0438 \u0442\u0430\u043a \u0438\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 (\u043f\u043e \u0442\u0430\u043f\u0443 \u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 8,07 \u043c\u0441), \u0438 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0447\u0435\u0433\u043e; \u0447\u0442\u043e \u0442\u0443\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c \u0442\u0440\u0435\u043a\u043f\u0430\u0434, \u0430 \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u044f \u043d\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b. \u041f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0443\u0449\u0435\u0440\u0431 NSEvent \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u044d\u043a\u0440\u0430\u043d\u0430. \u041d\u0430 \u0434\u0432\u0443\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u044d\u0442\u043e \u0434\u043e\u0433\u0430\u0434\u043a\u0430.<\/p>\n<h3>\u0413\u0440\u0430\u0431\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438<\/h3>\n<ul>\n<li>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 NSEvent \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430\u0434 \u043d\u0438\u043c, \u0438 <code>acceptsMouseMovedEvents<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d: \u0435\u0441\u043b\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043e\u043a\u043d\u0430, \u0441\u0447\u0451\u0442 NSEvent \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0435\u0442, \u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u043f \u043a NSEvent \u0437\u0430\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0439 \u043b\u043e\u0433\u0433\u0435\u0440 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0442\u0430\u0432\u0438\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u0446\u0435\u043d\u0442\u0440 \u043e\u043a\u043d\u0430. \u041f\u0435\u0440\u0432\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u0442\u0430\u043f\u0435 \u0438 NSEvent \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 (\u2212197, \u2212234), \u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u0443 GCMouse \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 (1, 1). \u041f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043a\u0443\u0440\u0441\u043e\u0440\u0430, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u044f \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b. \u0421\u0443\u043c\u043c\u044b \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043b\u043e\u0433\u0443 \u0438 \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u043e\u0442\u0440\u0435\u0437\u043a\u0443 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f. \u0412 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u043c \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440\u0435 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0421 ad-hoc \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0430\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0438\u0441\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b \u0432\u043e\u0434\u0438\u043b\u0438 \u0440\u0443\u043a\u043e\u0439. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0430\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438<\/h3>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043a\u043e\u0434 \u0432 <code>three-streams.swift<\/code>, \u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 <code>swiftc -O three-streams.swift -o three-streams<\/code>, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <code>.\/three-streams 20<\/code> \u0438 \u0432\u043e\u0434\u0438\u0442\u0435 \u043c\u044b\u0448\u044c\u044e \u043f\u043e \u043e\u043a\u043d\u0443. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0430\u043c\u0430 \u0431\u0435\u0440\u0451\u0442 \u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a: \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430, p99 \u0438 \u0434\u043e\u043b\u044e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043a\u043e\u0440\u043e\u0447\u0435 2 \u043c\u0441. \u041a\u043b\u044e\u0447 <code>--no-coalescing<\/code> \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043a\u043b\u0435\u0439\u043a\u0443 NSEvent (<code>isMouseCoalescingEnabled = false<\/code>). \u0421 \u043d\u0438\u043c \u044f \u043d\u0435 \u043c\u0435\u0440\u0438\u043b, \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445, \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432 <code>.app<\/code> \u0441\u043e \u0441\u0432\u043e\u0438\u043c <code>CFBundleIdentifier<\/code> (\u043d\u0443\u0436\u043d\u044b <code>Contents\/MacOS\/&lt;\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a&gt;<\/code> \u0438 <code>Info.plist<\/code>), \u043f\u043e\u0434\u043f\u0438\u0448\u0438\u0442\u0435 <code>codesign -f -s -<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 LaunchServices: <code>open -n -W --stdout \/tmp\/three-streams.out \u0418\u043c\u044f.app --args --no-tap<\/code>. \u041f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f: macOS \u043f\u0440\u0438\u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0443, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u043c\u044b\u0441\u043b. \u0412\u044b\u0432\u043e\u0434 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u0446\u0430 \u0437\u0430\u043f\u0438\u0441\u0438. \u041a\u043b\u044e\u0447 <code>--no-tap<\/code> \u043d\u0435 \u0434\u0430\u0451\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u043f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0438\u0442 \u0442\u0430\u043f, \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0438\u0442 GCMouse. \u0420\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 <code>IOHIDCheckAccess<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0435 \u0432\u044b\u0434\u0430\u0432\u0430\u0439\u0442\u0435, \u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f (<code>swiftc -O<\/code>, Swift 6.3.2), \u043d\u043e \u044f \u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b: \u0447\u0438\u0441\u043b\u0430 \u0432\u044b\u0448\u0435 \u0441\u043d\u044f\u0442\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0438\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, 86 \u0441\u0442\u0440\u043e\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"swift\">\/\/ swiftc -O three-streams.swift -o three-streams &amp;&amp; .\/three-streams 20\/\/ \u041e\u043f\u0446\u0438\u0438: --no-tap (\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u043f), --no-coalescing (NSEvent.isMouseCoalescingEnabled = false).\/\/ \u041f\u0438\u0448\u0435\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u0438 \u0442\u0440\u0435\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443: CGEventTap, NSEvent (local monitor), GCMouse.import AppKitimport GameControllerimport IOKit.hidfinal class Log: @unchecked Sendable {    private var v: [Double] = []    private let lock = NSLock()    func add(_ t: Double) { lock.lock(); v.append(t); lock.unlock() }    var values: [Double] { lock.lock(); defer { lock.unlock() }; return v.sorted() }}let tapLog = Log(), nsLog = Log(), gcLog = Log()let args = Array(CommandLine.arguments.dropFirst())let seconds = args.compactMap(Double.init).first ?? 20let app = NSApplication.sharedif args.contains(\"--no-coalescing\") { NSEvent.isMouseCoalescingEnabled = false }\/\/ 1) \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u043f: \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 AppKit, \u043c\u0435\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0434\u0451\u0442 \u043e\u0442 \u0436\u0435\u043b\u0435\u0437\u0430. \u041d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 macOS;\/\/    \u0431\u0435\u0437 \u043d\u0435\u0433\u043e tapCreate \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 nil, \u0438 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u043f\u0438\u0448\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e NSEvent \u0438 GCMouse.func startTap() {    let types: [CGEventType] = [.mouseMoved, .leftMouseDragged, .rightMouseDragged, .otherMouseDragged]    let mask = types.reduce(CGEventMask(0)) { $0 | (CGEventMask(1) &lt;&lt; CGEventMask($1.rawValue)) }    guard let tap = CGEvent.tapCreate(tap: .cgSessionEventTap, place: .headInsertEventTap, options: .listenOnly,                                      eventsOfInterest: mask, callback: { _, type, event, _ in        if type != .tapDisabledByTimeout &amp;&amp; type != .tapDisabledByUserInput { tapLog.add(Double(event.timestamp) \/ 1e9) }        return Unmanaged.passUnretained(event)    }, userInfo: nil) else {        print(\"\u0442\u0430\u043f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d (\u043d\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f?), \u043f\u0438\u0448\u0443 \u0442\u043e\u043b\u044c\u043a\u043e NSEvent \u0438 GCMouse\")        return    }    CFRunLoopAddSource(CFRunLoopGetMain(), CFMachPortCreateRunLoopSource(nil, tap, 0), .commonModes)}if !args.contains(\"--no-tap\") { startTap() }\/\/ 2) NSEvent: \u0442\u043e, \u0447\u0442\u043e AppKit \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u043a\u043d\u0443. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430\u0434 \u043d\u0438\u043c.\/\/    \u041e\u0442\u0441\u0447\u0451\u0442 \u0438\u0434\u0451\u0442 \u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439.func report() {    let streams = [(\"\u0442\u0430\u043f\", tapLog.values), (\"NSEvent\", nsLog.values), (\"GCMouse\", gcLog.values)].filter { !$0.1.isEmpty }    guard let lo = streams.map({ $0.1.first! }).max(), let hi = streams.map({ $0.1.last! }).min(), hi &gt; lo else {        print(\"\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c\"); return    }    print(String(format: \"\u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a: %.3f \u0441\", hi - lo))    for (name, all) in streams {        let t = all.filter { $0 &gt;= lo &amp;&amp; $0 &lt;= hi }        let gaps = zip(t, t.dropFirst()).map { ($1 - $0) * 1000 }.sorted()        guard !gaps.isEmpty else { continue }        let under2 = 100 * Double(gaps.filter { $0 &lt; 2 }.count) \/ Double(gaps.count)        print(name.padding(toLength: 8, withPad: \" \", startingAt: 0) + String(format: \"%6d \u0441\u043e\u0431\u044b\u0442\u0438\u0439  %6.1f\/\u0441  \u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 %.2f \u043c\u0441  p99 %.2f \u043c\u0441  \u043a\u043e\u0440\u043e\u0447\u0435 2 \u043c\u0441: %.1f%%\",              t.count, Double(t.count) \/ (hi - lo), gaps[gaps.count \/ 2], gaps[Int(0.99 * Double(gaps.count - 1))], under2))    }}var started = falseNSEvent.addLocalMonitorForEvents(matching: [.mouseMoved, .leftMouseDragged, .rightMouseDragged, .otherMouseDragged]) { e in    nsLog.add(e.timestamp)    if !started { started = true; DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { report(); app.terminate(nil) } }    return e}DispatchQueue.main.asyncAfter(deadline: .now() + 120) {    if !started { print(\"NSEvent \u043d\u0435 \u043f\u0440\u0438\u0448\u0451\u043b \u0437\u0430 2 \u043c\u0438\u043d\u0443\u0442\u044b: \u043e\u043a\u043d\u043e \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u043b\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432\u043d\u0435 \u043e\u043a\u043d\u0430\"); app.terminate(nil) }}\/\/ 3) GameController. \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0434\u0451\u0442 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.\/\/    \u041f\u0438\u0448\u0435\u043c \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430: lastEventTimestamp \u0443 \u0447\u0430\u0441\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f.let queue = DispatchQueue(label: \"gcmouse\", qos: .userInteractive)func attach(_ mouse: GCMouse) {    mouse.handlerQueue = queue    mouse.mouseInput?.mouseMovedHandler = { _, _, _ in gcLog.add(ProcessInfo.processInfo.systemUptime) }}GCMouse.mice().forEach(attach)NotificationCenter.default.addObserver(forName: .GCMouseDidConnect, object: nil, queue: .main) { note in    if let mouse = note.object as? GCMouse { attach(mouse) }}let access = IOHIDCheckAccess(kIOHIDRequestTypeListenEvent)   \/\/ \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442print(\"\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430 \u0443 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:\", access == kIOHIDAccessTypeGranted ? \"\u0432\u044b\u0434\u0430\u043d\" : access == kIOHIDAccessTypeDenied ? \"\u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e\" : \"unknown (\u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u043e)\")print(\"\u0414\u0432\u0438\u0433\u0430\u0439\u0442\u0435 \u043c\u044b\u0448\u044c \u043f\u043e \u043e\u043a\u043d\u0443, \u043e\u0442\u0441\u0447\u0451\u0442 \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\")app.setActivationPolicy(.regular)let window = NSWindow(contentRect: NSScreen.main?.visibleFrame ?? NSRect(x: 0, y: 0, width: 800, height: 500),                      styleMask: [.titled], backing: .buffered, defer: false)   \/\/ \u043e\u043a\u043d\u043e \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d: \u043a\u0443\u0440\u0441\u043e\u0440 \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442window.title = \"\u0414\u0432\u0438\u0433\u0430\u0439\u0442\u0435 \u043c\u044b\u0448\u044c \u043f\u043e \u043e\u043a\u043d\u0443\"window.acceptsMouseMovedEvents = truewindow.makeKeyAndOrderFront(nil)app.activate(ignoringOtherApps: true)app.run()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h3>\u0427\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e<\/h3>\n<ul>\n<li>\n<p>\u0424\u043e\u043d. \u0412\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u043e\u043a\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043f\u0435\u0440\u0435\u0434\u0438. <code>shouldMonitorBackgroundEvents<\/code> \u0434\u043b\u044f \u043c\u044b\u0448\u0438 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043b\u0438 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440, \u043a\u0430\u043a \u0432 \u0438\u0433\u0440\u0430\u0445 (<code>CGAssociateMouseAndMouseCursorPosition<\/code>). \u0422\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430\u0434 \u043e\u043a\u043d\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0433\u0440\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u043a\u043d\u043e. \u0418\u0437\u043c\u0435\u0440\u0435\u043d\u044b \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u043f\u0440\u0438\u0446\u0435\u043b, fps \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u00ab\u0432\u0432\u043e\u0434 \u2192 \u044d\u043a\u0440\u0430\u043d\u00bb \u044f \u043d\u0435 \u043c\u0435\u0440\u0438\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041e\u0434\u043d\u0430 \u043c\u044b\u0448\u044c (Logitech G309, 1000 \u0413\u0446), \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0442\u0440\u0435\u043a\u043f\u0430\u0434, \u043e\u0434\u0438\u043d Mac (M3 Pro), macOS 26.6.2, \u044d\u043a\u0440\u0430\u043d 120 \u0413\u0446. \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u044b, 60 \u0413\u0446, Intel \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 macOS \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u043b. \u0427\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e 26.2, \u0437\u043d\u0430\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u0447\u0443\u0436\u043e\u0433\u043e \u0442\u0440\u0435\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c. \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435, \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430 \u043d\u0435\u0442. \u0422\u0440\u0435\u043a\u043f\u0430\u0434 \u0441\u043d\u044f\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u042d\u0442\u0430\u043b\u043e\u043d. \u0417\u0430\u043f\u0438\u0441\u0438 IOHIDManager \u043d\u0435\u0442, \u00ab\u0447\u0442\u043e \u0448\u043b\u0451\u0442 \u043c\u044b\u0448\u044c\u00bb \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0432\u043d\u043e \u00ab\u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u043f\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u0435\u043b\u044c\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e HID, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0437\u043d\u0430\u043a Y \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e HID.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u044b: \u043a\u0442\u043e \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (WindowServer \u0438\u043b\u0438 AppKit), \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0438 <code>isMouseCoalescingEnabled = false<\/code>, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044b \u043c\u0435\u0442\u043e\u043a GCMouse, \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c 1,14 \u0438 \u00ab\u043e\u043a\u043e\u043b\u043e 850, \u0430 \u043d\u0435 1000\u00bb, \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438 \u043f\u0435\u0440\u0432\u043e\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u0443\u0440\u0441\u043e\u0440\u0430, \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043b\u0438 macOS \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e GCMouse \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442<\/h3>\n<p>\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u044f \u0431\u044b \u0431\u0440\u0430\u043b \u0438\u0437 NSEvent. \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u0438 \u0431\u0440\u0430\u043b \u0431\u044b \u0438\u0437 GCMouse, \u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u043b \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e \u0432 \u0438\u0433\u0440\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u0431\u044b \u0442\u043e, \u0447\u0435\u0433\u043e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442: \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c, \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u0444\u043e\u043d\u0435 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u0435\u043b\u044c\u0442 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044f\u0445 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/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\/articles\/1089032\/\">https:\/\/habr.com\/ru\/articles\/1089032\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u044b\u0448\u044c \u043d\u0430 1000 \u0413\u0446, \u044d\u043a\u0440\u0430\u043d MacBook Pro \u043d\u0430 120 \u0413\u0446. \u042f \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 CGEventTap \u0443\u0432\u0438\u0434\u0435\u043b 843,5 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. NSEvent.mouseMoved \u0432 \u043e\u043a\u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e Cocoa-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b 118,5, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0434\u0440 \u044d\u043a\u0440\u0430\u043d\u0430. GCMouse \u0438\u0437 GameController \u043e\u0442\u0434\u0430\u043b 843,6 \u0438 \u0432 \u043c\u043e\u0451\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 \u043d\u0438 \u043e \u043a\u0430\u043a\u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043d\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u043b. \u041d\u0438\u0436\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, 17 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 Swift, \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u0433\u043e, \u0447\u0435\u0433\u043e \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.\u0412\u0441\u0451 \u0441\u043d\u044f\u0442\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043c\u044b\u0448\u0438, \u043e\u0434\u043d\u043e\u043c \u043c\u0430\u043a\u0435 \u0438 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 macOS, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u0443 \u043d\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0435.\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u041f\u0440\u0438\u0446\u0435\u043b \u0432 \u0448\u0443\u0442\u0435\u0440\u0435 \u043d\u0430 MacBook \u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0432\u0430\u0442\u043d\u044b\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 100+ fps. \u0420\u0430\u043d\u044c\u0448\u0435 \u044f \u0443\u0436\u0435 \u043c\u0435\u0440\u0438\u043b NSEvent: \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0440\u0430\u0437 \u0432 \u043a\u0430\u0434\u0440 \u044d\u043a\u0440\u0430\u043d\u0430, \u043a\u0430\u043a \u0438 \u0437\u0434\u0435\u0441\u044c. \u041d\u0430 \u0444\u043e\u0440\u0443\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Apple \u0435\u0441\u0442\u044c \u0442\u0440\u0435\u0434 Changes in Mouse Event Reporting Frequency in macOS 26.2, \u0441\u0443\u0434\u044f \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e, \u043e \u0442\u043e\u043c \u0436\u0435. \u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 26.2, \u044f \u043d\u0435 \u0437\u043d\u0430\u044e: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043d\u044f\u0442\u044b \u043d\u0430 26.6.2. \u041c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u043e \u0434\u0440\u0443\u0433\u043e\u0435: \u043f\u0440\u043e\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0430\u043a \u0436\u0435 \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0434\u0430\u0451\u0442 GameController. \u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c.\u0421\u0442\u0435\u043d\u0434MacBook Pro 14&#8243; (M3 Pro), macOS 26.6.2, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d 120 \u0413\u0446 (\u043a\u0430\u0434\u0440 8,33 \u043c\u0441). \u041c\u044b\u0448\u044c Logitech G309 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a LIGHTSPEED, \u043e\u043f\u0440\u043e\u0441 1000 \u0413\u0446. \u041e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434, 25 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f 2026: \u044f \u0432\u043e\u0434\u0438\u043b \u043c\u044b\u0448\u044c\u044e \u043f\u043e \u043e\u043a\u043d\u0443, \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. NSEvent \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0414\u0440\u0443\u0433\u0438\u0445 \u043c\u044b\u0448\u0435\u0439, \u0434\u0440\u0443\u0433\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u0442.\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 (CGEventTap \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0442\u0430\u043f\u00bb):\u041f\u043e\u0442\u043e\u043a\u0413\u0434\u0435 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435\u041c\u0435\u0442\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u0442\u0430\u043f (CGEventTap, listen-only)\u0434\u043e AppKit, \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0435\u0441\u0441\u0438\u0438\u043c\u0435\u0442\u043a\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438NSEvent, local monitor\u0442\u043e, \u0447\u0442\u043e AppKit \u043e\u0442\u0434\u0430\u0451\u0442 \u043e\u043a\u043d\u0443\u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u0434\u043d\u0430 \u043c\u0435\u0442\u043a\u0430 \u043d\u0430 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435GCMouseGameControllerlastEventTimestamp, \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix\u0427\u0438\u0441\u043b\u0430 \u0441\u043d\u044f\u0442\u044b \u043d\u0435 \u0442\u0435\u043c \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u043e\u043d\u0435 (\u043c\u044b\u0448\u044c) \u0442\u0430\u043f \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044f \u0432\u044b\u0434\u0430\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0430 \u043e\u043a\u043d\u043e \u0441 NSEvent \u0438 GCMouse \u0431\u044b\u043b\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043e \u0441\u0432\u043e\u0438\u043c bundle id \u0438 \u0431\u0435\u0437 \u0432\u044b\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0448\u0451\u043b \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043e \u043d\u0451\u043c \u043d\u0438\u0436\u0435. \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435. \u042d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u0441\u043b\u0443\u0436\u0438\u0442 \u0442\u0430\u043f, \u0430 \u043d\u0435 \u0441\u0430\u043c HID: \u0437\u0430\u043f\u0438\u0441\u0438 IOHIDManager \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u043d\u0435\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u043b\u0451\u0442 \u043c\u044b\u0448\u044c\u00bb \u0437\u0434\u0435\u0441\u044c \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0438\u0434\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0442\u0430\u043f\u00bb.\u0417\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0430\u0439\u043c\u0435\u0440 \u0448\u0451\u043b \u043e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0438 \u0442\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0448\u043b\u0438 \u043f\u0443\u0441\u0442\u044b\u043c\u0438: \u044f \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u0432\u0438\u0433\u0430\u043b \u043c\u044b\u0448\u044c. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e \u043d\u0430 \u043e\u0431\u0449\u0435\u043c \u043e\u0442\u0440\u0435\u0437\u043a\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, 20,058 \u0441. \u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0442\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u00ab\u043f\u043e\u043b\u043e\u0441\u0430 \u043a\u0430\u0434\u0440\u0430\u00bb \u2014 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u043e\u0442 6 \u0434\u043e 10 \u043c\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u044d\u043a\u0440\u0430\u043d\u0430.\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0441\u043e\u0431\u044b\u0442\u0438\u0439\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443\u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430p99\u043a\u043e\u0440\u043e\u0447\u0435 2 \u043c\u0441\u0442\u0430\u043f16 919843,50,99 \u043c\u04415,90 \u043c\u044188,3 %NSEvent2 377118,58,07 \u043c\u044114,87 \u043c\u04410,3 %GCMouse16 921843,60,99 \u043c\u04415,96 \u043c\u044187,5 %\u041e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 100 \u043c\u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u0442\u0430\u043f (90 \u0441\u043e\u0431\u044b\u0442\u0438\u0439), NSEvent (12, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043d\u0430 \u043a\u0430\u0434\u0440 8,33 \u043c\u0441), GCMouse (90). \u041d\u0438\u0436\u0435 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0437\u0430 \u0432\u0441\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434\u0422\u0430\u043f \u0438 GCMouse \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b: \u043c\u0435\u0434\u0438\u0430\u043d\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u0441\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0442\u044b\u0441\u044f\u0447. \u0423 NSEvent 91,0 % \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u043b\u0435\u0436\u0430\u0442 \u0432 \u043f\u043e\u043b\u043e\u0441\u0435 6\u201310 \u043c\u0441. GCMouse \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u043e lastEventTimestamp. \u041f\u043e\u0447\u0435\u043c\u0443, \u043d\u0438\u0436\u0435.\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 1000 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443? \u041f\u0440\u043e\u0441\u0442\u043e\u044f\u043c\u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c: \u043f\u0430\u0443\u0437 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 20 \u043c\u0441 \u0431\u044b\u043b\u043e \u0434\u0435\u0441\u044f\u0442\u044c, \u0432\u043c\u0435\u0441\u0442\u0435 0,3 \u0441 \u0438\u0437 20. \u0411\u0435\u0437 \u043d\u0438\u0445 \u0442\u0430\u043f \u0434\u0430\u0451\u0442 \u043e\u043a\u043e\u043b\u043e 856 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0438 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0440\u043e\u0432\u043d\u044b\u0435: \u043c\u0435\u0434\u0438\u0430\u043d\u0430 0,99 \u043c\u0441, p90 2,11 \u043c\u0441. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u0442\u0430\u043f \u0432\u0438\u0434\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 850 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0430 \u043d\u0435 1000, \u044f \u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u044f\u043b: \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0432\u0435\u0441\u0442\u0438 \u043c\u044b\u0448\u044c, \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c IOHIDManager, \u0430 \u0435\u0451 \u043d\u0435\u0442.NSEvent \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u041d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f NSEvent \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c 7,12 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043f\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430 8, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 9), \u0432 94,9 % \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u0432\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u0421\u0430\u043c\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043f\u043e X (\u0441\u0443\u043c\u043c\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439) \u0443 \u0442\u0430\u043f\u0430 83 743, \u0443 NSEvent 83 611; \u043f\u043e Y \u043e\u0431\u0435 \u0441\u0443\u043c\u043c\u044b \u0440\u0430\u0432\u043d\u044b 18 894. \u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 0,2 % \u043f\u043e X, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0434\u0430\u0451\u0442 \u0440\u0430\u0437\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u043a\u043b\u0435\u0439\u043a\u0438. \u041f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0434\u0440\u0430. \u041a\u0430\u043a \u044d\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u0446\u0435\u043b\u0435, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e.GCMouse: 17 \u0441\u0442\u0440\u043e\u043aimport GameControllerlet queue = DispatchQueue(label: &#171;mouse&#187;, qos: .userInteractive)func attach(_ mouse: GCMouse) {    mouse.handlerQueue = queue                       \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0434\u0451\u0442 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043d\u0435 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439    mouse.mouseInput?.mouseMovedHandler = { input, dx, dy in        \/\/ dx, dy: \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 (Float); \u0437\u043d\u0430\u043a dy \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d NSEvent.deltaY (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u043e).        \/\/ input.lastEventTimestamp \u0432 \u043c\u043e\u0438\u0445 \u043b\u043e\u0433\u0430\u0445 \u2014 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix, \u0430 \u043d\u0435 \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.        print(dx, dy, input.lastEventTimestamp)    }}GCMouse.mice().forEach(attach)                       \/\/ \u043c\u044b\u0448\u0438, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430NotificationCenter.default.addObserver(forName: .GCMouseDidConnect, object: nil, queue: .main) { note in    if let mouse = note.object as? GCMouse { attach(mouse) }}\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430: \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0431\u0435\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 (RunLoop, NSApplication.run()) \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, \u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441 queue: .main \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 GCMouse, \u043f\u043e\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435, \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b: \u0443 GCController \u0435\u0441\u0442\u044c shouldMonitorBackgroundEvents, \u0434\u043b\u044f \u043c\u044b\u0448\u0438 \u044f \u0435\u0433\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u043b. \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u0432 \u043a\u043e\u043d\u0446\u0435.\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044f \u0432\u044b\u043d\u0435\u0441 \u043d\u0430 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u0447\u0442\u043e\u0431\u044b \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u043b\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043c\u0435\u0442\u043a\u0438. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0412\u0441\u0435 16 924 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f dx \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 \u0446\u0435\u043b\u044b\u0435.\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u0435\u043b\u044c\u0442\u0421\u0443\u043c\u043c\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043f\u043e X \u0437\u0430 \u043e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a: 83 743 \u0443 \u0442\u0430\u043f\u0430 \u0438 95 680 \u0443 GCMouse, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 1,143 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435. \u041f\u043e Y 18 894 \u043f\u0440\u043e\u0442\u0438\u0432 21 694 (\u0432 1,148 \u0440\u0430\u0437\u0430). \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u043a\u043d\u0430 \u043e\u0442 50 \u043c\u0441 \u0434\u043e 1 \u0441 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u043a\u043d\u0430\u043c, \u043d\u0430\u043a\u043b\u043e\u043d \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 GCMouse \u043a \u0442\u0430\u043f\u0443 \u043f\u043e X \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 1,137 \u0434\u043e 1,148 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430. \u041f\u043e \u043a\u0432\u0430\u0440\u0442\u0438\u043b\u044f\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u0446\u0435\u043d\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u043c\u0435\u0436\u0434\u0443 1,12 \u0438 1,20 (\u0442\u043e\u0436\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430). \u042f\u0432\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u0443\u0432\u0438\u0434\u0435\u043b, \u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0432\u0430\u0440\u0442\u0438\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430, \u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e. \u0423 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043e\u043d \u0442\u043e\u0442 \u0436\u0435: \u043f\u043e X 25 066 \u043f\u0440\u043e\u0442\u0438\u0432 28 754 (1,147), \u043f\u043e Y 18 247 \u043f\u0440\u043e\u0442\u0438\u0432 20 959 (1,149).\u0412 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 SDK \u0443 mouseMovedHandler \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u0434\u0435\u043b\u044c\u0442\u0430 \u00ab\u0441\u044b\u0440\u0430\u044f\u00bb \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0441\u043f\u043e\u0440\u044f\u0442, \u043d\u043e \u0438 \u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442: \u0441 \u043e\u0442\u0441\u0447\u0451\u0442\u0430\u043c\u0438 HID \u044f \u0434\u0435\u043b\u044c\u0442\u044b \u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b. \u0415\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b defaults read -g com.apple.mouse.scaling \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b 0.875, \u0430 1\/0,875 = 1,143, \u0442\u043e \u0435\u0441\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043c\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c. \u041d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b 29 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f, \u0430 \u043d\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0438 \u0443 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0442\u043e\u0442 \u0436\u0435, \u0445\u043e\u0442\u044f \u043a\u043b\u044e\u0447\u0430 com.apple.trackpad.scaling \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0422\u0430\u043a \u0447\u0442\u043e \u00ab\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u0441\u044b\u0440\u044b\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u00bb \u043f\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0433\u0438\u043f\u043e\u0442\u0435\u0437\u0430, \u0430 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e. \u042f \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b.\u041c\u0435\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f GCMouse \u044f \u0431\u0440\u0430\u043b \u043f\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (ProcessInfo.processInfo.systemUptime), \u0430 \u043d\u0435 \u043f\u043e lastEventTimestamp. \u041f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0440\u0438.\u0427\u0430\u0441\u044b. \u041c\u0435\u0442\u043a\u0438 \u0442\u0430\u043f\u0430 \u0438 NSEvent \u0438\u0434\u0443\u0442 \u043e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u0432 \u043e\u0431\u043e\u0438\u0445 \u043b\u043e\u0433\u0430\u0445 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435: 744709,998853. lastEventTimestamp \u2014 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043e\u0442 \u044d\u043f\u043e\u0445\u0438 Unix: \u0432 \u043b\u043e\u0433\u0435 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u043c\u0435\u0442\u043a\u0430 1790332272,76, \u0442\u043e \u0435\u0441\u0442\u044c 25 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f 2026, 10:31:12 UTC. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u043a\u0430\u043a Date() \u2212 systemUptime \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435, \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u043e\u0436\u0438\u0442 \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0443: 232 \u0448\u0430\u0433\u0430 \u043d\u0430\u0437\u0430\u0434 \u043d\u0430 16 924 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u0441\u0435 \u0440\u043e\u0432\u043d\u043e \u043f\u043e 1 \u043c\u043a\u0441. \u041d\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u044d\u0442\u043e \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442, \u043d\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0447\u0430\u0441\u0430\u043c\u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437.\u041f\u043e\u0432\u0442\u043e\u0440\u044b. \u0423 817 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438\u0437 16 924 (4,8 %) \u043c\u0435\u0442\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0435\u0441\u0442\u044c \u0438 51 \u0442\u0440\u043e\u0439\u043a\u0430. \u0423 \u0442\u0430\u043f\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043d\u0435\u0442, \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b 44 \u043c\u043a\u0441. \u0412 720 \u0438\u0437 \u044d\u0442\u0438\u0445 817 \u043f\u0430\u0440 \u0434\u0435\u043b\u044c\u0442\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f. \u041e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044b, \u043d\u0435 \u0437\u043d\u0430\u044e.\u0421\u043c\u044b\u0441\u043b \u043c\u0435\u0442\u043a\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u043d\u0430 7 \u043c\u043a\u0441 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 15 \u043c\u043a\u0441, p99 61 \u043c\u043a\u0441), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e \u043d\u0435\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f.\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0412\u044b\u0437\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 GCMouse \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 0,13 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043f\u0430 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 0,19 \u043c\u0441, p99 0,75 \u043c\u0441, \u043f\u043e \u0432\u0441\u0435\u043c 16 924 \u0432\u044b\u0437\u043e\u0432\u0430\u043c). NSEvent \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 0,71 \u043c\u0441 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043c\u0435\u0442\u043a\u0438 (\u043c\u0435\u0434\u0438\u0430\u043d\u0430, p90 1,76 \u043c\u0441, p99 5,95 \u043c\u0441). \u0414\u0432\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0438. \u0423 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u0435\u0442\u043a\u0430, \u0432\u0438\u0434\u0438\u043c\u043e, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0438\u0437 \u0441\u043a\u043b\u0435\u0435\u043d\u043d\u044b\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u0442\u0447\u0451\u0442 \u043f\u0430\u0447\u043a\u0438 \u0436\u0434\u0430\u043b \u0434\u043e\u043b\u044c\u0448\u0435. \u0418 \u044f \u0438\u0441\u0445\u043e\u0436\u0443 \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0430 \u0442\u0430\u043f\u0430 \u0438 systemUptime \u0438\u0434\u0443\u0442 \u043f\u043e \u043e\u0434\u043d\u0438\u043c \u0447\u0430\u0441\u0430\u043c: \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0435\u0442\u043a\u0438 \u0442\u0430\u043f\u0430 \u0438 NSEvent \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0434\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b.\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0422\u0430\u043f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f, \u043f\u043e\u043a\u0430 \u044f \u043d\u0435 \u0432\u044b\u0434\u0430\u043b \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0443: \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 nil. \u041a\u0430\u043a\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f listen-only \u0442\u0430\u043f\u0430 \u043d\u0430 26.6.2, \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b. \u0421\u0443\u0434\u044f \u043f\u043e API (IOHIDCheckAccess \u0441 kIOHIDRequestTypeListenEvent), \u0442\u043e\u0442 \u0436\u0435 \u00ab\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432\u0432\u043e\u0434\u0430\u00bb \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a IOHIDManager. \u0412 \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430\u0445 \u044f \u0435\u0433\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u043b\u0447\u0438\u0442 \u043e\u043d \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438, \u043d\u0435 \u0437\u043d\u0430\u044e.\u0421 GCMouse \u0442\u0430\u043a: \u043e\u043a\u043d\u043e \u0441 NSEvent \u0438 GCMouse \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043e \u0441\u0432\u043e\u0438\u043c bundle id, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. IOHIDCheckAccess \u0432\u0435\u0440\u043d\u0443\u043b unknown, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u043d\u0435 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u043e\u00bb, \u0430 \u043d\u0435 \u00ab\u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e\u00bb. \u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f. \u042d\u0442\u043e \u043c\u043e\u0451 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435, \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043b\u043e\u0433\u0435 \u043f\u0440\u043e \u044d\u0442\u043e \u043d\u0435\u0442. \u041f\u0440\u043e\u0433\u043e\u043d \u043d\u0430 \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0435\u0433\u043e \u043b\u043e\u0433\u0430 \u0441\u0442\u043e\u0438\u0442 granted, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442.\u0422\u0440\u0435\u043a\u043f\u0430\u0434 \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u0422\u043e\u0442 \u0436\u0435 \u0437\u0430\u043c\u0435\u0440 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430, \u043e\u043a\u043e\u043b\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u043e\u0433\u043e \u0436\u0435 \u0434\u043d\u044f, \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u041e\u0431\u0449\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a 20,227 \u0441. \u0422\u0430\u043f: 2 365 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (116,9 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443), GCMouse: 2 365 (116,9), NSEvent: 2 290 (113,2), \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 75 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0438\u043b\u0438 3,2 %, \u043c\u0435\u043d\u044c\u0448\u0435. \u0421\u043a\u043b\u0435\u0439\u043a\u0430 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0430\u0440\u0430: \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0430\u043f\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043d\u0435 \u0431\u044b\u0432\u0430\u043b\u043e, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0441 \u0434\u0432\u0443\u043c\u044f 3,3 %. \u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0440\u0435\u043a\u043f\u0430\u0434\u0430 \u0438 \u0442\u0430\u043a \u0438\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d\u0430 (\u043f\u043e \u0442\u0430\u043f\u0443 \u043c\u0435\u0434\u0438\u0430\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 8,07 \u043c\u0441), \u0438 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0447\u0435\u0433\u043e; \u0447\u0442\u043e \u0442\u0443\u0442 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0430\u043c \u0442\u0440\u0435\u043a\u043f\u0430\u0434, \u0430 \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u044f \u043d\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u043b. \u041f\u043e\u0445\u043e\u0436\u0435, \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0443\u0449\u0435\u0440\u0431 NSEvent \u043d\u0430\u043d\u043e\u0441\u0438\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u044d\u043a\u0440\u0430\u043d\u0430. \u041d\u0430 \u0434\u0432\u0443\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u044d\u0442\u043e \u0434\u043e\u0433\u0430\u0434\u043a\u0430.\u0413\u0440\u0430\u0431\u043b\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 NSEvent \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430\u0434 \u043d\u0438\u043c, \u0438 acceptsMouseMovedEvents \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u043a\u043e\u0440\u0434\u0435\u0440 \u043d\u0438\u0436\u0435 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d: \u0435\u0441\u043b\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043e\u043a\u043d\u0430, \u0441\u0447\u0451\u0442 NSEvent \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0435\u0442, \u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u043f \u043a NSEvent \u0437\u0430\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f.\u041c\u043e\u0439 \u043b\u043e\u0433\u0433\u0435\u0440 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-496881","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496881","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=496881"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/496881\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=496881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=496881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=496881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}