├── README.md ├── _locales └── en │ └── messages.json ├── background.js ├── content.js ├── icons ├── icon128.png ├── icon16.png ├── icon19.png └── icon48.png ├── manifest.json ├── popup.html └── popup.js /README.md: -------------------------------------------------------------------------------- 1 | [](https://www.javascript.com/) 2 | [](https://GitHub.com/codermert) 3 | [](https://ask.fm/codermertx) 4 | 5 | 6 | Ücretsiz Twitter Liker! 7 | 8 | Not : Chrome Store'da yayınlamadım 9 | 10 | ## Nasıl Kullanılır? 11 | Bildiğiniz gibi, henüz **Chrome Store** ' da yayınlanmadı, bu yüzden bu uzantıyı zip olarak indirmeniz ve daha sonra bir klasöre ayıklamanız gerekiyor (istediğiniz gibi adlandırabilirsiniz). Şimdi bu 3 basit adımı takip etmeniz gerekecek 12 | 13 | 14 |  15 | 16 | 17 | 18 | - İlk önce chrome://extensions/ sayfasına girin 19 | - Ardından **Geliştirici Modu**'nu aktif edin 20 | - Aktif ettikten sonra **Paketlenmemiş öğe yükle** deyin 21 | - Ve uzantımız hazır , Şimdi uzantımızı açıp Twitter anasayfanızı otomatik kaydırarak beğeni akışınızı kontrol edebilirsiniz ! 22 | 23 | 24 | ## 💸 Bağış Yap 25 | 26 | **[☕️ Kahve Ismarla](https://t.me/codermert)** 27 | 28 | ## 🌐 Telif Hakkı ve Lisans 29 | 30 | * *Copyright (C) 2022 by* [codermert](https://github.com/codermert) ❤️️ 31 | * [GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007] *Koşullarına göre lisanslanmıştır..* 32 | 33 | ## ♻️ İletişim 34 | 35 | *Benimle iletişime geçmek isterseniz, **Telegram**'dan mesaj göndermekten çekinmeyin;* [@codermert](https://t.me/codermert) 36 | -------------------------------------------------------------------------------- /_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "l10nHello": { 3 | "message": "Geliştirici : Coder Mert", 4 | "description": "Hello text for the popup." 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /background.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | /******/ 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | /******/ 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) { 10 | /******/ return installedModules[moduleId].exports; 11 | /******/ } 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ i: moduleId, 15 | /******/ l: false, 16 | /******/ exports: {} 17 | /******/ }; 18 | /******/ 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | /******/ 22 | /******/ // Flag the module as loaded 23 | /******/ module.l = true; 24 | /******/ 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | /******/ 29 | /******/ 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | /******/ 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | /******/ 36 | /******/ // define getter function for harmony exports 37 | /******/ __webpack_require__.d = function(exports, name, getter) { 38 | /******/ if(!__webpack_require__.o(exports, name)) { 39 | /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 | /******/ } 41 | /******/ }; 42 | /******/ 43 | /******/ // define __esModule on exports 44 | /******/ __webpack_require__.r = function(exports) { 45 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 | /******/ } 48 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 | /******/ }; 50 | /******/ 51 | /******/ // create a fake namespace object 52 | /******/ // mode & 1: value is a module id, require it 53 | /******/ // mode & 2: merge all properties of value into the ns 54 | /******/ // mode & 4: return value when already ns object 55 | /******/ // mode & 8|1: behave like require 56 | /******/ __webpack_require__.t = function(value, mode) { 57 | /******/ if(mode & 1) value = __webpack_require__(value); 58 | /******/ if(mode & 8) return value; 59 | /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 | /******/ var ns = Object.create(null); 61 | /******/ __webpack_require__.r(ns); 62 | /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 | /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 | /******/ return ns; 65 | /******/ }; 66 | /******/ 67 | /******/ // getDefaultExport function for compatibility with non-harmony modules 68 | /******/ __webpack_require__.n = function(module) { 69 | /******/ var getter = module && module.__esModule ? 70 | /******/ function getDefault() { return module['default']; } : 71 | /******/ function getModuleExports() { return module; }; 72 | /******/ __webpack_require__.d(getter, 'a', getter); 73 | /******/ return getter; 74 | /******/ }; 75 | /******/ 76 | /******/ // Object.prototype.hasOwnProperty.call 77 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 | /******/ 79 | /******/ // __webpack_public_path__ 80 | /******/ __webpack_require__.p = ""; 81 | /******/ 82 | /******/ 83 | /******/ // Load entry module and return exports 84 | /******/ return __webpack_require__(__webpack_require__.s = "./src/app/background.ts"); 85 | /******/ }) 86 | /************************************************************************/ 87 | /******/ ({ 88 | 89 | /***/ "./src/app/background.ts": 90 | /*!*******************************!*\ 91 | !*** ./src/app/background.ts ***! 92 | \*******************************/ 93 | /*! no static exports found */ 94 | /***/ (function(module, exports, __webpack_require__) { 95 | 96 | "use strict"; 97 | 98 | Object.defineProperty(exports, "__esModule", { value: true }); 99 | const util_1 = __webpack_require__(/*! ./util */ "./src/app/util.ts"); 100 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 101 | switch (message.action) { 102 | case "click": 103 | util_1.clickLocation({ 104 | x: message.x, 105 | y: message.y, 106 | }, sender.tab.id); 107 | } 108 | }); 109 | 110 | 111 | /***/ }), 112 | 113 | /***/ "./src/app/util.ts": 114 | /*!*************************!*\ 115 | !*** ./src/app/util.ts ***! 116 | \*************************/ 117 | /*! no static exports found */ 118 | /***/ (function(module, exports, __webpack_require__) { 119 | 120 | "use strict"; 121 | 122 | Object.defineProperty(exports, "__esModule", { value: true }); 123 | exports.clickLocation = exports.coordinatesInViewport = void 0; 124 | exports.coordinatesInViewport = ({ top, bottom, }) => { 125 | if (top >= 0 && bottom <= window.innerHeight) { 126 | return true; 127 | } 128 | return false; 129 | }; 130 | exports.clickLocation = (location, tabId, button = "left", clickCount = 1) => { 131 | const target = { tabId }; 132 | const clickArgs = Object.assign(Object.assign({}, location), { type: "mousePressed", button, 133 | clickCount }); 134 | const movedArgs = Object.assign(Object.assign({}, location), { type: "mouseMoved" }); 135 | chrome.debugger.attach(target, "1.2", () => { 136 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", Object.assign(Object.assign({}, location), { type: "mouseMoved" }), () => { 137 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", clickArgs, () => { 138 | clickArgs.type = "mouseReleased"; 139 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", clickArgs, () => chrome.debugger.detach(target)); 140 | }); 141 | }); 142 | }); 143 | }; 144 | 145 | 146 | /***/ }) 147 | 148 | /******/ }); 149 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9iYWNrZ3JvdW5kLnRzIiwid2VicGFjazovLy8uL3NyYy9hcHAvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsc0VBQXVDO0FBRXZDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUU7SUFDckUsUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ3RCLEtBQUssT0FBTztZQUNWLG9CQUFhLENBQ1g7Z0JBQ0UsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNaLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNiLEVBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQ2QsQ0FBQztLQUNMO0FBQ0gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiVSw2QkFBcUIsR0FBRyxDQUFDLEVBQ3BDLEdBQUcsRUFDSCxNQUFNLEdBQzBCLEVBQUUsRUFBRTtJQUNwQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRVcscUJBQWEsR0FBRyxDQUMzQixRQUFrQyxFQUNsQyxLQUFhLEVBQ2IsTUFBTSxHQUFHLE1BQU0sRUFDZixVQUFVLEdBQUcsQ0FBQyxFQUNkLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3pCLE1BQU0sU0FBUyxtQ0FDVixRQUFRLEtBQ1gsSUFBSSxFQUFFLGNBQWMsRUFDcEIsTUFBTTtRQUNOLFVBQVUsR0FDWCxDQUFDO0lBRUYsTUFBTSxTQUFTLG1DQUFRLFFBQVEsS0FBRSxJQUFJLEVBQUUsWUFBWSxHQUFFLENBQUM7SUFFdEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDekMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3pCLE1BQU0sRUFDTiwwQkFBMEIsa0NBQ3JCLFFBQVEsS0FBRSxJQUFJLEVBQUUsWUFBWSxLQUNqQyxHQUFHLEVBQUU7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDekIsTUFBTSxFQUNOLDBCQUEwQixFQUMxQixTQUFTLEVBQ1QsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDekIsTUFBTSxFQUNOLDBCQUEwQixFQUMxQixTQUFTLEVBQ1QsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQ3JDLENBQUM7WUFDSixDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJmaWxlIjoiYmFja2dyb3VuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2FwcC9iYWNrZ3JvdW5kLnRzXCIpO1xuIiwiaW1wb3J0IHsgY2xpY2tMb2NhdGlvbiB9IGZyb20gXCIuL3V0aWxcIjtcblxuY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChtZXNzYWdlLCBzZW5kZXIsIHNlbmRSZXNwb25zZSkgPT4ge1xuICBzd2l0Y2ggKG1lc3NhZ2UuYWN0aW9uKSB7XG4gICAgY2FzZSBcImNsaWNrXCI6XG4gICAgICBjbGlja0xvY2F0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgeDogbWVzc2FnZS54LFxuICAgICAgICAgIHk6IG1lc3NhZ2UueSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZGVyLnRhYi5pZFxuICAgICAgKTtcbiAgfVxufSk7XG4iLCJleHBvcnQgY29uc3QgY29vcmRpbmF0ZXNJblZpZXdwb3J0ID0gKHtcclxuICB0b3AsXHJcbiAgYm90dG9tLFxyXG59OiBQaWNrPERPTVJlY3QsIFwidG9wXCIgfCBcImJvdHRvbVwiPikgPT4ge1xyXG4gIGlmICh0b3AgPj0gMCAmJiBib3R0b20gPD0gd2luZG93LmlubmVySGVpZ2h0KSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNsaWNrTG9jYXRpb24gPSAoXHJcbiAgbG9jYXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcclxuICB0YWJJZDogbnVtYmVyLFxyXG4gIGJ1dHRvbiA9IFwibGVmdFwiLFxyXG4gIGNsaWNrQ291bnQgPSAxXHJcbikgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IHsgdGFiSWQgfTtcclxuICBjb25zdCBjbGlja0FyZ3MgPSB7XHJcbiAgICAuLi5sb2NhdGlvbixcclxuICAgIHR5cGU6IFwibW91c2VQcmVzc2VkXCIsXHJcbiAgICBidXR0b24sXHJcbiAgICBjbGlja0NvdW50LFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG1vdmVkQXJncyA9IHsgLi4ubG9jYXRpb24sIHR5cGU6IFwibW91c2VNb3ZlZFwiIH07XHJcblxyXG4gIGNocm9tZS5kZWJ1Z2dlci5hdHRhY2godGFyZ2V0LCBcIjEuMlwiLCAoKSA9PiB7XHJcbiAgICBjaHJvbWUuZGVidWdnZXIuc2VuZENvbW1hbmQoXHJcbiAgICAgIHRhcmdldCxcclxuICAgICAgXCJJbnB1dC5kaXNwYXRjaE1vdXNlRXZlbnRcIixcclxuICAgICAgeyAuLi5sb2NhdGlvbiwgdHlwZTogXCJtb3VzZU1vdmVkXCIgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGNocm9tZS5kZWJ1Z2dlci5zZW5kQ29tbWFuZChcclxuICAgICAgICAgIHRhcmdldCxcclxuICAgICAgICAgIFwiSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50XCIsXHJcbiAgICAgICAgICBjbGlja0FyZ3MsXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsaWNrQXJncy50eXBlID0gXCJtb3VzZVJlbGVhc2VkXCI7XHJcbiAgICAgICAgICAgIGNocm9tZS5kZWJ1Z2dlci5zZW5kQ29tbWFuZChcclxuICAgICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgICAgXCJJbnB1dC5kaXNwYXRjaE1vdXNlRXZlbnRcIixcclxuICAgICAgICAgICAgICBjbGlja0FyZ3MsXHJcbiAgICAgICAgICAgICAgKCkgPT4gY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh0YXJnZXQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ== -------------------------------------------------------------------------------- /content.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | /******/ 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | /******/ 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) { 10 | /******/ return installedModules[moduleId].exports; 11 | /******/ } 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ i: moduleId, 15 | /******/ l: false, 16 | /******/ exports: {} 17 | /******/ }; 18 | /******/ 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | /******/ 22 | /******/ // Flag the module as loaded 23 | /******/ module.l = true; 24 | /******/ 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | /******/ 29 | /******/ 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | /******/ 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | /******/ 36 | /******/ // define getter function for harmony exports 37 | /******/ __webpack_require__.d = function(exports, name, getter) { 38 | /******/ if(!__webpack_require__.o(exports, name)) { 39 | /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 40 | /******/ } 41 | /******/ }; 42 | /******/ 43 | /******/ // define __esModule on exports 44 | /******/ __webpack_require__.r = function(exports) { 45 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 46 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 47 | /******/ } 48 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 49 | /******/ }; 50 | /******/ 51 | /******/ // create a fake namespace object 52 | /******/ // mode & 1: value is a module id, require it 53 | /******/ // mode & 2: merge all properties of value into the ns 54 | /******/ // mode & 4: return value when already ns object 55 | /******/ // mode & 8|1: behave like require 56 | /******/ __webpack_require__.t = function(value, mode) { 57 | /******/ if(mode & 1) value = __webpack_require__(value); 58 | /******/ if(mode & 8) return value; 59 | /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 60 | /******/ var ns = Object.create(null); 61 | /******/ __webpack_require__.r(ns); 62 | /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 63 | /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 64 | /******/ return ns; 65 | /******/ }; 66 | /******/ 67 | /******/ // getDefaultExport function for compatibility with non-harmony modules 68 | /******/ __webpack_require__.n = function(module) { 69 | /******/ var getter = module && module.__esModule ? 70 | /******/ function getDefault() { return module['default']; } : 71 | /******/ function getModuleExports() { return module; }; 72 | /******/ __webpack_require__.d(getter, 'a', getter); 73 | /******/ return getter; 74 | /******/ }; 75 | /******/ 76 | /******/ // Object.prototype.hasOwnProperty.call 77 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 78 | /******/ 79 | /******/ // __webpack_public_path__ 80 | /******/ __webpack_require__.p = ""; 81 | /******/ 82 | /******/ 83 | /******/ // Load entry module and return exports 84 | /******/ return __webpack_require__(__webpack_require__.s = "./src/app/content.ts"); 85 | /******/ }) 86 | /************************************************************************/ 87 | /******/ ({ 88 | 89 | /***/ "./src/app/content.ts": 90 | /*!****************************!*\ 91 | !*** ./src/app/content.ts ***! 92 | \****************************/ 93 | /*! no static exports found */ 94 | /***/ (function(module, exports, __webpack_require__) { 95 | 96 | "use strict"; 97 | 98 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 99 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 100 | return new (P || (P = Promise))(function (resolve, reject) { 101 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 102 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 103 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 104 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 105 | }); 106 | }; 107 | Object.defineProperty(exports, "__esModule", { value: true }); 108 | const list_heart_clicker_1 = __webpack_require__(/*! ./list-heart-clicker */ "./src/app/list-heart-clicker.js"); 109 | const util_1 = __webpack_require__(/*! ./util */ "./src/app/util.ts"); 110 | const random = (min, max) => Math.random() * (max - min) + min; 111 | chrome.runtime.sendMessage({ action: "init" }, () => { 112 | var checkReady = setInterval(() => { 113 | if (document.readyState === "complete") { 114 | clearInterval(checkReady); 115 | list_heart_clicker_1.executeScript((el) => __awaiter(void 0, void 0, void 0, function* () { 116 | const { top, right, bottom, left } = el.getBoundingClientRect(); 117 | if (!util_1.coordinatesInViewport({ top, bottom })) { 118 | return; 119 | } 120 | const x = random(left, right); 121 | const y = random(top, bottom); 122 | console.log({ el, x, y }); 123 | chrome.runtime.sendMessage({ 124 | action: "click", 125 | x, 126 | y, 127 | }); 128 | })); 129 | } 130 | }); 131 | }); 132 | 133 | 134 | /***/ }), 135 | 136 | /***/ "./src/app/list-heart-clicker.js": 137 | /*!***************************************!*\ 138 | !*** ./src/app/list-heart-clicker.js ***! 139 | \***************************************/ 140 | /*! exports provided: executeScript */ 141 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 142 | 143 | "use strict"; 144 | __webpack_require__.r(__webpack_exports__); 145 | /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "executeScript", function() { return executeScript; }); 146 | const executeScript = (clickElement) => { 147 | 'use strict'; 148 | setTimeout(() => { 149 | // UI elements 150 | const arrowSvgString = ''; 151 | const likeSvgString = ''; 152 | 153 | const developerSvgString = ''; 154 | 155 | // Utilities 156 | const random = (min, max) => Math.random() * (max - min) + min; 157 | 158 | const createFromHTML = (htmlString) => { 159 | var div = document.createElement('div'); 160 | div.innerHTML = htmlString.trim(); 161 | 162 | // Change this to div.childNodes to support multiple top-level nodes 163 | return div.firstChild; 164 | } 165 | 166 | // Get elements Utilites 167 | 168 | const arrowSvg = createFromHTML(arrowSvgString); 169 | const heartSvg = createFromHTML(likeSvgString); 170 | const developerSvg = createFromHTML(developerSvgString); 171 | const blueColor = 'rgba(29,161,242,1.00)'; 172 | 173 | arrowSvg.setAttribute("style", "transform: rotate(180deg);"); 174 | const getNav = () => document.querySelector('nav[role="navigation"]'); 175 | const getHearts = () => Array.from(document.querySelectorAll('main [d="M12 21.638h-.014C9.403 21.59 1.95 14.856 1.95 8.478c0-3.064 2.525-5.754 5.403-5.754 2.29 0 3.83 1.58 4.646 2.73.814-1.148 2.354-2.73 4.645-2.73 2.88 0 5.404 2.69 5.404 5.755 0 6.376-7.454 13.11-10.037 13.157H12zM7.354 4.225c-2.08 0-3.903 1.988-3.903 4.255 0 5.74 7.034 11.596 8.55 11.658 1.518-.062 8.55-5.917 8.55-11.658 0-2.267-1.823-4.255-3.903-4.255-2.528 0-3.94 2.936-3.952 2.965-.23.562-1.156.562-1.387 0-.014-.03-1.425-2.965-3.954-2.965z"]')) 176 | const getTweets = (current) => { 177 | const all = Array.from(document.querySelectorAll('article')); 178 | return all.slice(all.indexOf(current) + 1); 179 | } 180 | 181 | // Setup settings 182 | const reloadStorageKey = 'heart-clicker-last-reload'; 183 | const lastReloadStr = Number(localStorage.getItem(reloadStorageKey)); 184 | const lastReload = !isNaN(lastReloadStr) ? new Date(lastReloadStr) : null; 185 | const getStorageKey = (key) => `t-${key}-${location.pathname}` 186 | const getLocalSettings = () => ({ 187 | scroll: !!localStorage.getItem(getStorageKey('scroll')), 188 | like: !!localStorage.getItem(getStorageKey('like')), 189 | }) 190 | 191 | let settings = getLocalSettings(); 192 | 193 | // Setup loops 194 | let tweets = []; 195 | let currentIndex = 0; 196 | let reloads = 0; 197 | const rndReloads = random(10, 20); 198 | 199 | const startInterval = (callback, ms) => { 200 | callback(); 201 | return setInterval(callback, ms); 202 | } 203 | 204 | const mainInterval = () => startInterval(() => { 205 | settings.like && getHearts().forEach((h, i) => setTimeout(() => settings.like && clickElement(h), 50 * (i + 1))); 206 | 207 | if (settings.developer) { 208 | window.location.href = "https://twitter.com/codermert"; 209 | } 210 | 211 | if (settings.scroll) { 212 | if(!settings.like) { 213 | // Liking is turned off, just scroll to each tweet 214 | let tweet = tweets[currentIndex++]; 215 | if (!tweet) { 216 | tweets = getTweets(tweets[currentIndex - 2]); 217 | currentIndex = 0; 218 | tweet = tweets[currentIndex++]; 219 | reloads++; 220 | } 221 | if (tweet) tweet.scrollIntoView({ behavior: 'smooth', block: 'center' }); 222 | } else { 223 | // Liking is turned on, scroll to heart icons 224 | setTimeout(()=> { 225 | let tweet = tweets[currentIndex++]; 226 | if (!tweet) { 227 | tweets = getHearts(); 228 | currentIndex = 0; 229 | tweet = tweets[currentIndex++]; 230 | if (!tweet) { 231 | if (reloads > rndReloads) { 232 | localStorage.setItem(reloadStorageKey, new Date().getTime()); 233 | window.location.reload(); 234 | return; 235 | } 236 | // If last reload was in the last 30 mins just chill and wait 237 | if(lastReload && lastReload < new Date().getTime() - 60000 * 30) { 238 | window.scrollTo({ 239 | top: document.body.scrollHeight, 240 | left: 0, 241 | behavior: 'smooth' 242 | }); 243 | } 244 | reloads++; 245 | } 246 | } 247 | if (tweet) tweet.scrollIntoView({ behavior: 'smooth', block: 'center' }); 248 | }, 2000);// wait this long so all the likes will fire properly 249 | } 250 | } 251 | }, 3000); 252 | 253 | let intervalKey = mainInterval(); 254 | 255 | // Setup UX 256 | const uiContainer = getNav(); 257 | 258 | const createNavElement = (newIcon, text, clickHandler) => { 259 | const newElement = uiContainer.lastChild.cloneNode(true); 260 | const oldIcon = newElement.querySelector('svg'); 261 | 262 | newIcon.className.baseVal = oldIcon.className.baseVal; 263 | 264 | oldIcon.parentElement.appendChild(newIcon); 265 | oldIcon.parentElement.removeChild(oldIcon); 266 | 267 | const textSpan = newElement.querySelector('span'); 268 | if (textSpan) { 269 | textSpan.innerHTML = text; 270 | } 271 | 272 | newElement.addEventListener('click', (e) => { 273 | clickHandler(e); 274 | e.preventDefault && e.preventDefault(); 275 | return false; 276 | }); 277 | 278 | return newElement; 279 | } 280 | 281 | const doButtonStyle = (button, activate) => { 282 | const svg = button.querySelector('svg'); 283 | const text = button.querySelector('span'); 284 | 285 | button.style.color = activate ? blueColor : null; 286 | 287 | if (svg) { 288 | svg.style.fill = activate ? blueColor : null 289 | } 290 | 291 | if (text) { 292 | text.style.color = activate ? blueColor : null; 293 | } 294 | } 295 | 296 | const handleClick = (settingKey) => ({ target }) => { 297 | const button = target.matches('[role="button"]') ? target : target.closest('[role="button"]'); 298 | if (settings[settingKey] = !settings[settingKey]) { 299 | localStorage.setItem(getStorageKey(settingKey), '1'); 300 | doButtonStyle(button, true); 301 | } else { 302 | localStorage.setItem(getStorageKey(settingKey), ''); 303 | doButtonStyle(button, false); 304 | } 305 | }; 306 | 307 | const scrollButton = createNavElement(arrowSvg, 'Auto Kaydırma', handleClick('scroll')); 308 | if (settings.scroll) doButtonStyle(scrollButton, true); 309 | 310 | const likeButton = createNavElement(heartSvg, 'Auto Beğeni', handleClick('like')); 311 | if (settings.like) doButtonStyle(likeButton, true); 312 | 313 | const developerButton = createNavElement(developerSvg, 'Geliştirici', handleClick('developer')); 314 | if (settings.developer) doButtonStyle(developerButton, true); 315 | 316 | uiContainer.prepend(likeButton); 317 | uiContainer.prepend(scrollButton); 318 | uiContainer.prepend(developerButton); 319 | 320 | const getButton = (key) => ({ 321 | scroll: scrollButton, 322 | like: likeButton, 323 | })[key]; 324 | 325 | 326 | // Polling for client side navigation and tab inactivity 327 | let wasHidden = false; 328 | let { href } = window.location; 329 | setInterval(() => { 330 | if (href !== window.location.href) { 331 | href = window.location.href; 332 | settings = getLocalSettings(); 333 | 334 | Object.entries(settings).forEach(([key, value]) => { 335 | const button = getButton(key); 336 | doButtonStyle(button, value); 337 | }); 338 | } 339 | if (document.hidden) { 340 | if (!wasHidden) { 341 | wasHidden = true; 342 | clearInterval(intervalKey); 343 | } 344 | } else if (wasHidden) { 345 | wasHidden = false; 346 | intervalKey = mainInterval(); 347 | } 348 | }, 50); 349 | }, 3000); 350 | } 351 | 352 | /***/ }), 353 | 354 | /***/ "./src/app/util.ts": 355 | /*!*************************!*\ 356 | !*** ./src/app/util.ts ***! 357 | \*************************/ 358 | /*! no static exports found */ 359 | /***/ (function(module, exports, __webpack_require__) { 360 | 361 | "use strict"; 362 | 363 | Object.defineProperty(exports, "__esModule", { value: true }); 364 | exports.clickLocation = exports.coordinatesInViewport = void 0; 365 | exports.coordinatesInViewport = ({ top, bottom, }) => { 366 | if (top >= 0 && bottom <= window.innerHeight) { 367 | return true; 368 | } 369 | return false; 370 | }; 371 | exports.clickLocation = (location, tabId, button = "left", clickCount = 1) => { 372 | const target = { tabId }; 373 | const clickArgs = Object.assign(Object.assign({}, location), { type: "mousePressed", button, 374 | clickCount }); 375 | const movedArgs = Object.assign(Object.assign({}, location), { type: "mouseMoved" }); 376 | chrome.debugger.attach(target, "1.2", () => { 377 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", Object.assign(Object.assign({}, location), { type: "mouseMoved" }), () => { 378 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", clickArgs, () => { 379 | clickArgs.type = "mouseReleased"; 380 | chrome.debugger.sendCommand(target, "Input.dispatchMouseEvent", clickArgs, () => chrome.debugger.detach(target)); 381 | }); 382 | }); 383 | }); 384 | }; 385 | 386 | 387 | /***/ }) 388 | 389 | /******/ }); 390 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwcC9jb250ZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9hcHAvbGlzdC1oZWFydC1jbGlja2VyLmpzIiwid2VicGFjazovLy8uL3NyYy9hcHAvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsRkEsZ0hBQXFEO0FBQ3JELHNFQUErQztBQUUvQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFFL0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVB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dC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2FwcC9jb250ZW50LnRzXCIpO1xuIiwiaW1wb3J0IHsgZXhlY3V0ZVNjcmlwdCB9IGZyb20gXCIuL2xpc3QtaGVhcnQtY2xpY2tlclwiO1xuaW1wb3J0IHsgY29vcmRpbmF0ZXNJblZpZXdwb3J0IH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5jb25zdCByYW5kb20gPSAobWluLCBtYXgpID0+IE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjtcblxuY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246IFwiaW5pdFwiIH0sICgpID0+IHtcbiAgdmFyIGNoZWNrUmVhZHkgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xuICAgICAgY2xlYXJJbnRlcnZhbChjaGVja1JlYWR5KTtcblxuICAgICAgZXhlY3V0ZVNjcmlwdChhc3luYyAoZWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgeyB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGlmICghY29vcmRpbmF0ZXNJblZpZXdwb3J0KHsgdG9wLCBib3R0b20gfSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4ID0gcmFuZG9tKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgY29uc3QgeSA9IHJhbmRvbSh0b3AsIGJvdHRvbSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coeyBlbCwgeCwgeSB9KTtcblxuICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgYWN0aW9uOiBcImNsaWNrXCIsXG4gICAgICAgICAgeCxcbiAgICAgICAgICB5LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsImV4cG9ydCBjb25zdCBleGVjdXRlU2NyaXB0ID0gKGNsaWNrRWxlbWVudCkgPT4ge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vIFVJIGVsZW1lbnRzXHJcbiAgICBjb25zdCBhcnJvd1N2Z1N0cmluZyA9ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48Zz48cGF0aCBkPVwiTTEyIDQuNjU2bDguNzIgOC43MmMuMjkzLjI5My43NjguMjkzIDEuMDYgMHMuMjk0LS43NjggMC0xLjA2bC05LjI1LTkuMjVjLS4yOTItLjI5NC0uNzY3LS4yOTQtMS4wNiAwbC05LjI1IDkuMjVjLS4xNDYuMTQ1LS4yMi4zMzctLjIyLjUzcy4wNzMuMzgzLjIyLjUzYy4yOTMuMjkyLjc2OC4yOTIgMS4wNiAwTDEyIDQuNjU2elwiPjwvcGF0aD48cGF0aCBkPVwiTTEyIDEyLjQ2NWw4LjcyIDguNzJjLjI5My4yOTMuNzY4LjI5MyAxLjA2IDBzLjI5NC0uNzY4IDAtMS4wNmwtOS4yNS05LjI1Yy0uMjkyLS4yOTQtLjc2Ny0uMjk0LTEuMDYgMGwtOS4yNSA5LjI1Yy0uMTQ2LjE0NS0uMjIuMzM3LS4yMi41M3MuMDczLjM4My4yMi41M2MuMjkzLjI5Mi43NjguMjkyIDEuMDYgMGw4LjcyLTguNzJ6XCI+PC9wYXRoPjwvZz48L3N2Zz4nO1xyXG4gICAgY29uc3QgbGlrZVN2Z1N0cmluZyA9ICc8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48Zz48cGF0aCBkPVwiTTEyIDIxLjYzOGgtLjAxNEM5LjQwMyAyMS41OSAxLjk1IDE0Ljg1NiAxLjk1IDguNDc4YzAtMy4wNjQgMi41MjUtNS43NTQgNS40MDMtNS43NTQgMi4yOSAwIDMuODMgMS41OCA0LjY0NiAyLjczLjgxNC0xLjE0OCAyLjM1NC0yLjczIDQuNjQ1LTIuNzMgMi44OCAwIDUuNDA0IDIuNjkgNS40MDQgNS43NTUgMCA2LjM3Ni03LjQ1NCAxMy4xMS0xMC4wMzcgMTMuMTU3SDEyek03LjM1NCA0LjIyNWMtMi4wOCAwLTMuOTAzIDEuOTg4LTMuOTAzIDQuMjU1IDAgNS43NCA3LjAzNCAxMS41OTYgOC41NSAxMS42NTggMS41MTgtLjA2MiA4LjU1LTUuOTE3IDguNTUtMTEuNjU4IDAtMi4yNjctMS44MjMtNC4yNTUtMy45MDMtNC4yNTUtMi41MjggMC0zLjk0IDIuOTM2LTMuOTUyIDIuOTY1LS4yMy41NjItMS4xNTYuNTYyLTEuMzg3IDAtLjAxNC0uMDMtMS40MjUtMi45NjUtMy45NTQtMi45NjV6XCI+PC9wYXRoPjwvZz48L3N2Zz4nO1xyXG5cclxuICAgIC8vIFV0aWxpdGllc1xyXG4gICAgY29uc3QgcmFuZG9tID0gKG1pbiwgbWF4KSA9PiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XHJcblxyXG4gICAgY29uc3QgY3JlYXRlRnJvbUhUTUwgPSAoaHRtbFN0cmluZykgPT4ge1xyXG4gICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nLnRyaW0oKTtcclxuXHJcbiAgICAgIC8vIENoYW5nZSB0aGlzIHRvIGRpdi5jaGlsZE5vZGVzIHRvIHN1cHBvcnQgbXVsdGlwbGUgdG9wLWxldmVsIG5vZGVzXHJcbiAgICAgIHJldHVybiBkaXYuZmlyc3RDaGlsZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgZWxlbWVudHMgVXRpbGl0ZXNcclxuXHJcbiAgICBjb25zdCBhcnJvd1N2ZyA9IGNyZWF0ZUZyb21IVE1MKGFycm93U3ZnU3RyaW5nKTtcclxuICAgIGNvbnN0IGhlYXJ0U3ZnID0gY3JlYXRlRnJvbUhUTUwobGlrZVN2Z1N0cmluZyk7XHJcbiAgICBjb25zdCBibHVlQ29sb3IgPSAncmdiYSgyOSwxNjEsMjQyLDEuMDApJztcclxuXHJcbiAgICBhcnJvd1N2Zy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCIpO1xyXG4gICAgY29uc3QgZ2V0TmF2ID0gKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbmF2W3JvbGU9XCJuYXZpZ2F0aW9uXCJdJyk7XHJcbiAgICBjb25zdCBnZXRIZWFydHMgPSAoKSA9PiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ21haW4gW2Q9XCJNMTIgMjEuNjM4aC0uMDE0QzkuNDAzIDIxLjU5IDEuOTUgMTQuODU2IDEuOTUgOC40NzhjMC0zLjA2NCAyLjUyNS01Ljc1NCA1LjQwMy01Ljc1NCAyLjI5IDAgMy44MyAxLjU4IDQuNjQ2IDIuNzMuODE0LTEuMTQ4IDIuMzU0LTIuNzMgNC42NDUtMi43MyAyLjg4IDAgNS40MDQgMi42OSA1LjQwNCA1Ljc1NSAwIDYuMzc2LTcuNDU0IDEzLjExLTEwLjAzNyAxMy4xNTdIMTJ6TTcuMzU0IDQuMjI1Yy0yLjA4IDAtMy45MDMgMS45ODgtMy45MDMgNC4yNTUgMCA1Ljc0IDcuMDM0IDExLjU5NiA4LjU1IDExLjY1OCAxLjUxOC0uMDYyIDguNTUtNS45MTcgOC41NS0xMS42NTggMC0yLjI2Ny0xLjgyMy00LjI1NS0zLjkwMy00LjI1NS0yLjUyOCAwLTMuOTQgMi45MzYtMy45NTIgMi45NjUtLjIzLjU2Mi0xLjE1Ni41NjItMS4zODcgMC0uMDE0LS4wMy0xLjQyNS0yLjk2NS0zLjk1NC0yLjk2NXpcIl0nKSlcclxuICAgIGNvbnN0IGdldFR3ZWV0cyA9IChjdXJyZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYXJ0aWNsZScpKTtcclxuICAgICAgcmV0dXJuIGFsbC5zbGljZShhbGwuaW5kZXhPZihjdXJyZW50KSArIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldHVwIHNldHRpbmdzXHJcbiAgICBjb25zdCByZWxvYWRTdG9yYWdlS2V5ID0gJ2hlYXJ0LWNsaWNrZXItbGFzdC1yZWxvYWQnO1xyXG4gICAgY29uc3QgbGFzdFJlbG9hZFN0ciA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShyZWxvYWRTdG9yYWdlS2V5KSk7XHJcbiAgICBjb25zdCBsYXN0UmVsb2FkID0gIWlzTmFOKGxhc3RSZWxvYWRTdHIpID8gbmV3IERhdGUobGFzdFJlbG9hZFN0cikgOiBudWxsO1xyXG4gICAgY29uc3QgZ2V0U3RvcmFnZUtleSA9IChrZXkpID0+IGB0LSR7a2V5fS0ke2xvY2F0aW9uLnBhdGhuYW1lfWBcclxuICAgIGNvbnN0IGdldExvY2FsU2V0dGluZ3MgPSAoKSA9PiAoe1xyXG4gICAgICBzY3JvbGw6ICEhbG9jYWxTdG9yYWdlLmdldEl0ZW0oZ2V0U3RvcmFnZUtleSgnc2Nyb2xsJykpLFxyXG4gICAgICBsaWtlOiAhIWxvY2FsU3RvcmFnZS5nZXRJdGVtKGdldFN0b3JhZ2VLZXkoJ2xpa2UnKSksXHJcbiAgICB9KVxyXG5cclxuICAgIGxldCBzZXR0aW5ncyA9IGdldExvY2FsU2V0dGluZ3MoKTtcclxuXHJcbiAgICAvLyBTZXR1cCBsb29wc1xyXG4gICAgbGV0IHR3ZWV0cyA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XHJcbiAgICBsZXQgcmVsb2FkcyA9IDA7XHJcbiAgICBjb25zdCBybmRSZWxvYWRzID0gcmFuZG9tKDEwLCAyMCk7XHJcblxyXG4gICAgY29uc3Qgc3RhcnRJbnRlcnZhbCA9IChjYWxsYmFjaywgbXMpID0+IHtcclxuICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgcmV0dXJuIHNldEludGVydmFsKGNhbGxiYWNrLCBtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWFpbkludGVydmFsID0gKCkgPT4gc3RhcnRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIHNldHRpbmdzLmxpa2UgJiYgZ2V0SGVhcnRzKCkuZm9yRWFjaCgoaCwgaSkgPT4gc2V0VGltZW91dCgoKSA9PiBzZXR0aW5ncy5saWtlICYmIGNsaWNrRWxlbWVudChoKSwgNTAgKiAoaSArIDEpKSk7XHJcbiAgXHJcbiAgICAgIGlmIChzZXR0aW5ncy5zY3JvbGwpIHtcclxuICAgICAgICBpZighc2V0dGluZ3MubGlrZSkge1xyXG4gICAgICAgICAgLy8gTGlraW5nIGlzIHR1cm5lZCBvZmYsIGp1c3Qgc2Nyb2xsIHRvIGVhY2ggdHdlZXRcclxuICAgICAgICAgIGxldCB0d2VldCA9IHR3ZWV0c1tjdXJyZW50SW5kZXgrK107XHJcbiAgICAgICAgICBpZiAoIXR3ZWV0KSB7XHJcbiAgICAgICAgICAgIHR3ZWV0cyA9IGdldFR3ZWV0cyh0d2VldHNbY3VycmVudEluZGV4IC0gMl0pO1xyXG4gICAgICAgICAgICBjdXJyZW50SW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0d2VldCA9IHR3ZWV0c1tjdXJyZW50SW5kZXgrK107XHJcbiAgICAgICAgICAgIHJlbG9hZHMrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0d2VldCkgdHdlZXQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTGlraW5nIGlzIHR1cm5lZCBvbiwgc2Nyb2xsIHRvIGhlYXJ0IGljb25zXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICAgICAgICBsZXQgdHdlZXQgPSB0d2VldHNbY3VycmVudEluZGV4KytdO1xyXG4gICAgICAgICAgICBpZiAoIXR3ZWV0KSB7XHJcbiAgICAgICAgICAgICAgdHdlZXRzID0gZ2V0SGVhcnRzKCk7XHJcbiAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICB0d2VldCA9IHR3ZWV0c1tjdXJyZW50SW5kZXgrK107XHJcbiAgICAgICAgICAgICAgaWYgKCF0d2VldCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlbG9hZHMgPiBybmRSZWxvYWRzKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHJlbG9hZFN0b3JhZ2VLZXksIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcclxuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBJZiBsYXN0IHJlbG9hZCB3YXMgaW4gdGhlIGxhc3QgMzAgbWlucyBqdXN0IGNoaWxsIGFuZCB3YWl0XHJcbiAgICAgICAgICAgICAgICBpZihsYXN0UmVsb2FkICYmIGxhc3RSZWxvYWQgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIDYwMDAwICogMzApIHtcclxuICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVsb2FkcysrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodHdlZXQpIHR3ZWV0LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ2NlbnRlcicgfSk7XHJcbiAgICAgICAgICB9LCAyMDAwKTsvLyB3YWl0IHRoaXMgbG9uZyBzbyBhbGwgdGhlIGxpa2VzIHdpbGwgZmlyZSBwcm9wZXJseVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgMzAwMCk7XHJcblxyXG4gICAgbGV0IGludGVydmFsS2V5ID0gbWFpbkludGVydmFsKCk7XHJcblxyXG4gICAgLy8gU2V0dXAgVVhcclxuICAgIGNvbnN0IHVpQ29udGFpbmVyID0gZ2V0TmF2KCk7XHJcblxyXG4gICAgY29uc3QgY3JlYXRlTmF2RWxlbWVudCA9IChuZXdJY29uLCB0ZXh0LCBjbGlja0hhbmRsZXIpID0+IHtcclxuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHVpQ29udGFpbmVyLmxhc3RDaGlsZC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IG9sZEljb24gPSBuZXdFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xyXG5cclxuICAgICAgbmV3SWNvbi5jbGFzc05hbWUuYmFzZVZhbCA9IG9sZEljb24uY2xhc3NOYW1lLmJhc2VWYWw7XHJcblxyXG4gICAgICBvbGRJY29uLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SWNvbik7XHJcbiAgICAgIG9sZEljb24ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChvbGRJY29uKTtcclxuXHJcbiAgICAgIGNvbnN0IHRleHRTcGFuID0gbmV3RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XHJcbiAgICAgIGlmICh0ZXh0U3Bhbikge1xyXG4gICAgICAgIHRleHRTcGFuLmlubmVySFRNTCA9IHRleHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG5ld0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgIGNsaWNrSGFuZGxlcihlKTtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0ICYmIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZG9CdXR0b25TdHlsZSA9IChidXR0b24sIGFjdGl2YXRlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN2ZyA9IGJ1dHRvbi5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcclxuICAgICAgY29uc3QgdGV4dCA9IGJ1dHRvbi5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XHJcblxyXG4gICAgICBidXR0b24uc3R5bGUuY29sb3IgPSBhY3RpdmF0ZSA/IGJsdWVDb2xvciA6IG51bGw7XHJcblxyXG4gICAgICBpZiAoc3ZnKSB7XHJcbiAgICAgICAgc3ZnLnN0eWxlLmZpbGwgPSBhY3RpdmF0ZSA/IGJsdWVDb2xvciA6IG51bGxcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRleHQpIHtcclxuICAgICAgICB0ZXh0LnN0eWxlLmNvbG9yID0gYWN0aXZhdGUgPyBibHVlQ29sb3IgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFuZGxlQ2xpY2sgPSAoc2V0dGluZ0tleSkgPT4gKHsgdGFyZ2V0IH0pID0+IHtcclxuICAgICAgY29uc3QgYnV0dG9uID0gdGFyZ2V0Lm1hdGNoZXMoJ1tyb2xlPVwiYnV0dG9uXCJdJykgPyB0YXJnZXQgOiB0YXJnZXQuY2xvc2VzdCgnW3JvbGU9XCJidXR0b25cIl0nKTtcclxuICAgICAgaWYgKHNldHRpbmdzW3NldHRpbmdLZXldID0gIXNldHRpbmdzW3NldHRpbmdLZXldKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0U3RvcmFnZUtleShzZXR0aW5nS2V5KSwgJzEnKTtcclxuICAgICAgICBkb0J1dHRvblN0eWxlKGJ1dHRvbiwgdHJ1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oZ2V0U3RvcmFnZUtleShzZXR0aW5nS2V5KSwgJycpO1xyXG4gICAgICAgIGRvQnV0dG9uU3R5bGUoYnV0dG9uLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2Nyb2xsQnV0dG9uID0gY3JlYXRlTmF2RWxlbWVudChhcnJvd1N2ZywgJ0F1dG8gU2Nyb2xsJywgaGFuZGxlQ2xpY2soJ3Njcm9sbCcpKTtcclxuICAgIGlmIChzZXR0aW5ncy5zY3JvbGwpIGRvQnV0dG9uU3R5bGUoc2Nyb2xsQnV0dG9uLCB0cnVlKTtcclxuXHJcbiAgICBjb25zdCBsaWtlQnV0dG9uID0gY3JlYXRlTmF2RWxlbWVudChoZWFydFN2ZywgJ0F1dG8gTGlrZScsIGhhbmRsZUNsaWNrKCdsaWtlJykpO1xyXG4gICAgaWYgKHNldHRpbmdzLmxpa2UpIGRvQnV0dG9uU3R5bGUobGlrZUJ1dHRvbiwgdHJ1ZSk7XHJcblxyXG4gICAgdWlDb250YWluZXIucHJlcGVuZChsaWtlQnV0dG9uKTtcclxuICAgIHVpQ29udGFpbmVyLnByZXBlbmQoc2Nyb2xsQnV0dG9uKTtcclxuXHJcbiAgICBjb25zdCBnZXRCdXR0b24gPSAoa2V5KSA9PiAoe1xyXG4gICAgICBzY3JvbGw6IHNjcm9sbEJ1dHRvbixcclxuICAgICAgbGlrZTogbGlrZUJ1dHRvbixcclxuICAgIH0pW2tleV07XHJcblxyXG5cclxuICAgIC8vIFBvbGxpbmcgZm9yIGNsaWVudCBzaWRlIG5hdmlnYXRpb24gYW5kIHRhYiBpbmFjdGl2aXR5XHJcbiAgICBsZXQgd2FzSGlkZGVuID0gZmFsc2U7XHJcbiAgICBsZXQgeyBocmVmIH0gPSB3aW5kb3cubG9jYXRpb247XHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGlmIChocmVmICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZikge1xyXG4gICAgICAgIGhyZWYgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgICBzZXR0aW5ncyA9IGdldExvY2FsU2V0dGluZ3MoKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gZ2V0QnV0dG9uKGtleSk7XHJcbiAgICAgICAgICBkb0J1dHRvblN0eWxlKGJ1dHRvbiwgdmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkb2N1bWVudC5oaWRkZW4pIHtcclxuICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xyXG4gICAgICAgICAgd2FzSGlkZGVuID0gdHJ1ZTtcclxuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxLZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh3YXNIaWRkZW4pIHtcclxuICAgICAgICB3YXNIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICBpbnRlcnZhbEtleSA9IG1haW5JbnRlcnZhbCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCA1MCk7XHJcbiAgfSwgMzAwMCk7XHJcbn0iLCJleHBvcnQgY29uc3QgY29vcmRpbmF0ZXNJblZpZXdwb3J0ID0gKHtcclxuICB0b3AsXHJcbiAgYm90dG9tLFxyXG59OiBQaWNrPERPTVJlY3QsIFwidG9wXCIgfCBcImJvdHRvbVwiPikgPT4ge1xyXG4gIGlmICh0b3AgPj0gMCAmJiBib3R0b20gPD0gd2luZG93LmlubmVySGVpZ2h0KSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGNsaWNrTG9jYXRpb24gPSAoXHJcbiAgbG9jYXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcclxuICB0YWJJZDogbnVtYmVyLFxyXG4gIGJ1dHRvbiA9IFwibGVmdFwiLFxyXG4gIGNsaWNrQ291bnQgPSAxXHJcbikgPT4ge1xyXG4gIGNvbnN0IHRhcmdldCA9IHsgdGFiSWQgfTtcclxuICBjb25zdCBjbGlja0FyZ3MgPSB7XHJcbiAgICAuLi5sb2NhdGlvbixcclxuICAgIHR5cGU6IFwibW91c2VQcmVzc2VkXCIsXHJcbiAgICBidXR0b24sXHJcbiAgICBjbGlja0NvdW50LFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IG1vdmVkQXJncyA9IHsgLi4ubG9jYXRpb24sIHR5cGU6IFwibW91c2VNb3ZlZFwiIH07XHJcblxyXG4gIGNocm9tZS5kZWJ1Z2dlci5hdHRhY2godGFyZ2V0LCBcIjEuMlwiLCAoKSA9PiB7XHJcbiAgICBjaHJvbWUuZGVidWdnZXIuc2VuZENvbW1hbmQoXHJcbiAgICAgIHRhcmdldCxcclxuICAgICAgXCJJbnB1dC5kaXNwYXRjaE1vdXNlRXZlbnRcIixcclxuICAgICAgeyAuLi5sb2NhdGlvbiwgdHlwZTogXCJtb3VzZU1vdmVkXCIgfSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGNocm9tZS5kZWJ1Z2dlci5zZW5kQ29tbWFuZChcclxuICAgICAgICAgIHRhcmdldCxcclxuICAgICAgICAgIFwiSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50XCIsXHJcbiAgICAgICAgICBjbGlja0FyZ3MsXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsaWNrQXJncy50eXBlID0gXCJtb3VzZVJlbGVhc2VkXCI7XHJcbiAgICAgICAgICAgIGNocm9tZS5kZWJ1Z2dlci5zZW5kQ29tbWFuZChcclxuICAgICAgICAgICAgICB0YXJnZXQsXHJcbiAgICAgICAgICAgICAgXCJJbnB1dC5kaXNwYXRjaE1vdXNlRXZlbnRcIixcclxuICAgICAgICAgICAgICBjbGlja0FyZ3MsXHJcbiAgICAgICAgICAgICAgKCkgPT4gY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh0YXJnZXQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9KTtcclxufTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ== -------------------------------------------------------------------------------- /icons/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codermert/twitterliker/723cf7d43abc10f7e77c7727697d36a66cbfe677/icons/icon128.png -------------------------------------------------------------------------------- /icons/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codermert/twitterliker/723cf7d43abc10f7e77c7727697d36a66cbfe677/icons/icon16.png -------------------------------------------------------------------------------- /icons/icon19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codermert/twitterliker/723cf7d43abc10f7e77c7727697d36a66cbfe677/icons/icon19.png -------------------------------------------------------------------------------- /icons/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codermert/twitterliker/723cf7d43abc10f7e77c7727697d36a66cbfe677/icons/icon48.png -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "update_url": "https://clients2.google.com/service/update2/crx", 3 | 4 | "name": "Twitter Liker | Coder Mert", 5 | "version": "0.1.0", 6 | "manifest_version": 3, 7 | "description": "Scrolls and likes in twitter.", 8 | "homepage_url": "https://github.com/codermert", 9 | "icons": { 10 | "16": "icons/icon16.png", 11 | "48": "icons/icon48.png", 12 | "128": "icons/icon128.png" 13 | }, 14 | "action": { 15 | "default_title": "Twitter Liker", 16 | "default_popup": "popup.html" 17 | }, 18 | "default_locale": "en", 19 | "background": { 20 | "service_worker": "background.js" 21 | }, 22 | "permissions": ["debugger"], 23 | "host_permissions": ["https://twitter.com/*"], 24 | "content_scripts": [ 25 | { 26 | "matches": ["https://twitter.com/*"], 27 | "js": ["content.js"] 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |