/*! * mybb-april-fools 1.1.1 (22.03.2024) * https://forumd.ru/viewtopic.php?id=7372 * Система первоапрельских розыгрышей для форумов MyBB * @author kozhilya * @license https://forumd.ru/viewtopic.php?id=5751#rule */ /* * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./src/html/button.html": /*!******************************!*\ !*** ./src/html/button.html ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/button.html?"); /***/ }), /***/ "./src/html/joke-fresh_glass.html": /*!****************************************!*\ !*** ./src/html/joke-fresh_glass.html ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"
\\n
\\n

А ты трогал сегодня траву?

\\n\\n \\\"Здесь\\n\\n \\n Изображение травы взято с\\n WikiMedia\\n под лицензией\\n CC BY-SA 4.0 DEED.\\n \\n
\\n
\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/joke-fresh_glass.html?"); /***/ }), /***/ "./src/html/styles.html": /*!******************************!*\ !*** ./src/html/styles.html ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/styles.html?"); /***/ }), /***/ "./src/html/window.html": /*!******************************!*\ !*** ./src/html/window.html ***! \******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Module\nvar code = \"
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n\";\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (code);\n\n//# sourceURL=webpack://mybb-april-fools/./src/html/window.html?"); /***/ }), /***/ "./src/types/html.d.ts": /*!*****************************!*\ !*** ./src/types/html.d.ts ***! \*****************************/ /***/ (() => { eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/html.d.ts?"); /***/ }), /***/ "./src/types/mybb.d.ts": /*!*****************************!*\ !*** ./src/types/mybb.d.ts ***! \*****************************/ /***/ (() => { eval("\n\n//# sourceURL=webpack://mybb-april-fools/./src/types/mybb.d.ts?"); /***/ }), /***/ "./src/common.ts": /*!***********************!*\ !*** ./src/common.ts ***! \***********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ d2: () => (/* binding */ d2),\n/* harmony export */ debug: () => (/* binding */ debug),\n/* harmony export */ debugEnabled: () => (/* binding */ debugEnabled),\n/* harmony export */ enableDebug: () => (/* binding */ enableDebug),\n/* harmony export */ getTextNodes: () => (/* binding */ getTextNodes),\n/* harmony export */ isFloat: () => (/* binding */ isFloat),\n/* harmony export */ isInt: () => (/* binding */ isInt),\n/* harmony export */ isNumber: () => (/* binding */ isNumber),\n/* harmony export */ isTouchEnabled: () => (/* binding */ isTouchEnabled)\n/* harmony export */ });\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);\n\n/**\n * Получение всех элементов, являющимися TextNode.\n * Используется некоторыми шутками для уменьшения\n * влияния на существующее DOM-дерево.\n *\n * @param {HTMLElement | JQuery | JQuery.Selector} root\n * Элемет, у которого необходимо найти текстовые ноды\n *\n * @return {JQuery}\n */\nfunction getTextNodes(root) {\n // Это очень странный код, но надо успокоить ESLint\n const $root = (typeof root === 'string') ? jquery__WEBPACK_IMPORTED_MODULE_0___default()(root) : jquery__WEBPACK_IMPORTED_MODULE_0___default()(root);\n return $root.\n find('*').\n contents().\n filter((_, node) => node.nodeType === Node.TEXT_NODE);\n}\nlet debugEnabled = ((scriptElement) => {\n if (!(scriptElement instanceof HTMLScriptElement)) {\n return false;\n }\n return !/\\.min\\.js$/.test(scriptElement.src);\n})(document.currentScript);\n/**\n * Отоброзить отладочное сообщение\n */\nfunction debug(...data) {\n if (!debugEnabled)\n return;\n console.log(...data);\n}\n/**\n * Включить отладку\n */\nfunction enableDebug() {\n debugEnabled = true;\n}\n/**\n * Проверка сенсорного экрана\n * @return {boolean}\n */\nfunction isTouchEnabled() {\n var _a;\n return 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n // eslint-disable-next-line\n ((_a = navigator.msMaxTouchPoints) !== null && _a !== void 0 ? _a : 0) > 0;\n}\n/**\n * Проверка, является ли переменная числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isNumber(n) {\n return Number(n) === n;\n}\n/**\n * Проверка, является ли переменная целым числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isInt(n) {\n return Number(n) === n && n % 1 === 0;\n}\n/**\n * Проверка, является ли переменная вещественным числом\n * @param {any} n Проверяемая переменная\n * @return {boolean} Результат проверки\n */\n// eslint-disable-next-line\nfunction isFloat(n) {\n return Number(n) === n && n % 1 !== 0;\n}\n/**\n * Тег литеральной функции, в которой вещественные числа будут\n * печататься с 2 точками после запятой\n * @param {TemplateStringsArray} strings\n * @param {any[]} values\n * @return {string}\n */\n// eslint-disable-next-line\nfunction d2(strings, ...values) {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n result += isFloat(values[i]) ? values[i].toFixed(2) : values[i];\n }\n }\n return result;\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/common.ts?"); /***/ }), /***/ "./src/data/stupid_title_variants.ts": /*!*******************************************!*\ !*** ./src/data/stupid_title_variants.ts ***! \*******************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ StupidTitleDefaultVariants: () => (/* binding */ StupidTitleDefaultVariants)\n/* harmony export */ });\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n\n/**\n * Метод, генерирующий стандартный список слов\n * @param {StupidTitleVariants} vars\n */\nfunction StupidTitleDefaultVariants(vars) {\n vars.adj = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'адекватный,$адский,активный,алчный,%ангельский,банальный,безнадёжный,$бесполезный,былой,верный,виртуальный,вкусный,воспитанный,выгодный,выходной,гигантский,$глупый,гордый,грамотный,громадный,грубый,далекий,двуличный,деятельный,доброжелательный,$жалкий,жёсткий,жестокий,$жирный,заинтересованный,запасной,застенчивый,знакомый,иностранный,истинный,конструктивный,креативный,ласковый,любимый,мелочный,^мирный,мстительный,небесный,невозможный,независимый,низкий,нужный,объективный,обыкновенный,опрятный,^оригинальный,особенный,острый,откровенный,открытый,пестрый,повседневный,подземный,пожилой,показательный,последний,посторонний,провинциальный,пышный,робкий,родной,самовлюблённый,северный,седой,семейный,серьёзный,сногсшибательный,^солнечный,спокойный,суровый,терпеливый,уверенный в себе,ударный,^удачливый,формальный,хладнокровный,целый,чистый,чрезвычайный,чужой,южный')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'адекватная,$адская,активная,алчная,%ангельская,банальная,безнадёжная,$бесполезная,былая,верная,виртуальная,вкусная,воспитанная,выгодная,выходная,гигантская,$глупая,гордая,грамотная,громадная,грубая,далекая,двуличная,деятельная,доброжелательная,$жалкая,жёсткая,жестокая,$жирная,заинтересованная,запасная,застенчивая,знакомая,иностранная,истинная,конструктивная,креативная,ласковая,любимая,мелочная,^мирная,мстительная,небесная,невозможная,независимая,низкая,нужная,объективная,обыкновенная,опрятная,^оригинальная,особенная,острая,откровенная,открытая,пестрая,повседневная,подземная,пожилая,показательная,последняя,посторонняя,провинциальная,пышная,робкая,родная,самовлюблённая,северная,седая,семейная,серьезная,сногсшибательная,^солнечная,спокаяная,суровая,терпеливая,уверенная в себе,ударная,^удачливая,формальная,хладнокровная,целая,чистая,чрезвычайная,чужая,южная')), vars.adj);\n vars.noun = Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'актёр,$балбес,бард,басурманин,борец,бродяга,бруталище,волк,дворф,%дед,%дедушка,джентльмен,диван,динозавр,дракон,ёж,%ёжик,жук,зайц,$злоумышленник,зомби,карасик,кентавр,кит,кот,кролик,кулак,лев,ледник,лесоруб,%мальчег,мальчик,манекен,массажист,мачо,монах,монстр,наследник,ниндзя,носорог,одиночка,организм,орёл,отец,принц,проказник,пузырь,$раб,рыцарь,спортсмен,сурикат,сын,%сынок,тигр,товарищ,хоббит,эльф')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'актриса,акула,$бабка,бабочка,%бабушка,бактерия,белочка,бусинка,валькирия,$ведьма,волторна,волчица,горгулья,дворфиха,девочка,деревяшка,детка,%деффачка,%дочка,дочь,заноза,$злоумышленница,знаменитость,каруселька,килька,конфетка,косточка,кошка,красотка,крышка,леди,$личинка,львица,мать,машина,милашка,монашка,мышь,наследница,орлица,панда,пиранья,принцесса,простуда,$рабыня,русалочка,рыбка,рыбка,скамеечка,спортсменка,тигрица,травка,черепашка,чертовка,эльфийка')), vars.noun);\n vars.verb = Object.assign(Object.assign(Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'бежит,берёт и делает,болеет,встаёт,говорит,думает,забывает,замирает,заходит,идёт,%имеет план и придерживается его,ловит,меняется,молчит,нарушает,оглядывается,орёт,освобождает,отвечает,отказаться куда-то идти,отказывается,отказывается вставать,отказывается что-то делать,оформляет,плывёт,поглядывает,поздравляет,поздравляет,получает,прибывает,приказывает,просыпается,прощает,работает,радуется,скрывается,снимает,снимает,снимается в сериале,снимается в фильме,собирается,соединяет,спрашивает,тянет,указывает,учит,читает,что-то скрывает,чувствует опасность,шепчет')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(true, \n // eslint-disable-next-line max-len\n 'взял и сделал,додумался,женился,женится,заработался,не спал,не успел,обиделся,познал дзен,присел,проснулся,скрылся,смог,успел')), (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(false, \n // eslint-disable-next-line max-len\n 'взяла и сделала,выходит замуж,вышла замуж,додумалась,заработалась,не спала,не успела,обиделась,познала дзен,присела,проснулась,скрылась,смогла,успела')), vars.verb);\n vars.place = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'в джунглях,в квартире,в космосе,в лесу,в очереди,в пустыне,в театре,%в тёплой и уютной квартире,в филармонии,где-то,на заснеженной вершине,на конференции,на пляже,на форуме,под водой,под дождём,%под проливным дождём')), vars.place);\n vars.adv = Object.assign(Object.assign({}, (0,_jokes_stupid_title__WEBPACK_IMPORTED_MODULE_0__.BuildStupidTitleVariant)(null, \n // eslint-disable-next-line max-len\n 'безрассудно,быстро,внезапно,вновь,$грубо,грустно,медленно,%молниеносно,немедленно,опять,осмысленно,позже,предсказуемо,расчётливо,регулярно,счастливо,уже,уныло')), vars.adv);\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/data/stupid_title_variants.ts?"); /***/ }), /***/ "./src/joke.ts": /*!*********************!*\ !*** ./src/joke.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Joke: () => (/* binding */ Joke),\n/* harmony export */ JokeSettings: () => (/* binding */ JokeSettings),\n/* harmony export */ StoppableJoke: () => (/* binding */ StoppableJoke)\n/* harmony export */ });\n/**\n * Объект настроек шутки\n */\nclass JokeSettings {\n constructor() {\n /**\n * Флаг блокировки срабатывания\n */\n this.enabled = true;\n /**\n * Вероятность срабатывания в процентах\n */\n this.chance = 20;\n }\n}\n/**\n * Объект, описывающий шутку\n */\nclass Joke {\n /**\n * Получение полного списка настроек\n */\n get settings() {\n return this._settings;\n }\n /**\n * Запись новых настроек\n *\n * @param {JokeSettings} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const value = entry[1];\n switch (id) {\n case 'name':\n case 'title':\n this.title = value;\n break;\n case 'description':\n this.description = value;\n break;\n default:\n // eslint-disable-next-line\n this._settings[id] = value;\n }\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Разблокировать шутку\n */\n enable() {\n this.settings.enabled = true;\n }\n /**\n * Заблокировать шутку\n */\n disable() {\n this.settings.enabled = false;\n }\n /**\n * Переключить блокировку шутки\n * @param {boolean | null} [value] Новое значение\n */\n toggle(value = null) {\n this.settings.enabled = value === null ? !this.settings.enabled : value;\n }\n}\n/**\n * Объект, описывающий шутку, которая может быть остановлена\n */\nclass StoppableJoke extends Joke {\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joke.ts?"); /***/ }), /***/ "./src/joker.ts": /*!**********************!*\ !*** ./src/joker.ts ***! \**********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerClass: () => (/* binding */ JokerClass)\n/* harmony export */ });\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./joke */ \"./src/joke.ts\");\n/* harmony import */ var _ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ui */ \"./src/ui.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common */ \"./src/common.ts\");\n\n\n\n\n/**\n * Блок обработки перво-апрельских шуток\n *\n * @author Kozhilya\n */\nclass JokerClass {\n constructor() {\n this.ui = new _ui__WEBPACK_IMPORTED_MODULE_2__.JokerUI(this);\n /**\n * Общие настройки системы\n */\n this.core_settings = new CoreSettings();\n /**\n * Перечисление всех шуток\n */\n this.jokes = {};\n }\n /**\n * Получение полного списка настроек\n */\n get settings() {\n const result = {};\n result['core'] = this.core_settings;\n for (const entries of Object.entries(this.jokes)) {\n const id = entries[0];\n const joke = entries[1];\n result[id] = joke.settings;\n }\n return result;\n }\n /**\n * Запись новых настроек\n *\n * @param {SettingsMap} settings\n */\n set settings(settings) {\n for (const entry of Object.entries(settings)) {\n const id = entry[0];\n const jokeSettings = entry[1];\n const targetSettings = id === 'core' ? this.core_settings : this.jokes[id].settings;\n Object.assign(targetSettings, jokeSettings);\n }\n }\n /**\n * Проверка вероятности\n *\n * @param {number} chance Вероятность срабатывания\n * @return {boolean} Флаг срабатывания (true - сработало)\n */\n check(chance) {\n return Math.random() < 0.01 * chance;\n }\n /**\n * Добавление шутки\n *\n * @param {Joke} joke Объект шутки\n */\n add(joke) {\n this.jokes[joke.id] = joke;\n }\n /**\n * Регистрация новой шутки\n *\n * @param {string} id Идентификатор шутки\n * @param {JokeHandler} handler Метод, выполняющий шутку\n * @param {JokeSettings | null} [settings] Объект настроек шутки\n * @return {Joke} Объект шутки\n */\n addCustom(id, handler, settings = null) {\n const joke = new (class extends _joke__WEBPACK_IMPORTED_MODULE_1__.Joke {\n constructor() {\n super(...arguments);\n this.id = id;\n this.title = 'Пользовательская шутка';\n this.description = 'Для шутки не определено описание';\n this._settings = new _joke__WEBPACK_IMPORTED_MODULE_1__.JokeSettings();\n }\n /**\n * Метод запуска шутки\n */\n start() {\n handler.call(this, this.settings);\n }\n })();\n joke.settings = settings;\n this.add(joke);\n return joke;\n }\n /**\n * Разблокировать систему\n */\n enable() {\n this.core_settings.enabled = true;\n }\n /**\n * Заблокировать систему\n */\n disable() {\n this.core_settings.enabled = false;\n }\n /**\n * Разблокировать все шутки\n */\n enableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].enable();\n }\n }\n /**\n * Заблокировать все шутки\n */\n disableAll() {\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].disable();\n }\n }\n /**\n * Переключение шутки\n *\n * @param {string} jokeId ID шутки для переключения\n * @param {boolean} state Новое состояние\n */\n toggleJoke(jokeId, state) {\n const joke = this.jokes[jokeId];\n joke.settings.enabled = state;\n if (joke instanceof _joke__WEBPACK_IMPORTED_MODULE_1__.StoppableJoke && !state) {\n joke.stop();\n }\n this.saveUserStates();\n }\n /**\n * Сохранение пользовательских настроек\n */\n saveUserStates() {\n const states = {};\n for (const key of Object.keys(this.jokes)) {\n states[key] = this.jokes[key].settings.enabled;\n }\n fetch('/api.php?' +\n $.param({\n method: 'storage.set',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n value: JSON.stringify(states),\n timer: 24 * 60,\n })).then((_) => { });\n }\n /**\n * Загрузка пользовательских настроек\n */\n async loadUserStates() {\n const response = await fetch('/api.php?' +\n $.param({\n method: 'storage.get',\n user_id: window.UserID,\n key: 'april-fools',\n }));\n const json = await response.json();\n if (json.error) {\n return;\n }\n const data = JSON.parse(json.response.storage.data['april-fools']);\n for (const key of Object.keys(this.jokes)) {\n this.jokes[key].settings.enabled = data[key];\n }\n }\n /**\n * Отчистка настроек пользователя\n */\n async clearUserStates() {\n await fetch('/api.php?' +\n $.param({\n method: 'storage.delete',\n user_id: window.UserID,\n key: 'april-fools',\n token: window.ForumAPITicket,\n }));\n return;\n }\n /**\n * Запуск шутки\n *\n * @param {string} jokeId ID шутки для запуска\n * @param {boolean} [forced] Принудительный запуск\n */\n start(jokeId, forced = false) {\n if (!(jokeId in this.jokes))\n return;\n const joke = this.jokes[jokeId];\n if (!forced && (!joke.settings.enabled || !this.check(joke.settings.chance))) {\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка не включена');\n return;\n }\n (0,_common__WEBPACK_IMPORTED_MODULE_3__.debug)(joke.title, '- шутка включена');\n joke.start();\n }\n /**\n * Запуск всех шуток\n *\n * @param {boolean} [forced] Принудительный запуск\n */\n startAll(forced = false) {\n for (const key of Object.keys(this.jokes)) {\n this.start(key, forced);\n }\n }\n /**\n * Стандартная проверка 1 апреля\n *\n * @return {boolean} Флаг, должна ли запускаться система\n */\n regularCheck() {\n if (!this.core_settings.enabled) {\n return false;\n }\n if (this.core_settings.testers.indexOf(window.UserID) >= 0) {\n return true;\n }\n const today = new Date();\n const month = today.getMonth() + 1;\n const day = today.getDate();\n if (month !== 4 || day !== 1) {\n return false;\n }\n return this.check(this.core_settings.chance);\n }\n /**\n * Стандартный запуск 1 апреля\n */\n async regularStart() {\n if (!this.regularCheck()) {\n return;\n }\n await this.loadUserStates();\n this.ui.show();\n this.startAll();\n }\n}\n/**\n * Общие правила системы\n */\nclass CoreSettings {\n constructor() {\n this.chance = 100;\n this.enabled = true;\n /**\n * Список пользователей-тестировщиков\n */\n this.testers = [];\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/joker.ts?"); /***/ }), /***/ "./src/jokes/carnival.ts": /*!*******************************!*\ !*** ./src/jokes/carnival.ts ***! \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CarnivalJoke: () => (/* binding */ CarnivalJoke),\n/* harmony export */ CarnivalJokeSettings: () => (/* binding */ CarnivalJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Карнавал**\n *\n * Аватарки приобретают интересные цвета\n *\n * @author Kozhilya\n */\nclass CarnivalJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'carnival';\n this.title = 'Карнавал';\n this.description = 'Аватарки приобретают интересные цвета';\n this._settings = new CarnivalJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const filters = [];\n for (const entry of Object.entries(this.settings.variants)) {\n if (!this.check(this.settings.variant_chance)) {\n continue;\n }\n filters.push(entry[0].replace('{0}', Math.round(Math.random() * entry[1]).toString()));\n }\n if (filters.length > 0) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css({ filter: filters.join(' ') });\n }\n });\n }\n}\n/**\n * Класс настроек для шутки \"Карнавал\"\n */\nclass CarnivalJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 30;\n /**\n * Селектор всех элементов, которые будут перекрашены\n */\n this.selector = 'img[src*=\"/avatars/\"]';\n /**\n * Вероятность применения некоторого фильтра\n */\n this.variant_chance = 20;\n /**\n * Список фильтров и диапозона случайных параметров\n */\n this.variants = {\n 'sepia({0}%)': 100,\n 'saturate({0}%)': 100,\n 'hue-rotate({0}deg)': 360,\n 'invert({0}%)': 100,\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/carnival.ts?"); /***/ }), /***/ "./src/jokes/crazy_letters.ts": /*!************************************!*\ !*** ./src/jokes/crazy_letters.ts ***! \************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CrazyLettersJoke: () => (/* binding */ CrazyLettersJoke),\n/* harmony export */ CrazyLettersJokeSettings: () => (/* binding */ CrazyLettersJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Мама, Я сОшЛа С уМа!**\n *\n * иМеНа ЗаБоРчИкОм\n *\n * @author Kozhilya\n */\nclass CrazyLettersJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'crazy_letters';\n this.title = 'Мама, Я сОшЛа С уМа!';\n this.description = 'иМеНа ЗаБоРчИкОм';\n this._settings = new CrazyLettersJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector).each((_, elem) => {\n const text = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).text();\n let result = '';\n for (let i = 0; i < text.length; i++) {\n result += text[i][i % 2 ? 'toLowerCase' : 'toUpperCase']();\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(this).text(result);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Мама, Я сОшЛа С уМа!\"\n */\nclass CrazyLettersJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.pa-author a';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/crazy_letters.ts?"); /***/ }), /***/ "./src/jokes/cursor.ts": /*!*****************************!*\ !*** ./src/jokes/cursor.ts ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CursorEffectsJoke: () => (/* binding */ CursorEffectsJoke),\n/* harmony export */ CursorEffectsJokeSettings: () => (/* binding */ CursorEffectsJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var cursor_effects__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! cursor-effects */ \"./node_modules/cursor-effects/dist/esm.js\");\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\n\n/**\n * **Красивый курсор**\n *\n * Эффекты, следующие за курсором\n *\n * @author Tim Holman\n * @link https://tholman.com/cursor-effects/\n */\nclass CursorEffectsJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'cursor_effects';\n this.title = 'Красивый курсор';\n this.description = 'Эффекты, следующие за курсором';\n this._settings = new CursorEffectsJokeSettings();\n }\n /**\n * Разблокировать все варианты курсоров\n */\n enableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = true;\n }\n }\n /**\n * Заблокировать все варианты курсоров\n */\n disableAll() {\n for (const key of Object.keys(this.settings.effects)) {\n this.settings.effects[key].enabled = false;\n }\n }\n /**\n * Получение веса отдельного эффекта\n * @param {CursorEffectsEnum} effect Тип эффекта\n * @return {number} Значение веса\n * @private\n */\n weight(effect) {\n const s = this.settings.effects[effect];\n return s.enabled ? s.weight : 0;\n }\n /**\n * Получение случайного эффекта\n * @return {CursorEffectsEnum}\n */\n getRandomEffect() {\n const elements = Object.values(CursorEffectsEnum).map((e) => e);\n const totalWeight = elements.reduce((sum, element) => sum + this.weight(element), 0);\n const randomWeight = Math.random() * totalWeight;\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += this.weight(element);\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Запуск шутки\n */\n start() {\n const effect = this.getRandomEffect();\n const settings = this.settings.effects[effect];\n this.active_cursor_effect = resolveCursorEffectsEnum(effect, settings);\n }\n /**\n * Остановка шутки\n */\n stop() {\n this.active_cursor_effect.destroy();\n }\n}\nvar CursorEffectsEnum;\n(function (CursorEffectsEnum) {\n CursorEffectsEnum[\"Rainbow\"] = \"rainbow\";\n CursorEffectsEnum[\"FairyDust\"] = \"fairy_dust\";\n CursorEffectsEnum[\"SpringyEmoji\"] = \"springy_emoji\";\n CursorEffectsEnum[\"Emoji\"] = \"emoji\";\n CursorEffectsEnum[\"Ghost\"] = \"ghost\";\n CursorEffectsEnum[\"Trailing\"] = \"trailing\";\n CursorEffectsEnum[\"TextFlag\"] = \"text_flag\";\n CursorEffectsEnum[\"FollowingDot\"] = \"following_dot\";\n CursorEffectsEnum[\"Bubbles\"] = \"bubbles\";\n CursorEffectsEnum[\"Snowflake\"] = \"snowflake\";\n CursorEffectsEnum[\"Clock\"] = \"clock\";\n})(CursorEffectsEnum || (CursorEffectsEnum = {}));\n/**\n * Получение эффекта\n * @param {CursorEffectsEnum | string} effect Тип эффекта\n * @param {CursorEffectsSetting} options Настройки эффекта\n * @return {CursorEffectsLib.CursorEffectResult}\n */\nfunction resolveCursorEffectsEnum(effect, options) {\n switch (effect) {\n case CursorEffectsEnum.Rainbow:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.rainbowCursor(options);\n case CursorEffectsEnum.FairyDust:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.fairyDustCursor(options);\n case CursorEffectsEnum.SpringyEmoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.springyEmojiCursor(options);\n case CursorEffectsEnum.Emoji:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.emojiCursor(options);\n case CursorEffectsEnum.Ghost:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.ghostCursor(options);\n case CursorEffectsEnum.Trailing:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.trailingCursor(options);\n case CursorEffectsEnum.TextFlag:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.textFlag(options);\n case CursorEffectsEnum.FollowingDot:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.followingDotCursor(options);\n case CursorEffectsEnum.Bubbles:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.bubbleCursor(options);\n case CursorEffectsEnum.Snowflake:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.snowflakeCursor(options);\n case CursorEffectsEnum.Clock:\n return cursor_effects__WEBPACK_IMPORTED_MODULE_1__.clockCursor(options);\n }\n}\n/**\n * Класс настроек для шутки \"Красивый курсор\"\n */\nclass CursorEffectsJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n this.effects = {\n /**\n * Радужный след за курсором\n */\n [CursorEffectsEnum.Rainbow]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Длина полосы\n */\n this.length = 20;\n /**\n * Ширина полосы\n */\n this.size = 3;\n /**\n * Цвета полос (сверху вниз)\n */\n this.colors = [\n '#9400D3',\n '#4B0082',\n '#0000FF',\n '#00FF00',\n '#FFFF00',\n '#FF7F00',\n '#FF0000',\n ];\n }\n })(),\n /**\n * Цепочка из эмодзи \"на резинке\" под курсором\n */\n [CursorEffectsEnum.SpringyEmoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Висящий эмодзи\n */\n this.emoji = '🤪';\n }\n })(),\n /**\n * Падающие от курсора эмодзи\n */\n [CursorEffectsEnum.Emoji]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Падающие эмодзи\n */\n this.emoji = ['🔥', '🐬', '🦆'];\n }\n })(),\n /**\n * Падающие от курсора пылинки\n */\n [CursorEffectsEnum.FairyDust]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет пылинок\n */\n this.colors = ['#ff0000', '#00ff00', '#0000ff'];\n }\n })(),\n /**\n * След \"зависших\" курсоров\n */\n [CursorEffectsEnum.Ghost]: new CursorEffectsSetting(),\n /**\n * След курсоров \"на резинке\"\n */\n [CursorEffectsEnum.Trailing]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Количество элементов\n */\n this.particles = 15;\n /**\n * Скорость частиц\n */\n this.rate = 0.4;\n /**\n * Ссылка на картинку с курсором\n * Используйте `null`, что бы использовать картинку курсора по умолчанию\n */\n this.baseImageSrc = null;\n }\n })(),\n /**\n * Текст, развивающийся флагом от курсора\n */\n [CursorEffectsEnum.TextFlag]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Отображаемый текст\n */\n this.text = 'С днём смеха!';\n /**\n * Цвет текста\n */\n this.color = '#000000';\n /**\n * Шрифт текста\n */\n this.font = 'monospace';\n /**\n * Размер текста\n */\n this.textSize = 12;\n /**\n * Растояние между бквами\n */\n this.gap = 14;\n /**\n * Размер... чего-то.\n */\n this.size = 3;\n }\n })(),\n /**\n * Точка, преследующая курсор\n */\n [CursorEffectsEnum.FollowingDot]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет догоняющей точки\n */\n this.color = '#323232a6';\n }\n })(),\n /**\n * Пузырьки от курсора\n */\n [CursorEffectsEnum.Bubbles]: new CursorEffectsSetting(),\n /**\n * Снежинки, летящие от курсора\n *\n * Отключено, потому что сейчас не зима :D\n */\n [CursorEffectsEnum.Snowflake]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n this.weight = 0;\n }\n })(),\n /**\n * Циферблат вокруг курсора\n */\n [CursorEffectsEnum.Clock]: new (class extends CursorEffectsSetting {\n constructor() {\n super(...arguments);\n /**\n * Цвет даты\n */\n this.dateColor = 'blue';\n /**\n * Цвет циферблата\n */\n this.faceColor = 'black';\n /**\n * Цвет секундной стрелки\n */\n this.secondsColor = 'red';\n /**\n * Цвет минутной стрелки\n */\n this.minutesColor = 'black';\n /**\n * Цвет часовой стрелки\n */\n this.hoursColor = 'black';\n }\n })(),\n };\n }\n}\n/**\n * Восстановление класса CursorEffectsLib.DefaultOptions\n */\nclass DefaultOptions {\n}\n/**\n * Класс настроек для курсора\n */\nclass CursorEffectsSetting extends DefaultOptions {\n constructor() {\n super(...arguments);\n /**\n * Флаг возможности срабатывания\n */\n this.enabled = true;\n /**\n * Весовой коэффициент вероятности курсора\n */\n this.weight = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/cursor.ts?"); /***/ }), /***/ "./src/jokes/fresh_grass.ts": /*!**********************************!*\ !*** ./src/jokes/fresh_grass.ts ***! \**********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FreshGrassJoke: () => (/* binding */ FreshGrassJoke),\n/* harmony export */ FreshGrassJokeSettings: () => (/* binding */ FreshGrassJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types/html.d */ \"./src/types/html.d.ts\");\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_html_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _html_joke_fresh_glass_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../html/joke-fresh_glass.html */ \"./src/html/joke-fresh_glass.html\");\n/* harmony import */ var _lib_vector__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../lib/vector */ \"./src/lib/vector.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n\n\n\n\n/**\n * **Свежая трава**\n *\n * Предложение потрогать траву\n * @author Идея: Magia\n * @author Kozhilya\n */\nclass FreshGrassJoke extends _joke__WEBPACK_IMPORTED_MODULE_1__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'fresh_grass';\n this.title = 'Свежая трава';\n this.description = 'Предложение потрогать траву';\n this._settings = new FreshGrassJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_2___default()(() => this.init());\n }\n /**\n * Основная загрузка шутки\n */\n init() {\n const $body = jquery__WEBPACK_IMPORTED_MODULE_2___default()(document.body);\n document.body.style.setProperty('--fresh-grass-body-top', `-${window.scrollY}px`);\n this.container = jquery__WEBPACK_IMPORTED_MODULE_2___default()(_html_joke_fresh_glass_html__WEBPACK_IMPORTED_MODULE_3__[\"default\"]);\n this.container.hide(0);\n $body.append(this.container);\n this.container.fadeIn(500);\n this.fleeingGrass();\n }\n /**\n * Отладка\n * @param {string} str\n */\n debug(str) {\n if (!_common__WEBPACK_IMPORTED_MODULE_5__.debugEnabled)\n return;\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('small', this.container).html(`
${str}
`);\n }\n /**\n * Анимация убегания травы от пользователя\n */\n fleeingGrass() {\n this.movement = new Movement(this.settings);\n const $img = jquery__WEBPACK_IMPORTED_MODULE_2___default()('img.april-fools__joke__fresh-grass__image', this.container);\n $img.on('mousedown', () => {\n this.close();\n });\n jquery__WEBPACK_IMPORTED_MODULE_2___default()(window).on('mousemove', (e) => {\n this.movement.mouse = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(e.clientX - window.innerWidth / 2, e.clientY - window.innerHeight / 2);\n });\n this.intervalIndex = setInterval(() => {\n const img = $img[0].getBoundingClientRect();\n this.movement.step(img);\n // this.debug(this.movement.debugLines.join('\\n'));\n $img.css('transform', this.movement.state.position.toTransform());\n }, Math.floor(1000 * this.movement.dt));\n }\n /**\n * Закрыть окно\n */\n close() {\n clearInterval(this.intervalIndex);\n this.container.fadeOut({\n duration: 500,\n // eslint-disable-next-line\n // @ts-ignore\n complete: () => {\n this.container.remove();\n scrollTo(0, -parseInt(document.body.style.getPropertyValue('--fresh-grass-body-top')));\n },\n });\n }\n}\n/**\n * Класс обработки движения\n */\nclass Movement {\n /**\n * Конструктор\n * @param {FreshGrassJokeSettings} settings\n */\n constructor(settings) {\n this.settings = settings;\n this.state = {\n position: new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(),\n velocity: _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(Math.random() * 2 * Math.PI, Math.random() *\n (this.settings.maxVelocity - this.settings.minVelocity) +\n this.settings.minVelocity),\n acceleration: new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector(),\n };\n this.mouse = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector();\n this.dt = 1.0 / this.settings.tickPerSecond;\n }\n /**\n * Координата движения\n */\n get position() {\n return this.state.position;\n }\n /**\n * Скорость движения\n */\n get velocity() {\n return this.state.velocity;\n }\n /**\n * Ускорение движения\n */\n get acceleration() {\n return this.state.acceleration;\n }\n /**\n * Произвести вычисление\n * @param {DOMRect} img Изображение\n */\n step(img) {\n this.last = this.state;\n this.debugLines = [];\n this.forces = {};\n // Обработка сил\n this.processForces();\n this.processMovement();\n this.processCollisions(img);\n }\n /**\n * Обработка сил\n */\n processForces() {\n // Притяжение к центру\n this.forces.gravity = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.position.angle + Math.PI, this.settings.gravity);\n // Коррекция скорости\n if (this.last.velocity.length < this.settings.minVelocity) {\n this.forces.correction = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.velocity.angle, this.settings.correctionForce *\n Math.pow(this.last.velocity.length - this.settings.minVelocity, 2));\n }\n else if (this.last.velocity.length > this.settings.maxVelocity) {\n this.forces.correction = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(this.last.velocity.angle + Math.PI, this.settings.correctionForce *\n Math.pow(this.last.velocity.length - this.settings.maxVelocity, 2));\n }\n // Отталкивание от мыши\n const toMouseVector = this.mouse.add(this.last.position.reverse());\n if (toMouseVector.length < this.settings.keepDistance &&\n toMouseVector.length > 0) {\n this.forces.running = _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector.fromLengthAngle(toMouseVector.angle + Math.PI, this.settings.mouseForceMax -\n Math.pow(Math.abs(toMouseVector.length / this.settings.keepDistance - 1), this.settings.mouseForcePow));\n }\n }\n /**\n * Обработка движения\n */\n processMovement() {\n // Ускорение\n this.debugLines.push('Forces:');\n let acceleration = new _lib_vector__WEBPACK_IMPORTED_MODULE_4__.Vector();\n for (const [name, force] of Object.entries(this.forces)) {\n acceleration = acceleration.add(force);\n this.debugLines.push(` [${name}] ${force}`);\n }\n acceleration = acceleration.multiply(1 / this.settings.mass);\n this.state = {\n position: this.last.position,\n velocity: this.last.velocity,\n acceleration: acceleration,\n };\n this.state.velocity = this.velocity.add(this.acceleration.multiply(this.dt));\n this.state.position = this.position.add(this.velocity.multiply(this.dt));\n this.debugLines.push(`acceleration: ${this.acceleration}`);\n this.debugLines.push(`velocity: ${this.velocity}`);\n this.debugLines.push(`position: ${this.position}`);\n }\n /**\n * Обработка столкновения с границами окна\n * @param {DOMRect} img Изображение\n */\n processCollisions(img) {\n const limitX = (window.innerWidth - img.width) / 2;\n const limitY = (window.innerHeight - img.height) / 2;\n if (this.position.x < -limitX) {\n // Left\n this.position.x = -2 * limitX - this.position.x;\n this.velocity.x = -this.velocity.x * this.settings.collisionElasticity;\n }\n if (this.position.x > limitX) {\n // Right\n this.position.x = 2 * limitX - this.position.x;\n this.velocity.x = -this.velocity.x * this.settings.collisionElasticity;\n }\n if (this.position.y < -limitY) {\n // Top\n this.position.y = -2 * limitY - this.position.y;\n this.velocity.y = -this.velocity.y * this.settings.collisionElasticity;\n }\n if (this.position.y > limitY) {\n // Bottom\n this.position.y = 2 * limitY - this.position.y;\n this.velocity.y = -this.velocity.y * this.settings.collisionElasticity;\n }\n }\n /**\n * Нормально распределённая случайная величина\n * @param {number} mean\n * @param {number} stdev\n * @return {number}\n * @private\n */\n randomGaussian(mean = 0, stdev = 1) {\n const u = 1 - Math.random(); // Converting [0,1) to (0,1]\n const v = Math.random();\n const z = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n // Transform to the desired mean and standard deviation:\n return z * stdev + mean;\n }\n}\n/**\n * Класс настроек для шутки \"Свежая трава\"\n */\nclass FreshGrassJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n /**\n * Расстояние, на котором трава начнёт убегать\n */\n this.keepDistance = 200;\n /**\n * Максимальная скорость картинки (в пикселях в секунду)\n */\n this.maxVelocity = 500;\n /**\n * Минимальная скорость картинки (в пикселях в секунду)\n */\n this.minVelocity = 20;\n /**\n * Количество отметок времени за секунду\n */\n this.tickPerSecond = 50;\n this.gravity = 20;\n this.correctionForce = 0.8;\n this.mouseForceMax = 5000;\n this.mouseForcePow = 5;\n this.mass = 1;\n this.collisionElasticity = 0.9;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/fresh_grass.ts?"); /***/ }), /***/ "./src/jokes/humanitarian_hell.ts": /*!****************************************!*\ !*** ./src/jokes/humanitarian_hell.ts ***! \****************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HumanitarianHellJoke: () => (/* binding */ HumanitarianHellJoke),\n/* harmony export */ HumanitarianHellJokeSettings: () => (/* binding */ HumanitarianHellJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Ад гуманитария**\n *\n * Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"\n *\n * @author Kozhilya\n */\nclass HumanitarianHellJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'humanitarian_hell';\n this.title = 'Ад гуманитария';\n this.description = 'Все \"тся\" заменяются на \"ться\", а все \"ться\" на \"тся\"';\n this._settings = new HumanitarianHellJokeSettings();\n }\n /**\n * Обработка текста\n *\n * @param {string} text Входная строка\n * @return {string} Итоговая строка\n */\n processText(text) {\n return text.replace(/(ть?ся)/g, function (fnd) {\n return fnd.indexOf('ь') > 0 ? 'тся' : 'ться';\n });\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, elem) => {\n elem.textContent = this.processText(elem.textContent);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Ад гуманитария\"\n */\nclass HumanitarianHellJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/humanitarian_hell.ts?"); /***/ }), /***/ "./src/jokes/inverted_scroll.ts": /*!**************************************!*\ !*** ./src/jokes/inverted_scroll.ts ***! \**************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ InvertedScrollJoke: () => (/* binding */ InvertedScrollJoke),\n/* harmony export */ InvertedScrollJokeSettings: () => (/* binding */ InvertedScrollJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n\n/**\n * **Обратная гравитация**\n *\n * Скролл в обратную сторону (крутишь вверх, а крутится вниз)\n *\n * @author Идея: Alex_63\n * @author Реализация: Kozhilya\n */\nclass InvertedScrollJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'inverted_scroll';\n this.title = 'Обратная гравитация';\n this.description = 'Скролл в обратную сторону';\n this._settings = new InvertedScrollJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n // let lastScroll = window.scrollY;\n document.addEventListener('wheel', (e) => {\n e.preventDefault();\n scrollBy(0, -e.deltaY);\n }, { passive: false });\n }\n}\n/**\n * Класс настроек для шутки \"Обратная гравитация\"\n */\nclass InvertedScrollJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/inverted_scroll.ts?"); /***/ }), /***/ "./src/jokes/latinization.ts": /*!***********************************!*\ !*** ./src/jokes/latinization.ts ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LatinizationJoke: () => (/* binding */ LatinizationJoke),\n/* harmony export */ LatinizationJokeSettings: () => (/* binding */ LatinizationJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Латинизация**\n *\n * Все символы на странице или только в постах или еще где-то местами -\n * латиницей вместо кириллицы и наоборот\n *\n * @author Идея: Alex_63\n * @author Kozhilya\n */\nclass LatinizationJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'latinization';\n this.title = 'Латинизация';\n this.description = 'Все символы на странице или только в постах ' +\n 'или еще где-то местами - латиницей вместо кириллицы и наоборот';\n this._settings = new LatinizationJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n /**\n * Латинизация или кириллизация слова\n * @param {string} word\n * @return {string}\n * @private\n */\n latinize(word) {\n if (/[а-яА-ЯёЁ0-9_-]+/.test(word)) {\n // Кириллица в латиницу\n for (const [ru, en] of Object.entries(this.settings.ruToEn)) {\n word = word.replace(new RegExp(ru, 'g'), en).\n replace(new RegExp(ru.toUpperCase(), 'gi'), en.toUpperCase());\n }\n }\n else if (/[a-zA-Z0-9_-]+/.test(word)) {\n // Латиница в кириллицу\n for (const [en, ru] of Object.entries(this.settings.enToRu)) {\n word = word.replace(new RegExp(en, 'g'), ru).\n replace(new RegExp(en.toUpperCase(), 'gi'), ru.toUpperCase());\n }\n }\n return word;\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.latinize(word));\n }\n}\n/**\n * Класс настроек для шутки \"Латинизация\"\n */\nclass LatinizationJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 10;\n /**\n * Селектор, в котором может изменяться текст\n */\n this.selector = '.post-content';\n /**\n * Правила преобразования из кириллицы в латиницу\n */\n this.ruToEn = {\n 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',\n 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',\n 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',\n 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',\n 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch',\n 'ш': 'sh', 'щ': 'shch', 'ъ': 'ie', 'ы': 'y', 'ь': '',\n 'э': 'e', 'ю': 'u', 'я': 'ya',\n };\n /**\n * Правила преобразования из латиницы в кириллицу\n */\n this.enToRu = {\n 'a': 'а', 'b': 'б', 'c': 'с', 'd': 'д', 'e': 'е',\n 'f': 'ф', 'gh': 'ж', 'g': 'г', 'h': 'х', 'i': 'и',\n 'j': 'й', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н',\n 'o': 'о', 'p': 'п', 'q': 'кью', 'r': 'р', 's': 'с',\n 't': 'т', 'u': 'ю', 'v': 'в', 'w': 'в', 'x': 'кс',\n 'y': 'ы', 'z': 'з',\n };\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/latinization.ts?"); /***/ }), /***/ "./src/jokes/letter_chaos.ts": /*!***********************************!*\ !*** ./src/jokes/letter_chaos.ts ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LetterChaosJoke: () => (/* binding */ LetterChaosJoke),\n/* harmony export */ LetterChaosJokeSettings: () => (/* binding */ LetterChaosJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n\n/**\n * **Буквенный хаос**\n *\n * Все буквы в словах, кроме первой и последней, перемешены\n *\n * @author Kozhilya\n */\nclass LetterChaosJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'letter_chaos';\n this.title = 'Буквенный хаос';\n this.description = 'Все буквы в словах, кроме первой и последней, перемешены';\n this._settings = new LetterChaosJokeSettings();\n this.punctuationSymbols = null;\n }\n /**\n * Перемешивание букв в словах\n * @param {string} word\n * @return {string}\n * @private\n */\n shuffleLetters(word) {\n if (word.length < 3 || !this.check(this.settings.shuffle_chance)) {\n return word;\n }\n const characters = word.split('');\n const middleCharacters = characters.slice(1, -1);\n for (let i = middleCharacters.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [middleCharacters[i], middleCharacters[j]] = [\n middleCharacters[j],\n middleCharacters[i],\n ];\n }\n return [\n characters[0],\n ...middleCharacters,\n characters[characters.length - 1],\n ].join('');\n }\n /**\n * Обработка текстовой ноды\n * @param {Text} node\n * @private\n */\n processNode(node) {\n var _a;\n node.textContent = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.replace(/([А-Яа-яA-Za-z]+)/gm, (_, word) => this.shuffleLetters(word));\n }\n /**\n * Запуск шутки\n */\n start() {\n const textNodes = (0,_common__WEBPACK_IMPORTED_MODULE_1__.getTextNodes)(this.settings.selector);\n textNodes.each((_, node) => this.processNode(node));\n }\n}\n/**\n * Класс настроек для шутки \"Буквенный хаос\"\n */\nclass LetterChaosJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 20;\n /**\n * Селектор всех элементов, которые будут затронуты\n */\n this.selector = '.post-content';\n /**\n * Вероятность того, что буквы будут перемешаны\n */\n this.shuffle_chance = 50;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/letter_chaos.ts?"); /***/ }), /***/ "./src/jokes/mirror.ts": /*!*****************************!*\ !*** ./src/jokes/mirror.ts ***! \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MirrorJoke: () => (/* binding */ MirrorJoke),\n/* harmony export */ MirrorJokeSettings: () => (/* binding */ MirrorJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Зеркало**\n *\n * Элементы форума отражаются (по крайней мере, пытаются)\n *\n * @author Kozhilya\n */\nclass MirrorJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'mirror';\n this.title = 'Зеркало';\n this.description = 'Элементы форума отражаются (по крайней мере, пытаются)';\n this._settings = new MirrorJokeSettings();\n }\n /**\n * Запуск шутки\n */\n start() {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post, .post h3, .post-links, .post-author, .post-content')\n .css('transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('-moz-transform', 'scaleX(-1)')\n .css('filter', 'FlipH')\n .css('-ms-filter', '\"FlipH\"');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-links, .post-links ul, .post h3 span').css('margin-left', '0');\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post h3 span').css('margin-right', '25em');\n }\n}\n/**\n * Класс настроек для шутки \"Зеркало\"\n */\nclass MirrorJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 30;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/mirror.ts?"); /***/ }), /***/ "./src/jokes/shake.ts": /*!****************************!*\ !*** ./src/jokes/shake.ts ***! \****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ShakeJoke: () => (/* binding */ ShakeJoke),\n/* harmony export */ ShakeJokeSettings: () => (/* binding */ ShakeJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n\n\n/**\n * **Форумо-трясение**\n *\n * Страница форума начинает трястись\n *\n * @author Kozhilya\n */\nclass ShakeJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.StoppableJoke {\n constructor() {\n super(...arguments);\n this.id = 'shake';\n this.title = 'Форумо-трясение';\n this.description = 'Страница форума начинает трястись';\n this._settings = new ShakeJokeSettings();\n this.dataName = 'april-fools-shake';\n }\n /**\n * Выбор случайной амплитуды\n * @param {number} a\n * @return {number}\n */\n rand(a) {\n return a + this.settings.force * (Math.random() * 2 - 1);\n }\n /**\n * Запуск шутки\n */\n start() {\n this.items = jquery__WEBPACK_IMPORTED_MODULE_1___default()(this.settings.selector);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n data[d] = parseInt(jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d));\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n this.intervalId = setInterval(() => {\n this.items.each((_, elem) => {\n const data = jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName);\n for (const entry of Object.entries(data)) {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + entry[0], this.rand(entry[1]));\n }\n });\n }, this.settings.interval);\n }\n /**\n * Остновка шутки\n */\n stop() {\n clearInterval(this.intervalId);\n this.items.each((_, elem) => {\n const data = {};\n this.settings.directions.forEach((d) => {\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).css('margin-' + d, data[d]);\n });\n jquery__WEBPACK_IMPORTED_MODULE_1___default()(elem).data(this.dataName, data);\n });\n }\n}\n/**\n * Класс настроек для шутки \"Форумо-трясение\"\n */\nclass ShakeJokeSettings {\n constructor() {\n this.enabled = false;\n this.chance = 1;\n /**\n * Направление тряски (тряска происходит путём изменения перечисленных\n * направлений margin на значение ±force от стандартного значения)\n */\n this.directions = ['top', 'left', 'bottom', 'left'];\n /**\n * Сила тряски - насколько отклоняется элемент от стандартного значения\n */\n this.force = 0.5;\n /**\n * Селектор всех элементов, которые будут трястись\n */\n this.selector = '[id^=pun]';\n /**\n * Частота тряски\n */\n this.interval = 100;\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/shake.ts?"); /***/ }), /***/ "./src/jokes/stupid_title.ts": /*!***********************************!*\ !*** ./src/jokes/stupid_title.ts ***! \***********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BuildStupidTitleVariant: () => (/* binding */ BuildStupidTitleVariant),\n/* harmony export */ StupidTitleJoke: () => (/* binding */ StupidTitleJoke),\n/* harmony export */ StupidTitleJokeSettings: () => (/* binding */ StupidTitleJokeSettings)\n/* harmony export */ });\n/* harmony import */ var _joke__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../joke */ \"./src/joke.ts\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/stupid_title_variants */ \"./src/data/stupid_title_variants.ts\");\n\n\n\n/**\n * **Глупые статусы**\n *\n * Каждому пользователю даётся новый глупый статус\n *\n * @author Kozhilya\n */\nclass StupidTitleJoke extends _joke__WEBPACK_IMPORTED_MODULE_0__.Joke {\n constructor() {\n super(...arguments);\n this.id = 'stupid_title';\n this.title = 'Глупые статусы';\n this.description = 'Каждому пользователю даётся новый глупый статус';\n this._settings = new StupidTitleJokeSettings();\n this.loadedGenders = null;\n this.variantsGenerated = false;\n this.seed = 0;\n }\n /**\n * Загрузка полов, если они не определены\n */\n async loadGenders() {\n var _a;\n const names = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a').\n map((_, elem) => elem.innerText).\n toArray().\n reduce((arr, name) => {\n if (arr.indexOf(name) < 0) {\n arr.push(name);\n }\n return arr;\n }, []);\n const url = '/api.php?' +\n jquery__WEBPACK_IMPORTED_MODULE_1___default().param({ method: 'users.get', fields: 'username,sex', username: names });\n const response = await fetch(url);\n const json = await response.json();\n this.loadedGenders = {};\n if (json.error) {\n return;\n }\n (_a = json.response) === null || _a === void 0 ? void 0 : _a.users.forEach((element) => {\n if (element.sex === '0') {\n return;\n }\n this.loadedGenders[element.username] = element.sex === '1';\n });\n }\n /**\n * Разрешение пола по имени\n * @param {string} name\n * @return {boolean}\n */\n resolveGender(name) {\n if (this.settings.gender_resolver !== null) {\n return !!this.settings.gender_resolver.call(this, name);\n }\n if (name in this.loadedGenders) {\n return !!this.loadedGenders[name];\n }\n this.resetSeed();\n return this.selectRandom(name, { m: 1, f: 1 }) === 'm';\n }\n /**\n * Запуск шутки\n */\n async start() {\n if (!this.variantsGenerated) {\n (0,_data_stupid_title_variants__WEBPACK_IMPORTED_MODULE_2__.StupidTitleDefaultVariants)(this.settings.variants);\n this.variantsGenerated = true;\n }\n await this.loadGenders();\n const cache = {};\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.post-author').each((_, root) => {\n const name = jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-author a', root).text();\n if (!name) {\n return;\n }\n if (!(name in cache)) {\n this.resetSeed();\n cache[name] = this.generatePhrase(name);\n }\n jquery__WEBPACK_IMPORTED_MODULE_1___default()('.pa-title', root).text(cache[name]);\n });\n }\n /**\n * Сгенерировать фразу\n * @param {string} name Имя, кому необходимо сгенерировать фразу\n * @return {string} Итоговая фраза\n */\n generatePhrase(name) {\n const gender = this.resolveGender(name);\n const phrase = this.selectRandom(name, this.settings.schemas);\n return this.capitalizeFirst(phrase.replace(/\\{(.+?)}/g, (_, type) => {\n const variants = this.buildVariants(type, gender);\n return this.selectRandom(name, variants);\n }));\n }\n /**\n * Функция хеширования\n *\n * https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js\n *\n * cyrb53 (c) 2018 bryc (github.com/bryc)\n * A fast and simple hash function with decent collision resistance.\n * Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n * Public domain. Attribution appreciated.\n *\n * @param {string} name Имя\n * @param {number} seed Зерно случайности\n * @param {limit} limit Максимальное значение\n * @return {number} Хеш-значение\n * @private\n */\n prng(name, seed, limit) {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < name.length; i++) {\n ch = name.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^\n Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^\n Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n const value = 4294967296 * (2097151 & h2) + (h1 >>> 0);\n return Math.floor(Math.pow(Math.sin(value), 2) * limit) % limit;\n }\n /**\n * Сброс зерна случайности\n * @private\n */\n resetSeed() {\n const date = new Date();\n const time = date.getUTCHours() * 60 + date.getUTCMinutes();\n if (this.settings.change_frequency === 0) {\n this.seed = time * 60 + date.getUTCSeconds();\n return;\n }\n this.seed = Math.floor(time / this.settings.change_frequency);\n }\n /**\n * Выбор случайного слова\n * @param {string} name\n * @param {StupidTitleWeightedVariants} variants\n * @return {string}\n * @private\n */\n selectRandom(name, variants) {\n const elements = Object.keys(variants);\n const totalWeight = elements.reduce((sum, element) => sum + variants[element], 0);\n const randomWeight = this.prng(name, this.seed++, totalWeight);\n let currentWeight = 0;\n for (const element of elements) {\n currentWeight += variants[element];\n if (randomWeight <= currentWeight) {\n return element;\n }\n }\n throw new Error('Тебя быть тут не должно...');\n }\n /**\n * Выбор случайной фразы\n * @param {string} type\n * @param {boolean} gender\n * @return {StupidTitleWeightedVariants}\n * @private\n */\n buildVariants(type, gender) {\n const result = {};\n const variants = this.settings.variants[type];\n for (const iterator of Object.entries(variants)) {\n const word = iterator[0];\n const wordSettings = iterator[1];\n if (!wordSettings.enabled || wordSettings.gender === !gender) {\n continue;\n }\n if (!this.settings.rude && wordSettings.rude) {\n continue;\n }\n result[word] = wordSettings.weight;\n }\n return result;\n }\n /**\n * Сделать первую буква слова заглавной\n * @param {string} str Слово\n * @return {string} Исправленное слово\n * @private\n */\n capitalizeFirst(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n}\n/**\n * Класс настроек для шутки \"Глупые статусы\"\n */\nclass StupidTitleJokeSettings {\n constructor() {\n this.enabled = true;\n this.chance = 100;\n /**\n * Определение пола по имени.\n * По умолчанию род устанавливается случайным образом\n *\n * Если установлено значение `null`, система попытается загрузить пол,\n * установленный в настройках аккаунта. Если этот пол определить невозможно,\n * то он будет выбран случайно. Эта настройка позволяет изменить это\n * поведение, если ваш форум обладает ролевой системой, в которой пол\n * определяется иным образом.\n */\n this.gender_resolver = null;\n /**\n * Разрешить возможно оскорбительные варианты\n */\n this.rude = false;\n /**\n * Частота смены статусов (в минутах)\n * Установите значение 0, что бы обновление происходило при\n * каждом обновлении страницы\n */\n this.change_frequency = 5;\n /**\n * Разрешённые схемы формирования статусов\n *\n * {adj} - прилагательное\n * {noun} - имя существительно\n * {verb} - глагол\n * {adv} - наречие\n * {place} - дополнение места\n * {p} - знак препинания\n */\n this.schemas = {\n '{adj} {noun}{p}': 10,\n '{noun} {adj}{p}': 3,\n '{adj}, {adj} {noun}{p}': 10,\n '{adj} и очень {adj} {noun}{p}': 10,\n '{adj} {noun} {verb}{p}': 10,\n '{adj} {noun} {adv} {verb}{p}': 5,\n '{adj} {noun} {verb} {place}{p}': 5,\n '{adj} {noun} {adv} {verb} {place}{p}': 5,\n };\n /**\n * Вариант слов\n * Смотрите раздел описания скрипта, что бы настроить это поле\n */\n this.variants = {\n adj: {},\n noun: {},\n verb: {},\n place: {},\n adv: {},\n p: {\n '': new StupidTitleSetting({ weight: 15 }),\n '.': new StupidTitleSetting({ weight: 10 }),\n '...': new StupidTitleSetting({ weight: 5 }),\n '!': new StupidTitleSetting({ weight: 5 }),\n '!!!': new StupidTitleSetting({ weight: 2 }),\n '?': new StupidTitleSetting({ weight: 2 }),\n '?!': new StupidTitleSetting({ weight: 1 }),\n },\n };\n }\n}\n/**\n * Класс настройки\n */\nclass StupidTitleSetting {\n /**\n * Создание класса\n * @param {StupidTitleSettingInitializer} options\n */\n constructor(options) {\n var _a, _b, _c, _d;\n this.weight = 10;\n this.enabled = true;\n this.rude = false;\n this.gender = null;\n (_a = this.weight) !== null && _a !== void 0 ? _a : (this.weight = options.weight);\n (_b = this.enabled) !== null && _b !== void 0 ? _b : (this.enabled = options.enabled);\n (_c = this.rude) !== null && _c !== void 0 ? _c : (this.rude = options.rude);\n (_d = this.gender) !== null && _d !== void 0 ? _d : (this.gender = options.gender);\n }\n}\n/**\n * Метод создания списка слов\n * @param {boolean | null} gender\n * @param {string} input\n * @return {StupidTitleVariant}\n * @constructor\n */\nfunction BuildStupidTitleVariant(gender, input) {\n const result = {};\n const words = input.split(',').map((word) => word.trim());\n words.forEach((word) => {\n const cleanWord = word.replace(/[^А-ЯЁа-яёA-Za-z\\- ]/g, '');\n if (cleanWord === '') {\n return;\n }\n result[cleanWord] = new StupidTitleSetting({\n gender,\n rude: word.indexOf('$') >= 0,\n enabled: word.indexOf('!') < 0,\n weight: 10 *\n (word.indexOf('$') >= 0 ? 0.5 : 1) *\n (word.indexOf('%') >= 0 ? 0.5 : 1) *\n (word.indexOf('^') >= 0 ? 2 : 1),\n });\n });\n return result;\n}\nwindow.BuildStupidTitleVariant = BuildStupidTitleVariant;\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/jokes/stupid_title.ts?"); /***/ }), /***/ "./src/lib/vector.ts": /*!***************************!*\ !*** ./src/lib/vector.ts ***! \***************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Vector: () => (/* binding */ Vector)\n/* harmony export */ });\n/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common */ \"./src/common.ts\");\n\n/**\n * Класс вектора\n */\nclass Vector {\n /**\n * Конструктор вектора\n * @param {number} x Координата X\n * @param {number} y Координата Y\n */\n constructor(x = 0, y = 0) {\n this.x = x;\n this.y = y;\n }\n /**\n * Угол наклона вектора\n */\n get angle() {\n return Math.atan2(this.y, this.x);\n }\n /**\n * Угол наклона вектора\n * @param {number} angle\n */\n set angle(angle) {\n const length = this.length;\n this.x = Math.cos(angle) * length;\n this.y = Math.sin(angle) * length;\n }\n /**\n * Длина вектора\n */\n get length() {\n return Math.distance(this.x, this.y);\n }\n /**\n * Длина вектора\n * @param {number} length\n */\n set length(length) {\n const angle = this.angle;\n this.x = Math.cos(angle) * length;\n this.y = Math.sin(angle) * length;\n }\n /**\n * Сумма векторов\n * @param {Vector} a Первый вектор\n * @param {Vector} b Второй вектор\n * @return {Vector} Вектор суммы\n */\n static addVectors(a, b) {\n return new Vector(a.x + b.x, a.y + b.y);\n }\n /**\n * Скалярное умножение векторов\n * @param {Vector} a Первый вектор\n * @param {Vector} b Второй вектор\n * @return {number} Скалярное произведение векторов\n */\n static dotProduct(a, b) {\n return a.x * b.x + a.y * b.y;\n }\n /**\n * Создать вектор по углу наклона и длине\n * @param {number} angle Угол наклона\n * @param {number} length Длина\n * @return {Vector} Вектор суммы\n */\n static fromLengthAngle(angle, length) {\n const v = new Vector();\n v.length = length;\n v.angle = angle;\n return v;\n }\n /**\n * Нахождение противоположного вектора\n * @return {Vector} Противоположный вектор\n */\n reverse() {\n return new Vector(-this.x, -this.y);\n }\n /**\n * Прибавить вектор\n * @param {Vector} a Второе слагаемое\n * @return {Vector} Вектор суммы\n */\n add(a) {\n return Vector.addVectors(this, a);\n }\n /**\n * Умножение вектора на число\n * @param {number} a Скаляр\n * @return {Vector} Вектор-результат\n */\n multiply(a) {\n return new Vector(a * this.x, a * this.y);\n }\n /**\n * Преобразование в CSS-преобразование\n * @return {string} CSS-преобразование\n */\n toTransform() {\n return `translate(${this.x}px, ${this.y}px)`;\n }\n /**\n * Строковое представление\n * @return {string}\n */\n toString() {\n return (0,_common__WEBPACK_IMPORTED_MODULE_0__.d2) `Vector(x=${this.x}, y=${this.y}, ` +\n (0,_common__WEBPACK_IMPORTED_MODULE_0__.d2) `length=${this.length}, angle=${this.angle})`;\n }\n}\nMath.distance = (x, y) => Math.sqrt(x * x + y * y);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/lib/vector.ts?"); /***/ }), /***/ "./src/main.ts": /*!*********************!*\ !*** ./src/main.ts ***! \*********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _joker__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./joker */ \"./src/joker.ts\");\n/* harmony import */ var _jokes_shake__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jokes/shake */ \"./src/jokes/shake.ts\");\n/* harmony import */ var _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./jokes/humanitarian_hell */ \"./src/jokes/humanitarian_hell.ts\");\n/* harmony import */ var _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./jokes/mirror */ \"./src/jokes/mirror.ts\");\n/* harmony import */ var _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./jokes/carnival */ \"./src/jokes/carnival.ts\");\n/* harmony import */ var _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./jokes/crazy_letters */ \"./src/jokes/crazy_letters.ts\");\n/* harmony import */ var _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./jokes/letter_chaos */ \"./src/jokes/letter_chaos.ts\");\n/* harmony import */ var _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./jokes/cursor */ \"./src/jokes/cursor.ts\");\n/* harmony import */ var _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./jokes/stupid_title */ \"./src/jokes/stupid_title.ts\");\n/* harmony import */ var _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./jokes/inverted_scroll */ \"./src/jokes/inverted_scroll.ts\");\n/* harmony import */ var _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./jokes/latinization */ \"./src/jokes/latinization.ts\");\n/* harmony import */ var _jokes_fresh_grass__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./jokes/fresh_grass */ \"./src/jokes/fresh_grass.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nwindow.AprilJokes = ((jokes) => {\n const cl = new _joker__WEBPACK_IMPORTED_MODULE_0__.JokerClass();\n jokes.forEach((CustomJoke) => {\n cl.add(new CustomJoke());\n });\n $(() => cl.regularStart());\n return cl;\n})([\n _jokes_shake__WEBPACK_IMPORTED_MODULE_1__.ShakeJoke,\n _jokes_humanitarian_hell__WEBPACK_IMPORTED_MODULE_2__.HumanitarianHellJoke,\n _jokes_mirror__WEBPACK_IMPORTED_MODULE_3__.MirrorJoke,\n _jokes_carnival__WEBPACK_IMPORTED_MODULE_4__.CarnivalJoke,\n _jokes_crazy_letters__WEBPACK_IMPORTED_MODULE_5__.CrazyLettersJoke,\n _jokes_letter_chaos__WEBPACK_IMPORTED_MODULE_6__.LetterChaosJoke,\n _jokes_cursor__WEBPACK_IMPORTED_MODULE_7__.CursorEffectsJoke,\n _jokes_stupid_title__WEBPACK_IMPORTED_MODULE_8__.StupidTitleJoke,\n _jokes_inverted_scroll__WEBPACK_IMPORTED_MODULE_9__.InvertedScrollJoke,\n _jokes_latinization__WEBPACK_IMPORTED_MODULE_10__.LatinizationJoke,\n _jokes_fresh_grass__WEBPACK_IMPORTED_MODULE_11__.FreshGrassJoke,\n]);\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/main.ts?"); /***/ }), /***/ "./src/ui.ts": /*!*******************!*\ !*** ./src/ui.ts ***! \*******************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ JokerUI: () => (/* binding */ JokerUI)\n/* harmony export */ });\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/html.d */ \"./src/types/html.d.ts\");\n/* harmony import */ var _types_html_d__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_types_html_d__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types/mybb.d */ \"./src/types/mybb.d.ts\");\n/* harmony import */ var _types_mybb_d__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_types_mybb_d__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jquery */ \"jquery\");\n/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _html_button_html__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./html/button.html */ \"./src/html/button.html\");\n/* harmony import */ var _html_styles_html__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./html/styles.html */ \"./src/html/styles.html\");\n/* harmony import */ var _html_window_html__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./html/window.html */ \"./src/html/window.html\");\n\n\n\n\n\n\n/**\n * Класс интерфейса настроек\n */\nclass JokerUI {\n /**\n * Создание класса интерфейса настроек\n *\n * @param {JokerClass} joker\n */\n constructor(joker) {\n this.joker = joker;\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('link[rel=\"stylesheet\"]').eq(0).before(_html_styles_html__WEBPACK_IMPORTED_MODULE_4__[\"default\"]);\n const button = this.button;\n button.hide();\n button.mybbModal({\n title: 'Настройки первоапрельских шуток',\n content: () => this.render(),\n closer: true,\n noscroll: true,\n escClose: true,\n });\n }\n /**\n * Основная кнопка, открывающая настройки\n * @return {JQuery}\n */\n get button() {\n let button = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__button');\n if (button.length === 0) {\n button = jquery__WEBPACK_IMPORTED_MODULE_2___default()(_html_button_html__WEBPACK_IMPORTED_MODULE_3__[\"default\"]).appendTo('body');\n }\n return button;\n }\n /**\n * Показать кнопку настроек\n */\n show() {\n this.button.show();\n }\n /**\n * Создать окно настроек\n * @return {JQuery}\n */\n render() {\n const result = jquery__WEBPACK_IMPORTED_MODULE_2___default()('
').html(_html_window_html__WEBPACK_IMPORTED_MODULE_5__[\"default\"]);\n const rowTemplate = jquery__WEBPACK_IMPORTED_MODULE_2___default()('#april-fools__window-row', result).html();\n const jokeContainer = jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__jokes', result);\n for (const joke of Object.values(this.joker.jokes)) {\n const row = jquery__WEBPACK_IMPORTED_MODULE_2___default()(eval('`' + rowTemplate + '`'));\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('input[type=\"checkbox\"]', row)\n .prop('checked', joke.settings.enabled)\n .on('click', (e) => {\n const target = e.currentTarget;\n this.joker.toggleJoke(joke.id, target.checked);\n });\n jokeContainer.append(row);\n }\n jquery__WEBPACK_IMPORTED_MODULE_2___default()('button', result).on('click', async () => {\n await this.joker.clearUserStates();\n window.location.reload();\n });\n return jquery__WEBPACK_IMPORTED_MODULE_2___default()('.april-fools__content', result);\n }\n}\n\n\n//# sourceURL=webpack://mybb-april-fools/./src/ui.ts?"); /***/ }), /***/ "jquery": /*!*************************!*\ !*** external "jQuery" ***! \*************************/ /***/ ((module) => { "use strict"; module.exports = jQuery; /***/ }), /***/ "./node_modules/cursor-effects/dist/esm.js": /*!*************************************************!*\ !*** ./node_modules/cursor-effects/dist/esm.js ***! \*************************************************/ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { "use strict"; eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ bubbleCursor: () => (/* binding */ h),\n/* harmony export */ characterCursor: () => (/* binding */ i),\n/* harmony export */ clockCursor: () => (/* binding */ r),\n/* harmony export */ emojiCursor: () => (/* binding */ c),\n/* harmony export */ fairyDustCursor: () => (/* binding */ e),\n/* harmony export */ followingDotCursor: () => (/* binding */ s),\n/* harmony export */ ghostCursor: () => (/* binding */ l),\n/* harmony export */ rainbowCursor: () => (/* binding */ a),\n/* harmony export */ snowflakeCursor: () => (/* binding */ n),\n/* harmony export */ springyEmojiCursor: () => (/* binding */ t),\n/* harmony export */ textFlag: () => (/* binding */ d),\n/* harmony export */ trailingCursor: () => (/* binding */ o)\n/* harmony export */ });\nfunction t(t){let e,n,i,o,s=t&&t.emoji||\"🤪\",h=t&&t.element,c=h||document.body,l=window.innerWidth,a=window.innerHeight,r={x:l/2,y:l/2},d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",h?(e.style.position=\"absolute\",c.appendChild(e),e.width=c.clientWidth,e.height=c.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=l,e.height=a),n.font=\"16px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\";let t=n.measureText(s),i=document.createElement(\"canvas\"),r=i.getContext(\"2d\");i.width=t.width,i.height=2*t.actualBoundingBoxAscent,r.textAlign=\"center\",r.font=\"16px serif\",r.textBaseline=\"middle\",r.fillText(s,i.width/2,t.actualBoundingBoxAscent),o=i;let A=0;for(A=0;A<7;A++)d[A]=new x(o);c.addEventListener(\"mousemove\",f),c.addEventListener(\"touchmove\",g,{passive:!0}),c.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),p()}function m(t){l=window.innerWidth,a=window.innerHeight,h?(e.width=c.clientWidth,e.height=c.clientHeight):(e.width=l,e.height=a)}function g(t){if(t.touches.length>0)if(h){const e=c.getBoundingClientRect();r.x=t.touches[0].clientX-e.left,r.y=t.touches[0].clientY-e.top}else r.x=t.touches[0].clientX,r.y=t.touches[0].clientY}function f(t){if(h){const e=c.getBoundingClientRect();r.x=t.clientX-e.left,r.y=t.clientY-e.top}else r.x=t.clientX,r.y=t.clientY}function p(){!function(){e.width=e.width,d[0].position.x=r.x,d[0].position.y=r.y;for(let t=1;t<7;t++){let i=new v(0,0);t>0&&w(t-1,t,i),t<6&&w(t+1,t,i);let o,s,h=new v(10*-d[t].velocity.x,10*-d[t].velocity.y),c=new v((i.X+h.X)/1,(i.Y+h.Y)/1+50);d[t].velocity.x+=.01*c.X,d[t].velocity.y+=.01*c.Y,Math.abs(d[t].velocity.x)<.1&&Math.abs(d[t].velocity.y)<.1&&Math.abs(c.X)<.1&&Math.abs(c.Y)<.1&&(d[t].velocity.x=0,d[t].velocity.y=0),d[t].position.x+=d[t].velocity.x,d[t].position.y+=d[t].velocity.y,o=e.clientHeight,s=e.clientWidth,d[t].position.y>=o-11-1&&(d[t].velocity.y>0&&(d[t].velocity.y=.7*-d[t].velocity.y),d[t].position.y=o-11-1),d[t].position.x>=s-11&&(d[t].velocity.x>0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=s-11-1),d[t].position.x<0&&(d[t].velocity.x<0&&(d[t].velocity.x=.7*-d[t].velocity.x),d[t].position.x=0),d[t].draw(n)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),c.removeEventListener(\"mousemove\",f),c.removeEventListener(\"touchmove\",g),c.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function v(t,e){this.X=t,this.Y=e}function w(t,e,n){let i=d[t].position.x-d[e].position.x,o=d[t].position.y-d[e].position.y,s=Math.sqrt(i*i+o*o);if(s>10){let t=10*(s-10);n.X+=i/s*t,n.Y+=o/s*t}}function x(t){this.position={x:r.x,y:r.y},this.velocity={x:0,y:0},this.canv=t,this.draw=function(t){t.drawImage(this.canv,this.position.x-this.canv.width/2,this.position.y-this.canv.height/2,this.canv.width,this.canv.height)}}return u.onchange=()=>{u.matches?y():A()},A(),{destroy:y}}function e(t){let e=t&&t.colors||[\"#D61C59\",\"#E7D84B\",\"#1B8798\"],n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2},l=[],a=[];let r,d,u;const A=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function m(){if(A.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;r=document.createElement(\"canvas\"),d=r.getContext(\"2d\"),r.style.top=\"0px\",r.style.left=\"0px\",r.style.pointerEvents=\"none\",n?(r.style.position=\"absolute\",i.appendChild(r),r.width=i.clientWidth,r.height=i.clientHeight):(r.style.position=\"fixed\",i.appendChild(r),r.width=o,r.height=s),d.font=\"21px serif\",d.textBaseline=\"middle\",d.textAlign=\"center\",e.forEach((t=>{let e=d.measureText(\"*\"),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=e.actualBoundingBoxAscent+e.actualBoundingBoxDescent,i.fillStyle=t,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(\"*\",n.width/2,e.actualBoundingBoxAscent),a.push(n)})),i.addEventListener(\"mousemove\",p),i.addEventListener(\"touchmove\",f,{passive:!0}),i.addEventListener(\"touchstart\",f,{passive:!0}),window.addEventListener(\"resize\",g),v()}function g(t){o=window.innerWidth,s=window.innerHeight,n?(r.width=i.clientWidth,r.height=i.clientHeight):(r.width=o,r.height=s)}function f(t){if(t.touches.length>0)for(let e=0;e{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1.5&&(y(h.x,h.y,a[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y)}))}function y(t,e,n){l.push(new x(t,e,n))}function v(){!function(){if(0!=l.length){d.clearRect(0,0,o,s);for(let t=0;t=0;t--)l[t].lifeSpan<0&&l.splice(t,1);0==l.length&&d.clearRect(0,0,o,s)}}(),u=requestAnimationFrame(v)}function w(){r.remove(),cancelAnimationFrame(u),i.removeEventListener(\"mousemove\",p),i.removeEventListener(\"touchmove\",f),i.removeEventListener(\"touchstart\",f),window.addEventListener(\"resize\",g)}function x(t,e,n){const i=Math.floor(30*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.7*Math.random()+.9},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.02;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return A.onchange=()=>{A.matches?w():m()},m(),{destroy:w}}function n(t){let e,n,i,o=t&&t.element,s=o||document.body,h=[\"❄️\"],c=window.innerWidth,l=window.innerHeight,a={x:c/2,y:c/2},r=[],d=[];const u=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function A(){if(u.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=c,e.height=l),n.font=\"12px serif\",n.textBaseline=\"middle\",n.textAlign=\"center\",h.forEach((t=>{let e=n.measureText(t),i=document.createElement(\"canvas\"),o=i.getContext(\"2d\");i.width=e.width,i.height=2*e.actualBoundingBoxAscent,o.textAlign=\"center\",o.font=\"12px serif\",o.textBaseline=\"middle\",o.fillText(t,i.width/2,e.actualBoundingBoxAscent),d.push(i)})),s.addEventListener(\"mousemove\",f),s.addEventListener(\"touchmove\",g,{passive:!0}),s.addEventListener(\"touchstart\",g,{passive:!0}),window.addEventListener(\"resize\",m),y()}function m(t){c=window.innerWidth,l=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=c,e.height=l)}function g(t){if(t.touches.length>0)for(let e=0;e=0;t--)r[t].lifeSpan<0&&r.splice(t,1);0==r.length&&n.clearRect(0,0,c,l)}}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",f),s.removeEventListener(\"touchmove\",g),s.removeEventListener(\"touchstart\",g),window.addEventListener(\"resize\",m)}function w(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:1+Math.random()},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/300;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0),n=.0174533*(2*this.lifeSpan);t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return u.onchange=()=>{u.matches?v():A()},A(),{destroy:v}}function i(t){let e=t&&t.element,n=e||document.body,i=t?.characters||[\"h\",\"e\",\"l\",\"l\",\"o\"];const o=t?.colors||[\"#6622CC\",\"#A755C2\",\"#B07C9E\",\"#B59194\",\"#D2A1B8\"];let s,h,c,l=t?.cursorOffset||{x:0,y:0},a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=t?.font||\"15px serif\",m=t?.characterLifeSpanFunction||function(){return Math.floor(60*Math.random()+80)},g=t?.initialCharacterVelocityFunction||function(){return{x:(Math.random()<.5?-1:1)*Math.random()*5,y:(Math.random()<.5?-1:1)*Math.random()*5}},f=t?.characterVelocityChangeFunctions||{x_func:function(t,e){return(Math.random()<.5?-1:1)/30},y_func:function(t,e){return(Math.random()<.5?-1:1)/15}},p=t?.characterScalingFunction||function(t,e){let n=e-t;return Math.max(n/e*2,0)},y=t?.characterNewRotationDegreesFunction||function(t,e){return(e-t)/5},v=[];const w=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function x(){if(w.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;s=document.createElement(\"canvas\"),h=s.getContext(\"2d\"),s.style.top=\"0px\",s.style.left=\"0px\",s.style.pointerEvents=\"none\",e?(s.style.position=\"absolute\",n.appendChild(s),s.width=n.clientWidth,s.height=n.clientHeight):(s.style.position=\"fixed\",document.body.appendChild(s),s.width=a,s.height=r),h.font=A,h.textBaseline=\"middle\",h.textAlign=\"center\",i.forEach((t=>{let e=h.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2.5*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=A,i.textBaseline=\"middle\";var s=o[Math.floor(Math.random()*o.length)];i.fillStyle=s,i.fillText(t,n.width/2,e.actualBoundingBoxAscent),v.push(n)})),n.addEventListener(\"mousemove\",L),n.addEventListener(\"touchmove\",M,{passive:!0}),n.addEventListener(\"touchstart\",M,{passive:!0}),window.addEventListener(\"resize\",E),B()}function E(t){a=window.innerWidth,r=window.innerHeight,e?(s.width=n.clientWidth,s.height=n.clientHeight):(s.width=a,s.height=r)}function M(t){if(t.touches.length>0)for(let e=0;e=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&h.clearRect(0,0,a,r)}}(),c=requestAnimationFrame(B)}function R(){s.remove(),cancelAnimationFrame(c),n.removeEventListener(\"mousemove\",L),n.removeEventListener(\"touchmove\",M),n.removeEventListener(\"touchstart\",M),window.addEventListener(\"resize\",E)}function S(t,e,n){const i=m();this.rotationSign=Math.random()<.5?-1:1,this.age=0,this.initialLifeSpan=i,this.lifeSpan=i,this.velocity=g(),this.position={x:t+l.x,y:e+l.y},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.age++,this.velocity.x+=f.x_func(this.age,this.initialLifeSpan),this.velocity.y+=f.y_func(this.age,this.initialLifeSpan);const e=p(this.age,this.initialLifeSpan),n=.0174533*(this.rotationSign*y(this.age,this.initialLifeSpan));t.translate(this.position.x,this.position.y),t.rotate(n),t.drawImage(this.canv,-this.canv.width/2*e,-this.canv.height/2,this.canv.width*e,this.canv.height*e),t.rotate(-n),t.translate(-this.position.x,-this.position.y)}}return w.onchange=()=>{w.matches?R():x()},x(),{destroy:R}}function o(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.particles||15,d=t?.rate||.4,u=t?.baseImageSrc||\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";let A=!1,m=new Image;m.src=u;const g=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function f(){if(g.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",y),window.addEventListener(\"resize\",p),v()}function p(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function y(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t{g.matches?w():f()},f(),{destroy:w}}function s(t){let e,n,i=t&&t.element,o=i||document.body,s=window.innerWidth,h=window.innerHeight,c={x:s/2,y:s/2},l=new function(t,e,n,i){this.position={x:t,y:e},this.width=n,this.lag=i,this.moveTowards=function(t,e,n){this.position.x+=(t-this.position.x)/this.lag,this.position.y+=(e-this.position.y)/this.lag,n.fillStyle=a,n.beginPath(),n.arc(this.position.x,this.position.y,this.width,0,2*Math.PI),n.fill(),n.closePath()}}(s/2,h/2,10,10),a=t?.color||\"#323232a6\";const r=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function d(){if(r.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",i?(e.style.position=\"absolute\",o.appendChild(e),e.width=o.clientWidth,e.height=o.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=s,e.height=h),o.addEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u),m()}function u(t){s=window.innerWidth,h=window.innerHeight,i?(e.width=o.clientWidth,e.height=o.clientHeight):(e.width=s,e.height=h)}function A(t){if(i){const e=o.getBoundingClientRect();c.x=t.clientX-e.left,c.y=t.clientY-e.top}else c.x=t.clientX,c.y=t.clientY}function m(){n.clearRect(0,0,s,h),l.moveTowards(c.x,c.y,n),requestAnimationFrame(m)}function g(){e.remove(),cancelAnimationFrame(m),o.removeEventListener(\"mousemove\",A),window.addEventListener(\"resize\",u)}return r.onchange=()=>{r.matches?g():d()},d(),{destroy:g}}function h(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[],r=[];const d=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function u(){if(d.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",g),s.addEventListener(\"touchmove\",m,{passive:!0}),s.addEventListener(\"touchstart\",m,{passive:!0}),window.addEventListener(\"resize\",A),p()}function A(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function m(t){if(t.touches.length>0)for(let e=0;e=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&n.clearRect(0,0,h,c)}}(),i=requestAnimationFrame(p)}function y(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",g),s.removeEventListener(\"touchmove\",m),s.removeEventListener(\"touchstart\",m),window.addEventListener(\"resize\",A)}function v(t,e,n){const i=Math.floor(60*Math.random()+60);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/10),y:-1*Math.random()-.4},this.position={x:t,y:e},this.canv=n,this.baseDimension=4,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.velocity.x+=2*(Math.random()<.5?-1:1)/75,this.velocity.y-=Math.random()/600,this.lifeSpan--;const e=.2+(this.initialLifeSpan-this.lifeSpan)/this.initialLifeSpan;t.fillStyle=\"#e6f1f7\",t.strokeStyle=\"#3a92c5\",t.beginPath(),t.arc(this.position.x-this.baseDimension/2*e,this.position.y-this.baseDimension/2,this.baseDimension*e,0,2*Math.PI),t.stroke(),t.fill(),t.closePath()}}return d.onchange=()=>{d.matches?y():u()},u(),{destroy:y}}function c(t){const e=t&&t.emoji||[\"😀\",\"😂\",\"😆\",\"😊\"];let n=t&&t.element,i=n||document.body,o=window.innerWidth,s=window.innerHeight;const h={x:o/2,y:o/2},c={x:o/2,y:o/2};let l=0;const a=[],r=[];let d,u,A;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;d=document.createElement(\"canvas\"),u=d.getContext(\"2d\"),d.style.top=\"0px\",d.style.left=\"0px\",d.style.pointerEvents=\"none\",n?(d.style.position=\"absolute\",i.appendChild(d),d.width=i.clientWidth,d.height=i.clientHeight):(d.style.position=\"fixed\",document.body.appendChild(d),d.width=o,d.height=s),u.font=\"21px serif\",u.textBaseline=\"middle\",u.textAlign=\"center\",e.forEach((t=>{let e=u.measureText(t),n=document.createElement(\"canvas\"),i=n.getContext(\"2d\");n.width=e.width,n.height=2*e.actualBoundingBoxAscent,i.textAlign=\"center\",i.font=\"21px serif\",i.textBaseline=\"middle\",i.fillText(t,n.width/2,e.actualBoundingBoxAscent),r.push(n)})),i.addEventListener(\"mousemove\",y,{passive:!0}),i.addEventListener(\"touchmove\",p,{passive:!0}),i.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),w()}function f(t){o=window.innerWidth,s=window.innerHeight,n?(d.width=i.clientWidth,d.height=i.clientHeight):(d.width=o,d.height=s)}function p(t){if(t.touches.length>0)for(let e=0;e{if(n){const e=i.getBoundingClientRect();h.x=t.clientX-e.left,h.y=t.clientY-e.top}else h.x=t.clientX,h.y=t.clientY;Math.hypot(h.x-c.x,h.y-c.y)>1&&(v(h.x,h.y,r[Math.floor(Math.random()*e.length)]),c.x=h.x,c.y=h.y,l=t.timeStamp)}))}function v(t,e,n){a.push(new E(t,e,n))}function w(){!function(){if(0!=a.length){u.clearRect(0,0,o,s);for(let t=0;t=0;t--)a[t].lifeSpan<0&&a.splice(t,1);0==a.length&&u.clearRect(0,0,o,s)}}(),A=requestAnimationFrame(w)}function x(){d.remove(),cancelAnimationFrame(A),i.removeEventListener(\"mousemove\",y),i.removeEventListener(\"touchmove\",p),i.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function E(t,e,n){const i=Math.floor(60*Math.random()+80);this.initialLifeSpan=i,this.lifeSpan=i,this.velocity={x:(Math.random()<.5?-1:1)*(Math.random()/2),y:.4*Math.random()+.8},this.position={x:t,y:e},this.canv=n,this.update=function(t){this.position.x+=this.velocity.x,this.position.y+=this.velocity.y,this.lifeSpan--,this.velocity.y+=.05;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.drawImage(this.canv,this.position.x-this.canv.width/2*e,this.position.y-this.canv.height/2,this.canv.width*e,this.canv.height*e)}}return m.onchange=()=>{m.matches?x():g()},g(),{destroy:x}}function l(t){let e,n,i,o=t&&t.element,s=o||document.body,h=t&&t.randomDelay,c=t&&t.minDelay||5,l=t&&t.maxDelay||50,a=window.innerWidth,r=window.innerHeight,d={x:a/2,y:a/2},u=[],A=new Image;t&&t.image?A.src=t.image:A.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAATCAYAAACk9eypAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAAEwAAAAAChpcNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAABqElEQVQoFY3SPUvDQBgH8BREpRHExYiDgmLFl6WC+AYmWeyLg4i7buJX8DMpOujgyxGvUYeCgzhUQUSKKLUS0+ZyptXh8Z5Ti621ekPyJHl+uftfomhaf9Ei5JyxXKfynyEA6EYcLHpwyflT958GAQ7DTABNHd8EbtDbEH2BD5QEQmi2mM8P/Iq+A0SzszEg+3sPjDnDdVEtQKQbMUidHD3xVzf6A9UDEmEm+8h9KTqTVUjT+vB53aHrCbAPiceYq1dQI1Aqv4EhMll0jzv+Y0yiRgCnLRSYyDQHVoqUXe4uKL9l+L7GXC4vkMhE6eW/AOJs9k583ORDUyXMZ8F5SVHVVnllmPNKSFagAJ5DofaqGXw/gHBYg51dIldkmknY3tguv3jOtHR4+MqAzaraJXbEhqHhcQlwGSOi5pytVQHZLN5s0WNe8HPrLYlFsO20RPHkImxsbmHdLJFI76th7Z4SeuF53hTeFLvhRCJRCTKZKxgdnRDbW+iozFJbBMw14/ElwGYc0egMBMFzT21f5Rog33Z7dX02GBm7WV5ZfT5Nn5bE3zuCDe9UxdTpNvK+5AAAAABJRU5ErkJggg==\";const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=a,e.height=r),s.addEventListener(\"mousemove\",x),s.addEventListener(\"touchmove\",p,{passive:!0}),s.addEventListener(\"touchstart\",p,{passive:!0}),window.addEventListener(\"resize\",f),M()}function f(t){a=window.innerWidth,r=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=a,e.height=r)}function p(t){if(t.touches.length>0)for(let e=0;e{m.matches?L():g()};let y=()=>Math.floor(Math.random()*(l-c+1))+c,v=Date.now(),w=y();function x(t){if(h){if(v+w>Date.now())return;v=Date.now(),w=y()}if(o){const e=s.getBoundingClientRect();d.x=t.clientX-e.left,d.y=t.clientY-e.top}else d.x=t.clientX,d.y=t.clientY;E(d.x,d.y,A)}function E(t,e,n){u.push(new C(t,e,n))}function M(){!function(){if(0!=u.length){n.clearRect(0,0,a,r);for(let t=0;t=0;t--)u[t].lifeSpan<0&&u.splice(t,1);0==u.length&&n.clearRect(0,0,a,r)}}(),i=requestAnimationFrame(M)}function L(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",x),s.removeEventListener(\"touchmove\",p),s.removeEventListener(\"touchstart\",p),window.addEventListener(\"resize\",f)}function C(t,e,n){this.initialLifeSpan=40,this.lifeSpan=40,this.position={x:t,y:e},this.image=n,this.update=function(t){this.lifeSpan--;const e=Math.max(this.lifeSpan/this.initialLifeSpan,0);t.globalAlpha=e,t.drawImage(this.image,this.position.x,this.position.y)}}return g(),{destroy:L}}function a(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2},a=[];const r=t?.length||20,d=t?.colors||[\"#FE0000\",\"#FD8C00\",\"#FFE500\",\"#119F0B\",\"#0644B3\",\"#C22EDC\"],u=t?.size||3;let A=!1;const m=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function g(){if(m.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),s.addEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f),y()}function f(t){h=window.innerWidth,c=window.innerHeight,o?(e.width=s.clientWidth,e.height=s.clientHeight):(e.width=h,e.height=c)}function p(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY;if(!1===A){A=!0;for(let t=0;t{n.beginPath(),n.strokeStyle=e,t.length&&n.moveTo(t[0].x,t[0].y+i*(u-1)),t.forEach(((t,e)=>{0!==e&&n.lineTo(t.x,t.y+i*u)})),n.lineWidth=u,n.lineCap=\"round\",n.stroke()}))}(),i=requestAnimationFrame(y)}function v(){e.remove(),cancelAnimationFrame(i),s.removeEventListener(\"mousemove\",p),window.addEventListener(\"resize\",f)}function w(t,e){this.position={x:t,y:e}}return m.onchange=()=>{m.matches?v():g()},g(),{destroy:v}}function r(t){let e,n,i,o=t&&t.element,s=o||document.body,h=window.innerWidth,c=window.innerHeight,l={x:h/2,y:h/2};const a=t&&t.dateColor||\"blue\",r=t&&t.faceColor||\"black\",d=t&&t.secondsColor||\"red\",u=t&&t.minutesColor||\"black\",A=t&&t.hoursColor||\"black\",m=.4,g=t&&t.theDays||[\"SUNDAY\",\"MONDAY\",\"TUESDAY\",\"WEDNESDAY\",\"THURSDAY\",\"FRIDAY\",\"SATURDAY\"],f=t&&t.theMonths||[\"JANUARY\",\"FEBRUARY\",\"MARCH\",\"APRIL\",\"MAY\",\"JUNE\",\"JULY\",\"AUGUST\",\"SEPTEMBER\",\"OCTOBER\",\"NOVEMBER\",\"DECEMBER\"];let p=new Date,y=p.getDate(),v=p.getYear()+1900;const w=(\" \"+g[p.getDay()]+\" \"+y+\" \"+f[p.getMonth()]+\" \"+v).split(\"\"),x=[\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"1\",\"2\"],E=x.length,M=[\"•\",\"•\",\"•\"],L=[\"•\",\"•\",\"•\",\"•\"],C=[\"•\",\"•\",\"•\",\"•\",\"•\"],B=360/E,R=360/w.length,S=45/6.5,b=[],Y=[],W=[],H=[],I=[],X=[],D=[],T=[],F=[];var z=parseInt(w.length+E+M.length+L.length+C.length)+1;const P=window.matchMedia(\"(prefers-reduced-motion: reduce)\");function J(){if(P.matches)return console.log(\"This browser has prefers reduced motion turned on, so the cursor did not init\"),!1;e=document.createElement(\"canvas\"),n=e.getContext(\"2d\"),e.style.top=\"0px\",e.style.left=\"0px\",e.style.pointerEvents=\"none\",o?(e.style.position=\"absolute\",s.appendChild(e),e.width=s.clientWidth,e.height=s.clientHeight):(e.style.position=\"fixed\",document.body.appendChild(e),e.width=h,e.height=c),n.font=\"10px sans-serif\",n.textAlign=\"center\",n.textBaseline=\"middle\";for(let t=0;t0)if(o){const e=s.getBoundingClientRect();l.x=t.touches[0].clientX-e.left,l.y=t.touches[0].clientY-e.top}else l.x=t.touches[0].clientX,l.y=t.touches[0].clientY}function Z(t){if(o){const e=s.getBoundingClientRect();l.x=t.clientX-e.left,l.y=t.clientY-e.top}else l.x=t.clientX,l.y=t.clientY}function k(){!function(){W[0]=Math.round(b[0]+=(l.y-b[0])*m),H[0]=Math.round(Y[0]+=(l.x-Y[0])*m);for(let t=1;t=c-80&&(b[t-1]=c-80),Y[t-1]>=h-80&&(Y[t-1]=h-80)}(),function(){n.clearRect(0,0,h,c);const t=new Date,e=t.getSeconds(),i=Math.PI*(e-15)/30,o=t.getMinutes(),s=Math.PI*(o-15)/30,l=t.getHours(),a=Math.PI*(l-3)/6+Math.PI*parseInt(t.getMinutes())/360;for(let t=0;t{P.matches?N():J()},J(),{destroy:N}}function d(t){let e,n,i,o=t||{},s=t&&t.element,h=s||document.body,c=o.text?\" \"+t.text:\" Your Text Here\",l=t?.color||\"#000000\",a=o.font||\"monospace\",r=o.textSize||12,d=r+\"px \"+a,u=o.gap||r+2,A=0,m=[],g=window.innerWidth,f=window.innerHeight,p={x:g/2,y:g/2};for(let t=0;t0;t--)m[t].x=m[t-1].x+u,m[t].y=m[t-1].y,n.fillStyle=l,n.font=d,n.fillText(m[t].letter,m[t].x,m[t].y);let i=m[0].x,o=m[0].y;i+=(p.x-i)/5+t+2,o+=(p.y-o)/5+e,m[0].x=i,m[0].y=o}(),i=requestAnimationFrame(E)}function M(){e.remove(),cancelAnimationFrame(i),h.removeEventListener(\"mousemove\",x),window.addEventListener(\"resize\",w)}return y.onchange=()=>{y.matches?M():v()},v(),{destroy:M}}\n\n\n//# sourceURL=webpack://mybb-april-fools/./node_modules/cursor-effects/dist/esm.js?"); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval devtool is used. /******/ var __webpack_exports__ = __webpack_require__("./src/main.ts"); /******/ /******/ })() ;