Release code
13
404.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||||
|
<title>Error 404 - MangaDex</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align: center; ">Error 404</h1>
|
||||||
|
<hr />
|
||||||
|
<a href="/"><img style="margin: 0 auto; display: block;" src="/images/avatars/default2.jpg" alt="404" /></a>
|
||||||
|
<p style="text-align: center; ">This page does not exist.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
13
503.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||||
|
<title>Error 503 - MangaDex</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align: center; ">Error 503</h1>
|
||||||
|
<hr />
|
||||||
|
<a href="/"><img style="margin: 0 auto; display: block;" src="/images/avatars/default1.jpg" alt="503" /></a>
|
||||||
|
<p style="text-align: center; ">Please stop spamming the server!</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
GeoLite2-City.mmdb
Normal file
After Width: | Height: | Size: 57 MiB |
BIN
GeoLite2-Country.mmdb
Normal file
3
README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Code vulenerable to a PHP RCE.
|
||||||
|
|
||||||
|
IP Address for Site: 188.165.48.31
|
554
ajax/actions.ajax.php
Normal file
@ -0,0 +1,554 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
//if (isset($_GET['_'])) {
|
||||||
|
// http_response_code(666);
|
||||||
|
// die();
|
||||||
|
//}
|
||||||
|
|
||||||
|
require_once ('../bootstrap.php');
|
||||||
|
|
||||||
|
define('IS_NOJS', (isset($_GET['nojs']) && $_GET['nojs']));
|
||||||
|
|
||||||
|
if (!DEBUG && !IS_NOJS && (!isset($_SERVER["HTTP_X_REQUESTED_WITH"]) || $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest"))
|
||||||
|
die("Hacking attempt... Go away.");
|
||||||
|
|
||||||
|
require_once (ABSPATH . "/scripts/header.req.php");
|
||||||
|
|
||||||
|
/*
|
||||||
|
$user__id = $sql->prep("token_$token", ' SELECT user_id FROM mangadex_users WHERE token = ? LIMIT 1 ', [$token], 'fetchColumn', '', 3600);
|
||||||
|
$user = new User($user__id, 'user_id');
|
||||||
|
*/
|
||||||
|
$guard = \Mangadex\Model\Guard::getInstance();
|
||||||
|
if (isset($_COOKIE[SESSION_COOKIE_NAME]) || isset($_COOKIE[SESSION_REMEMBERME_COOKIE_NAME])) {
|
||||||
|
$guard->tryRestoreSession($_COOKIE[SESSION_COOKIE_NAME] ?? null, $_COOKIE[SESSION_REMEMBERME_COOKIE_NAME] ?? null);
|
||||||
|
$user = $guard->hasUser() ? $guard->getUser() : $guard->getUser(0); // Fetch guest record (userid=0) if no user could be restored
|
||||||
|
} else {
|
||||||
|
$user = $guard->getUser(0); // Fetch guest
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** @var $sentry Raven_Client */
|
||||||
|
if (isset($sentry) && isset($user)) {
|
||||||
|
$sentry->user_context([
|
||||||
|
'id' => $user->user_id,
|
||||||
|
'username' => $user->username,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = '';
|
||||||
|
$error = '';
|
||||||
|
|
||||||
|
foreach($_POST as $key => $value) {
|
||||||
|
if (is_string($value))
|
||||||
|
$_POST[$key] = trim($value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$function = $_GET['function'];
|
||||||
|
|
||||||
|
foreach (read_dir('ajax/actions') as $file) {
|
||||||
|
require_once (ABSPATH . "/ajax/actions/$file");
|
||||||
|
} //require every file in actions
|
||||||
|
|
||||||
|
switch ($function) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// filter functions
|
||||||
|
*/
|
||||||
|
case 'hentai_toggle':
|
||||||
|
$mode = $_GET['mode'];
|
||||||
|
|
||||||
|
if ($mode == 1) {
|
||||||
|
setcookie('mangadex_h_toggle', $mode, $timestamp + (86400 * 3650), '/', DOMAIN); // 86400 = 1 day
|
||||||
|
$details = 'Everything displayed.';
|
||||||
|
}
|
||||||
|
elseif ($mode == 2) {
|
||||||
|
setcookie('mangadex_h_toggle', $mode, $timestamp + (86400 * 3650), '/', DOMAIN); // 86400 = 1 day
|
||||||
|
$details = 'Only hentai displayed.';
|
||||||
|
}
|
||||||
|
elseif ($mode == 0) {
|
||||||
|
setcookie('mangadex_h_toggle', '', $timestamp - 3600, '/', DOMAIN);
|
||||||
|
$details = 'Hentai hidden.';
|
||||||
|
}
|
||||||
|
|
||||||
|
print display_alert('success', 'Success', $details);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'set_display_lang':
|
||||||
|
$display_lang_id = $_GET['id'];
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
setcookie('mangadex_display_lang', $display_lang_id, $timestamp + 86400, '/', DOMAIN); // 86400 = 1 day
|
||||||
|
else {
|
||||||
|
$sql->modify('set_display_lang', ' UPDATE mangadex_users SET display_lang_id = ? WHERE user_id = ? LIMIT 1 ', [$display_lang_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = 'Display language set.';
|
||||||
|
|
||||||
|
print display_alert('success', 'Success', $details);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'set_mangas_view':
|
||||||
|
$mode = $_GET['mode'];
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
setcookie('mangadex_title_mode', $mode, $timestamp + 86400, '/', DOMAIN); // 86400 = 1 day
|
||||||
|
else {
|
||||||
|
$sql->modify('set_mangas_view', ' UPDATE mangadex_users SET mangas_view = ? WHERE user_id = ? LIMIT 1 ', [$mode, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = 'View mode set.';
|
||||||
|
|
||||||
|
print display_alert('success', 'Success', $details);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
// user functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
case 'ban_user':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$target_user = new User($id, 'user_id');
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin') && !validate_level($target_user, 'admin') && validate_level($target_user, 'validating')) {
|
||||||
|
$sql->modify('ban_user', ' UPDATE mangadex_users SET level_id = 0 WHERE user_id = ? LIMIT 1 ', [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't ban $target_user->username.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'unban_user':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$target_user = new User($id, 'user_id');
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin') && !$target_user->level_id) {
|
||||||
|
$sql->modify('unban_user', ' UPDATE mangadex_users SET level_id = 3 WHERE user_id = ? LIMIT 1 ', [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't unban $target_user->username.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// message functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
case 'msg_reply':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$reply = str_replace(['javascript:'], '', htmlentities($_POST['text']));
|
||||||
|
|
||||||
|
$thread = new PM_Thread($id);
|
||||||
|
|
||||||
|
$recipient_user = new User($thread->recipient_id, 'user_id');
|
||||||
|
$sender_user = new User($thread->sender_id, 'user_id');
|
||||||
|
|
||||||
|
$sender_blocked = $sender_user->get_blocked_user_ids();
|
||||||
|
$recipient_blocked = $recipient_user->get_blocked_user_ids();
|
||||||
|
|
||||||
|
// DM restriction if there is an active restriction and the sender isnt staff. restricted users can always message staff
|
||||||
|
$dm_restriction = $user->has_active_restriction(USER_RESTRICTION_CREATE_DM) && !validate_level($recipient_user, 'mod');
|
||||||
|
|
||||||
|
if (($user->user_id == $thread->sender_id || $user->user_id == $thread->recipient_id) && !isset($sender_blocked[$thread->recipient_id]) && !isset($recipient_blocked[$thread->sender_id]) && !$dm_restriction) {
|
||||||
|
$sql->modify('msg_reply', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text) VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$id, $user->user_id, $reply]);
|
||||||
|
|
||||||
|
if ($thread->sender_id == $user->user_id)
|
||||||
|
$sql->modify('msg_reply', ' UPDATE mangadex_pm_threads SET recipient_read = 0, recipient_deleted = 0, thread_timestamp = UNIX_TIMESTAMP() WHERE thread_id = ? LIMIT 1 ', [$id]);
|
||||||
|
else
|
||||||
|
$sql->modify('msg_reply', ' UPDATE mangadex_pm_threads SET sender_read = 0, sender_deleted = 0, thread_timestamp = UNIX_TIMESTAMP() WHERE thread_id = ? LIMIT 1 ', [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$thread->recipient_id}_unread_msgs");
|
||||||
|
$memcached->delete("user_{$thread->sender_id}_unread_msgs");
|
||||||
|
$memcached->delete("PM_{$thread->thread_id}");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isset($sender_blocked[$thread->recipient_id]))
|
||||||
|
$details = "You can't reply to the message because they are blocked.";
|
||||||
|
elseif (isset($recipient_blocked[$thread->sender_id]))
|
||||||
|
$details = "You can't reply to the message because they are blocked.";
|
||||||
|
elseif ($dm_restriction)
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CREATE_DM) ?? "You can't reply to this dm.";
|
||||||
|
else
|
||||||
|
$details = "You can't reply on thread $id.";
|
||||||
|
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'msg_send':
|
||||||
|
$recipient = htmlentities($_POST['recipient']);
|
||||||
|
$subject = htmlentities($_POST['subject']);
|
||||||
|
$message = str_replace(['javascript:'], '', htmlentities($_POST['text']));
|
||||||
|
|
||||||
|
// Process captcha
|
||||||
|
if (defined('REQUIRE_CAPTCHA') && REQUIRE_CAPTCHA && !validate_level($user, 'pr')) {
|
||||||
|
|
||||||
|
if (isset($_POST['g-recaptcha-response'])) {
|
||||||
|
$captcha = $_POST['g-recaptcha-response'];
|
||||||
|
}
|
||||||
|
|
||||||
|
//validate captcha
|
||||||
|
if (!isset($captcha)) {
|
||||||
|
// This might happen if the google captcha was blocked or this is a bot request
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
} else if ($captcha) {
|
||||||
|
try {
|
||||||
|
$captcha_validate = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".GOOGLE_CAPTCHA_SECRET."&response=$captcha&remoteip=$ip"), true);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// This might happen if the google api timed out.
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Probably a dev environment or captcha is currently disabled, just return success then.
|
||||||
|
$captcha = true;
|
||||||
|
$captcha_validate = ['success' => true];
|
||||||
|
}
|
||||||
|
if (!isset($captcha_validate['success'])) {
|
||||||
|
$captcha_validate['success'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$last_message_timestamp = $sql->prep('last_message_timestamp', ' SELECT timestamp FROM mangadex_pm_msgs WHERE user_id = ? ORDER BY timestamp DESC LIMIT 1 ', [$user->user_id], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
$recipient_id = $sql->prep('recipient_id', ' SELECT user_id FROM mangadex_users WHERE username = ?', [$recipient], 'fetchColumn', '', -1);
|
||||||
|
$recipient_user = new User($recipient_id, 'user_id');
|
||||||
|
|
||||||
|
$user_blocked = $user->get_blocked_user_ids();
|
||||||
|
$recipient_blocked = $recipient_user->get_blocked_user_ids();
|
||||||
|
|
||||||
|
// DM restriction if there is an active restriction and the sender isnt staff. restricted users can always message staff
|
||||||
|
$dm_restriction = $user->has_active_restriction(USER_RESTRICTION_CREATE_DM) && !validate_level($recipient_user, 'mod');
|
||||||
|
// staff members ignore banned words and dm timeout
|
||||||
|
$has_banned_word = !validate_level($user, "pr") && (strpos_arr($message, SPAM_WORDS) !== FALSE || strpos_arr($subject, SPAM_WORDS) !== FALSE);
|
||||||
|
$has_dmed_recently = !validate_level($user, "pr") && ($timestamp - $last_message_timestamp < 30);
|
||||||
|
|
||||||
|
$is_valid_recipient = $recipient_id && $recipient_id != $user->user_id;
|
||||||
|
$is_blocked = isset($user_blocked[$recipient_id]) || isset($recipient_blocked[$user->user_id]);
|
||||||
|
|
||||||
|
if(!validate_level($user, 'member') || $dm_restriction){
|
||||||
|
$details = "You can't send messages.";
|
||||||
|
}
|
||||||
|
else if ($has_banned_word) {
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 1, 0, 1) ', [$subject, $user->user_id, $recipient_id]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $user->user_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
}
|
||||||
|
else if($has_dmed_recently) {
|
||||||
|
$details = "Please wait before sending another message.";
|
||||||
|
}
|
||||||
|
else if(!$is_valid_recipient) {
|
||||||
|
$details = "$recipient is an invalid recipient.";
|
||||||
|
}
|
||||||
|
else if($is_blocked) {
|
||||||
|
$details = "$recipient has blocked you or you have blocked them.";
|
||||||
|
}
|
||||||
|
else if(!$captcha_validate['success']) {
|
||||||
|
$details = 'You need to solve the captcha to send messages.';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $user->user_id, $recipient_id]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $user->user_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
if(!$result){
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'msg_del':
|
||||||
|
if ($user->user_id && !empty($_POST['msg_ids']) && is_array($_POST['msg_ids'])) {
|
||||||
|
foreach ($_POST['msg_ids'] as $id) {
|
||||||
|
|
||||||
|
$id = prepare_numeric($id);
|
||||||
|
$thread = new PM_Thread($id);
|
||||||
|
|
||||||
|
if ($user->user_id == $thread->sender_id)
|
||||||
|
$sql->modify('msg_del', ' UPDATE mangadex_pm_threads SET sender_deleted = 1 WHERE thread_id = ? LIMIT 1 ', [$id]);
|
||||||
|
else
|
||||||
|
$sql->modify('msg_del', ' UPDATE mangadex_pm_threads SET recipient_deleted = 1 WHERE thread_id = ? LIMIT 1 ', [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("PM_{$thread->thread_id}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!$user->user_id)
|
||||||
|
$details = "Your session has timed out. Please log in again.";
|
||||||
|
else
|
||||||
|
$details = "No messages selected.";
|
||||||
|
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
// mod functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// other functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
case 'translate':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$json = json_encode($_POST);
|
||||||
|
|
||||||
|
if (in_array($user->user_id, TL_USER_IDS) || validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('translate', ' UPDATE mangadex_languages SET navbar = ? WHERE lang_id = ? LIMIT 1 ', [$json, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("lang_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Denied.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "read_announcement":
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
$sql->modify('read_announcement', ' UPDATE mangadex_users SET read_announcement = 1 WHERE user_id = ? LIMIT 1 ', [$user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'report_submit':
|
||||||
|
$item_id = prepare_numeric($_POST['item_id']);
|
||||||
|
$type_id = prepare_numeric($_POST['type_id']);
|
||||||
|
$reason_id = prepare_numeric($_POST['reason_id']);
|
||||||
|
$info = strip_tags($_POST['info']);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member'))
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'You must be logged in to submit reports!']));
|
||||||
|
|
||||||
|
$report_restriction = $user->has_active_restriction(USER_RESTRICTION_CREATE_REPORT) && !validate_level($user, 'mod');
|
||||||
|
|
||||||
|
$reasons = [];
|
||||||
|
foreach ((new Report_Reasons())->toArray() AS $row) {
|
||||||
|
$reasons[$row['id']] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($report_restriction)
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => $details = $user->get_restriction_message(USER_RESTRICTION_CREATE_REPORT) ?? 'You can\'t submit reports at this time!']));
|
||||||
|
|
||||||
|
if (!isset($reasons[$reason_id]))
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'You must specify a valid reason!']));
|
||||||
|
|
||||||
|
if ($reasons[$reason_id]['is_info_required'] && empty($info))
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'You must add a short info text to this report reason!']));
|
||||||
|
|
||||||
|
if ($type_id < 1 || !isset(REPORT_TYPES[$type_id]))
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'You must specify a valid item type!']));
|
||||||
|
|
||||||
|
// Check if there already is a processed report for this comment
|
||||||
|
try {
|
||||||
|
$autoDecline = $sql->prep(
|
||||||
|
"comment_report_check_$item_id",
|
||||||
|
'SELECT COUNT(*) FROM mangadex_reports WHERE item_id = ? AND state != 0',
|
||||||
|
[$item_id],
|
||||||
|
'fetchColumn',
|
||||||
|
null,
|
||||||
|
-1
|
||||||
|
) > 0;
|
||||||
|
} catch(\PDOException $e) {
|
||||||
|
$autoDecline = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$sql->modify(
|
||||||
|
'report_submit', '
|
||||||
|
INSERT INTO mangadex_reports (item_id, type_id, reason_id, created, info, user_id, state, updated, mod_id)
|
||||||
|
VALUES (?,?,?,?,?,?,?,?,?)',
|
||||||
|
[
|
||||||
|
$item_id,
|
||||||
|
$type_id,
|
||||||
|
$reason_id,
|
||||||
|
time(),
|
||||||
|
empty($info) ? null : trim($info),
|
||||||
|
$user->user_id,
|
||||||
|
$autoDecline ? 2 : 0,
|
||||||
|
$autoDecline ? time() : null,
|
||||||
|
$autoDecline ? 1 : null
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
if (stripos($e->getMessage(), 'integrity constraint violation')) {
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'You already have a report of this type pending!']));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'There was an issue submitting the report. Please try again later!']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete('mod_general_report_count');
|
||||||
|
|
||||||
|
echo json_encode(['status' => 'success']);
|
||||||
|
|
||||||
|
if (!$autoDecline) {
|
||||||
|
post_on_discord(DISCORD_WEBHOOK_REPORT, [
|
||||||
|
'username' => $user->username,
|
||||||
|
'embeds' => [
|
||||||
|
[
|
||||||
|
'title' => 'Comment Report',
|
||||||
|
'description' => $reasons[$reason_id]['text'],
|
||||||
|
'url' => URL . 'mod/reports',
|
||||||
|
'footer' => [
|
||||||
|
'text' => $info
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'report_setstate':
|
||||||
|
|
||||||
|
$id = prepare_numeric($_POST['id']);
|
||||||
|
$state = prepare_numeric($_POST['state']);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod'))
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'Only staff can change report states!']));
|
||||||
|
|
||||||
|
try {
|
||||||
|
$sql->modify('report_changestate', 'UPDATE mangadex_reports SET updated = ?, mod_id = ?, state = ? WHERE id = ?', [time(), $user->user_id, $state, $id]);
|
||||||
|
} catch (\PDOException $e) {
|
||||||
|
trigger_error($e->getMessage(), E_USER_ERROR);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'There was an issue updating the request. Please try again later!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete('mod_general_report_count');
|
||||||
|
|
||||||
|
echo json_encode(['status' => 'success']);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_ip_unban":
|
||||||
|
$ip_unban = $_POST['ip'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
// Check if this is an ip that is in the database
|
||||||
|
$affectedRows = $sql->modify('ip_unban', "DELETE FROM mangadex_ip_bans WHERE ip = ?", [$ip_unban]);
|
||||||
|
|
||||||
|
if ($affectedRows < 1 && $memcached->delete($ip_unban) === FALSE && $memcached->delete("api_$ip_unban") === FALSE && $memcached->delete("login_$ip_unban") === FALSE) {
|
||||||
|
$details = "IP is not on the ban list.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
} else {
|
||||||
|
$memcached->delete('ip_banlist');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_ip_ban":
|
||||||
|
$ip_ban = $_POST['ip'];
|
||||||
|
$expires = (int)$_POST['expires'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$sql->modify('ban_ip', "INSERT IGNORE INTO mangadex_ip_bans (ip, expires) VALUES (?, ?)", [$ip_ban, time()+60*60*$expires]);
|
||||||
|
$memcached->delete('ip_banlist');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_add_tempmail":
|
||||||
|
$tempmail = $_POST['tempmail'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$sql->modify('add_tempmail', "INSERT IGNORE INTO mangadex_tempmail (id, host) VALUES (NULL, ?)", [$tempmail]);
|
||||||
|
$memcached->delete('tempmail');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_remove_tempmail":
|
||||||
|
$tempmail = $_POST['tempmail'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$sql->modify('remove_tempmail', "DELETE FROM mangadex_tempmail WHERE host LIKE ? LIMIT 1 ", [$tempmail]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "override":
|
||||||
|
$id = $_GET['id'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'mod')) {
|
||||||
|
$sql->modify('override', "UPDATE mangadex_user_stats SET chapters_read = 101 WHERE user_id = ? LIMIT 1 ", [$id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (!in_array($function, ['manga_follow', 'manga_unfollow']))
|
||||||
|
$sql->modify('action_log', ' INSERT INTO mangadex_logs_actions (action_id, action_name, action_user_id, action_timestamp, action_ip, action_result, action_details)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?, ?, ?) ', [$function, $user->user_id, $ip, $result, strlen($details) > 128 ? substr($details, 0, 128) : $details]);
|
||||||
|
*/
|
||||||
|
?>
|
566
ajax/actions/auth.actions.req.php
Normal file
@ -0,0 +1,566 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$guard = \Mangadex\Model\Guard::getInstance();
|
||||||
|
|
||||||
|
switch ($function) {
|
||||||
|
case 'logout':
|
||||||
|
|
||||||
|
$guard->destroySession();
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
if (IS_NOJS) redirect_url('/index.php');
|
||||||
|
print display_alert('success', 'Success', 'You have logged out.');
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'login':
|
||||||
|
|
||||||
|
$username = $_POST['login_username'] ?? '';
|
||||||
|
$password = $_POST['login_password'] ?? '';
|
||||||
|
$twoFaCode = !isset($_POST['two_factor']) || empty(trim($_POST['two_factor'])) ? false : trim($_POST['two_factor']);
|
||||||
|
$isRememberme = isset($_POST['remember_me']) && $_POST['remember_me'];
|
||||||
|
|
||||||
|
$sql->modify('login', "
|
||||||
|
INSERT INTO mangadex_login_attempts (ip, timestamp) VALUES (?, UNIX_TIMESTAMP()) ON DUPLICATE KEY UPDATE count = count + 1
|
||||||
|
", [$ip]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Process captcha
|
||||||
|
if (defined('REQUIRE_CAPTCHA') && REQUIRE_CAPTCHA) {
|
||||||
|
|
||||||
|
if (isset($_POST['g-recaptcha-response']))
|
||||||
|
$captcha = $_POST['g-recaptcha-response'];
|
||||||
|
|
||||||
|
//validate captcha
|
||||||
|
if (!isset($captcha)) {
|
||||||
|
// This might happen if the google captcha was blocked or this is a bot request
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
} else if ($captcha) {
|
||||||
|
try {
|
||||||
|
$captcha_validate = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".GOOGLE_CAPTCHA_SECRET."&response=$captcha&remoteip=$ip"), true);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// This might happen if the google api timed out.
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Probably a dev environment or captcha is currently disabled, just return success then.
|
||||||
|
$captcha = true;
|
||||||
|
$captcha_validate = ['success' => true];
|
||||||
|
}
|
||||||
|
|
||||||
|
$ipbans = [];
|
||||||
|
try {
|
||||||
|
$ipbans = get_ip_bans();
|
||||||
|
} catch (\Exception $e) {}
|
||||||
|
|
||||||
|
if (in_array($ip, $ipbans)) {
|
||||||
|
if (IS_NOJS) redirect_url('/login?msg=ipban');
|
||||||
|
$details = 'Your IP is banned. Please wait a few hours or contact a Staff member on IRC/Discord';
|
||||||
|
print display_alert('danger', 'Failed', $details); // IP banned
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Username/password authentication
|
||||||
|
|
||||||
|
$isAuthenticated = false;
|
||||||
|
try {
|
||||||
|
$userId = $guard->authenticate($username, $password);
|
||||||
|
$isAuthenticated = $userId > 0;
|
||||||
|
$user = $guard->getUser($userId);
|
||||||
|
} catch (\RuntimeException $e) {
|
||||||
|
if (IS_NOJS) redirect_url('/login?msg=wrong_credentials');
|
||||||
|
$details = 'Incorrect username or password.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //wrong password
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2FA validation (if activated)
|
||||||
|
|
||||||
|
$twoFa = new \Mangadex\TwoFactorAuth($user);
|
||||||
|
|
||||||
|
$isValidated = !$twoFa->isEnabled();
|
||||||
|
if (!$isValidated) {
|
||||||
|
if (!$twoFaCode) {
|
||||||
|
if (IS_NOJS) redirect_url('/login?msg=missing_2fa');
|
||||||
|
die('missing_2fa');
|
||||||
|
}
|
||||||
|
|
||||||
|
$reason = 'Failed to verify logincode!';
|
||||||
|
try {
|
||||||
|
$isValidated = $twoFa->validateLoginCode($twoFaCode);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$reason = $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Maybe its a recovery code?
|
||||||
|
if (!$isValidated && preg_match('#[A-Z0-9]{8}#', $twoFaCode)) {
|
||||||
|
// Validated via recovery code. Maybe send an email?
|
||||||
|
$isValidated = $twoFa->validateRecoveryCode($twoFaCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$isValidated) {
|
||||||
|
if (IS_NOJS) redirect_url('/login?msg=failed_2fa');
|
||||||
|
print display_alert('danger', 'Failed', $reason);
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create session
|
||||||
|
|
||||||
|
if ($isAuthenticated && $isValidated) {
|
||||||
|
$guard->createSession($userId);
|
||||||
|
if ($isRememberme) {
|
||||||
|
$guard->createRemembermeToken($userId);
|
||||||
|
}
|
||||||
|
if (IS_NOJS) redirect_url('/index.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'session_destroy':
|
||||||
|
|
||||||
|
$sessionId = (int)$_POST['session_id'];
|
||||||
|
|
||||||
|
$sql->modify('user_destroy_session', 'DELETE FROM mangadex_sessions WHERE user_id = ? AND session_id = ?',
|
||||||
|
[$user->user_id, $sessionId]);
|
||||||
|
|
||||||
|
$ret = ['status' => 'success', 'message' => 'Session removed'];
|
||||||
|
print json_encode($ret);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'clear_sessions':
|
||||||
|
|
||||||
|
$userId = $user->user_id;
|
||||||
|
if (isset($_POST['user_id']) && validate_level($user, 'admin')) {
|
||||||
|
// Allow admins to clear sessions for any user
|
||||||
|
$userId = (int)$_POST['user_id'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('user_clear_sessions', 'DELETE FROM mangadex_sessions WHERE user_id = ?',
|
||||||
|
[$userId]);
|
||||||
|
|
||||||
|
$ret = ['status' => 'success', 'message' => 'Sessions cleared'];
|
||||||
|
print json_encode($ret);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'signup':
|
||||||
|
$username = $_POST['reg_username'];
|
||||||
|
$pass1 = $_POST['reg_pass1'];
|
||||||
|
$pass2 = $_POST['reg_pass2'];
|
||||||
|
$email1 = $_POST['reg_email1'];
|
||||||
|
$email2 = $_POST['reg_email2'];
|
||||||
|
|
||||||
|
$password_hash = password_hash($pass1, PASSWORD_DEFAULT);
|
||||||
|
$token = rand_string(32);
|
||||||
|
$activation_key = rand_string(32);
|
||||||
|
|
||||||
|
//pass1=pass2 and email1=email2
|
||||||
|
$password_test = ($pass1 == $pass2 && strlen($pass1) >= 8); //return TRUE
|
||||||
|
$email_test = ($email1 == $email2); //return TRUE
|
||||||
|
|
||||||
|
//existing username / validate username
|
||||||
|
$count_user = $sql->prep('count_user', ' SELECT count(*) FROM mangadex_users WHERE username = ? ', [$username], 'fetchColumn', '', -1);
|
||||||
|
$username_validate = preg_match("/^[a-zA-Z0-9_-]+$/", $username);
|
||||||
|
$username_test = (!$count_user && $username_validate); //return TRUE
|
||||||
|
|
||||||
|
//strip . from gmails
|
||||||
|
/*if (false !== stripos($email1, '@gmail.')) {
|
||||||
|
$email1 = preg_replace_callback('/^([^\+@]+)(\+[^@]*)?@(gmail\..*)$/i', function ($match) { return str_replace('.', '', $match[1]).'@'.$match[3]; }, $email1);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
//existing email
|
||||||
|
$count_email = $sql->prep('count_email', ' SELECT count(*) FROM mangadex_users WHERE email = ? ', [$email1], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
//banned emails
|
||||||
|
$banned_hosts = $sql->query_read('tempmail', "SELECT host FROM mangadex_tempmail ORDER BY host ASC ", 'fetchAll', PDO::FETCH_COLUMN);
|
||||||
|
|
||||||
|
$email_parts = explode('@', $email1);
|
||||||
|
$banned_email = in_array($email_parts[1], $banned_hosts);
|
||||||
|
|
||||||
|
|
||||||
|
// Process captcha
|
||||||
|
if (defined('REQUIRE_CAPTCHA') && REQUIRE_CAPTCHA) {
|
||||||
|
|
||||||
|
if (isset($_POST['g-recaptcha-response']))
|
||||||
|
$captcha = $_POST['g-recaptcha-response'];
|
||||||
|
|
||||||
|
//validate captcha
|
||||||
|
if (!isset($captcha)) {
|
||||||
|
// This might happen if the google captcha was blocked or this is a bot request
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
} else if ($captcha) {
|
||||||
|
try {
|
||||||
|
$captcha_validate = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".GOOGLE_CAPTCHA_SECRET."&response=$captcha&remoteip=$ip"), true);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// This might happen if the google api timed out.
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Probably a dev environment or captcha is currently disabled, just return success then.
|
||||||
|
$captcha = true;
|
||||||
|
$captcha_validate = ['success' => true];
|
||||||
|
}
|
||||||
|
|
||||||
|
$ipbans = [];
|
||||||
|
try {
|
||||||
|
$ipbans = get_ip_bans();
|
||||||
|
} catch (\Exception $e) {}
|
||||||
|
|
||||||
|
$banned_asn = is_banned_asn($ip);
|
||||||
|
|
||||||
|
$sign_up_test = ($username_test && $count_email == 0 && $banned_email === FALSE && $password_test && $email_test && isset($captcha_validate['success']) && $captcha_validate['success'] && !in_array($ip, $ipbans) && !$banned_asn);
|
||||||
|
|
||||||
|
if ($sign_up_test) {
|
||||||
|
|
||||||
|
$user_id = $sql->modify('signup', "
|
||||||
|
INSERT INTO mangadex_users (user_id, username, password, token, level_id, email, language, display_lang_id, default_lang_ids, style, joined_timestamp, last_seen_timestamp, avatar, creation_ip, time_offset, activation_key, activated, user_website, user_description, upload_group_id, upload_lang_id, read_announcement, user_views, user_uploads, hentai_mode, swipe_direction, swipe_sensitivity, reader_mode, reader_click, image_fit, mangas_view, user_bio, list_privacy, list_banner, latest_updates, reader, premium, img_server)
|
||||||
|
VALUES (NULL, ?, ?, ?, 2, ?, 1, 1, '', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '', ?, '0', ?, 0, '', '', 0, 0, 0, 0, 0, 0, 1, 100, 0, 1, 0, 0, '', 0, '', 0, 0, 0, 0)
|
||||||
|
", [$username, $password_hash, $token, $email1, $ip, $activation_key]);
|
||||||
|
|
||||||
|
$sql->modify('signup', " INSERT INTO mangadex_user_stats (user_id) VALUES (?) ", [$user_id]);
|
||||||
|
|
||||||
|
$sql->modify('signup', " INSERT INTO mangadex_user_options (user_id) VALUES (?) ", [$user_id]);
|
||||||
|
|
||||||
|
$to = $email1;
|
||||||
|
$subject = "MangaDex: Account Creation - $username";
|
||||||
|
$body = "Thank you for creating an account on MangaDex. \n\nUsername: $username \nPassword: (your chosen password) \n\nActivation code: $activation_key \n\nPlease visit " . URL . "activation/$activation_key to activate your account.";
|
||||||
|
//$body = "Thank you for creating an account on MangaDex. \n\nUsername: $username \nPassword: (your chosen password) Due to problem with a spammer, activation codes are temporarily not being sent in this email. Please reply to this email to request an activation code. Apologies for the inconvenience!";
|
||||||
|
|
||||||
|
send_email($to, $subject, $body);
|
||||||
|
|
||||||
|
$user = new User($token, 'token'); //logs
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ($count_user)
|
||||||
|
$details = 'Your username has already been used.';
|
||||||
|
elseif (!$username_validate)
|
||||||
|
$details = 'Choose a valid username. Only a-z, A-Z, 0-9, _ and - allowed.';
|
||||||
|
elseif ($count_email == 1)
|
||||||
|
$details = 'Your email address has already been used.';
|
||||||
|
elseif ($banned_email !== FALSE)
|
||||||
|
$details = 'Temporary email services are banned to prevent spamming.';
|
||||||
|
elseif ($pass1 !== $pass2)
|
||||||
|
$details = 'Your passwords do not match.';
|
||||||
|
elseif (strlen($pass1) < 8)
|
||||||
|
$details = 'Your password is too short.';
|
||||||
|
elseif (!$email_test)
|
||||||
|
$details = 'Your emails do not match.';
|
||||||
|
elseif (isset($captcha_validate['success']) && !$captcha_validate['success'])
|
||||||
|
$details = 'The captcha could not be verified. Please try again.';
|
||||||
|
elseif (in_array($ip, $ipbans))
|
||||||
|
$details = 'Your IP is banned. Please wait for a few hours or contact a Staffmember on IRC/Discord.';
|
||||||
|
elseif ($banned_asn)
|
||||||
|
$details = 'Your ASN is banned. Please contact a staff member on Discord and quote the error message.';
|
||||||
|
|
||||||
|
print display_alert('danger', 'Failed', $details);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'reset_email':
|
||||||
|
$email = $_POST['reset_email'];
|
||||||
|
|
||||||
|
// Process captcha
|
||||||
|
if (defined('REQUIRE_CAPTCHA') && REQUIRE_CAPTCHA) {
|
||||||
|
|
||||||
|
if (isset($_POST['g-recaptcha-response']))
|
||||||
|
$captcha = $_POST['g-recaptcha-response'];
|
||||||
|
|
||||||
|
//validate captcha
|
||||||
|
if (!isset($captcha)) {
|
||||||
|
// This might happen if the google captcha was blocked or this is a bot request
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
} else if ($captcha) {
|
||||||
|
try {
|
||||||
|
$captcha_validate = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".GOOGLE_CAPTCHA_SECRET."&response=$captcha&remoteip=$ip"), true);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// This might happen if the google api timed out.
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Probably a dev environment or captcha is currently disabled, just return success then.
|
||||||
|
$captcha = true;
|
||||||
|
$captcha_validate = ['success' => true];
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $sql->prep('reset_email', ' SELECT user_id, username FROM mangadex_users WHERE email = ? LIMIT 1 ', [$email], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if ($user && isset($user->user_id) && $user->user_id > 1 && isset($captcha_validate['success']) && $captcha_validate['success']) {
|
||||||
|
$activation_key = rand_string(32);
|
||||||
|
|
||||||
|
$to = $email;
|
||||||
|
$subject = "MangaDex: Reset Password Request - $user->username";
|
||||||
|
$body = "You have requested a reset code for MangaDex. \n\nUsername: $user->username \n\nReset code: $activation_key \n\nPlease visit " . URL . "reset_confirm/$activation_key to continue with your password reset. ";
|
||||||
|
|
||||||
|
send_email($to, $subject, $body);
|
||||||
|
|
||||||
|
$sql->modify('reset_email', ' UPDATE mangadex_users SET activation_key = ? WHERE user_id = ? ', [$activation_key, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
//$user = new User($token, 'token'); //logs // TODO: Why is this here? why would we ever want or need this?
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!isset($captcha_validate['success']) || !$captcha_validate['success']) {
|
||||||
|
$error = $captcha_validate['error-codes'] ?? 'No error code available';
|
||||||
|
$details = "You failed the captcha.";
|
||||||
|
if (is_string($error) || is_numeric($error))
|
||||||
|
$details .= " Error code: $error";
|
||||||
|
} else {
|
||||||
|
$details = "Incorrect email address: $email";
|
||||||
|
}
|
||||||
|
|
||||||
|
print display_alert('danger', 'Failed', $details);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'reset':
|
||||||
|
$reset_code = $_POST['reset_code'];
|
||||||
|
|
||||||
|
$pass1 = $_POST['reg_pass1'];
|
||||||
|
$pass2 = $_POST['reg_pass2'];
|
||||||
|
|
||||||
|
$password_hash = password_hash($pass1, PASSWORD_DEFAULT);
|
||||||
|
$token = rand_string(32);
|
||||||
|
$activation_key = rand_string(32);
|
||||||
|
|
||||||
|
//pass1=pass2 and email1=email2
|
||||||
|
$password_test = ($pass1 == $pass2 && strlen($pass1) >= 8); //return TRUE
|
||||||
|
|
||||||
|
// Process captcha
|
||||||
|
if (defined('REQUIRE_CAPTCHA') && REQUIRE_CAPTCHA) {
|
||||||
|
|
||||||
|
if (isset($_POST['g-recaptcha-response']))
|
||||||
|
$captcha = $_POST['g-recaptcha-response'];
|
||||||
|
|
||||||
|
//validate captcha
|
||||||
|
if (!isset($captcha)) {
|
||||||
|
// This might happen if the google captcha was blocked or this is a bot request
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
} else if ($captcha) {
|
||||||
|
try {
|
||||||
|
$captcha_validate = json_decode(file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".GOOGLE_CAPTCHA_SECRET."&response=$captcha&remoteip=$ip"), true);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
// This might happen if the google api timed out.
|
||||||
|
$captcha_validate = ['success' => false];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Probably a dev environment or captcha is currently disabled, just return success then.
|
||||||
|
$captcha = true;
|
||||||
|
$captcha_validate = ['success' => true];
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = $sql->prep('reset_password', ' SELECT user_id, username, email FROM mangadex_users WHERE activation_key = ? LIMIT 1 ', [$reset_code], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
$iphash = sha1(_IP);
|
||||||
|
|
||||||
|
$floodCheck = isset($user->user_id) && !$memcached->get("pass_reset_user_$user->user_id") && !$memcached->get("pass_reset_ip_$iphash");
|
||||||
|
|
||||||
|
if ($floodCheck && $password_test && $user && isset($user->user_id) && $user->user_id > 1 && isset($captcha_validate['success']) && $captcha_validate['success']) {
|
||||||
|
$new_password = $pass1;
|
||||||
|
$password_hash = password_hash($new_password, PASSWORD_DEFAULT);
|
||||||
|
//$token = '';
|
||||||
|
$activation_key = rand_string(32);
|
||||||
|
|
||||||
|
// $to = $user->email;
|
||||||
|
// $subject = "MangaDex: Reset Password - $user->username";
|
||||||
|
// $body = "You have successfully reset your password for MangaDex. \n\nUsername: $user->username \nPassword: $new_password \n\nPlease change this password after you log on. ";
|
||||||
|
//
|
||||||
|
// send_email($to, $subject, $body);
|
||||||
|
|
||||||
|
$sql->modify('reset_password', ' UPDATE mangadex_users SET `password` = ?, activation_key = ? WHERE user_id = ? ', [$password_hash, $activation_key, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
$memcached->set("pass_reset_user_$user->user_id", true, 60*60);
|
||||||
|
$memcached->set("pass_reset_ip_$iphash", true, 60*60);
|
||||||
|
|
||||||
|
//$user = new User($token, 'token'); //logs // TODO: Why is this here? why would we ever want or need this?
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (isset($captcha_validate['success']) && !$captcha_validate['success']) {
|
||||||
|
$details = "You failed the captcha.";
|
||||||
|
}
|
||||||
|
else if (!isset($user->user_id)) {
|
||||||
|
$details = "Incorrect or expired reset code: $reset_code";
|
||||||
|
}
|
||||||
|
else if (!$floodCheck) {
|
||||||
|
$details = "You can't reset your password that often. Please wait up to 1 hour before trying to reset your password again.";
|
||||||
|
}
|
||||||
|
else if (!$password_test) {
|
||||||
|
$details = "The two passwords are too short (8 chars min.) or don't match.";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Incorrect reset code: $reset_code";
|
||||||
|
}
|
||||||
|
|
||||||
|
print display_alert('danger', 'Failed', $details);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'activate':
|
||||||
|
$activation_code = $_POST['activation_code'];
|
||||||
|
|
||||||
|
if ($activation_code == $user->activation_key && $user->level_id) {
|
||||||
|
// check if user is ip banned
|
||||||
|
$user_banned = $sql->prep('activate', '
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM mangadex_users u
|
||||||
|
JOIN mangadex_ip_bans b
|
||||||
|
ON u.creation_ip = b.ip OR u.last_ip = b.ip
|
||||||
|
WHERE user_id = ? LIMIT 1', [$user->user_id], "fetchAll", PDO::FETCH_UNIQUE, -1);
|
||||||
|
if($user_banned){
|
||||||
|
$sql->modify('activate', ' UPDATE mangadex_users SET level_id = 0, activated = 1 WHERE user_id = ? AND activated = 0 LIMIT 1 ', [$user->user_id]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$sql->modify('activate', ' UPDATE mangadex_users SET level_id = 3, activated = 1 WHERE user_id = ? AND activated = 0 LIMIT 1 ', [$user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$to = $user->email;
|
||||||
|
$subject = "MangaDex: Successful Activation - $user->username";
|
||||||
|
$body = "You have successfully activated your account for MangaDex.";
|
||||||
|
|
||||||
|
//send_email($to, $subject, $body);
|
||||||
|
}
|
||||||
|
elseif (!$user->level_id) {
|
||||||
|
$details = "You're banned.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // banned
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Incorrect activation code.';
|
||||||
|
print display_alert('danger', 'Failed', $details); // wrong code
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "resend_activation_code":
|
||||||
|
$to = $user->email;
|
||||||
|
$subject = "MangaDex: Resend Activation Code - $user->username";
|
||||||
|
$body = "Here's your activation code. \n\nUsername: $user->username \n\nActivation code: $user->activation_key \n\nPlease visit " . URL . "activation/$user->activation_key to activate your account. ";
|
||||||
|
|
||||||
|
send_email($to, $subject, $body, 3);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2fa_setup":
|
||||||
|
|
||||||
|
if ($user === null || $user->user_id < 2 || !validate_level($user, 'member')) {
|
||||||
|
http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA can not be set up on the current user!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFa = new \Mangadex\TwoFactorAuth($user);
|
||||||
|
if ($twoFa->isEnabled()) {
|
||||||
|
http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA Is already enabled!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$res = $twoFa->setUp();
|
||||||
|
if (!$res) {
|
||||||
|
http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => 'Failed to set up 2FA!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = ['status' => 'success', 'message' => 'Please confirm your 2FA with a logincode', 'data' => ['image_data' => $twoFa->generateQrImageData(), 'code' => $twoFa->getUserCode()]];
|
||||||
|
print json_encode($ret);
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2fa_confirm":
|
||||||
|
|
||||||
|
if ($user === null || $user->user_id < 2 || !validate_level($user, 'member')) {
|
||||||
|
//http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA can not be set up on the current user!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFa = new \Mangadex\TwoFactorAuth($user, true);
|
||||||
|
if (!$twoFa->isEnabled()) {
|
||||||
|
//http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA Needs to be set up first!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($twoFa->getType() > 0) {
|
||||||
|
//http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA Is already enabled!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$reason = 'Failed to verify logincode!';
|
||||||
|
$validate = false;
|
||||||
|
try {
|
||||||
|
$validate = $twoFa->validateLoginCode($_POST['code']);
|
||||||
|
} catch (\InvalidArgumentException $e) {
|
||||||
|
$reason = $e->getMessage();
|
||||||
|
}
|
||||||
|
if (!$validate) {
|
||||||
|
//http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => $reason]));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFa->confirmSetUp();
|
||||||
|
|
||||||
|
$codes = $twoFa->getRecoveryCodes();
|
||||||
|
print json_encode(['status' => 'success', 'message' => 'Successfully set up 2FA!', 'data' => ['recovery' => $codes]]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2fa_login":
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "2fa_remove":
|
||||||
|
|
||||||
|
if (!isset($_POST['confirm'])) {
|
||||||
|
http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA removal needs to be confirmed!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFaUser = $user;
|
||||||
|
|
||||||
|
// Allow admins to remove 2FA from other users
|
||||||
|
if (isset($_POST['user_id']) && $_POST['user_id'] > 0 && validate_level($user, 'admin')) {
|
||||||
|
$twoFaUser = new User((int)$_POST['user_id'], 'user_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($twoFaUser === null || $twoFaUser->user_id < 2 || !validate_level($twoFaUser, 'member')) {
|
||||||
|
http_response_code(400);
|
||||||
|
die(json_encode(['status' => 'fail', 'message' => '2FA can not be removed on the current user!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFa = new \Mangadex\TwoFactorAuth($twoFaUser);
|
||||||
|
if (!$twoFa->isEnabled()) {
|
||||||
|
//http_response_code(400);
|
||||||
|
// this is an error case but we still answer with a success to hide the fact if this account had 2fa or not
|
||||||
|
die(json_encode(['status' => 'success', 'message' => '2FA has been disabled!']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$twoFa->remove();
|
||||||
|
|
||||||
|
die(json_encode(['status' => 'success', 'message' => '2FA has been disabled!']));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
943
ajax/actions/chapters.actions.req.php
Normal file
@ -0,0 +1,943 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Mangadex\Exception\RemoteFileUploadFailed;
|
||||||
|
use Mangadex\Model\RemoteFileUploader;
|
||||||
|
|
||||||
|
switch ($function) {
|
||||||
|
|
||||||
|
case "chapter_mark_unread":
|
||||||
|
$ids = array_map(function ($e) {return (int)$e;}, explode(',', $_GET["id"]));
|
||||||
|
if (count($ids) > 100)
|
||||||
|
$ids = array_slice($ids, 0, 100); // Only take max. 100 items
|
||||||
|
$ids_in = prepare_in($ids);
|
||||||
|
|
||||||
|
if (!empty($ids_in)) {
|
||||||
|
$sql->modify('chapter_mark_unread', "DELETE FROM mangadex_chapter_views WHERE user_id = ? AND chapter_id IN ($ids_in)", array_merge([$user->user_id], $ids));
|
||||||
|
$memcached->delete("user_{$user->user_id}_read_chapters");
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_mark_read":
|
||||||
|
$ids = array_map(function ($e) {return (int)$e;}, explode(',', $_GET["id"]));
|
||||||
|
if (count($ids) > 100)
|
||||||
|
$ids = array_slice($ids, 0, 100); // Only take max. 100 items
|
||||||
|
|
||||||
|
|
||||||
|
$q = "INSERT IGNORE INTO mangadex_chapter_views (user_id, chapter_id) VALUES ";
|
||||||
|
$values = [];
|
||||||
|
$binds = [];
|
||||||
|
foreach ($ids AS $id) {
|
||||||
|
$values[]= "(?, ?)";
|
||||||
|
$binds[] = $user->user_id;
|
||||||
|
$binds[] = $id;
|
||||||
|
}
|
||||||
|
$q .= implode(',', $values);
|
||||||
|
|
||||||
|
$sql->modify('chapter_mark_read', $q, $binds);
|
||||||
|
$memcached->delete("user_{$user->user_id}_read_chapters");
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_purge":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$chapter = new Chapter($id);
|
||||||
|
|
||||||
|
if (count(get_object_vars($chapter))) {
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_purge', " UPDATE mangadex_chapters SET manga_id = 47 WHERE chapter_id = ? LIMIT 1 ", [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("chapter_$id");
|
||||||
|
|
||||||
|
// Add undelete change to manga history
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $chapter->manga_id, time(), 'chapter_purge', json_encode([sprintf('Purge Chapter <a href="/chapter/%1$d">%1$d</a> <a role="button" href="/chapter/%1$d/edit" class="btn btn-xs btn-info"><span class="fas fa-pencil-alt fa-fw " aria-hidden="true" title="Edit"></span></a>', $chapter->chapter_id)])]);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't purge Chapter #$id.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Chapter #$id does not exist.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_unavailable":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$chapter = new Chapter($id);
|
||||||
|
|
||||||
|
if (count(get_object_vars($chapter))) {
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_undelete', " UPDATE mangadex_chapters SET available = 0, chapter_deleted = 0 WHERE chapter_id = ? LIMIT 1 ", [$id]);
|
||||||
|
$sql->modify('chapter_undelete', " UPDATE mangadex_users SET user_uploads = user_uploads + 1 WHERE user_id = ? LIMIT 1 ", [$chapter->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("chapter_$id");
|
||||||
|
$memcached->delete("user_$chapter->user_id");
|
||||||
|
|
||||||
|
// Add undelete change to manga history
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $chapter->manga_id, time(), 'chapter_unavailable', json_encode([sprintf('Unavailable Chapter <a href="/chapter/%1$d">%1$d</a> <a role="button" href="/chapter/%1$d/edit" class="btn btn-xs btn-info"><span class="fas fa-pencil-alt fa-fw " aria-hidden="true" title="Edit"></span></a>', $chapter->chapter_id)])]);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't make Chapter #$id unavailable.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Chapter #$id does not exist.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_undelete":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$chapter = new Chapter($id);
|
||||||
|
|
||||||
|
if (count(get_object_vars($chapter))) {
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_undelete', " UPDATE mangadex_chapters SET chapter_deleted = 0 WHERE chapter_id = ? LIMIT 1 ", [$id]);
|
||||||
|
$sql->modify('chapter_undelete', " UPDATE mangadex_users SET user_uploads = user_uploads + 1 WHERE user_id = ? LIMIT 1 ", [$chapter->user_id]);
|
||||||
|
|
||||||
|
$is_delayed = $chapter->upload_timestamp > time(); // Upload date is in the future
|
||||||
|
|
||||||
|
if ($is_delayed) {
|
||||||
|
// We undeleted a chapter that is still due to be released in the future. Make sure the chapter exists in the delayed_chapters table
|
||||||
|
$sql->modify('chapter_delayed', 'INSERT INTO mangadex_delayed_chapters (`chapter_id`, `manga_id`, `upload_timestamp`) VALUES (?,?,?) ON DUPLICATE KEY UPDATE `upload_timestamp` = ?', [$chapter->chapter_id, $chapter->manga_id, $chapter->upload_timestamp, $chapter->upload_timestamp]);
|
||||||
|
} else {
|
||||||
|
//update last_updated table by checking timestamps
|
||||||
|
$last_updated = $sql->prep('chapter_undelete', ' SELECT * FROM mangadex_last_updated WHERE manga_id = ? AND lang_id = ? LIMIT 1 ', [$chapter->manga_id, $chapter->lang_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
if ($chapter->upload_timestamp > $last_updated->upload_timestamp) {
|
||||||
|
$sql->modify('chapter_undelete', " INSERT INTO mangadex_last_updated (chapter_id, manga_id, volume, chapter, title, upload_timestamp, user_id, lang_id, group_id, group_id_2, group_id_3, available) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE chapter_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ? ",
|
||||||
|
[$chapter->chapter_id, $chapter->manga_id, $chapter->volume, $chapter->chapter, $chapter->title, $chapter->upload_timestamp, $chapter->user_id, $chapter->lang_id, $chapter->group_id, $chapter->group_id_2, $chapter->group_id_3, $chapter->available, $chapter->chapter_id, $chapter->volume, $chapter->chapter, $chapter->title, $chapter->upload_timestamp, $chapter->user_id, $chapter->group_id, $chapter->group_id_2, $chapter->group_id_3, $chapter->available]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("chapter_$id");
|
||||||
|
$memcached->delete("user_$chapter->user_id");
|
||||||
|
|
||||||
|
// Add undelete change to manga history
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $chapter->manga_id, time(), 'chapter_undelete', json_encode([sprintf('Undelete Chapter <a href="/chapter/%1$d">%1$d</a> <a role="button" href="/chapter/%1$d/edit" class="btn btn-xs btn-info"><span class="fas fa-pencil-alt fa-fw " aria-hidden="true" title="Edit"></span></a>', $chapter->chapter_id)])]);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't restore Chapter #$id.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Chapter #$id does not exist.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_delete":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$chapter = new Chapter($id);
|
||||||
|
|
||||||
|
// Restriction check
|
||||||
|
if (!validate_level($user, 'gmod') && $user->has_active_restriction(USER_RESTRICTION_CHAPTER_DELETE)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CHAPTER_DELETE) ?? "Chapter upload failed!";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
else if (count(get_object_vars($chapter))) {
|
||||||
|
$group = new Group($chapter->group_id);
|
||||||
|
|
||||||
|
if (
|
||||||
|
validate_level($user, 'gmod') ||
|
||||||
|
(
|
||||||
|
$chapter->available &&
|
||||||
|
(
|
||||||
|
$chapter->user_id == $user->user_id ||
|
||||||
|
(
|
||||||
|
!$group->group_is_inactive &&
|
||||||
|
(
|
||||||
|
$group->group_leader_id == $user->user_id ||
|
||||||
|
in_array($user->username, $group->get_members())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
$sql->modify('chapter_delete', " UPDATE mangadex_chapters SET chapter_deleted = 1 WHERE chapter_id = ? LIMIT 1 ", [$id]);
|
||||||
|
$sql->modify('chapter_delete', " UPDATE mangadex_users SET user_uploads = user_uploads - 1 WHERE user_id = ? LIMIT 1 ", [$user->user_id]);
|
||||||
|
|
||||||
|
//update last_updated table by deleting entry and replacing with an older entry if possible
|
||||||
|
$sql->modify('chapter_delete', " DELETE FROM mangadex_last_updated WHERE chapter_id = ? LIMIT 1 ", [$id]);
|
||||||
|
$last_updated = $sql->prep('chapter_delete', '
|
||||||
|
SELECT * FROM mangadex_chapters WHERE manga_id = ? AND lang_id = ? AND chapter_deleted = 0 ORDER BY upload_timestamp DESC LIMIT 1
|
||||||
|
', [$chapter->manga_id, $chapter->lang_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if ($last_updated)
|
||||||
|
$sql->modify('chapter_delete', "
|
||||||
|
INSERT INTO mangadex_last_updated (chapter_id, manga_id, volume, chapter, title, upload_timestamp, user_id, lang_id, group_id, group_id_2, group_id_3, available) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE chapter_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ?
|
||||||
|
", [$last_updated->chapter_id, $last_updated->manga_id, $last_updated->volume, $last_updated->chapter, $last_updated->title, $last_updated->upload_timestamp, $last_updated->user_id, $last_updated->lang_id, $last_updated->group_id, $last_updated->group_id_2, $last_updated->group_id_3, $last_updated->available, $last_updated->chapter_id, $last_updated->volume, $last_updated->chapter, $last_updated->title, $last_updated->upload_timestamp, $last_updated->user_id, $last_updated->group_id, $last_updated->group_id_2, $last_updated->group_id_3, $last_updated->available]);
|
||||||
|
|
||||||
|
// Delete this chapter from the delayed table as well
|
||||||
|
$sql->modify('delayed_chapter_delete', 'DELETE FROM mangadex_delayed_chapters WHERE `chapter_id` = ?', [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("chapter_$id");
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
// Add delete change to manga history
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $chapter->manga_id, time(), 'chapter_delete', json_encode([sprintf('Delete Chapter <a href="/chapter/%1$d">%1$d</a> <a role="button" href="/chapter/%1$d/edit" class="btn btn-xs btn-info"><span class="fas fa-pencil-alt fa-fw " aria-hidden="true" title="Edit"></span></a>', $chapter->chapter_id)])]);
|
||||||
|
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
print display_alert("success", "Success", "Chapter $id has been deleted."); // success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!$chapter->available)
|
||||||
|
$details = "Chapter #$id is unavailable.";
|
||||||
|
else
|
||||||
|
$details = "You can't delete Chapter #$id.";
|
||||||
|
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Chapter #$id does not exist.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_edit":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$chapter = new Chapter($id);
|
||||||
|
|
||||||
|
$manga_id = prepare_numeric($_POST["manga_id"]);
|
||||||
|
$chapter_name = htmlentities($_POST["chapter_name"]);
|
||||||
|
$volume_number = remove_padding(htmlentities($_POST["volume_number"]));
|
||||||
|
$chapter_number = remove_padding(htmlentities($_POST["chapter_number"]));
|
||||||
|
$group_id = prepare_numeric($_POST["group_id"]);
|
||||||
|
$group_id_2 = prepare_numeric($_POST["group_id_2"]);
|
||||||
|
$group_id_3 = prepare_numeric($_POST["group_id_3"]);
|
||||||
|
$lang_id = prepare_numeric($_POST["lang_id"]);
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
|
||||||
|
$unavailable = isset($_POST["unavailable"]) ? 0 : 1;
|
||||||
|
$server = $_POST["server"] ?? $chapter->server;
|
||||||
|
$page_order = $_POST["page_order"] ?? $chapter->page_order;
|
||||||
|
$user_id = $_POST["user_id"] ?? $chapter->user_id;
|
||||||
|
|
||||||
|
if (isset($_POST["user_id"]) && !validate_level($user, 'mod')) {
|
||||||
|
$error .= display_alert('danger', 'Failed', 'You may not change the uploader user ID.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify volume number
|
||||||
|
if (preg_match('/[^0-9\.]+/', $volume_number)) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Volume Number field may only contain numbers and decimals. Please use the Chapter Name field for text input like Chapter titles.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify chapter_number
|
||||||
|
if (preg_match('/[^0-9\.]+/', $chapter_number)) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter Number field may only contain numbers and decimals. Please use the Chapter Name field for text input like Chapter titles.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify chapter title
|
||||||
|
if (stripos($chapter_name, 'ch. ') !== false || stripos($chapter_name, 'vol. ') !== false) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter name may not contain chapter or volume numbers. Please use the Volume / Chapter number field for that.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify there is no end tag
|
||||||
|
if (stripos($chapter_name, htmlentities(' <end>')) !== false || stripos($chapter_name, ' [end]') !== false) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter name may not contain an end tag. Last chapters are set in the manga entry.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$current_group = new Group($chapter->group_id);
|
||||||
|
$current_members_array = $current_group->get_members();
|
||||||
|
|
||||||
|
$current_members_array2 = [];
|
||||||
|
if($chapter->group_id_2){
|
||||||
|
$current_group2 = new Group($chapter->group_id_2);
|
||||||
|
$current_members_array2 = $current_group2->get_members();
|
||||||
|
}
|
||||||
|
|
||||||
|
$current_members_array3 = [];
|
||||||
|
if($chapter->group_id_3){
|
||||||
|
$current_group3 = new Group($chapter->group_id_3);
|
||||||
|
$current_members_array3 = $current_group3->get_members();
|
||||||
|
}
|
||||||
|
|
||||||
|
$target_group = new Group($group_id);
|
||||||
|
if (!$target_group->group_is_inactive) {
|
||||||
|
$group_members_array = $target_group->get_members();
|
||||||
|
} else {
|
||||||
|
$group_members_array = [];
|
||||||
|
$target_group->group_leader_id = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($group_id_2) {
|
||||||
|
$target_group2 = new Group($group_id_2);
|
||||||
|
if (!$target_group2->group_is_inactive) {
|
||||||
|
$group_2_members_array = $target_group2->get_members();
|
||||||
|
} else {
|
||||||
|
$group_2_members_array = [];
|
||||||
|
$target_group2->group_leader_id = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$target_group2 = new stdClass();
|
||||||
|
$target_group2->group_control = 0;
|
||||||
|
$group_2_members_array = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($group_id_3) {
|
||||||
|
$target_group3 = new Group($group_id_3);
|
||||||
|
if (!$target_group3->group_is_inactive) {
|
||||||
|
$group_3_members_array = $target_group3->get_members();
|
||||||
|
} else {
|
||||||
|
$group_3_members_array = [];
|
||||||
|
$target_group3->group_leader_id = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$target_group3 = new stdClass();
|
||||||
|
$target_group3->group_control = 0;
|
||||||
|
$group_3_members_array = [];
|
||||||
|
}
|
||||||
|
$validate_group_control = (!$target_group->group_control || $user->user_id == $target_group->group_leader_id || in_array($user->username, $group_members_array));
|
||||||
|
$validate_group2_control = (!$target_group2->group_control || $user->user_id == $target_group2->group_leader_id || in_array($user->username, $group_2_members_array));
|
||||||
|
$validate_group3_control = (!$target_group3->group_control || $user->user_id == $target_group3->group_leader_id || in_array($user->username, $group_3_members_array));
|
||||||
|
|
||||||
|
$same_multi_group_validate = ($group_id != $group_id_2 && $group_id != $group_id_3 && ((!$group_id_2 && !$group_id_3) || $group_id_2 != $group_id_3));
|
||||||
|
|
||||||
|
// Restriction check
|
||||||
|
// User that cant delete chapters, cant edit chapters for obvious reasons
|
||||||
|
if (!validate_level($user, 'gmod') && $user->has_active_restriction(USER_RESTRICTION_CHAPTER_DELETE)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CHAPTER_DELETE) ?? "Chapter edit failed!";
|
||||||
|
$error .= display_alert("danger", "Failed", $details);
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
$same_multi_group_validate &&
|
||||||
|
(
|
||||||
|
validate_level($user, 'mod') ||
|
||||||
|
(
|
||||||
|
(
|
||||||
|
$user->user_id == $chapter->user_id ||
|
||||||
|
($user->user_id && in_array($user->user_id, [$chapter->group_leader_id, $chapter->group_leader_id_2, $chapter->group_leader_id_3])) ||
|
||||||
|
in_array($user->username, array_merge($current_members_array, $current_members_array2, $current_members_array3))
|
||||||
|
) &&
|
||||||
|
($validate_group_control && $validate_group2_control && $validate_group3_control) &&
|
||||||
|
$chapter->available
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if ($old_file) {
|
||||||
|
$zip = new ZipArchive;
|
||||||
|
|
||||||
|
if ($_FILES["file"]) {
|
||||||
|
if (!ENABLE_UPLOAD) {
|
||||||
|
die('Upload is temporarily disabled.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = explode(".", $_FILES["file"]["name"]);
|
||||||
|
|
||||||
|
$validate_extention = in_array(strtolower(end($value)), ALLOWED_CHAPTER_EXT);
|
||||||
|
$validate_file_size = ($_FILES["file"]["size"] <= MAX_CHAPTER_FILESIZE) || validate_level($user, 'pr'); //check file size
|
||||||
|
$validate_zip_file = true;
|
||||||
|
|
||||||
|
// Check for zip bomb by limiting the uncompressed filesize to 200M, double whats allowed
|
||||||
|
if (($actualSize = get_zip_originalsize($_FILES["file"]["tmp_name"])) > (2 * MAX_CHAPTER_FILESIZE)) {
|
||||||
|
$validate_file_size = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($validate_extention && $validate_file_size && $zip->open($_FILES["file"]["tmp_name"])) {
|
||||||
|
$chapter_hash = md5($manga_id . $timestamp);
|
||||||
|
|
||||||
|
mkdir(ABS_DATA_BASEPATH . "/data/$chapter_hash");
|
||||||
|
|
||||||
|
$zip->extractTo(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
$zip->close();
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
|
||||||
|
$pages = count($files);
|
||||||
|
|
||||||
|
if ($pages == 1 && is_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[2]")) { //folder
|
||||||
|
rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[2]", ABS_DATA_BASEPATH . "/data/$chapter_hash/folder"); //rename the dir
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder/");
|
||||||
|
foreach($files as $value) {
|
||||||
|
rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder/$value", ABS_DATA_BASEPATH . "/data/$chapter_hash/$value"); //move them all
|
||||||
|
}
|
||||||
|
|
||||||
|
rmdir(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder");
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
}
|
||||||
|
elseif ($pages > 1 && is_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[3]")) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Your .zip contains multiple folders."); //can't open zip
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$validate_zip_file = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_FILES["file"]["error"])
|
||||||
|
$error .= display_alert("danger", "Failed", "Missing file? Code: (" . $_FILES["file"]["error"] . ").");
|
||||||
|
elseif (!$validate_file_size)
|
||||||
|
$error .= display_alert("danger", "Failed", "File size exceeds 100 MB."); //too big
|
||||||
|
elseif (!$validate_extention)
|
||||||
|
$error .= display_alert("danger", "Failed", "A .$extension file, not a .zip."); //too big
|
||||||
|
elseif (!$validate_zip_file)
|
||||||
|
$error .= display_alert("danger", "Failed", "There's something wrong with your .zip file."); //can't open zip
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif (!$validate_group_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 1 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$validate_group2_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 2 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$validate_group3_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 3 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$same_multi_group_validate)
|
||||||
|
$error .= display_alert("danger", "Failed", "Identical groups detected."); //banned
|
||||||
|
elseif (!$chapter->available)
|
||||||
|
$error .= display_alert("danger", "Failed", "This chapter is unavailable."); //unavailable
|
||||||
|
else
|
||||||
|
$error .= display_alert("danger", "Failed", "You can't edit Chapter #$id.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('chapter_edit', " UPDATE mangadex_chapters SET manga_id = ?, title = ?, volume = ?, chapter = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, lang_id = ?, server = ?, page_order = ?, user_id = ?, available = ? WHERE chapter_id = ? LIMIT 1 ",
|
||||||
|
[$manga_id, $chapter_name, $volume_number, $chapter_number, $group_id, $group_id_2, $group_id_3, $lang_id, $server, $page_order, $user_id, $unavailable, $id]);
|
||||||
|
|
||||||
|
$sql->modify('chapter_edit', " UPDATE mangadex_last_updated SET manga_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?, lang_id = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ? WHERE chapter_id = ? LIMIT 1 ",
|
||||||
|
[$manga_id, $volume_number, $chapter_number, $chapter_name, $chapter->upload_timestamp, $user_id, $lang_id, $group_id, $group_id_2, $group_id_3, $unavailable, $id]);
|
||||||
|
|
||||||
|
if ($old_file) {
|
||||||
|
$page_order = "";
|
||||||
|
|
||||||
|
natcasesort($files);
|
||||||
|
$arr = array_values($files);
|
||||||
|
|
||||||
|
foreach($arr as $key => $value) {
|
||||||
|
$key++;
|
||||||
|
$arr = explode(".", $value);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
if (!in_array($ext, ALLOWED_IMG_EXT))
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/data/$chapter_hash/$value");
|
||||||
|
else {
|
||||||
|
$sha256 = hash_file('sha256', ABS_DATA_BASEPATH . "/data/$chapter_hash/$value");
|
||||||
|
|
||||||
|
@rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/$value", ABS_DATA_BASEPATH . "/data/$chapter_hash/$key-$sha256.$ext"); //rename them all numerically
|
||||||
|
|
||||||
|
$page_order .= "$key-$sha256.$ext,";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$page_order = rtrim($page_order, ",");
|
||||||
|
|
||||||
|
if (!$chapter->server && is_dir(ABS_DATA_BASEPATH . "/data/$chapter->chapter_hash"))
|
||||||
|
rename(ABS_DATA_BASEPATH . "/data/$chapter->chapter_hash", ABS_DATA_BASEPATH . "/delete/$chapter->chapter_hash");
|
||||||
|
|
||||||
|
$sql->modify('chapter_edit', " UPDATE mangadex_chapters SET server = ?, chapter_hash = ?, page_order = ? WHERE chapter_id = ? LIMIT 1 ", [IMAGE_SERVER, $chapter_hash, $page_order, $id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("chapter_$id");
|
||||||
|
|
||||||
|
// Additionally, we need to invalidate the manga cache the api uses, otherwise changes to the chapter wont show up in the reader immediately
|
||||||
|
$bind = [0,(string)$manga_id];
|
||||||
|
$order = "(CASE volume WHEN '' THEN 1 END) DESC, abs(volume) DESC, abs(chapter) DESC, group_id ASC";
|
||||||
|
$key = "chapters_query_".hash_array($bind)."_orderby_".md5($order)."_offset_0"; // See /api/index.php L:39+
|
||||||
|
$res = $memcached->delete($key);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
|
||||||
|
$result = ($error) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case "chapter_report":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
$type = prepare_numeric($_POST["type_id"]);
|
||||||
|
$info = htmlentities($_POST["info"]);
|
||||||
|
|
||||||
|
$report_restriction = $user->has_active_restriction(USER_RESTRICTION_CREATE_REPORT) && !validate_level($user, 'mod');
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && !$report_restriction) {
|
||||||
|
$chapter_reasons = array_filter((new Report_Reasons())->toArray(), function($reason) { return REPORT_TYPES[$reason['type_id']] === 'Chapter'; });
|
||||||
|
if (($chapter_reasons[$type]['is_info_required'] == 1 ?? false) && !$info) {
|
||||||
|
$details = "Please give more information.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sql->modify('chapter_report', " INSERT IGNORE INTO mangadex_reports_chapters (report_id, report_chapter_id, report_timestamp, report_type, report_info, report_user_id, report_mod_user_id, report_conclusion)
|
||||||
|
VALUES (NULL, ?, UNIX_TIMESTAMP(), ?, ?, ?, 0, 0) ", [$id, $type, $info, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
|
||||||
|
post_on_discord(DISCORD_WEBHOOK_REPORT, [
|
||||||
|
'username' => $user->username,
|
||||||
|
'embeds' => [
|
||||||
|
[
|
||||||
|
'title' => 'Chapter Report',
|
||||||
|
'description' => $chapter_reasons[$type]['text'] ?? 'Unknown report type',
|
||||||
|
'url' => URL . 'mod/chapter_reports/new',
|
||||||
|
'footer' => [
|
||||||
|
'text' => $info
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (defined('DISCORD_REPORT_PING_COUNT') && defined('DISCORD_REPORT_PING_ROLE_ID') && !empty(DISCORD_REPORT_PING_COUNT)) {
|
||||||
|
$report_count = $sql->prep('chapter_report_count',
|
||||||
|
' SELECT count(DISTINCT report_user_id) FROM mangadex_reports_chapters WHERE report_chapter_id = ? AND report_conclusion = 0 ',
|
||||||
|
[$id], 'fetchColumn', '', -1);
|
||||||
|
if ($report_count === DISCORD_REPORT_PING_COUNT) {
|
||||||
|
post_on_discord(DISCORD_WEBHOOK_REPORT, [
|
||||||
|
'username' => 'MangaDex',
|
||||||
|
'content' => "<@&" . DISCORD_REPORT_PING_ROLE_ID . "> Chapter $id has received $report_count unresolved reports.\n". URL . "chapter/$id",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($report_restriction) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CREATE_REPORT) ?? "You can't report Chapter $id.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't report Chapter $id.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_report_accept_all":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_report_accept_all', " UPDATE mangadex_reports_chapters SET report_conclusion = 1, report_mod_user_id = ? WHERE report_chapter_id = ? ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "All reports for chapter #$id accepted."); //success
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_report_accept":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_report_accept', " UPDATE mangadex_reports_chapters SET report_conclusion = 1, report_mod_user_id = ? WHERE report_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "Report #$id accepted."); //success
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_report_reject":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('chapter_report_reject', " UPDATE mangadex_reports_chapters SET report_conclusion = 2, report_mod_user_id = ? WHERE report_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "Report #$id rejected."); //success
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "upload_queue_accept":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$row = $sql->prep("queue_$id", " SELECT * FROM mangadex_upload_queue WHERE queue_id = ? ", [$id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if (validate_level($user, 'mod')) {
|
||||||
|
$sql->modify('upload_queue_accept', " UPDATE mangadex_upload_queue SET queue_conclusion = 1, queue_mod_user_id = ? WHERE queue_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('upload_queue_accept', " UPDATE mangadex_chapters SET upload_timestamp = GREATEST(upload_timestamp, UNIX_TIMESTAMP()), available = 1 WHERE chapter_id = ? LIMIT 1 ", [$row->chapter_id]);
|
||||||
|
|
||||||
|
$sql->modify('upload_queue_accept', " UPDATE mangadex_last_updated SET upload_timestamp = UNIX_TIMESTAMP(), available = 1 WHERE chapter_id = ? LIMIT 1 ", [$row->chapter_id]);
|
||||||
|
|
||||||
|
$sql->modify('upload_queue_accept', " UPDATE mangadex_users SET user_uploads = user_uploads + 1 WHERE user_id = ? LIMIT 1 ", [$row->user_id]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "Queue #$id accepted."); //success
|
||||||
|
|
||||||
|
$memcached->delete("user_{$row->user_id}");
|
||||||
|
$memcached->delete("chapter_{$row->chapter_id}");
|
||||||
|
$memcached->delete('mod_upload_queue_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "upload_queue_reject":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$row = $sql->prep("queue_$id", " SELECT * FROM mangadex_upload_queue WHERE queue_id = ? ", [$id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
$chapter = new Chapter($row->chapter_id);
|
||||||
|
|
||||||
|
if (validate_level($user, 'mod')) {
|
||||||
|
$sql->modify('upload_queue_reject', " UPDATE mangadex_upload_queue SET queue_conclusion = 2, queue_mod_user_id = ? WHERE queue_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('upload_queue_reject', " UPDATE mangadex_chapters SET available = 1, chapter_deleted = 1 WHERE chapter_id = ? LIMIT 1 ", [$row->chapter_id]);
|
||||||
|
|
||||||
|
//update last_updated table by deleting entry and replacing with an older entry if possible
|
||||||
|
$sql->modify('upload_queue_reject', " DELETE FROM mangadex_last_updated WHERE chapter_id = ? LIMIT 1 ", [$row->chapter_id]);
|
||||||
|
$last_updated = $sql->prep('upload_queue_reject', '
|
||||||
|
SELECT * FROM mangadex_chapters WHERE manga_id = ? AND lang_id = ? AND chapter_deleted = 0 ORDER BY upload_timestamp DESC LIMIT 1
|
||||||
|
', [$chapter->manga_id, $chapter->lang_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if ($last_updated)
|
||||||
|
$sql->modify('upload_queue_reject', "
|
||||||
|
INSERT INTO mangadex_last_updated (chapter_id, manga_id, volume, chapter, title, upload_timestamp, user_id, lang_id, group_id, group_id_2, group_id_3, available) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE chapter_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ?
|
||||||
|
", [$last_updated->chapter_id, $last_updated->manga_id, $last_updated->volume, $last_updated->chapter, $last_updated->title, $last_updated->upload_timestamp, $last_updated->user_id, $last_updated->lang_id, $last_updated->group_id, $last_updated->group_id_2, $last_updated->group_id_3, $last_updated->available, $last_updated->chapter_id, $last_updated->volume, $last_updated->chapter, $last_updated->title, $last_updated->upload_timestamp, $last_updated->user_id, $last_updated->group_id, $last_updated->group_id_2, $last_updated->group_id_3, $last_updated->available]);
|
||||||
|
|
||||||
|
// Delete this chapter from the delayed table as well
|
||||||
|
$sql->modify('delayed_chapter_delete', 'DELETE FROM mangadex_delayed_chapters WHERE `chapter_id` = ?', [$row->id]);
|
||||||
|
|
||||||
|
$memcached->delete("chapter_{$row->chapter_id}");
|
||||||
|
$memcached->delete('mod_upload_queue_count');
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "Queue #$id rejected."); //success
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "chapter_upload":
|
||||||
|
if (!ENABLE_UPLOAD) {
|
||||||
|
die('Upload is temporarily disabled.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$zip = new ZipArchive;
|
||||||
|
|
||||||
|
$manga_id = prepare_numeric($_POST["manga_id"]);
|
||||||
|
$chapter_name = htmlentities($_POST["chapter_name"]);
|
||||||
|
$volume_number = remove_padding(htmlentities($_POST["volume_number"]));
|
||||||
|
$chapter_number = remove_padding(htmlentities($_POST["chapter_number"]));
|
||||||
|
$group_id = prepare_numeric($_POST["group_id"]);
|
||||||
|
$group_id_2 = !empty($_POST["group_id_2"]) ? prepare_numeric($_POST["group_id_2"]) : 0;
|
||||||
|
$group_id_3 = !empty($_POST["group_id_3"]) ? prepare_numeric($_POST["group_id_3"]) : 0;
|
||||||
|
$lang_id = prepare_numeric($_POST["lang_id"]);
|
||||||
|
$external = isset($_POST["external"]) ? remove_padding(htmlentities($_POST["external"])) : '';
|
||||||
|
$is_deleted = (bool) ( isset($_POST["is_deleted"]) && validate_level($user, 'gmod') && $_POST["is_deleted"] );
|
||||||
|
$available = (isset($_POST["unavailable"]) && validate_level($user, 'gmod')) ? 0 : 1;
|
||||||
|
$override_user_id = (isset($_POST["override_user_id"]) && !empty($_POST["override_user_id"]) && validate_level($user, 'gmod')) ? prepare_numeric($_POST["override_user_id"]) : false;
|
||||||
|
|
||||||
|
// Verify volume number
|
||||||
|
if (preg_match('/[^0-9\.]+/', $volume_number)) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Volume Number field may only contain numbers and decimals. Please use the Chapter Name field for text input like Chapter titles.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify chapter_number
|
||||||
|
if (preg_match('/[^0-9\.]+/', $chapter_number)) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter Number field may only contain numbers and decimals. Please use the Chapter Name field for text input like Chapter titles.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify chapter title
|
||||||
|
if (stripos($chapter_name, 'ch. ') !== false || stripos($chapter_name, 'vol. ') !== false) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter name may not contain chapter or volume numbers. Please use the Volume / Chapter number field for that.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify there is no end tag
|
||||||
|
if (stripos($chapter_name, htmlentities(' <end>')) !== false || stripos($chapter_name, ' [end]') !== false) {
|
||||||
|
$error .= display_alert('warning', 'Format error', 'The Chapter name may not contain an end tag. Last chapters are set in the manga entry.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$manga = new Manga($manga_id);
|
||||||
|
$group = new Group($group_id);
|
||||||
|
$group_members_array = $group->get_members();
|
||||||
|
|
||||||
|
if ($group_id_2) {
|
||||||
|
$group2 = new Group($group_id_2);
|
||||||
|
$group2_members_array = $group2->get_members();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$group2 = new stdClass();
|
||||||
|
$group2->group_control = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($group_id_3) {
|
||||||
|
$group3 = new Group($group_id_3);
|
||||||
|
$group3_members_array = $group3->get_members();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$group3 = new stdClass();
|
||||||
|
$group3->group_control = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$validate_group_control = (!$group->group_control || $user->user_id == $group->group_leader_id || ($group->group_control && in_array($user->username, $group_members_array)));
|
||||||
|
$validate_group2_control = (!$group2->group_control || $user->user_id == $group2->group_leader_id || ($group2->group_control && in_array($user->username, $group2_members_array)));
|
||||||
|
$validate_group3_control = (!$group3->group_control || $user->user_id == $group3->group_leader_id || ($group3->group_control && in_array($user->username, $group3_members_array)));
|
||||||
|
|
||||||
|
$same_multi_group_validate = ($group_id != $group_id_2 && $group_id != $group_id_3 && ((!$group_id_2 && !$group_id_3) || $group_id_2 != $group_id_3));
|
||||||
|
|
||||||
|
if (!validate_level($user, 'gmod') && $user->has_active_restriction(USER_RESTRICTION_CHAPTER_UPLOAD)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CHAPTER_UPLOAD) ?? "Chapter upload failed!";
|
||||||
|
$error .= display_alert("danger", "Failed", $details); //timed_out
|
||||||
|
}
|
||||||
|
|
||||||
|
$remote = new RemoteFileUploader();
|
||||||
|
$remote->setContext(['userid' => $user->user_id]);
|
||||||
|
$isRemoteUploadError = false;
|
||||||
|
$wasRemoteUploaded = false;
|
||||||
|
if (empty($error) && isset($_POST['fileurl']) && !empty($_POST['fileurl']) && validate_level($user, 'gl')) {
|
||||||
|
if (!$remote->supports($_POST['fileurl'])) {
|
||||||
|
$error .= display_alert("danger", "Failed", 'This file url is not supported');
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
['filename' => $filename,
|
||||||
|
'filetype' => $filetype,
|
||||||
|
'filetmpname' => $filetmpname,
|
||||||
|
'filesize' => $filesize
|
||||||
|
] = $remote->downloadFromRemote($_POST['fileurl']);
|
||||||
|
|
||||||
|
$_FILES["file"] = [
|
||||||
|
'name' => $filename,
|
||||||
|
'type' => $filetype,
|
||||||
|
'tmp_name' => $filetmpname,
|
||||||
|
'error' => 0,
|
||||||
|
'size' => $filesize,
|
||||||
|
];
|
||||||
|
$wasRemoteUploaded = true;
|
||||||
|
} catch (RemoteFileUploadFailed $e) {
|
||||||
|
$error .= display_alert('danger', 'Failed', $e->getMessage());
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// send to sentry
|
||||||
|
trigger_error($e->getMessage(), E_USER_WARNING);
|
||||||
|
$error .= display_alert("danger", "Failed", 'Remote file upload failed');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($error) && (!isset($_FILES['file']['tmp_name']) || empty($_FILES['file']['tmp_name']))) {
|
||||||
|
$error .= display_alert("danger", "Failed", 'No upload found.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($error) && validate_level($user, 'member') && count(get_object_vars($manga)) && (($validate_group_control && $validate_group2_control && $validate_group3_control) || validate_level($user, 'gmod')) && $same_multi_group_validate) {
|
||||||
|
if ($external)
|
||||||
|
$chapter_hash = md5($manga_id . $chapter_name . $volume_number . $chapter_number . $timestamp);
|
||||||
|
elseif ($_FILES["file"]) {
|
||||||
|
$value = explode(".", $_FILES["file"]["name"]);
|
||||||
|
|
||||||
|
$validate_extention = in_array(strtolower(end($value)), ALLOWED_CHAPTER_EXT);
|
||||||
|
$validate_file_size = ($_FILES["file"]["size"] <= MAX_CHAPTER_FILESIZE) || validate_level($user, 'pr'); //check file size
|
||||||
|
$validate_zip_file = true;
|
||||||
|
|
||||||
|
// Check for zip bomb by limiting the uncompressed filesize to 200M, double whats allowed
|
||||||
|
if (($actualSize = get_zip_originalsize($_FILES["file"]["tmp_name"])) > (2 * MAX_CHAPTER_FILESIZE)) {
|
||||||
|
$validate_file_size = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($validate_extention && $validate_file_size && !empty($_FILES["file"]["tmp_name"]) && $zip->open($_FILES["file"]["tmp_name"]) === true) {
|
||||||
|
$chapter_hash = md5($manga_id . $chapter_name . $volume_number . $chapter_number . $timestamp);
|
||||||
|
|
||||||
|
mkdir(ABS_DATA_BASEPATH . "/data/$chapter_hash");
|
||||||
|
|
||||||
|
$zip->extractTo(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
$zip->close();
|
||||||
|
if ($wasRemoteUploaded) {
|
||||||
|
@unlink($_FILES["file"]["tmp_name"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
|
||||||
|
$pages = count($files);
|
||||||
|
|
||||||
|
if ($pages == 1 && is_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[2]")) { //folder
|
||||||
|
rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[2]", ABS_DATA_BASEPATH . "/data/$chapter_hash/folder"); //rename the dir
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder/");
|
||||||
|
foreach($files as $value) {
|
||||||
|
rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder/$value", ABS_DATA_BASEPATH . "/data/$chapter_hash/$value"); //move them all
|
||||||
|
}
|
||||||
|
|
||||||
|
rmdir(ABS_DATA_BASEPATH . "/data/$chapter_hash/folder");
|
||||||
|
|
||||||
|
$files = read_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/");
|
||||||
|
}
|
||||||
|
elseif ($pages > 1 && is_dir(ABS_DATA_BASEPATH . "/data/$chapter_hash/$files[3]")) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Your .zip contains multiple folders, or you have files starting with an invalid character (!)"); //can't open zip
|
||||||
|
}
|
||||||
|
elseif ($pages < 1) {
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your .zip did not contain any files.");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$validate_zip_file = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_FILES["file"]["error"]) && !empty($_FILES["file"]["error"]))
|
||||||
|
$error .= display_alert("danger", "Failed", "Missing file? Code: (" . $_FILES["file"]["error"] . ").");
|
||||||
|
elseif (!$validate_file_size)
|
||||||
|
$error .= display_alert("danger", "Failed", "File size exceeds 100 MB."); //too big
|
||||||
|
elseif (!$validate_extention)
|
||||||
|
$error .= display_alert("danger", "Failed", "Only .zip archvies are supported."); //too big
|
||||||
|
elseif (!$validate_zip_file)
|
||||||
|
$error .= display_alert("danger", "Failed", "There's something wrong with your .zip file."); //can't open zip
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$error .= display_alert("danger", "Failed", "Missing file."); //missing image
|
||||||
|
}
|
||||||
|
elseif (empty($error)) {
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again."); //timed_out
|
||||||
|
elseif (!$user->level_id)
|
||||||
|
$error .= display_alert("danger", "Failed", "You're banned from uploading!"); //banned
|
||||||
|
elseif (!$validate_group_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 1 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$validate_group2_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 2 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$validate_group3_control)
|
||||||
|
$error .= display_alert("danger", "Failed", "Group 3 have restricted uploads to members only."); //banned
|
||||||
|
elseif (!$same_multi_group_validate)
|
||||||
|
$error .= display_alert("danger", "Failed", "Identical groups detected."); //banned
|
||||||
|
elseif (!$stop)
|
||||||
|
$error .= display_alert("danger", "Failed", "Stop uploading for a while due to image transfer."); //banned
|
||||||
|
else
|
||||||
|
$error .= display_alert("danger", "Failed", "Manga #$manga_id does not exist.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//if no errors, then upload
|
||||||
|
if (!$error) {
|
||||||
|
if ($external) {
|
||||||
|
$page_order = $external;
|
||||||
|
} else {
|
||||||
|
$page_order = "";
|
||||||
|
natcasesort($files);
|
||||||
|
$arr = array_values($files);
|
||||||
|
//$letter = rand_letter(1);
|
||||||
|
foreach($arr as $key => $value) {
|
||||||
|
$key++;
|
||||||
|
$arr = explode(".", $value);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
if (!in_array($ext, ALLOWED_IMG_EXT))
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/data/$chapter_hash/$value");
|
||||||
|
else {
|
||||||
|
$sha256 = hash_file('sha256', ABS_DATA_BASEPATH . "/data/$chapter_hash/$value");
|
||||||
|
|
||||||
|
@rename(ABS_DATA_BASEPATH . "/data/$chapter_hash/$value", ABS_DATA_BASEPATH . "/data/$chapter_hash/$key-$sha256.$ext"); //rename them all numerically
|
||||||
|
|
||||||
|
$page_order .= "$key-$sha256.$ext,";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$page_order = rtrim($page_order, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
$upload_timestamp = $timestamp + $group->group_delay;
|
||||||
|
|
||||||
|
$is_delayed = $group->group_delay > 0;
|
||||||
|
|
||||||
|
$user_has_available_uploads = validate_level($user, 'pr') || $sql->prep('chapter_queue_check',
|
||||||
|
' SELECT count(chapter_id) FROM mangadex_chapters WHERE user_id = ? AND lang_id = ? AND available = 1 AND chapter_deleted = 0 LIMIT 1 ',
|
||||||
|
[$user->user_id, $lang_id], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
$available = !$user_has_available_uploads ? 0 : $available;
|
||||||
|
|
||||||
|
$available = (in_array($manga_id, DNU_MANGA_IDS) && $lang_id == 1) ? 0 : $available;
|
||||||
|
|
||||||
|
$uploader = $override_user_id ?: $user->user_id;
|
||||||
|
|
||||||
|
$chapter_id = $sql->modify('chapter_upload', "
|
||||||
|
INSERT INTO mangadex_chapters (chapter_id, chapter_hash, manga_id, volume, chapter, title, upload_timestamp, user_id, chapter_views, lang_id, authorised, group_id, group_id_2, group_id_3, server, page_order, chapter_deleted, thread_id, available)
|
||||||
|
VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, 0, ?, 0, ?, ?, ?, ?, ?, ?, 0, ?)
|
||||||
|
", [$chapter_hash, $manga_id, $volume_number, $chapter_number, $chapter_name, $upload_timestamp, $uploader, $lang_id, $group_id, $group_id_2, $group_id_3, IMAGE_SERVER, $page_order, $is_deleted ? 1 : 0, $available ? 1 : 0]);
|
||||||
|
|
||||||
|
if (!$user_has_available_uploads) {
|
||||||
|
if (defined('DISCORD_REPORT_PING_ROLE_ID')) {
|
||||||
|
$queued_chapter_count = $sql->prep('chapter_queue_check',
|
||||||
|
' SELECT count(DISTINCT chapter_id) FROM mangadex_upload_queue WHERE user_id = ? AND queue_conclusion IS NULL ',
|
||||||
|
[$user->user_id], 'fetchColumn', '', -1);
|
||||||
|
if ($queued_chapter_count === 0) {
|
||||||
|
post_on_discord(DISCORD_WEBHOOK_REPORT, [
|
||||||
|
'username' => 'MangaDex',
|
||||||
|
'content' => "<@&" . DISCORD_REPORT_PING_ROLE_ID . "> Chapter $chapter_id has been held in the upload queue.\n". URL . "user/$user->user_id \n". URL . "chapter/$chapter_id",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('chapter_upload', "
|
||||||
|
INSERT INTO mangadex_upload_queue (queue_id, user_id, chapter_id) VALUES (NULL, ?, ?)
|
||||||
|
", [$user->user_id, $chapter_id]);
|
||||||
|
|
||||||
|
$memcached->delete('mod_upload_queue_count');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$is_deleted)
|
||||||
|
$sql->modify('chapter_upload', " UPDATE mangadex_groups SET group_last_updated = ? WHERE group_id = ? LIMIT 1 ", [$timestamp, $group_id]);
|
||||||
|
|
||||||
|
if ($is_delayed && !$is_deleted) {
|
||||||
|
// Add this chapter to the delayed_chapters table, so metadata can be modified at a later date
|
||||||
|
if ($chapter_id > 0) {
|
||||||
|
$sql->modify('chapter_delayed', 'INSERT INTO mangadex_delayed_chapters (`chapter_id`, `manga_id`, `upload_timestamp`) VALUES (?,?,?)', [$chapter_id, $manga_id, $upload_timestamp]);
|
||||||
|
}
|
||||||
|
} else if (!$is_deleted) {
|
||||||
|
$sql->modify('chapter_upload', " UPDATE mangadex_mangas SET manga_last_uploaded = ? WHERE manga_id = ? LIMIT 1 ", [$timestamp, $manga_id]);
|
||||||
|
|
||||||
|
$sql->modify('chapter_upload', "
|
||||||
|
INSERT INTO mangadex_last_updated (chapter_id, manga_id, volume, chapter, title, upload_timestamp, user_id, lang_id, group_id, group_id_2, group_id_3, available)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE chapter_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?, group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ?
|
||||||
|
", [$chapter_id, $manga_id, $volume_number, $chapter_number, $chapter_name, $upload_timestamp, $uploader, $lang_id, $group_id, $group_id_2, $group_id_3, $available ? 1 : 0, $chapter_id, $volume_number, $chapter_number, $chapter_name, $upload_timestamp, $uploader, $group_id, $group_id_2, $group_id_3, $available ? 1 : 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($group_id_2 && !$is_deleted)
|
||||||
|
$sql->modify('chapter_upload', " UPDATE mangadex_groups SET group_last_updated = ? WHERE group_id = ? LIMIT 1 ", [$timestamp, $group_id_2]);
|
||||||
|
|
||||||
|
if ($group_id_3 && !$is_deleted)
|
||||||
|
$sql->modify('chapter_upload', " UPDATE mangadex_groups SET group_last_updated = ? WHERE group_id = ? LIMIT 1 ", [$timestamp, $group_id_3]);
|
||||||
|
|
||||||
|
if (!$is_deleted && $user->user_uploads)
|
||||||
|
$sql->modify('chapter_upload', " UPDATE mangadex_users SET user_uploads = user_uploads + 1 WHERE user_id = ? LIMIT 1 ", [$user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
|
||||||
|
$result = ($error) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
}
|
665
ajax/actions/forums.actions.req.php
Normal file
@ -0,0 +1,665 @@
|
|||||||
|
<?php
|
||||||
|
switch ($function) {
|
||||||
|
case "start_empty_thread":
|
||||||
|
$thread_type = is_numeric($_POST["type"]) ? (int) $_POST["type"] : 3;
|
||||||
|
// TODO: Change hardcoded forum ids
|
||||||
|
$forum_id = ($thread_type === 1) ? 11 : (($thread_type === 2) ? 14 : 12);
|
||||||
|
$type = ($thread_type === 1) ? 'manga' : (($thread_type === 2) ? 'group' : 'chapter');
|
||||||
|
$type_id = prepare_numeric($_POST["type_id"]);
|
||||||
|
$has_thread = false;
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again."); //success
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod') && $user->has_active_restriction(USER_RESTRICTION_POST_COMMENT)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_POST_COMMENT) ?? "Thread creation failed!";
|
||||||
|
$error .= display_alert("danger", "Failed", $details);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check existence of thread.
|
||||||
|
if (!$error) {
|
||||||
|
// These values are probably in cache since the user is on a page for them. So lets just load that
|
||||||
|
if ($thread_type === 1)
|
||||||
|
$type_instance = new Manga($type_id);
|
||||||
|
elseif ($thread_type === 2)
|
||||||
|
$type_instance = new Group($type_id);
|
||||||
|
else
|
||||||
|
$type_instance = new Chapter($type_id);
|
||||||
|
if ($type_instance) {
|
||||||
|
if ($type_instance->thread_id) {
|
||||||
|
$has_thread = true;
|
||||||
|
$details = $type_instance->thread_id;
|
||||||
|
//$error = display_alert("danger", "Failed", ucfirst($type) . " has a thread (#{$type_instance->thread_id})!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = display_alert("danger", "Failed", ucfirst($type) . " does not exist!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to create a thread if there were no errors, and one does not already exist
|
||||||
|
if (!$error && !$has_thread) {
|
||||||
|
$sql->beginTransaction();
|
||||||
|
try {
|
||||||
|
$thread_id = $sql->modify('start_empty_thread', " INSERT INTO mangadex_threads (thread_id, thread_name, forum_id, user_id, thread_posts, thread_views, thread_locked, thread_sticky, thread_deleted, last_post_user_id, last_post_timestamp, last_post_id)
|
||||||
|
VALUES (NULL, ?, ?, 1, 0, 0, 0, 0, 0, 0, 0, 0) ", [$type_id, $forum_id]);
|
||||||
|
|
||||||
|
$sql->modify('start_empty_thread', "
|
||||||
|
UPDATE mangadex_forums
|
||||||
|
SET last_thread_id = ?,
|
||||||
|
count_threads = (SELECT count(*) FROM mangadex_threads WHERE forum_id = ?),
|
||||||
|
count_posts = (SELECT SUM(thread_posts) FROM mangadex_threads WHERE forum_id = ?)
|
||||||
|
WHERE forum_id = ? LIMIT 1 ", [$thread_id, $forum_id, $forum_id, $forum_id]);
|
||||||
|
|
||||||
|
$sql->modify('start_empty_thread', "
|
||||||
|
UPDATE mangadex_{$type}s
|
||||||
|
SET thread_id = ?
|
||||||
|
WHERE {$type}_id = ? AND thread_id = 0 LIMIT 1
|
||||||
|
", [$thread_id, $type_id]);
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
$sql->commit();
|
||||||
|
|
||||||
|
$memcached->delete("{$type}_$type_id");
|
||||||
|
$memcached->delete("forum_$forum_id");
|
||||||
|
}
|
||||||
|
catch (\Throwable $e) {
|
||||||
|
// We lost connection to the db or some other internal error
|
||||||
|
$sql->rollBack();
|
||||||
|
$error = display_alert('danger', 'Failed', 'Please refresh your browser and try again.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alert user if any errors occurred
|
||||||
|
if ($error) {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "start_thread":
|
||||||
|
$forum_id = prepare_numeric($_GET["id"]);
|
||||||
|
$subject = htmlentities($_POST["subject"]);
|
||||||
|
$post_text = htmlentities($_POST["text"]);
|
||||||
|
$poll_items = htmlentities($_POST["poll_items"]);
|
||||||
|
$poll_days = prepare_numeric($_POST["poll_days"]);
|
||||||
|
|
||||||
|
$threads = new Forum_Threads($forum_id);
|
||||||
|
|
||||||
|
$poll_items_array = explode("\r\n", $poll_items); //array of poll items
|
||||||
|
|
||||||
|
$error = "";
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod') && $user->has_active_restriction(USER_RESTRICTION_POST_COMMENT)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_POST_COMMENT) ?? "Thread creation failed!";
|
||||||
|
$error .= display_alert("danger", "Failed", $details);
|
||||||
|
}
|
||||||
|
elseif (!$subject)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your subject is empty.");
|
||||||
|
elseif (!$post_text)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your post is empty.");
|
||||||
|
elseif (!empty($poll_items) && count($poll_items_array) == 1) //poll_items not empty and only 1 item in the poll_items
|
||||||
|
$error .= display_alert("danger", "Failed", "You need at least 2 poll items.");
|
||||||
|
elseif (!$user->user_id)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again.");
|
||||||
|
elseif (!validate_level($user, $threads->start_thread_level))
|
||||||
|
$error .= display_alert("danger", "Failed", "You don't have permission to start a thread in this forum.");
|
||||||
|
|
||||||
|
if (!$user->premium && !validate_level($user, 'pr') && !$error) {
|
||||||
|
$MIN_FIRST_THREAD_SECONDS = 60*60*24;
|
||||||
|
$MIN_THREAD_INTERVAL_SECONDS = 60*5;
|
||||||
|
if ($user->joined_timestamp + $MIN_FIRST_THREAD_SECONDS > time()) {
|
||||||
|
$error .= display_alert("danger", "Failed", "You have to wait until you can make your first thread.");
|
||||||
|
} else {
|
||||||
|
$last_timestamp = $sql->prep('start_thread', "
|
||||||
|
SELECT MIN(p.timestamp) AS op_timestamp
|
||||||
|
FROM mangadex_threads t
|
||||||
|
INNER JOIN mangadex_forum_posts p ON t.user_id = p.user_id
|
||||||
|
WHERE t.thread_id = p.thread_id AND p.user_id = ?
|
||||||
|
GROUP BY t.thread_id
|
||||||
|
ORDER BY op_timestamp DESC
|
||||||
|
LIMIT 1
|
||||||
|
", [$user->user_id], 'fetch', PDO::FETCH_COLUMN, -1);
|
||||||
|
if ($last_timestamp + $MIN_THREAD_INTERVAL_SECONDS > time()) {
|
||||||
|
$error .= display_alert("danger", "Failed", "You have to wait until you can make your next thread.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
if (!empty($poll_items))
|
||||||
|
$poll_expire_timestamp = $timestamp + $poll_days * 60 * 60 * 24;
|
||||||
|
else
|
||||||
|
$poll_expire_timestamp = 0;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('start_thread', " INSERT INTO mangadex_threads (thread_id, thread_name, forum_id, user_id, thread_posts, thread_views, thread_locked, thread_sticky, thread_deleted, last_post_user_id, last_post_timestamp, last_post_id, poll_expire_timestamp)
|
||||||
|
VALUES (NULL, ?, ?, ?, 1, 0, 0, 0, 0, ?, ?, 0, ?) ", [$subject, $forum_id, $user->user_id, $user->user_id, $timestamp, $poll_expire_timestamp]); // insert thread into threads table
|
||||||
|
|
||||||
|
if (!empty($poll_items)) {
|
||||||
|
foreach ($poll_items_array as $item) {
|
||||||
|
$sql->modify('start_thread', " INSERT INTO mangadex_forum_poll_items (item_id, item_name, thread_id) VALUES (NULL, ?, ?) ", [$item, $thread_id]); // insert poll_items into poll_items table
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('start_thread', "
|
||||||
|
UPDATE mangadex_forums
|
||||||
|
SET last_thread_id = ?,
|
||||||
|
count_threads = (SELECT count(*) FROM mangadex_threads WHERE forum_id = ?),
|
||||||
|
count_posts = (SELECT SUM(thread_posts) FROM mangadex_threads WHERE forum_id = ?)
|
||||||
|
WHERE forum_id = ? LIMIT 1 ", [$thread_id, $forum_id, $forum_id, $forum_id]); //update forum metadata
|
||||||
|
|
||||||
|
$post_id = $sql->modify('start_thread', " INSERT INTO mangadex_forum_posts (post_id, thread_id, user_id, timestamp, edit_timestamp, edit_user_id, text, deleted)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), 0, 0, ?, 0) ", [$thread_id, $user->user_id, $post_text]); //insert post into posts table
|
||||||
|
|
||||||
|
$sql->modify('start_thread', "
|
||||||
|
UPDATE mangadex_threads
|
||||||
|
SET last_post_id = ?
|
||||||
|
WHERE thread_id = ? LIMIT 1 ", [$post_id, $thread_id]); //update thread metadata
|
||||||
|
|
||||||
|
$callback = new Notify_Callback($post_id);
|
||||||
|
$post_text = preg_replace_callback("/(@[a-zA-Z0-9_-]+)/", [$callback, 'notify'], $post_text);
|
||||||
|
$sql->modify('start_thread', " UPDATE mangadex_forum_posts SET text = ? WHERE post_id = ? ", [$post_text, $post_id]);
|
||||||
|
|
||||||
|
if ($forum_id == 3) { //announcement stuff
|
||||||
|
$sql->modify('start_thread', " UPDATE mangadex_users SET read_announcement = ? ", [0]);
|
||||||
|
$memcached->delete('top_announce');
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("forum_$forum_id");
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "delete_threads":
|
||||||
|
$forum_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't delete threads.";
|
||||||
|
elseif(!$_POST['thread_id'])
|
||||||
|
$error = "No threads selected.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
foreach($_POST['thread_id'] as $thread_id) {
|
||||||
|
$thread_id = prepare_numeric($thread_id);
|
||||||
|
$sql->modify('delete_threads', " UPDATE mangadex_threads SET thread_deleted = 1 WHERE thread_id = ? LIMIT 1 ", [$thread_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("forum_$forum_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "lock_thread":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't lock threads.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('lock_thread', " UPDATE mangadex_threads SET thread_locked = 1 WHERE thread_id = ? LIMIT 1 ", [$thread_id]);
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "unlock_thread":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't unlock threads.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('unlock_thread', " UPDATE mangadex_threads SET thread_locked = 0 WHERE thread_id = ? LIMIT 1 ", [$thread_id]);
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "sticky_thread":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't sticky threads.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('sticky_thread', " UPDATE mangadex_threads SET thread_sticky = 1 WHERE thread_id = ? LIMIT 1 ", [$thread_id]);
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "unsticky_thread":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't unsticky threads.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('unsticky_thread', " UPDATE mangadex_threads SET thread_sticky = 0 WHERE thread_id = ? LIMIT 1 ", [$thread_id]);
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "edit_thread":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
$thread_name = htmlentities($_POST["thread_name"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr'))
|
||||||
|
$error = "You can't edit threads.";
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('edit_thread', " UPDATE mangadex_threads SET thread_name = ? WHERE thread_id = ? LIMIT 1 ", [$thread_name, $thread_id]);
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
$details = $thread_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "vote":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
$poll_item_id = prepare_numeric($_POST["poll_item_id"]);
|
||||||
|
|
||||||
|
$sql->modify('vote', " INSERT IGNORE INTO mangadex_forum_poll_votes (thread_id, user_id, item_id) VALUES (?, ?, ?) ", [$thread_id, $user->user_id, $poll_item_id]); //insert or update vote
|
||||||
|
|
||||||
|
$sql->modify('vote', "
|
||||||
|
UPDATE mangadex_forum_poll_items
|
||||||
|
SET vote_count = (SELECT count(*) FROM mangadex_forum_poll_votes WHERE item_id = ? AND thread_id = ?)
|
||||||
|
WHERE item_id = ? AND thread_id = ? LIMIT 1
|
||||||
|
", [$poll_item_id, $thread_id, $poll_item_id, $thread_id]); //increase new vote counter
|
||||||
|
|
||||||
|
$memcached->delete("thread_{$thread_id}_user_{$user->user_id}_vote");
|
||||||
|
$memcached->delete("thread_{$thread_id}_poll_total_votes");
|
||||||
|
$memcached->delete("thread_{$thread_id}_poll_items");
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_reply":
|
||||||
|
$thread_id = prepare_numeric($_GET["id"]);
|
||||||
|
$post_text = htmlentities($_POST["text"]);
|
||||||
|
|
||||||
|
$thread = $sql->prep('post_reply', ' SELECT thread_id, thread_locked, forum_id FROM mangadex_threads WHERE thread_id = ? LIMIT 1 ', [$thread_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod') && $user->has_active_restriction(USER_RESTRICTION_POST_COMMENT)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_POST_COMMENT) ?? "Post creation failed!";
|
||||||
|
$error = $details;
|
||||||
|
}
|
||||||
|
else if(!$post_text)
|
||||||
|
$error = "Your post is empty.";
|
||||||
|
elseif (!$user->user_id)
|
||||||
|
$error = "Your session has timed out. Please log in again.";
|
||||||
|
elseif (!$thread->thread_id)
|
||||||
|
$error = "The thread does not exist.";
|
||||||
|
elseif ($thread->thread_locked && !validate_level($user, 'pr'))
|
||||||
|
$error = "The thread is locked.";
|
||||||
|
|
||||||
|
if (!$user->premium && !validate_level($user, 'pr') && !$error) {
|
||||||
|
$MIN_FIRST_POST_SECONDS = 86400;
|
||||||
|
$MIN_POST_INTERVAL_SECONDS = 60*2;
|
||||||
|
if ($user->joined_timestamp + $MIN_FIRST_POST_SECONDS > time()) {
|
||||||
|
$error = "You have to wait until you can make your first post.";
|
||||||
|
} else {
|
||||||
|
$last_timestamp = $sql->prep('post_reply', "
|
||||||
|
SELECT timestamp
|
||||||
|
FROM mangadex_forum_posts
|
||||||
|
WHERE user_id = ?
|
||||||
|
ORDER BY timestamp DESC
|
||||||
|
LIMIT 1
|
||||||
|
", [$user->user_id], 'fetch', PDO::FETCH_COLUMN, -1);
|
||||||
|
if ($last_timestamp + $MIN_POST_INTERVAL_SECONDS > time()) {
|
||||||
|
$error = "You have to wait until you can make your next post.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$post_id = $sql->modify('post_reply', " INSERT INTO mangadex_forum_posts (post_id, thread_id, user_id, timestamp, edit_timestamp, edit_user_id, text, deleted) VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), 0, 0, ?, 0) ", [$thread_id, $user->user_id, $post_text]);
|
||||||
|
|
||||||
|
$sql->modify('post_reply', " UPDATE mangadex_threads SET thread_posts = thread_posts + 1, last_post_user_id = ?, last_post_timestamp = UNIX_TIMESTAMP(), last_post_id = ? WHERE thread_id = ? LIMIT 1 ", [$user->user_id, $post_id, $thread_id]);
|
||||||
|
|
||||||
|
$sql->modify('post_reply', "
|
||||||
|
UPDATE mangadex_forums
|
||||||
|
SET last_thread_id = ?,
|
||||||
|
count_threads = (SELECT count(*) FROM mangadex_threads WHERE forum_id = ?),
|
||||||
|
count_posts = (SELECT SUM(thread_posts) FROM mangadex_threads WHERE forum_id = ?)
|
||||||
|
WHERE forum_id = ? LIMIT 1 ", [$thread_id, $thread->forum_id, $thread->forum_id, $thread->forum_id]);
|
||||||
|
|
||||||
|
$callback = new Notify_Callback($post_id);
|
||||||
|
$post_text = preg_replace_callback("/(@[a-zA-Z0-9_-]+)/", [$callback, 'notify'], $post_text);
|
||||||
|
$sql->modify('post_reply', " UPDATE mangadex_forum_posts SET text = ? WHERE post_id = ? ", [$post_text, $post_id]);
|
||||||
|
|
||||||
|
switch ($thread->forum_id) {
|
||||||
|
case 11:
|
||||||
|
$manga_id = $sql->prep('post_reply', ' SELECT manga_id FROM mangadex_mangas WHERE thread_id = ? LIMIT 1 ', [$thread_id], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("manga_$manga_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
$chapter_id = $sql->prep('post_reply', ' SELECT chapter_id FROM mangadex_chapters WHERE thread_id = ? LIMIT 1 ', [$thread_id], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("chapter_$chapter_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
$group_id = $sql->prep('post_reply', ' SELECT group_id FROM mangadex_groups WHERE thread_id = ? LIMIT 1 ', [$thread_id], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("group_$group_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$memcached->delete("thread_$thread_id");
|
||||||
|
|
||||||
|
$details = $thread_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print display_alert("danger", "Failed", $error);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_edit":
|
||||||
|
$post_id = prepare_numeric($_GET["id"]);
|
||||||
|
$post_text = htmlentities($_POST["text"]);
|
||||||
|
|
||||||
|
$previous_post = $sql->prep('post_edit', ' SELECT * FROM mangadex_forum_posts WHERE post_id = ? LIMIT 1 ', [$post_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod') && $user->has_active_restriction(USER_RESTRICTION_POST_COMMENT)) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_POST_COMMENT) ?? "Thread edit failed!";
|
||||||
|
$error .= display_alert("danger", "Failed", $details);
|
||||||
|
}
|
||||||
|
elseif (!$post_text)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your post is empty.");
|
||||||
|
elseif (!$user->user_id)
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again."); //success
|
||||||
|
elseif (!(validate_level($user, 'pr') || $user->user_id == $previous_post->user_id))
|
||||||
|
$error .= display_alert("danger", "Failed", "You can't edit this post.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
// Store previous version in database
|
||||||
|
$sql->modify(
|
||||||
|
'post_edit',
|
||||||
|
'INSERT INTO mangadex_forum_posts_history (post_id, user_id, timestamp, text) VALUES (?, ?, ?, ?)',
|
||||||
|
[
|
||||||
|
$previous_post->post_id,
|
||||||
|
$previous_post->edit_user_id !== 0 ? $previous_post->edit_user_id : $previous_post->user_id,
|
||||||
|
$previous_post->edit_timestamp !== 0 ? $previous_post->edit_timestamp : $previous_post->timestamp,
|
||||||
|
$previous_post->text
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Update actual comment row
|
||||||
|
$callback = new Notify_Callback($post_id);
|
||||||
|
$post_text = preg_replace_callback("/(@[a-zA-Z0-9_-]+)/", [$callback, 'notify'], $post_text);
|
||||||
|
$sql->modify('post_edit', " UPDATE mangadex_forum_posts SET text = ?, edit_timestamp = UNIX_TIMESTAMP(), edit_user_id = ? WHERE post_id = ? ", [$post_text, $user->user_id, $post_id]);
|
||||||
|
|
||||||
|
$details = $post_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_delete":
|
||||||
|
$post_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$post = $sql->prep('post_delete', '
|
||||||
|
SELECT posts.user_id, posts.thread_id, threads.forum_id
|
||||||
|
FROM mangadex_forum_posts AS posts
|
||||||
|
LEFT JOIN mangadex_threads AS threads
|
||||||
|
ON threads.thread_id = posts.thread_id
|
||||||
|
WHERE posts.post_id = ?
|
||||||
|
LIMIT 1
|
||||||
|
', [$post_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
|
||||||
|
if ($post->user_id) {
|
||||||
|
if (validate_level($user, 'pr')) {
|
||||||
|
$sql->modify('post_delete', " UPDATE mangadex_forum_posts SET deleted = 1 WHERE post_id = ? LIMIT 1 ", [$post_id]);
|
||||||
|
|
||||||
|
$sql->modify('post_delete', " UPDATE mangadex_threads SET thread_posts = thread_posts - 1 WHERE thread_id = ? LIMIT 1 ", [$post->thread_id]);
|
||||||
|
|
||||||
|
switch ($post->forum_id) {
|
||||||
|
case 11:
|
||||||
|
$manga_id = $sql->prep('post_delete', ' SELECT manga_id FROM mangadex_mangas WHERE thread_id = ? LIMIT 1 ', [$post->thread_id], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("manga_$manga_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
$group_id = $sql->prep('post_delete', ' SELECT group_id FROM mangadex_groups WHERE thread_id = ? LIMIT 1 ', [$post->thread_id], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("group_$group_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = $post->thread_id;
|
||||||
|
print display_alert("success", "Success", "Post #$post_id has been deleted."); // success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't delete Post #$post_id.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Post #$post_id does not exist.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_history":
|
||||||
|
$post_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
// Check if PR+
|
||||||
|
if (!validate_level($user, 'pr')) {
|
||||||
|
print display_alert("danger", "Failed", "You can't view this post history.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve history
|
||||||
|
$post_history = $sql->prep(
|
||||||
|
'post_edit',
|
||||||
|
'SELECT
|
||||||
|
history.*, users.username, levels.level_colour AS editor_level_colour
|
||||||
|
FROM mangadex_forum_posts_history AS history
|
||||||
|
LEFT JOIN mangadex_users AS users ON history.user_id = users.user_id
|
||||||
|
LEFT JOIN mangadex_user_levels AS levels ON users.level_id = levels.level_id
|
||||||
|
WHERE history.post_id = ? ORDER BY history.timestamp DESC',
|
||||||
|
[$post_id],
|
||||||
|
'fetchAll',
|
||||||
|
PDO::FETCH_OBJ,
|
||||||
|
-1
|
||||||
|
);
|
||||||
|
|
||||||
|
// Show message if no edits stored
|
||||||
|
if (count($post_history) === 0) {
|
||||||
|
print display_alert("info", "No History", "There are no previous versions of this post available.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build
|
||||||
|
print parse_template(
|
||||||
|
'forum/post_history',
|
||||||
|
[
|
||||||
|
'user' => $user,
|
||||||
|
'posts' => $post_history,
|
||||||
|
'parser' => $parser,
|
||||||
|
]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_moderate":
|
||||||
|
$post_id = prepare_numeric($_GET["id"]);
|
||||||
|
$set_moderate = (bool)prepare_numeric($_GET["value"]) ? 1 : 0;
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr')) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Unauthorized action.");
|
||||||
|
}
|
||||||
|
elseif (!$user->user_id) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again."); //success
|
||||||
|
}
|
||||||
|
$post = $sql->prep('post_moderate', ' SELECT post.*,
|
||||||
|
(SELECT (count(*) -1) DIV 20 + 1 FROM mangadex_forum_posts
|
||||||
|
WHERE mangadex_forum_posts.post_id <= post.post_id
|
||||||
|
AND mangadex_forum_posts.thread_id = post.thread_id
|
||||||
|
AND mangadex_forum_posts.deleted = 0) AS thread_page
|
||||||
|
FROM mangadex_forum_posts AS post WHERE post.post_id = ? LIMIT 1 ', [$post_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
if (!$post) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Post not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('post_moderate', " UPDATE mangadex_forum_posts SET moderated = ? WHERE post_id = ? ", [$set_moderate, $post_id]);
|
||||||
|
|
||||||
|
if ($set_moderate) {
|
||||||
|
// send the moderated user an automated message
|
||||||
|
|
||||||
|
$url = URL . "thread/$post->thread_id/$post->thread_page/#post_$post->post_id";
|
||||||
|
$subject = "[Warning] Your comment has been marked as moderated";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"One of your comments in [url=$url]this thread[/url] has been marked as moderated because it has been found to break a rule. This means it is hidden from all users who have not enabled displaying moderated comments.\n\n" .
|
||||||
|
"This moderated comment will not necessarily lead to further disciplinary action but repeated offenses may do so.\n\n" .
|
||||||
|
"This is an automated message, do not reply. If you have questions about moderation, please contact a moderator on the staff.";
|
||||||
|
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $post->user_id;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, ?, 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id, $timestamp]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = $post_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "post_spoiler":
|
||||||
|
$post_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr')) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Unauthorized action.");
|
||||||
|
}
|
||||||
|
elseif (!$user->user_id) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Your session has timed out. Please log in again."); //success
|
||||||
|
}
|
||||||
|
|
||||||
|
$post = $sql->prep('post_spoiler', ' SELECT post.*,
|
||||||
|
(SELECT (count(*) -1) DIV 20 + 1 FROM mangadex_forum_posts
|
||||||
|
WHERE mangadex_forum_posts.post_id <= post.post_id
|
||||||
|
AND mangadex_forum_posts.thread_id = post.thread_id
|
||||||
|
AND mangadex_forum_posts.deleted = 0) AS thread_page
|
||||||
|
FROM mangadex_forum_posts AS post WHERE post.post_id = ? LIMIT 1 ', [$post_id], 'fetch', PDO::FETCH_OBJ, -1);
|
||||||
|
if (!$post) {
|
||||||
|
$error .= display_alert("danger", "Failed", "Post not found.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$updated_text = "[spoiler]$post->text[/spoiler]\n\n[code]Mod Note: Please use spoiler tags when talking about chapter-specific or future events.[/code]";
|
||||||
|
|
||||||
|
//$sql->modify('post_spoiler', " UPDATE mangadex_forum_posts SET text = ? WHERE post_id = ? ", [$updated_text, $post_id]);
|
||||||
|
|
||||||
|
$sql->modify(
|
||||||
|
'post_spoiler',
|
||||||
|
'INSERT INTO mangadex_forum_posts_history (post_id, user_id, timestamp, text) VALUES (?, ?, ?, ?)',
|
||||||
|
[
|
||||||
|
$post->post_id,
|
||||||
|
$post->edit_user_id !== 0 ? $post->edit_user_id : $post->user_id,
|
||||||
|
$post->edit_timestamp !== 0 ? $post->edit_timestamp : $post->timestamp,
|
||||||
|
$post->text
|
||||||
|
]
|
||||||
|
);
|
||||||
|
$sql->modify('post_spoiler', " UPDATE mangadex_forum_posts SET text = ?, edit_timestamp = UNIX_TIMESTAMP(), edit_user_id = ? WHERE post_id = ? ", [$updated_text, $user->user_id, $post_id]);
|
||||||
|
|
||||||
|
// send the user whose post was spoilered an automated message
|
||||||
|
|
||||||
|
$url = URL . "thread/$post->thread_id/$post->thread_page/#post_$post->post_id";
|
||||||
|
$subject = "[Warning] Your comment has been marked as a spoiler";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"One of your comments in [url=$url]this thread[/url] has been edited because it has been found to be in violation of Rules 5.2.2 and/or 5.4.4.\n\n" .
|
||||||
|
"This comment will not necessarily lead to further disciplinary action but repeated offenses may do so.\n\n" .
|
||||||
|
"This is an automated message, do not reply. If you have questions about moderation, please contact a moderator on the staff.";
|
||||||
|
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $post->user_id;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, ?, 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id, $timestamp]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$details = $post_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
}
|
452
ajax/actions/groups.actions.req.php
Normal file
@ -0,0 +1,452 @@
|
|||||||
|
<?php
|
||||||
|
switch ($function) {
|
||||||
|
case "group_add":
|
||||||
|
$group_name = htmlentities($_POST["group_name"]);
|
||||||
|
$group_lang_id = prepare_numeric($_POST["group_lang_id"]);
|
||||||
|
$group_website = str_replace(['javascript:'], '', htmlentities($_POST["group_website"]));
|
||||||
|
$group_irc_channel = htmlentities($_POST["group_irc_channel"]);
|
||||||
|
$group_irc_server = htmlentities($_POST["group_irc_server"]);
|
||||||
|
$group_discord = str_replace(['javascript:'], '', htmlentities($_POST["group_discord"]));
|
||||||
|
$group_email = str_replace(['javascript:'], '', htmlentities($_POST["group_email"]));
|
||||||
|
$group_description = str_replace(['javascript:'], '', htmlentities($_POST["group_description"]));
|
||||||
|
|
||||||
|
//existing group
|
||||||
|
$count_group_name = $sql->prep('group_add', ' SELECT count(*) FROM mangadex_groups WHERE group_name = ? ', [$group_name], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
// Make sure website has http://
|
||||||
|
if (!empty($group_website) && stripos($group_website, 'http://') === false && stripos($group_website, 'https://') === false)
|
||||||
|
$group_website = 'http://'.$group_website;
|
||||||
|
|
||||||
|
if (!$count_group_name) {
|
||||||
|
$group_discord = str_replace(['https://discord.gg/', 'https://discordapp.com/invite/'], ['', ''], $group_discord);
|
||||||
|
|
||||||
|
$group_id = $sql->modify('group_add', "
|
||||||
|
INSERT INTO mangadex_groups (group_id, group_name, group_alt_name, group_leader_id, group_website, group_irc_channel, group_irc_server, group_discord, group_email, group_lang_id, group_founded, group_banner, group_likes, group_follows, group_views, group_description, group_control, group_delay, group_last_updated, thread_id) VALUES (NULL, ?, '', 1, ?, ?, ?, ?, ?, ?, '2018-01-01', '', 0, 0, 0, ?, 0, 0, 0, 0)
|
||||||
|
", [$group_name, $group_website, $group_irc_channel, $group_irc_server, $group_discord, $group_email, $group_lang_id, $group_description]);
|
||||||
|
|
||||||
|
$details = $group_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Your chosen group name is not unique.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_add_member":
|
||||||
|
$group_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$group = new Group($group_id);
|
||||||
|
|
||||||
|
$add_member_user_id = prepare_numeric($_POST["add_member_user_id"]);
|
||||||
|
$check_member = $sql->prep('group_add_member', ' SELECT count(*) FROM mangadex_users WHERE user_id = ? ', [$add_member_user_id], 'fetchColumn', '', -1);
|
||||||
|
$check_existing_member = $sql->prep('group_add_member', ' SELECT count(*) FROM mangadex_link_user_group WHERE user_id = ? AND group_id = ? ', [$add_member_user_id, $group_id], 'fetchColumn', '', -1);
|
||||||
|
$user_is_already_invited = $memcached->get("group_{$group_id}_invite_{$add_member_user_id}");
|
||||||
|
|
||||||
|
// invalid user
|
||||||
|
if(!($check_member && !$check_existing_member && $add_member_user_id > 1)){
|
||||||
|
$details = "User does not exist or is already in your group.";
|
||||||
|
print display_alert("danger", "Failed", $details);
|
||||||
|
}
|
||||||
|
// gmods can add directly
|
||||||
|
else if(validate_level($user, 'gmod')){
|
||||||
|
$sql->modify('group_add_member', " INSERT INTO mangadex_link_user_group (id, user_id, group_id, role) VALUES (NULL, ?, ?, 2) ", [$add_member_user_id, $group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_{$group_id}_invite_{$add_member_user_id}");
|
||||||
|
$memcached->delete("group_{$group_id}_members_display");
|
||||||
|
$memcached->delete("group_{$group_id}_members");
|
||||||
|
$memcached->delete("group_{$group_id}");
|
||||||
|
$memcached->delete("user_{$add_member_user_id}_groups");
|
||||||
|
|
||||||
|
$details = $group_id;
|
||||||
|
print display_alert("success", "Success", "User $add_member_user_id has been added to group $group_id."); //success
|
||||||
|
}
|
||||||
|
// group leaders can invite if user not already invited
|
||||||
|
else if($group->group_leader_id == $user->user_id && !$user_is_already_invited){
|
||||||
|
$memcached->set("group_{$group_id}_invite_{$add_member_user_id}", "pending", 1209600);
|
||||||
|
|
||||||
|
// send the invitee an automated message
|
||||||
|
$subject = "You have been invited to join {$group->group_name}.";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"You have been invited to join group {$group->group_name}.
|
||||||
|
Please check the [url=https://mangadex.org/group/{$group->group_id}]group's[/url] page to accept or decline the invitation.
|
||||||
|
This invitation will expire in 2 weeks.";
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $add_member_user_id;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', '
|
||||||
|
INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id]);
|
||||||
|
$sql->modify('msg_send', '
|
||||||
|
INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "User $add_member_user_id has been invited to group $group_id."); //success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't invite group members or the user is already invited.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_accept_invite":
|
||||||
|
$group_id = prepare_numeric($_GET["id"]);
|
||||||
|
$user_id = $user->user_id;
|
||||||
|
|
||||||
|
if($memcached->get("group_{$group_id}_invite_{$user_id}") == "pending"){
|
||||||
|
$sql->modify('group_add_member', " INSERT INTO mangadex_link_user_group (id, user_id, group_id, role) VALUES (NULL, ?, ?, 2) ", [$user_id, $group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_{$group_id}_invite_{$user_id}");
|
||||||
|
$memcached->delete("group_{$group_id}_members_display");
|
||||||
|
$memcached->delete("group_{$group_id}_members");
|
||||||
|
$memcached->delete("group_{$group_id}");
|
||||||
|
$memcached->delete("user_{$user_id}_groups");
|
||||||
|
|
||||||
|
$details = $group_id;
|
||||||
|
|
||||||
|
// send the group leader an automated message
|
||||||
|
$group = new Group($group_id);
|
||||||
|
$subject = "{$user->username} has accepted your invite.";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"{$user->username} has accepted your invite and is now a member of [url=https://mangadex.org/group/{$group_id}]{$group->group_name}[/url].";
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $group->group_leader_id;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', '
|
||||||
|
INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id]);
|
||||||
|
$sql->modify('msg_send', '
|
||||||
|
INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "You have joined group $group->group_name."); //success
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
print display_alert("danger", "Failed", "You have not been invited to group {$group_id}"); //success
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "group_reject_invite":
|
||||||
|
$group_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if($memcached->get("group_{$group_id}_invite_{$user->user_id}") == "pending") {
|
||||||
|
$memcached->set("group_{$group_id}_invite_{$user->user_id}", "rejected", 1209600);
|
||||||
|
|
||||||
|
print display_alert("success", "Success", "You have rejected the invite."); //success
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
print display_alert("danger", "Failed", "You have not been invited to group {$group_id}"); //success
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_delete_member":
|
||||||
|
$delete_user_id = prepare_numeric($_GET['user_id']);
|
||||||
|
$group_id = prepare_numeric($_GET['group_id']);
|
||||||
|
|
||||||
|
$group = new Group($group_id);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod') || $group->group_leader_id == $user->user_id) {
|
||||||
|
$sql->modify('group_delete_member', " DELETE FROM mangadex_link_user_group WHERE group_id = ? AND user_id = ? AND role = 2 LIMIT 1 ", [$group_id, $delete_user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_{$group_id}_members_display");
|
||||||
|
$memcached->delete("group_{$group_id}_members");
|
||||||
|
$memcached->delete("group_{$group_id}");
|
||||||
|
$memcached->delete("user_{$delete_user_id}_groups");
|
||||||
|
|
||||||
|
$details = $group_id;
|
||||||
|
print display_alert("success", "Success", "User has been deleted."); //success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't delete members.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_leave":
|
||||||
|
$group_id = prepare_numeric($_GET['group_id']);
|
||||||
|
|
||||||
|
$group = new Group($group_id);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member')) {
|
||||||
|
$details = "You must be logged in!";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
|
||||||
|
} else if (!$group || $group->group_id < 1) {
|
||||||
|
$details = "Could not find group!";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
|
||||||
|
} else if ($group->group_leader_id == $user->user_id) {
|
||||||
|
// Groupleader wants to leave
|
||||||
|
|
||||||
|
$details = "A group leader can't leave their own group. Please contact staff.";
|
||||||
|
print display_alert("info", "Notice", $details); //fail
|
||||||
|
} else if (in_array($user->user_id, array_keys($group->get_members()))) {
|
||||||
|
// Group member wants to leave
|
||||||
|
|
||||||
|
$sql->modify('group_delete_member', " DELETE FROM mangadex_link_user_group WHERE group_id = ? AND user_id = ? AND role = 2 LIMIT 1 ", [$group_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_{$group_id}_members_display");
|
||||||
|
$memcached->delete("group_{$group_id}_members");
|
||||||
|
$memcached->delete("group_{$group_id}");
|
||||||
|
$memcached->delete("user_{$user->user_id}_groups");
|
||||||
|
|
||||||
|
$details = $group_id;
|
||||||
|
print display_alert("success", "Success", "You have left the group."); //success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't leave a group you don't belong to.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_edit":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$group = new Group($id);
|
||||||
|
|
||||||
|
$group_founded = htmlentities($_POST["group_founded"]);
|
||||||
|
$url_link = htmlentities($_POST["url_link"]);
|
||||||
|
$irc_channel = htmlentities($_POST["irc_channel"]);
|
||||||
|
$irc_server = htmlentities($_POST["irc_server"]);
|
||||||
|
$discord = htmlentities($_POST["discord"]);
|
||||||
|
$lang_id = prepare_numeric($_POST["lang_id"]);
|
||||||
|
$group_email = htmlentities($_POST["group_email"]);
|
||||||
|
$group_description = htmlentities($_POST["group_description"]);
|
||||||
|
$group_control = isset($_POST["group_control"]) ? 1 : 0;
|
||||||
|
$group_delay = prepare_numeric($_POST["group_delay"]);
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
|
||||||
|
// Only allow group inactive state to be changed if user is a mod
|
||||||
|
$group_is_inactive = validate_level($user, 'gmod')
|
||||||
|
? ($_POST['group_is_inactive'] ?? false ? 1 : 0)
|
||||||
|
: $group->group_is_inactive;
|
||||||
|
|
||||||
|
if ($_FILES["file"] && $old_file)
|
||||||
|
$error .= validate_image($_FILES["file"]);
|
||||||
|
|
||||||
|
if (!(validate_level($user, 'gmod') || $group->group_leader_id == $user->user_id || in_array($user->username, $group->get_members())))
|
||||||
|
$error .= display_alert("danger", "Failed", "You can't edit $group->group_name.");
|
||||||
|
|
||||||
|
// Make sure website has http://
|
||||||
|
if (!empty($url_link) && stripos($url_link, 'http://') === false && stripos($url_link, 'https://') === false)
|
||||||
|
$url_link = 'http://'.$url_link;
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('group_edit', " UPDATE mangadex_groups SET group_founded = ?, group_website = ?, group_irc_channel = ?, group_irc_server = ?, group_discord = ?, group_email = ?, group_lang_id = ?, group_description = ?, group_control = ?, group_is_inactive = ?, group_delay = ? WHERE group_id = ? LIMIT 1 ", [$group_founded, $url_link, $irc_channel, $irc_server, $discord, $group_email, $lang_id, $group_description, $group_control, $group_is_inactive, $group_delay, $group->group_id]);
|
||||||
|
|
||||||
|
if ($old_file) {
|
||||||
|
$arr = explode(".", $_FILES["file"]["name"]);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
if ($group->group_banner)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/groups/$group->group_id.$group->group_banner");
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/groups/$group->group_id.$ext");
|
||||||
|
|
||||||
|
$sql->modify('group_edit', " UPDATE mangadex_groups SET group_banner = ? WHERE group_id = ? LIMIT 1 ", [$ext, $group->group_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_like":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$group = new Group($id);
|
||||||
|
|
||||||
|
$array_of_user_id_ip = $group->get_likes_user_id_ip_list();
|
||||||
|
|
||||||
|
if ($user->user_id && !in_array($user->user_id, $array_of_user_id_ip["user_id"])) {
|
||||||
|
$sql->modify('group_like', " INSERT IGNORE INTO mangadex_group_likes (group_id, user_id, ip, timestamp) VALUES (?, ?, '', UNIX_TIMESTAMP()) ", [$id, $user->user_id]);
|
||||||
|
}
|
||||||
|
elseif (!$user->user_id && !in_array($ip, $array_of_user_id_ip["ip"])) {
|
||||||
|
$sql->modify('group_like', " INSERT IGNORE INTO mangadex_group_likes (group_id, user_id, ip, timestamp) VALUES (?, 0, ?, UNIX_TIMESTAMP()) ", [$id, $ip]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('group_like', " UPDATE mangadex_groups SET group_likes = (SELECT count(*) FROM mangadex_group_likes WHERE group_id = ?) WHERE group_id = ? LIMIT 1 ", [$group->group_id, $group->group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
$memcached->delete("group_{$id}_likes_user_id_ip_list");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_unlike":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$group = new Group($id);
|
||||||
|
|
||||||
|
$array_of_user_id_ip = $group->get_likes_user_id_ip_list();
|
||||||
|
|
||||||
|
if ($user->user_id && in_array($user->user_id, $array_of_user_id_ip["user_id"])) {
|
||||||
|
$sql->modify('group_unlike', " DELETE FROM mangadex_group_likes WHERE group_id = ? AND user_id = ? LIMIT 1 ", [$group->group_id, $user->user_id]);
|
||||||
|
}
|
||||||
|
elseif (!$user->user_id && in_array($ip, $array_of_user_id_ip["ip"])) {
|
||||||
|
$sql->modify('group_unlike', " DELETE FROM mangadex_group_likes WHERE group_id = ? AND ip = ? LIMIT 1 ", [$group->group_id, $ip]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('group_unlike', " UPDATE mangadex_groups SET group_likes = (SELECT count(*) FROM mangadex_group_likes WHERE group_id = ?) WHERE group_id = ? LIMIT 1 ", [$group->group_id, $group->group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
$memcached->delete("group_{$id}_likes_user_id_ip_list");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_block":
|
||||||
|
$group_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$group = new Group($group_id);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && isset($group->group_id)) {
|
||||||
|
$sql->modify('group_block', ' INSERT IGNORE INTO mangadex_user_block_group (user_id, group_id) VALUES (?, ?) ', [$user->user_id, $group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_blocked_groups");
|
||||||
|
$memcached->delete("group_{$group_id}_blocked_users");
|
||||||
|
$details = $group_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't block this group.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_unblock":
|
||||||
|
$group_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
$sql->modify('group_unblock', ' DELETE FROM mangadex_user_block_group WHERE (user_id = ? AND group_id = ?) LIMIT 1 ', [$user->user_id, $group_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_blocked_groups");
|
||||||
|
$memcached->delete("group_{$group_id}_blocked_users");
|
||||||
|
$details = $group_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't unblock this group.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_follow":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
$sql->modify('group_follow', " INSERT IGNORE INTO mangadex_follow_user_group (user_id, group_id) VALUES (?, ?) ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('group_follow', " UPDATE mangadex_groups SET group_follows =
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_group WHERE group_id = ?)
|
||||||
|
WHERE group_id = ? LIMIT 1 ", [$id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
$memcached->delete("group_{$id}_follows_user_id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You have timed out. Please log in again.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_unfollow":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
$sql->modify('group_unfollow', " DELETE FROM mangadex_follow_user_group WHERE user_id = ? AND group_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('group_unfollow', " UPDATE mangadex_groups SET group_follows =
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_group WHERE group_id = ?)
|
||||||
|
WHERE group_id = ? LIMIT 1 ", [$id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
$memcached->delete("group_{$id}_follows_user_id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You have timed out. Please log in again.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_edit_group":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
$group_name = htmlentities($_POST["group_name"]);
|
||||||
|
$group_alt_name = htmlentities($_POST["group_alt_name"]);
|
||||||
|
$group_leader_id = prepare_numeric($_POST["group_leader_id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('admin_edit_group', " UPDATE mangadex_groups SET group_name = ?, group_alt_name = ?, group_leader_id = ? WHERE group_id = ? LIMIT 1 ", [$group_name, $group_alt_name, $group_leader_id, $id]);
|
||||||
|
|
||||||
|
$uploader = new User($group_leader_id, 'user_id');
|
||||||
|
$group = new Group($id);
|
||||||
|
|
||||||
|
if ($uploader->level_id < 5 && $group_leader_id > 0)
|
||||||
|
$sql->modify('admin_edit_group', " UPDATE mangadex_users SET level_id = 5 WHERE user_id = ? LIMIT 1 ", [$group_leader_id]);
|
||||||
|
|
||||||
|
if ($group_leader_id > 1) {
|
||||||
|
$sql->modify('admin_edit_group', " DELETE FROM mangadex_link_user_group WHERE group_id = ? AND role = 3 LIMIT 1 ", [$id]);
|
||||||
|
$sql->modify('admin_edit_group', " INSERT INTO mangadex_link_user_group (id, user_id, group_id, role) VALUES (NULL, ?, ?, 3) ", [$group_leader_id, $id]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sql->modify('admin_edit_group', " DELETE FROM mangadex_link_user_group WHERE group_id = ? AND role = 3 LIMIT 1 ", [$id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
$memcached->delete("user_{$group_leader_id}_groups");
|
||||||
|
$memcached->delete("user_{$group->group_leader_id}_groups");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't edit groups.";
|
||||||
|
print display_alert("danger", "Failed", $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "group_delete":
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$sql->modify('group_delete', " DELETE FROM mangadex_groups WHERE group_id = ? LIMIT 1 ", [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("group_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
print display_alert("success", "Success", "Group #$id has been deleted."); // success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't delete Group #$id.";
|
||||||
|
print display_alert("danger", "Failed", $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
}
|
871
ajax/actions/mangas.actions.req.php
Normal file
@ -0,0 +1,871 @@
|
|||||||
|
<?php
|
||||||
|
switch ($function) {
|
||||||
|
case "import":
|
||||||
|
|
||||||
|
$json = $_POST["json"];
|
||||||
|
|
||||||
|
$insert = "";
|
||||||
|
$search = '"comic_id":"';
|
||||||
|
$string = $json;
|
||||||
|
$bind = [];
|
||||||
|
$found = strpos_recursive($string, $search);
|
||||||
|
|
||||||
|
if($found) {
|
||||||
|
foreach($found as $pos) {
|
||||||
|
$start = $pos + 12;
|
||||||
|
$end = strpos($json, '"', $start);
|
||||||
|
$diff = $end - $start;
|
||||||
|
$substr = substr($json, $start, $diff);
|
||||||
|
$substr = prepare_numeric($substr);
|
||||||
|
$insert .= "(?, ?, 1),";
|
||||||
|
$bind = array_merge($bind, [$user->user_id, $substr]);
|
||||||
|
|
||||||
|
$id = $substr;
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_id");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_key_pair");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
}
|
||||||
|
|
||||||
|
$insert = rtrim($insert,",");
|
||||||
|
|
||||||
|
$sql->modify('import', " INSERT IGNORE INTO mangadex_follow_user_manga (user_id, manga_id, follow_type) VALUES $insert ", $bind);
|
||||||
|
|
||||||
|
$details = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Something's wrong with your JSON.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'increment_volume':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Your session has timed out. Please log in again.'); //success
|
||||||
|
|
||||||
|
if (!$manga->manga_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "This title does not exist.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('increment_volume', ' UPDATE mangadex_follow_user_manga SET volume = FLOOR(volume) + 1 WHERE manga_id = ? AND user_id = ? LIMIT 1 ', [$manga->manga_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
|
||||||
|
$details = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'increment_chapter':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Your session has timed out. Please log in again.'); //success
|
||||||
|
|
||||||
|
if (!$manga->manga_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "This title does not exist.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('increment_chapter', ' UPDATE mangadex_follow_user_manga SET chapter = FLOOR(chapter) + 1 WHERE manga_id = ? AND user_id = ? LIMIT 1 ', [$manga->manga_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
|
||||||
|
$details = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'edit_progress':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$volume = remove_padding(htmlentities($_POST["volume"]));
|
||||||
|
$chapter = remove_padding(htmlentities($_POST["chapter"]));
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Your session has timed out. Please log in again.'); //success
|
||||||
|
|
||||||
|
if (!$manga->manga_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "This title does not exist.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('edit_progress', ' UPDATE mangadex_follow_user_manga SET volume = ?, chapter = ? WHERE manga_id = ? AND user_id = ? LIMIT 1 ', [$volume, $chapter, $manga->manga_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
|
||||||
|
$details = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'manga_cover_delete':
|
||||||
|
$id = prepare_numeric($_GET['manga_id']);
|
||||||
|
$volume = remove_padding(htmlentities($_GET["volume"]));
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'gmod'))
|
||||||
|
$error .= display_alert('danger', 'Failed', "You can't delete covers.");
|
||||||
|
|
||||||
|
if (!$manga->manga_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "This title does not exist.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$old_ext = $sql->prep('old_ext', ' SELECT img FROM mangadex_manga_covers WHERE manga_id = ? AND volume = ? LIMIT 1 ', [$manga->manga_id, $volume], 'fetchColumn', '', -1);
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.$old_ext");
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.thumb.jpg");
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.250.jpg");
|
||||||
|
|
||||||
|
$sql->modify('manga_cover_delete', ' DELETE FROM mangadex_manga_covers WHERE manga_id = ? AND volume = ? LIMIT 1 ', [$manga->manga_id, $volume]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_{$id}_covers");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'manga_cover_upload':
|
||||||
|
// die('temporarily disabled');
|
||||||
|
|
||||||
|
if (!validate_level($user, 'pr')) {
|
||||||
|
//max of 5 attempts in 5 minutes
|
||||||
|
$ip = _IP;
|
||||||
|
$visit_count = $memcached->get('manga_cover_upload_' . $ip);
|
||||||
|
|
||||||
|
if ($visit_count !== FALSE && $visit_count[0] > 5) {
|
||||||
|
$error .= display_alert('danger', 'Failed', "Try again later.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update limits
|
||||||
|
if ($visit_count === false || time() - $visit_count[1] > 300) {
|
||||||
|
$memcached->set('manga_cover_upload_' . $ip, [1, time()], 300);
|
||||||
|
} else {
|
||||||
|
$memcached->set('manga_cover_upload_' . $ip, [$visit_count[0] + 1, $visit_count[1]], 300);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$volume = remove_padding(htmlentities($_POST["volume"]));
|
||||||
|
// TODO: Standardize image upload process
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member'))
|
||||||
|
$error .= display_alert('danger', 'Failed', "You can't upload covers.");
|
||||||
|
|
||||||
|
if ($user->has_active_restriction(USER_RESTRICTION_EDIT_TITLES))
|
||||||
|
$error .= display_alert('danger', 'Failed', $user->get_restriction_message(USER_RESTRICTION_EDIT_TITLES) ?? "You can't upload covers.");
|
||||||
|
|
||||||
|
if (!validate_level($user, 'gmod') && $manga->manga_locked)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Editing has been locked to mods only.");
|
||||||
|
|
||||||
|
if ($_FILES['file'] && $old_file)
|
||||||
|
$error .= validate_image($_FILES['file'], 'file', 1024*1024*2); //2MB max filesize
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Your session has timed out. Please log in again.'); //success
|
||||||
|
|
||||||
|
$old_ext = $sql->prep('old_ext', ' SELECT img FROM mangadex_manga_covers WHERE manga_id = ? AND volume = ? LIMIT 1 ', [$manga->manga_id, $volume], 'fetchColumn', '', -1);
|
||||||
|
if ($old_ext && !validate_level($user, 'pr'))
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Only staff can replace covers.');
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
if ($old_file) {
|
||||||
|
$arr = explode('.', $_FILES['file']['name']);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
if ($old_ext)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.$old_ext");
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.$ext");
|
||||||
|
|
||||||
|
generate_thumbnail(ABS_DATA_BASEPATH . "/covers/{$manga->manga_id}v{$volume}.$ext", 250);
|
||||||
|
|
||||||
|
$sql->modify('manga_cover_upload', '
|
||||||
|
INSERT INTO mangadex_manga_covers (manga_id, volume, img, user_id) VALUES (?, ?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE img = ?, user_id = ?
|
||||||
|
', [$manga->manga_id, $volume, $ext, $user->user_id, $ext, $user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("manga_{$id}_covers");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_delete":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
if (count(get_object_vars($manga))) {
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('manga_delete', " DELETE FROM mangadex_mangas WHERE manga_id = ? LIMIT 1 ", [$id]);
|
||||||
|
$sql->modify('manga_delete', " DELETE FROM mangadex_manga_alt_names WHERE manga_id = ? ", [$id]);
|
||||||
|
$sql->modify('manga_delete', " DELETE FROM mangadex_manga_genres WHERE manga_id = ? ", [$id]);
|
||||||
|
$sql->modify('manga_history_delete', " DELETE FROM mangadex_manga_history WHERE manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$manga->manga_image");
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.thumb.jpg");
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
print display_alert('success', 'Success', "Manga #$id has been deleted."); // success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't delete Manga #$id.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Manga #$id does not exist.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_edit":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
$history_action = 'edit';
|
||||||
|
$history_changes = [];
|
||||||
|
|
||||||
|
if (count(get_object_vars($manga))) {
|
||||||
|
$manga_name = htmlentities($_POST["manga_name"]);
|
||||||
|
$manga_alt_names = htmlentities(trim($_POST["manga_alt_names"]));
|
||||||
|
$manga_author = htmlentities($_POST["manga_author"]);
|
||||||
|
$manga_artist = htmlentities($_POST["manga_artist"]);
|
||||||
|
$manga_last_chapter = htmlentities($_POST["manga_last_chapter"]);
|
||||||
|
$manga_last_volume = empty($_POST["manga_last_volume"]) ? null : prepare_numeric($_POST["manga_last_volume"]);
|
||||||
|
$manga_lang_id = prepare_numeric($_POST["manga_lang_id"]);
|
||||||
|
$manga_status_id = prepare_numeric($_POST["manga_status_id"]);
|
||||||
|
$manga_demo_id = prepare_numeric($_POST["manga_demo_id"]);
|
||||||
|
$manga_hentai = isset($_POST["manga_hentai"]) ? 1 : 0;
|
||||||
|
$manga_description = htmlentities($_POST["manga_description"]);
|
||||||
|
$manga_mod_notes = isset($_POST["manga_mod_notes"]) ? htmlentities($_POST["manga_mod_notes"]) : '';
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
$old_alt_names = $manga->get_manga_alt_names();
|
||||||
|
$old_related_manga = $manga->get_related_manga();
|
||||||
|
$old_ext_links = json_decode($manga->manga_links, 1);
|
||||||
|
|
||||||
|
if ($_FILES["file"] && $old_file)
|
||||||
|
$error .= validate_image($_FILES["file"]);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'contributor'))
|
||||||
|
$error .= display_alert('danger', 'Failed', "You can't edit this title.");
|
||||||
|
|
||||||
|
if ($user->has_active_restriction(USER_RESTRICTION_EDIT_TITLES))
|
||||||
|
$error .= display_alert('danger', 'Failed', $user->get_restriction_message(USER_RESTRICTION_EDIT_TITLES) ?? "You can't edit this title.");
|
||||||
|
|
||||||
|
if (!validate_level($user, 'gmod') && $manga->manga_locked)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Editing has been locked to mods only.");
|
||||||
|
elseif ($manga->manga_locked)
|
||||||
|
$history_action = 'edit_locked';
|
||||||
|
|
||||||
|
if ($manga_last_volume > 255)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Manga last volume number is too large');
|
||||||
|
|
||||||
|
if (mb_strlen($manga_last_chapter) > 8)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Manga last chapter number is too large');
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
//manga_links
|
||||||
|
if (!empty($_POST['link_type'])) {
|
||||||
|
foreach ($_POST['link_type'] as $key => $link_type) {
|
||||||
|
if (!empty($_POST['link_id'][$key]))
|
||||||
|
$array[$link_type] = str_replace(['javascript:'], '', htmlentities($_POST['link_id'][$key]));
|
||||||
|
}
|
||||||
|
$manga_links = json_encode($array);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$manga_links = NULL;
|
||||||
|
|
||||||
|
// Track changes
|
||||||
|
if ($manga->manga_name != $manga_name) $history_changes[] = "Name: [$manga->manga_name] -> [$manga_name]";
|
||||||
|
if ($manga->manga_author != $manga_author) $history_changes[] = "Author: [$manga->manga_author] -> [$manga_author]";
|
||||||
|
if ($manga->manga_artist != $manga_artist) $history_changes[] = "Artist: [$manga->manga_artist] -> [$manga_artist]";
|
||||||
|
if ($manga->manga_lang_id != $manga_lang_id) $history_changes[] = "Language changed: [$manga->manga_lang_id] -> [$manga_lang_id]";
|
||||||
|
if ($manga->manga_last_chapter != $manga_last_chapter) $history_changes[] = "Last Chapter-Id changed: [$manga->manga_last_chapter] -> [$manga_last_chapter]";
|
||||||
|
if ($manga->manga_last_volume != $manga_last_volume) $history_changes[] = "Last Volume-Id changed: [$manga->manga_last_volume] -> [$manga_last_volume]";
|
||||||
|
if ($manga->manga_status_id != $manga_status_id) $history_changes[] = "Status-Id changed: [$manga->manga_status_id] -> [$manga_status_id]";
|
||||||
|
if ($manga->manga_demo_id != $manga_demo_id) $history_changes[] = "Demographic-Id changed: [$manga->manga_demo_id] -> [$manga_demo_id]";
|
||||||
|
if ($manga->manga_hentai != $manga_hentai) $history_changes[] = "Hentai Status changed: [".($manga->manga_hentai ? 1 : 0)."] -> [".($manga_hentai ? 1 : 0)."]";
|
||||||
|
if ($manga->manga_description != $manga_description) $history_changes[] = "Description changed. (Not tracked)";
|
||||||
|
|
||||||
|
$sql->modify('manga_edit', "
|
||||||
|
UPDATE mangadex_mangas SET manga_name = ?, manga_author = ?, manga_artist = ?, manga_lang_id = ?, manga_status_id = ?, manga_hentai = ?, manga_demo_id = ?, manga_description = ?, manga_links = ?, manga_last_volume = ?, manga_last_chapter = ?, manga_mod_notes = ? WHERE manga_id = ? LIMIT 1
|
||||||
|
", [$manga_name, $manga_author, $manga_artist, $manga_lang_id, $manga_status_id, $manga_hentai, $manga_demo_id, $manga_description, $manga_links, $manga_last_volume, $manga_last_chapter, $manga_mod_notes, $id]);
|
||||||
|
|
||||||
|
//manga genres
|
||||||
|
$sql->modify('manga_edit', " DELETE FROM mangadex_manga_genres WHERE manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
$_POST["manga_genres"] = $_POST["manga_genres"] ?? []; // Fixes case where all genres are removed
|
||||||
|
if (is_array($_POST["manga_genres"])) {
|
||||||
|
|
||||||
|
// Track genre history
|
||||||
|
$old_genres = $manga->get_manga_genres();
|
||||||
|
$_POST['manga_genres'] = array_map(function ($e) {return (int)$e;}, $_POST['manga_genres']); // Convert genre ids to int
|
||||||
|
$genres_removed = array_diff($old_genres, $_POST["manga_genres"] ?? []);
|
||||||
|
$genres_added = array_diff($_POST["manga_genres"] ?? [], $old_genres);
|
||||||
|
|
||||||
|
$tags = new Tags();
|
||||||
|
$genre_inserts = [];
|
||||||
|
foreach ($_POST["manga_genres"] as $genre_id) {
|
||||||
|
$genre_id = prepare_numeric($genre_id);
|
||||||
|
if ($tags->getTagById($genre_id)) {
|
||||||
|
$genre_inserts[] = $genre_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($genre_inserts)) {
|
||||||
|
$values = implode(", ", array_fill(0, count($genre_inserts), "($id, ?)"));
|
||||||
|
$sql->modify('manga_edit', " INSERT IGNORE INTO mangadex_manga_genres (manga_id, genre_id) VALUES $values ", $genre_inserts);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($genres_added))
|
||||||
|
$history_changes[] = 'Genres Added: ['.implode(', ', $genres_added).']';
|
||||||
|
if (!empty($genres_removed))
|
||||||
|
$history_changes[] = 'Genres Removed: ['.implode(', ', $genres_removed).']';
|
||||||
|
}
|
||||||
|
|
||||||
|
//manga alt names
|
||||||
|
$manga_alt_names = explode("\r\n", $manga_alt_names);
|
||||||
|
|
||||||
|
if ($old_alt_names != $manga_alt_names) {
|
||||||
|
$alt_removed = array_diff($old_alt_names, $manga_alt_names);
|
||||||
|
$alt_added = array_diff($manga_alt_names, $old_alt_names);
|
||||||
|
if (!empty($alt_added))
|
||||||
|
$history_changes[] = 'Alt titles Added: ['.implode(', ', $alt_added).']';
|
||||||
|
if (!empty($alt_removed))
|
||||||
|
$history_changes[] = 'Alt titles Removed: ['.implode(', ', $alt_removed).']';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('manga_edit', " DELETE FROM mangadex_manga_alt_names WHERE manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
if (!empty($manga_alt_names)) {
|
||||||
|
foreach (array_filter($manga_alt_names) as $alt_name) {
|
||||||
|
$sql->modify('manga_edit', " INSERT IGNORE INTO mangadex_manga_alt_names (manga_id, alt_name) VALUES (?, ?) ", [$id, $alt_name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//manga relations
|
||||||
|
$sql->modify('manga_edit', " DELETE FROM mangadex_manga_relations WHERE manga_id = ? ", [$id]);
|
||||||
|
$sql->modify('manga_edit', " DELETE FROM mangadex_manga_relations WHERE related_manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
if (!empty($_POST["relation_type"])) {
|
||||||
|
$relation_types = new Relation_Types();
|
||||||
|
foreach ($_POST["relation_type"] as $key => $relation_type) {
|
||||||
|
if ($id != $_POST["related_manga_id"][$key]) {
|
||||||
|
$other_id = $_POST["related_manga_id"][$key];
|
||||||
|
$memcached->delete("manga_{$other_id}_related_manga");
|
||||||
|
$sql->modify('manga_edit', " INSERT IGNORE INTO mangadex_manga_relations (manga_id, relation_id, related_manga_id) VALUES (?, ?, ?) ", [$id, $relation_type, $other_id]);
|
||||||
|
$sql->modify('manga_edit', " INSERT IGNORE INTO mangadex_manga_relations (manga_id, relation_id, related_manga_id) VALUES (?, ?, ?) ", [$other_id, $relation_types->{$relation_type}->pair_id, $id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($old_file) {
|
||||||
|
$arr = explode(".", $_FILES["file"]["name"]);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
if ($manga->manga_image)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$manga->manga_image");
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$ext");
|
||||||
|
|
||||||
|
$sql->modify('manga_edit', " UPDATE mangadex_mangas SET manga_image = ? WHERE manga_id = ? LIMIT 1 ", [$ext, $manga->manga_id]);
|
||||||
|
|
||||||
|
generate_thumbnail(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$ext", 1);
|
||||||
|
|
||||||
|
//send to image server
|
||||||
|
/*
|
||||||
|
$url = "https://s1.mangadex.org/upload.images.php";
|
||||||
|
$headers = [];
|
||||||
|
|
||||||
|
$data = ['file' => base64_encode(file_get_contents(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$ext")), 'filename' => "$manga->manga_id.$ext" ];
|
||||||
|
$return_msg = httpPost($url, $data, $headers);
|
||||||
|
|
||||||
|
$data = ['file' => base64_encode(file_get_contents(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.thumb.jpg")), 'filename' => "$manga->manga_id.thumb.jpg" ];
|
||||||
|
$return_msg = httpPost($url, $data, $headers);
|
||||||
|
*/
|
||||||
|
|
||||||
|
$history_changes[] = "Thumbnail changed.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
$memcached->delete("manga_{$id}_alt_names");
|
||||||
|
$memcached->delete("manga_{$id}_genres");
|
||||||
|
$memcached->delete("manga_{$id}_related_manga");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
|
||||||
|
// Insert changes entry
|
||||||
|
if (!empty($history_changes)) {
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $manga->manga_id, time(), $history_action, json_encode($history_changes)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Manga #$id does not exist.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_add":
|
||||||
|
$manga_name = htmlentities($_POST["manga_name"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
if ($user->has_active_restriction(USER_RESTRICTION_EDIT_TITLES))
|
||||||
|
$error .= display_alert('danger', 'Failed', $user->get_restriction_message(USER_RESTRICTION_EDIT_TITLES) ?? "You can't add titles.");
|
||||||
|
else if ($_FILES["file"])
|
||||||
|
$error .= validate_image($_FILES["file"]);
|
||||||
|
else
|
||||||
|
$error .= display_alert('danger', 'Failed', "Missing image."); //missing image
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your session has timed out. Please log in again."); //timed_out
|
||||||
|
else
|
||||||
|
$error .= display_alert('danger', 'Failed', "You can't upload."); //banned
|
||||||
|
}
|
||||||
|
|
||||||
|
//if no errors, then upload
|
||||||
|
if (!$error) {
|
||||||
|
$manga_alt_names = htmlentities($_POST["manga_alt_names"]);
|
||||||
|
$manga_author = htmlentities($_POST["manga_author"]);
|
||||||
|
$manga_artist = htmlentities($_POST["manga_artist"]);
|
||||||
|
$manga_lang_id = prepare_numeric($_POST["manga_lang_id"]);
|
||||||
|
$manga_status_id = prepare_numeric($_POST["manga_status_id"]);
|
||||||
|
$manga_hentai = isset($_POST["manga_hentai"]) ? 1 : 0;
|
||||||
|
$manga_demo_id = prepare_numeric($_POST["manga_demo_id"]);
|
||||||
|
$manga_description = htmlentities($_POST["manga_description"]);
|
||||||
|
|
||||||
|
$arr = explode(".", $_FILES["file"]["name"]);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
$manga_id = $sql->modify('manga_add', "
|
||||||
|
INSERT INTO mangadex_mangas (manga_id, manga_name, manga_author, manga_artist, manga_lang_id, manga_status_id, manga_hentai, manga_demo_id, manga_description, manga_image, manga_rating, manga_rated_users, manga_views, manga_follows, manga_comments, manga_locked, manga_links, manga_last_uploaded, thread_id, manga_last_chapter, manga_mod_notes) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 0, 0, 0, 0, NULL, 0, 0, 0, '')
|
||||||
|
", [$manga_name, $manga_author, $manga_artist, $manga_lang_id, $manga_status_id, $manga_hentai, $manga_demo_id, $manga_description, $ext]);
|
||||||
|
|
||||||
|
if (!empty($_POST["manga_genres"])) {
|
||||||
|
$tags = new Tags();
|
||||||
|
$genre_inserts = [];
|
||||||
|
foreach ($_POST["manga_genres"] as $genre_id) {
|
||||||
|
$genre_id = prepare_numeric($genre_id);
|
||||||
|
if ($tags->getTagById($genre_id)) {
|
||||||
|
$genre_inserts[] = $genre_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($genre_inserts)) {
|
||||||
|
$values = implode(", ", array_fill(0, sizeof($genre_inserts), "($manga_id, ?)"));
|
||||||
|
$sql->modify('manga_add', " INSERT IGNORE INTO mangadex_manga_genres (manga_id, genre_id) VALUES $values ", $genre_inserts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($manga_alt_names)) {
|
||||||
|
$arr = explode("\r\n", $manga_alt_names);
|
||||||
|
foreach (array_filter($arr) as $alt_name) {
|
||||||
|
$sql->modify('manga_add', " INSERT IGNORE INTO mangadex_manga_alt_names (manga_id, alt_name) VALUES (?, ?) ", [$manga_id, $alt_name]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/manga/$manga_id.$ext");
|
||||||
|
|
||||||
|
generate_thumbnail(ABS_DATA_BASEPATH . "/manga/$manga_id.$ext", 1);
|
||||||
|
|
||||||
|
//send to image server
|
||||||
|
/*
|
||||||
|
$url = "https://s1.mangadex.org/upload.images.php";
|
||||||
|
$headers = [];
|
||||||
|
|
||||||
|
$data = ['file' => base64_encode(file_get_contents(ABS_DATA_BASEPATH . "/manga/$manga_id.$ext")), 'filename' => "$manga_id.$ext" ];
|
||||||
|
$return_msg = httpPost($url, $data, $headers);
|
||||||
|
|
||||||
|
$data = ['file' => base64_encode(file_get_contents(ABS_DATA_BASEPATH . "/manga/$manga_id.thumb.jpg")), 'filename' => "$manga_id.thumb.jpg" ];
|
||||||
|
$return_msg = httpPost($url, $data, $headers);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Add create manga to history
|
||||||
|
$sql->modify('manga_history', 'INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`, `changes`) VALUES (?,?,?,?,?)',
|
||||||
|
[$user->user_id ?? 1, $manga_id, time(), 'manga_create', json_encode(['Created manga entry.'])]);
|
||||||
|
}
|
||||||
|
|
||||||
|
print $error;
|
||||||
|
|
||||||
|
$result = ($error) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_follow":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$type_id = prepare_numeric($_GET["type"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
$sql->modify('manga_follow', " INSERT INTO mangadex_follow_user_manga (user_id, manga_id, follow_type) VALUES (?, ?, ?)
|
||||||
|
ON DUPLICATE KEY UPDATE follow_type = ? ", [$user->user_id, $id, $type_id, $type_id]);
|
||||||
|
|
||||||
|
$sql->modify('manga_follow', " UPDATE mangadex_mangas SET manga_follows =
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_manga WHERE manga_id = ?)
|
||||||
|
WHERE manga_id = ? LIMIT 1 ", [$id, $id]);
|
||||||
|
|
||||||
|
if (in_array($type_id, [2, 6])) {
|
||||||
|
$search["manga_id"] = $id; //manga_id
|
||||||
|
$chapters = new Chapters($search);
|
||||||
|
$chapters_obj = $chapters->query_read("chapter_id ASC", 2000, 1);
|
||||||
|
|
||||||
|
if (count($chapters_obj) > 0) {
|
||||||
|
foreach ($chapters_obj as $chapter) {
|
||||||
|
$ch_array[] = $chapter['chapter_id'];
|
||||||
|
}
|
||||||
|
$in = prepare_in($ch_array);
|
||||||
|
$sql->modify('manga_follow', " DELETE FROM mangadex_chapter_views WHERE user_id = ? AND chapter_id IN ($in) ", array_merge([$user->user_id], $ch_array));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_id");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_key_pair");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You have timed out. Please log in again.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_unfollow":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$type_id = prepare_numeric($_GET["type"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
$sql->modify('manga_unfollow', " DELETE FROM mangadex_follow_user_manga WHERE user_id = ? AND manga_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('manga_unfollow', " UPDATE mangadex_mangas SET manga_follows =
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_manga WHERE manga_id = ?)
|
||||||
|
WHERE manga_id = ? LIMIT 1 ", [$id, $id]);
|
||||||
|
|
||||||
|
$search["manga_id"] = $id; //manga_id
|
||||||
|
$chapters = new Chapters($search);
|
||||||
|
$chapters_obj = $chapters->query_read("chapter_id ASC", 2000, 1);
|
||||||
|
|
||||||
|
if (count($chapters_obj) > 0) {
|
||||||
|
foreach ($chapters_obj as $chapter) {
|
||||||
|
$ch_array[] = $chapter['chapter_id'];
|
||||||
|
}
|
||||||
|
$in = prepare_in($ch_array);
|
||||||
|
$sql->modify('manga_unfollow', " DELETE FROM mangadex_chapter_views WHERE user_id = ? AND chapter_id IN ($in) ", array_merge([$user->user_id], $ch_array));
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_id");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_key_pair");
|
||||||
|
$memcached->delete("manga_{$id}_follows_user_{$user->user_id}");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You have timed out. Please log in again.";
|
||||||
|
print display_alert('danger', 'Failed', $details); // fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_rating":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$rating = prepare_numeric($_GET["rating"]);
|
||||||
|
|
||||||
|
if ($rating < 0)
|
||||||
|
$rating = 0;
|
||||||
|
elseif ($rating > 10)
|
||||||
|
$rating = 10;
|
||||||
|
else
|
||||||
|
$rating = round($rating, 0);
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
if($rating == 0){
|
||||||
|
$sql->modify('manga_rating', "
|
||||||
|
DELETE FROM mangadex_manga_ratings WHERE manga_id = ? AND user_id = ? LIMIT 1
|
||||||
|
", [$id, $user->user_id]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$sql->modify('manga_rating', "
|
||||||
|
INSERT INTO mangadex_manga_ratings (manga_id, user_id, rating) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE rating = ?
|
||||||
|
", [$id, $user->user_id, $rating, $rating]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("manga_{$id}_user_ratings");
|
||||||
|
$memcached->delete("manga_{$id}_user_rating_$user->user_id");
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids_api");
|
||||||
|
$memcached->delete("user_{$user->user_id}_manga_ratings");
|
||||||
|
|
||||||
|
$manga = new Manga($id);
|
||||||
|
|
||||||
|
$ratings_array = $manga->get_user_ratings();
|
||||||
|
$average_rating = array_sum($ratings_array) / (count($ratings_array) ?: 1);
|
||||||
|
|
||||||
|
$site_average_rating = $sql->query_read('site_average', ' SELECT AVG(rating) FROM mangadex_manga_ratings ', 'fetchColumn', '', 3600);
|
||||||
|
$no_ratings_per_title = $sql->query_read('ratings_per_title', ' SELECT COUNT(*) AS Rows FROM mangadex_manga_ratings GROUP BY manga_id ', 'fetchAll', PDO::FETCH_COLUMN, 3600);
|
||||||
|
$average_no_ratings_per_title = array_sum($no_ratings_per_title) / count($no_ratings_per_title);
|
||||||
|
|
||||||
|
$bayesian = bayesian_average($ratings_array, $average_no_ratings_per_title, $average_rating, $site_average_rating);
|
||||||
|
|
||||||
|
if(is_nan($average_rating)){
|
||||||
|
$average_rating = 0;
|
||||||
|
}
|
||||||
|
if(is_nan($bayesian)){
|
||||||
|
$bayesian = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql->modify('manga_rating', " UPDATE mangadex_mangas SET manga_bayesian = ?, manga_rating = ?, manga_rated_users = (SELECT count(*) FROM mangadex_manga_ratings WHERE manga_id = ?) WHERE manga_id = ? ", [$bayesian, $average_rating, $id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
print display_alert('success', 'Success', "You have rated Manga #$id."); //success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Your session has timed out. Please log in again.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_lock":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('manga_lock', " UPDATE mangadex_mangas SET manga_locked = 1 WHERE manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
|
||||||
|
// Add history entry
|
||||||
|
$sql->modify('manga_history', "INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`) VALUES (?,?,?,?)", [$user->user_id, $id, time(), 'lock']);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't lock manga.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_unlock":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('manga_unlock', " UPDATE mangadex_mangas SET manga_locked = 0 WHERE manga_id = ? ", [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
|
||||||
|
// Add history entry
|
||||||
|
$sql->modify('manga_history', "INSERT INTO mangadex_manga_history (`user_id`, `manga_id`, `timestamp`, `action`) VALUES (?,?,?,?)", [$user->user_id, $id, time(), 'unlock']);
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't unlock manga.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_report":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$report_text = htmlentities($_POST["report_text"]);
|
||||||
|
|
||||||
|
$report_restriction = $user->has_active_restriction(USER_RESTRICTION_CREATE_REPORT) && !validate_level($user, 'mod');
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && !$report_restriction) {
|
||||||
|
if (!$report_text) {
|
||||||
|
$details = "Please give more information.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sql->modify('manga_report', " INSERT INTO mangadex_reports_manga (report_id, report_manga_id, report_timestamp, report_info, report_user_id, report_mod_user_id, report_conclusion)
|
||||||
|
VALUES (NULL, ?, UNIX_TIMESTAMP(), ?, ?, 0, 0) ", [$id, $report_text, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
|
||||||
|
post_on_discord(DISCORD_WEBHOOK_REPORT, [
|
||||||
|
'username' => $user->username,
|
||||||
|
'embeds' => [
|
||||||
|
[
|
||||||
|
'title' => 'Title Report',
|
||||||
|
'url' => URL . 'mod/manga_reports/new',
|
||||||
|
'footer' => [
|
||||||
|
'text' => $report_text
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($report_restriction) {
|
||||||
|
$details = $user->get_restriction_message(USER_RESTRICTION_CREATE_REPORT) ?? "You can't report Manga $id.";
|
||||||
|
print display_alert('danger', 'Failed', $details);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't report Manga $id.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_report_accept":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('manga_report_accept', " UPDATE mangadex_reports_manga SET report_conclusion = 1, report_mod_user_id = ? WHERE report_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
print display_alert('success', 'Success', "Report #$id accepted."); //success
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "manga_report_reject":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('manga_report_reject', " UPDATE mangadex_reports_manga SET report_conclusion = 2, report_mod_user_id = ? WHERE report_id = ? LIMIT 1 ", [$user->user_id, $id]);
|
||||||
|
|
||||||
|
print display_alert('success', 'Success', "Report #$id rejected."); //success
|
||||||
|
|
||||||
|
$memcached->delete('mod_report_count');
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "admin_edit_manga":
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
$old_id = prepare_numeric($_POST["old_id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('admin_edit_manga', " UPDATE mangadex_chapters SET manga_id = ? WHERE manga_id = ? ", [$old_id, $id]);
|
||||||
|
$sql->modify('admin_edit_manga', " UPDATE IGNORE mangadex_follow_user_manga SET manga_id = ? WHERE manga_id = ? ", [$old_id, $id]);
|
||||||
|
$sql->modify('admin_edit_manga', " UPDATE IGNORE mangadex_manga_ratings SET manga_id = ? WHERE manga_id = ? ", [$old_id, $id]);
|
||||||
|
$sql->modify('admin_edit_manga', " UPDATE IGNORE mangadex_manga_history SET manga_id = ? WHERE manga_id = ? ", [$old_id, $id]);
|
||||||
|
$sql->modify('admin_edit_manga', " UPDATE mangadex_forum_posts SET thread_id = (SELECT thread_id FROM mangadex_mangas WHERE manga_id = ?) WHERE thread_id = (SELECT thread_id FROM mangadex_mangas WHERE manga_id = ?) ", [$old_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('admin_edit_manga', " DELETE FROM mangadex_mangas WHERE manga_id = ? LIMIT 1 ", [$id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_$id");
|
||||||
|
$memcached->delete("manga_$old_id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
print display_alert('success', 'Success', "Manga #$id has been edited."); //success
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't edit manga.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "remove_featured":
|
||||||
|
$list_id = prepare_numeric($_GET["list_id"]);
|
||||||
|
$manga_id = prepare_numeric($_GET["manga_id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('remove_featured', " DELETE FROM mangadex_manga_featured WHERE list_id = ? AND manga_id = ? LIMIT 1 ", [$list_id, $manga_id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_list_$list_id");
|
||||||
|
}
|
||||||
|
print display_alert('success', 'Success', "Title removed."); //success
|
||||||
|
|
||||||
|
$details = $manga_id;
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "add_featured":
|
||||||
|
$list_id = prepare_numeric($_GET['id']);
|
||||||
|
$manga_id = prepare_numeric($_POST["manga_id"]);
|
||||||
|
|
||||||
|
if (validate_level($user, 'gmod')) {
|
||||||
|
$sql->modify('add_featured', " INSERT IGNORE INTO mangadex_manga_featured (list_id, manga_id) VALUES (?, ?) ", [$list_id, $manga_id]);
|
||||||
|
|
||||||
|
$memcached->delete("manga_list_$list_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = $manga_id;
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
}
|
232
ajax/actions/md_at_home.actions.req.php
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
<?php
|
||||||
|
switch ($function) {
|
||||||
|
case 'turn_on':
|
||||||
|
$turn_on = isset($_POST["turn_on"]) ? 1 : 0;
|
||||||
|
|
||||||
|
$sql->modify('turn_on', ' UPDATE mangadex_user_options SET md_at_home = ? WHERE user_id = ? ', [$turn_on, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$details = $user->user_id;
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'request_client':
|
||||||
|
$upload = prepare_numeric($_POST['upload']);
|
||||||
|
$download = prepare_numeric($_POST['download']);
|
||||||
|
$disk = prepare_numeric($_POST['disk']);
|
||||||
|
$ip = $_POST['ip'];
|
||||||
|
$speedtest = $_POST['speedtest'];
|
||||||
|
$read_rules = isset($_POST["read_rules"]) ? 1 : 0;
|
||||||
|
|
||||||
|
$count_ip = $sql->prep('count_ip', ' SELECT count(*) FROM mangadex_clients WHERE client_ip = ? ', [$ip], 'fetchColumn', '', -1);
|
||||||
|
$count_clients = $sql->prep('count_clients', ' SELECT count(*) FROM mangadex_clients WHERE user_id = ? ', [$user->user_id], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your session has timed out. Please log in again.");
|
||||||
|
elseif ($upload < 80)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your upload speed must be at least 80 Mbps.");
|
||||||
|
elseif ($download < 80)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your download speed must be at least 80 Mbps.");
|
||||||
|
elseif ($upload > 65535)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your upload speed is too high.");
|
||||||
|
elseif ($download > 65535)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your download speed is too high.");
|
||||||
|
elseif ($disk < 40)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your disk cache allocation must be at least 40 GB.");
|
||||||
|
elseif ($disk > 65535)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your disk cache allocation is too high.");
|
||||||
|
elseif (!preg_match('/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/', $ip))
|
||||||
|
$error .= display_alert('danger', 'Failed', "That doesn't look like a IPv4 address.");
|
||||||
|
elseif ($count_ip)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your IP has already been used.");
|
||||||
|
elseif ($count_clients > 5)
|
||||||
|
$error .= display_alert('danger', 'Failed', "You have reached the limit of clients you can request. For more clients, please PM ixlone.");
|
||||||
|
elseif (!$read_rules)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Go and read the rules.");
|
||||||
|
elseif (strlen($ip) > 15)
|
||||||
|
$error .= display_alert('danger', 'Failed', "IPv4 addresses only.");
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('request_client', '
|
||||||
|
INSERT INTO mangadex_clients (client_id, user_id, upload_speed, download_speed, disk_cache_size, speedtest, client_ip, client_continent, client_country)
|
||||||
|
VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
', [$user->user_id, $upload, $download, $disk, $speedtest, $ip, get_continent_code($ip), get_country_code($ip)]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_clients");
|
||||||
|
|
||||||
|
$details = $user->user_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'client_rotate':
|
||||||
|
$client_id = prepare_numeric($_GET['client_id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$client = $sql->prep('client_user_id', ' SELECT user_id, upload_speed FROM mangadex_clients WHERE client_id = ? ', [$client_id], 'fetch', PDO::FETCH_ASSOC, -1);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$client_secret = $mdAtHomeClient->rotateUser($client_id);
|
||||||
|
|
||||||
|
$sql->modify('client_rotate', ' UPDATE mangadex_clients SET client_secret = ? WHERE client_id = ? LIMIT 1 ', [$client_secret, $client_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_clients");
|
||||||
|
|
||||||
|
// send the user an automated message
|
||||||
|
|
||||||
|
$subject = "Your MangaDex@Home client secret has been reset.";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"Your MangaDex@Home client secret has been reset to $client_secret";
|
||||||
|
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $client['user_id'];
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
// Send to sentry
|
||||||
|
trigger_error($t->getMessage(), E_USER_WARNING);
|
||||||
|
|
||||||
|
$details = $t->getMessage();
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Error.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'client_approve':
|
||||||
|
$client_id = prepare_numeric($_GET['client_id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$client = $sql->prep('client_user_id', '
|
||||||
|
SELECT clients.user_id, clients.upload_speed, users.username, users.email
|
||||||
|
FROM mangadex_clients AS clients
|
||||||
|
LEFT JOIN mangadex_users AS users
|
||||||
|
ON users.user_id = clients.user_id
|
||||||
|
WHERE clients.client_id = ?
|
||||||
|
LIMIT 1
|
||||||
|
', [$client_id], 'fetch', PDO::FETCH_ASSOC, -1);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$bytes = $client['upload_speed'] / 8 * 1000000;
|
||||||
|
$client_secret = $mdAtHomeClient->registerUser($client['user_id'], $client_id, $client['username'], $bytes);
|
||||||
|
|
||||||
|
$sql->modify('client_approve', ' UPDATE mangadex_clients SET approved = 1, timestamp = UNIX_TIMESTAMP(), client_secret = ? WHERE client_id = ? LIMIT 1 ', [$client_secret, $client_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_clients");
|
||||||
|
|
||||||
|
// send the user an automated message
|
||||||
|
|
||||||
|
$subject = "Your MangaDex@Home client application has been accepted.";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"Your MangaDex@Home client application has been accepted. Thank you for hosting a client! Please check the [url=https://mangadex.org/md_at_home/clients]My clients[/url] page for instructions on setting up the client.";
|
||||||
|
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $client['user_id'];
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
//email them
|
||||||
|
$to = $client['email'];
|
||||||
|
$subject = "Your MangaDex@Home client application has been accepted - {$client['username']}";
|
||||||
|
$body = "Hello,\n\n" .
|
||||||
|
"Your MangaDex@Home client application has been accepted. Thank you for hosting a client! Please check https://mangadex.org/md_at_home/clients for instructions on setting up the client.
|
||||||
|
|
||||||
|
Please connect your client as soon as possible. Clients that do not connect within 3 days of being approved will have re-apply for a new secret.";
|
||||||
|
|
||||||
|
send_email($to, $subject, $body);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
// Send to sentry
|
||||||
|
trigger_error($t->getMessage(), E_USER_WARNING);
|
||||||
|
|
||||||
|
$details = "MangaDex@Home error.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Error.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'client_reject':
|
||||||
|
$client_id = prepare_numeric($_GET['client_id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'admin')) {
|
||||||
|
$sql->modify('client_reject', ' UPDATE mangadex_clients SET approved = 0 WHERE client_id = ? LIMIT 1 ', [$client_id]);
|
||||||
|
|
||||||
|
$client_user_id = $sql->prep('client_user_id', ' SELECT user_id FROM mangadex_clients WHERE client_id = ? ', [$client_id], 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
// send the user an automated message
|
||||||
|
|
||||||
|
$subject = "Your MangaDex@Home client application has been rejected.";
|
||||||
|
$message = "Hello,\n\n" .
|
||||||
|
"Your MangaDex@Home client application has been rejected. Please PM ixlone to discuss your application.";
|
||||||
|
|
||||||
|
$sender_id = 1; // Default MangaDex user; TODO: remove hardcoded value?
|
||||||
|
$recipient_id = $client_user_id;
|
||||||
|
|
||||||
|
$thread_id = $sql->modify('msg_send', ' INSERT INTO mangadex_pm_threads (thread_id, thread_subject, sender_id, recipient_id, thread_timestamp, sender_read, recipient_read, sender_deleted, recipient_deleted)
|
||||||
|
VALUES (NULL, ?, ?, ?, UNIX_TIMESTAMP(), 1, 0, 0, 0) ', [$subject, $sender_id, $recipient_id]);
|
||||||
|
|
||||||
|
$sql->modify('msg_send', ' INSERT INTO mangadex_pm_msgs (msg_id, thread_id, user_id, timestamp, text)
|
||||||
|
VALUES (NULL, ?, ?, UNIX_TIMESTAMP(), ?) ', [$thread_id, $sender_id, $message]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$recipient_id}_unread_msgs");
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_clients");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "Error.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'edit_client':
|
||||||
|
die();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'delete_client':
|
||||||
|
die();
|
||||||
|
break;
|
||||||
|
}
|
771
ajax/actions/users.actions.req.php
Normal file
@ -0,0 +1,771 @@
|
|||||||
|
<?php
|
||||||
|
switch ($function) {
|
||||||
|
case 'order':
|
||||||
|
$payment = prepare_numeric($_POST['payment']);
|
||||||
|
|
||||||
|
if (array_sum($_POST) - $payment > 0) {
|
||||||
|
$payment = prepare_numeric($_POST['payment']);
|
||||||
|
unset($_POST['payment']);
|
||||||
|
$order_json = json_encode($_POST);
|
||||||
|
|
||||||
|
$sql->modify('order', ' INSERT INTO mangadex_orders (order_id, user_id, payment, items) VALUES (NULL, ?, ?, ?) ', [$user->user_id, $payment, $order_json]);
|
||||||
|
|
||||||
|
$details = '';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'You need to order something!';
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'cancel_order':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$sql->modify('order', ' DELETE FROM mangadex_orders WHERE order_id = ? AND user_id = ? LIMIT 1 ', [$id, $user->user_id]);
|
||||||
|
|
||||||
|
$details = '';
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'claim_transaction':
|
||||||
|
$id_string = $_POST['id_string'];
|
||||||
|
|
||||||
|
if (validate_level($user, 'member')) {
|
||||||
|
|
||||||
|
$sql->modify('claim_transaction', ' INSERT INTO mangadex_user_paypal (user_id, paypal) VALUES (?, ?) ', [$user->user_id, $id_string]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_transactions");
|
||||||
|
|
||||||
|
|
||||||
|
$details = $id_string;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't claim transactions.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'friend_accept':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && $user->user_id != $id) {
|
||||||
|
$sql->modify('friend_accept', '
|
||||||
|
INSERT INTO mangadex_user_relations (user_id, relation_id, target_user_id, accepted) VALUES (?, 1, ?, 1)
|
||||||
|
ON DUPLICATE KEY UPDATE accepted = 1
|
||||||
|
', [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$sql->modify('friend_accept', ' UPDATE mangadex_user_relations SET accepted = 1 WHERE user_id = ? AND relation_id = 1 AND target_user_id = ? LIMIT 1 ', [$id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_pending_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_pending_friends_user_ids");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't accept this user as a friend.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'friend_add':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && $user->user_id != $id) {
|
||||||
|
$sql->modify('friend_add', ' INSERT IGNORE INTO mangadex_user_relations (user_id, relation_id, target_user_id, accepted) VALUES (?, 1, ?, 0) ', [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_pending_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_pending_friends_user_ids");
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't add this user as a friend.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'friend_remove':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && $user->user_id != $id) {
|
||||||
|
$sql->modify('friend_remove', ' DELETE FROM mangadex_user_relations WHERE (user_id = ? AND relation_id = 1 AND target_user_id = ?) OR (user_id = ? AND relation_id = 1 AND target_user_id = ?) LIMIT 2 ', [$user->user_id, $id, $id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_pending_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_pending_friends_user_ids");
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't remove this user as a friend.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'user_block':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$target_user = new User($id, 'user_id');
|
||||||
|
|
||||||
|
// Dont allow blocking of staff members
|
||||||
|
if (validate_level($user, 'member') && $user->user_id != $id && !validate_level($target_user, 'pr')) {
|
||||||
|
$sql->modify('user_block', ' DELETE FROM mangadex_user_relations WHERE (user_id = ? AND relation_id = 1 AND target_user_id = ?) OR (user_id = ? AND relation_id = 1 AND target_user_id = ?) LIMIT 2 ', [$user->user_id, $id, $id, $user->user_id]);
|
||||||
|
|
||||||
|
$sql->modify('user_block', ' INSERT IGNORE INTO mangadex_user_relations (user_id, relation_id, target_user_id, accepted) VALUES (?, 0, ?, 1) ', [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_blocked_user_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$user->user_id}_pending_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_friends_user_ids");
|
||||||
|
$memcached->delete("user_{$id}_pending_friends_user_ids");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't block this user.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'user_unblock':
|
||||||
|
$id = prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
if (validate_level($user, 'member') && $user->user_id != $id) {
|
||||||
|
$sql->modify('user_unblock', ' DELETE FROM mangadex_user_relations WHERE user_id = ? AND relation_id = 0 AND target_user_id = ? LIMIT 1 ', [$user->user_id, $id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_blocked_user_ids");
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't unblock this user.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'set_user_note':
|
||||||
|
if ($user->premium === 0) {
|
||||||
|
die('You do not have the right permissions to do that.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$affectedUserId = prepare_numeric($_POST['user_id']);
|
||||||
|
$note = $_POST['note'];
|
||||||
|
|
||||||
|
if (strlen($note) > 50) {
|
||||||
|
die('The note is too long.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($note)) {
|
||||||
|
// Check the note limit
|
||||||
|
$existingNotes = $sql->prep(
|
||||||
|
'user_notes_overview',
|
||||||
|
'SELECT affected_user_id FROM mangadex_user_notes WHERE creator_user_id = ?',
|
||||||
|
[
|
||||||
|
$user->user_id
|
||||||
|
],
|
||||||
|
'fetchAll',
|
||||||
|
PDO::FETCH_COLUMN,
|
||||||
|
-1
|
||||||
|
);
|
||||||
|
$allowedNotes = [0, 50, 200, 1000, 1000, 1000][$user->premium];
|
||||||
|
|
||||||
|
if (!in_array($affectedUserId, $existingNotes, false) && count($existingNotes) >= $allowedNotes) {
|
||||||
|
die('You have reached the maximum amount of notes');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert/Update
|
||||||
|
$sql->modify(
|
||||||
|
'set_user_note',
|
||||||
|
'INSERT INTO mangadex_user_notes VALUES(?, ?, ?) ON DUPLICATE KEY UPDATE note = VALUES(note)',
|
||||||
|
[
|
||||||
|
$user->user_id,
|
||||||
|
$affectedUserId,
|
||||||
|
$note
|
||||||
|
]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Delete
|
||||||
|
$sql->modify(
|
||||||
|
'set_user_note',
|
||||||
|
'DELETE FROM mangadex_user_notes WHERE creator_user_id = ? AND affected_user_id = ?',
|
||||||
|
[
|
||||||
|
$user->user_id,
|
||||||
|
$affectedUserId
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$memcached->delete("user_{$user->user_id}_notes");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 'change_password':
|
||||||
|
$old_password = $_POST['old_password'];
|
||||||
|
$new_password1 = $_POST['new_password1'];
|
||||||
|
$new_password2 = $_POST['new_password2'];
|
||||||
|
|
||||||
|
if (password_verify($old_password, $user->password)) { //verify the hash
|
||||||
|
$password_test = ($new_password1 == $new_password2 && strlen($new_password1) >= 8); //return TRUE
|
||||||
|
|
||||||
|
$new_hash = password_hash($new_password1, PASSWORD_DEFAULT);
|
||||||
|
|
||||||
|
if ($password_test) {
|
||||||
|
$sql->modify('change_password', ' UPDATE mangadex_users SET password = ? WHERE user_id = ? LIMIT 1 ', [$new_hash, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$to = $user->email;
|
||||||
|
$subject = "MangaDex: Change Password - $user->username";
|
||||||
|
$body = "You have successfully changed your password for MangaDex. \n\nUsername: $user->username \nPassword: (your chosen password) ";
|
||||||
|
|
||||||
|
send_email($to, $subject, $body);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Your new password is too short.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //too short
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Incorrect password.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //wrong password
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'supporter_settings':
|
||||||
|
$show_premium_badge = !empty($_POST['show_supporter_badge']) ? 1 : 0;
|
||||||
|
$show_mah_badge = !empty($_POST['show_mah_badge']) ? 1 : 0;
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
if ($user->premium) {
|
||||||
|
$sql->modify('supporter_settings', ' UPDATE mangadex_user_options SET show_premium_badge = ? WHERE user_id = ? LIMIT 1 ', [$show_premium_badge, $user->user_id]);
|
||||||
|
}
|
||||||
|
if (count($user->get_clients())) {
|
||||||
|
$approvaltime = $user->get_client_approval_time();
|
||||||
|
if ($show_mah_badge && $approvaltime < 1593561600) {
|
||||||
|
$show_mah_badge = 2;
|
||||||
|
}
|
||||||
|
$sql->modify('supporter_settings', ' UPDATE mangadex_user_options SET show_md_at_home_badge = ? WHERE user_id = ? LIMIT 1 ', [$show_mah_badge, $user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Your session has timed out. Please log in again.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'upload_settings':
|
||||||
|
$lang_id = prepare_numeric($_POST["lang_id"]);
|
||||||
|
$group_id = prepare_numeric($_POST["group_id"]) ?? 0;
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
$sql->modify('upload_settings', ' UPDATE mangadex_users SET upload_group_id = ?, upload_lang_id = ? WHERE user_id = ? LIMIT 1 ', [$group_id, $lang_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Your session has timed out. Please log in again.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'reader_settings':
|
||||||
|
$reader = !empty($_POST['reader']) ? 1 : 0;
|
||||||
|
$swipe_direction = !empty($_POST['swipe_direction']) ? 1 : 0;
|
||||||
|
$reader_click = !empty($_POST['reader_click']) ? 1 : 0;
|
||||||
|
$post_sensitivity = prepare_numeric($_POST['swipe_sensitivity']);
|
||||||
|
$reader_mode = prepare_numeric($_POST['reader_mode']) ?? 0;
|
||||||
|
$image_fit = prepare_numeric($_POST['image_fit']) ?? 0;
|
||||||
|
$img_server = prepare_numeric($_POST['img_server']);
|
||||||
|
if ($reader_mode && $image_fit == 2)
|
||||||
|
$image_fit = 0;
|
||||||
|
|
||||||
|
$swipe_sensitivity = $post_sensitivity * 25 + 25;
|
||||||
|
if ($swipe_sensitivity < 25)
|
||||||
|
$swipe_sensitivity = 25;
|
||||||
|
elseif ($swipe_sensitivity > 150)
|
||||||
|
$swipe_sensitivity = 150;
|
||||||
|
|
||||||
|
if ($user->user_id) {
|
||||||
|
$sql->modify('reader_settings', '
|
||||||
|
UPDATE mangadex_users SET reader = ?, swipe_direction = ?, swipe_sensitivity = ?, reader_mode = ?, reader_click = ?, image_fit = ?, img_server = ? WHERE user_id = ? LIMIT 1
|
||||||
|
', [$reader, $swipe_direction, $swipe_sensitivity, $reader_mode, $reader_click, $image_fit, $img_server, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = 'Your session has timed out. Please log in again.';
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'change_profile':
|
||||||
|
$lang_id = prepare_numeric($_POST['lang_id']);
|
||||||
|
$website = str_replace(['javascript:'], '', htmlentities($_POST['website']));
|
||||||
|
$user_bio = str_replace(['javascript:'], '', htmlentities($_POST['user_bio']));
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
|
||||||
|
// Make sure website has http://
|
||||||
|
if (!empty($website) && stripos($website, 'http://') === false && stripos($website, 'https://') === false)
|
||||||
|
$website = 'http://'.$website;
|
||||||
|
|
||||||
|
if ($_FILES['file'] && $old_file) {
|
||||||
|
$error .= validate_image($_FILES['file']);
|
||||||
|
|
||||||
|
// Check for Avatar Change Restriction
|
||||||
|
if ($user->has_active_restriction(USER_RESTRICTION_CHANGE_AVATAR)) {
|
||||||
|
$fail_reason = $user->get_restriction_message(USER_RESTRICTION_CHANGE_AVATAR) ?? 'Avatar change failed!';
|
||||||
|
$error .= display_alert("danger", "Failed", $fail_reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for Biography Change Restriction
|
||||||
|
if ($user->has_active_restriction(USER_RESTRICTION_CHANGE_BIOGRAPHY)) {
|
||||||
|
if ($user->user_bio !== $user_bio || $user->user_website !== $website) {
|
||||||
|
$fail_reason = $user->get_restriction_message(USER_RESTRICTION_CHANGE_BIOGRAPHY) ?? 'Biography/Website change failed!';
|
||||||
|
$error .= display_alert("danger", "Failed", $fail_reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', 'Your session has timed out. Please log in again.'); //success
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member'))
|
||||||
|
$error .= display_alert('danger', 'Failed', 'You need to be at least a member.'); //success
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('change_profile', ' UPDATE mangadex_users SET language = ?, user_website = ?, user_bio = ? WHERE user_id = ? LIMIT 1 ', [$lang_id, $website, $user_bio, $user->user_id]);
|
||||||
|
|
||||||
|
if ($old_file) {
|
||||||
|
$arr = explode('.', $_FILES['file']['name']);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
if ($user->avatar)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/avatars/$user->user_id.$user->avatar");
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/avatars/$user->user_id.$ext");
|
||||||
|
|
||||||
|
$sql->modify('change_profile', ' UPDATE mangadex_users SET avatar = ? WHERE user_id = ? LIMIT 1 ', [$ext, $user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strpos($user_bio, 'haruki.ga') !== FALSE) {
|
||||||
|
$token = rand_string(32);
|
||||||
|
$sql->modify('change_profile', ' UPDATE mangadex_users SET password = ?, token = ?, user_website = NULL, user_bio = NULL, avatar = NULL WHERE user_id = ? ', ['compromised', $token, $user->user_id]);
|
||||||
|
|
||||||
|
$guard->destroySession();
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
if (IS_NOJS) redirect_url('/index.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$details = $user->user_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'site_settings':
|
||||||
|
$theme_id = prepare_numeric($_POST['theme_id']);
|
||||||
|
$navigation = prepare_numeric($_POST['navigation']);
|
||||||
|
$list_privacy = prepare_numeric($_POST['list_privacy']);
|
||||||
|
$reader = $_POST['reader'] ?? 0;
|
||||||
|
$data_saver = $_POST['data_saver'] ?? 0;
|
||||||
|
$display_lang_id = prepare_numeric($_POST['display_lang_id']);
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
$hentai_mode = prepare_numeric($_POST["hentai_mode"]);
|
||||||
|
$show_unavailable = prepare_numeric($_POST["show_unavailable"]);
|
||||||
|
$display_moderated = prepare_numeric($_POST["display_moderated"]);
|
||||||
|
$latest_updates = prepare_numeric($_POST["latest_updates"]);
|
||||||
|
$default_lang_ids = (isset($_POST["default_lang_ids"]) && count($_POST["default_lang_ids"]) < 20) ? implode(",", $_POST["default_lang_ids"]) : "";
|
||||||
|
$reset_list_banner = isset($_POST["reset_list_banner"]) ? 1 : 0;
|
||||||
|
$excluded_genres = (isset($_POST['manga_genres']) ? array_map('intval', $_POST['manga_genres']) : []);
|
||||||
|
sort($excluded_genres);
|
||||||
|
|
||||||
|
if ($_FILES['file'] && $old_file && !$reset_list_banner)
|
||||||
|
$error .= validate_image($_FILES['file']);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your session has timed out. Please log in again."); //success
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member'))
|
||||||
|
$error .= display_alert('danger', 'Failed', 'You need to be at least a member.'); //success
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('site_settings', '
|
||||||
|
UPDATE mangadex_users SET hentai_mode = ?, display_moderated = ?, latest_updates = ?, reader = ?, default_lang_ids = ?, style = ?, display_lang_id = ?, list_privacy = ?, excluded_genres = ?, navigation = ?, show_unavailable = ? WHERE user_id = ? LIMIT 1
|
||||||
|
', [$hentai_mode, $display_moderated, $latest_updates, (int) $reader, $default_lang_ids, $theme_id, $display_lang_id, $list_privacy, implode(',', $excluded_genres), $navigation, $show_unavailable, $user->user_id]);
|
||||||
|
|
||||||
|
$sql->modify('site_settings', ' UPDATE mangadex_user_options SET data_saver = ? WHERE user_id = ? LIMIT 1 ', [(int) $data_saver, $user->user_id]);
|
||||||
|
|
||||||
|
if ($old_file && !$reset_list_banner) {
|
||||||
|
$arr = explode(".", $_FILES["file"]["name"]);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
$oldFilename = ABS_DATA_BASEPATH . "/lists/$user->user_id.$user->list_banner";
|
||||||
|
if ($user->list_banner && file_exists($oldFilename))
|
||||||
|
@unlink($oldFilename);
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/lists/$user->user_id.$ext");
|
||||||
|
|
||||||
|
$sql->modify('site_settings', ' UPDATE mangadex_users SET list_banner = ? WHERE user_id = ? LIMIT 1 ', [$ext, $user->user_id]);
|
||||||
|
}
|
||||||
|
elseif ($reset_list_banner) {
|
||||||
|
if ($user->list_banner)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/lists/$user->user_id.$user->list_banner");
|
||||||
|
|
||||||
|
$sql->modify('site_settings', " UPDATE mangadex_users SET list_banner = '' WHERE user_id = ? LIMIT 1 ", [$user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$details = $user->user_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'homepage_settings':
|
||||||
|
$theme_id = prepare_numeric($_POST['theme_id']);
|
||||||
|
$display_lang_id = prepare_numeric($_POST['display_lang_id']);
|
||||||
|
$default_lang_ids = (isset($_POST["default_lang_ids"]) && count($_POST["default_lang_ids"]) < 20) ? implode(",", $_POST["default_lang_ids"]) : "";
|
||||||
|
$hentai_mode = isset($_POST['hentai_mode']) ? prepare_numeric($_POST['hentai_mode']) : 0;
|
||||||
|
|
||||||
|
switch ($hentai_mode) {
|
||||||
|
case 1:
|
||||||
|
setcookie('mangadex_h_toggle', $hentai_mode, $timestamp + (86400 * 3650), '/', DOMAIN); // 86400 = 1 day
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
setcookie('mangadex_h_toggle', $hentai_mode, $timestamp + (86400 * 3650), '/', DOMAIN); // 86400 = 1 day
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
setcookie('mangadex_h_toggle', '', $timestamp - 3600, '/', DOMAIN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user->user_id) {
|
||||||
|
setcookie("mangadex_theme", $theme_id, $timestamp + 3600, "/"); // 3600 = 1 hour
|
||||||
|
setcookie("mangadex_filter_langs", $default_lang_ids, $timestamp + 3600, "/"); // 3600 = 1 hour
|
||||||
|
setcookie('mangadex_display_lang', $display_lang_id, $timestamp + 3600, '/', DOMAIN); // 3600 = 1 hour
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sql->modify('homepage_settings', ' UPDATE mangadex_users SET style = ?, default_lang_ids = ?, display_lang_id = ? WHERE user_id = ? LIMIT 1 ', [$theme_id, $default_lang_ids, $display_lang_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = '';
|
||||||
|
$result = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'list_settings':
|
||||||
|
$list_privacy = prepare_numeric($_POST['list_privacy']);
|
||||||
|
$old_file = $_FILES['file']['name'];
|
||||||
|
$reset_list_banner = isset($_POST["reset_list_banner"]) ? 1 : 0;
|
||||||
|
|
||||||
|
if ($_FILES['file'] && $old_file && !$reset_list_banner)
|
||||||
|
$error .= validate_image($_FILES['file']);
|
||||||
|
|
||||||
|
if (!$user->user_id)
|
||||||
|
$error .= display_alert('danger', 'Failed', "Your session has timed out. Please log in again."); //success
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$sql->modify('list_settings', ' UPDATE mangadex_users SET list_privacy = ? WHERE user_id = ? LIMIT 1 ', [$list_privacy, $user->user_id]);
|
||||||
|
|
||||||
|
if ($old_file && !$reset_list_banner) {
|
||||||
|
$arr = explode(".", $_FILES["file"]["name"]);
|
||||||
|
$ext = strtolower(end($arr));
|
||||||
|
|
||||||
|
if ($user->list_banner)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/lists/$user->user_id.$user->list_banner");
|
||||||
|
|
||||||
|
move_uploaded_file($_FILES["file"]["tmp_name"], ABS_DATA_BASEPATH . "/lists/$user->user_id.$ext");
|
||||||
|
|
||||||
|
$sql->modify('list_settings', ' UPDATE mangadex_users SET list_banner = ? WHERE user_id = ? LIMIT 1 ', [$ext, $user->user_id]);
|
||||||
|
}
|
||||||
|
elseif ($reset_list_banner) {
|
||||||
|
if ($user->list_banner)
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/lists/$user->user_id.$user->list_banner");
|
||||||
|
|
||||||
|
$sql->modify('list_settings', " UPDATE mangadex_users SET list_banner = '' WHERE user_id = ? LIMIT 1 ", [$user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$user->user_id");
|
||||||
|
|
||||||
|
$details = $user->user_id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = $error;
|
||||||
|
print $error; //returns "" or a message
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = ($details) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'msg_thread':
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
try {
|
||||||
|
|
||||||
|
$thread_id = (int)$_POST['id'];
|
||||||
|
$page = max(1, (int)$_POST['page']);
|
||||||
|
|
||||||
|
if (!validate_level($user, 'member'))
|
||||||
|
throw new \Exception("You must be logged in.");
|
||||||
|
|
||||||
|
$thread = new PM_Thread($thread_id);
|
||||||
|
|
||||||
|
if (!isset($thread->thread_id) || ($thread->sender_id != $user->user_id && $thread->recipient_id != $user->user_id))
|
||||||
|
throw new \Exception("This thread does not exist.");
|
||||||
|
|
||||||
|
$limit = defined('DMS_DISPLAY_LIMIT') ? DMS_DISPLAY_LIMIT : 25;
|
||||||
|
$messages = new PM_Msgs($thread->thread_id, ($page - 1) * $limit, $limit);
|
||||||
|
|
||||||
|
$html = "";
|
||||||
|
|
||||||
|
$n = 0;
|
||||||
|
foreach ($messages as $msg_id => $msg) {
|
||||||
|
$parser->parse($msg->text);
|
||||||
|
$msg->post_id = $msg_id;
|
||||||
|
|
||||||
|
$html = display_post_v2($msg, $parser->getAsHtml(), $user, 'message') . $html;
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
print json_encode([
|
||||||
|
'status' => 'success',
|
||||||
|
'code' => 200,
|
||||||
|
'data' => $html,
|
||||||
|
'count' => $n,
|
||||||
|
'total' => $thread->total,
|
||||||
|
]);
|
||||||
|
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
print json_encode([
|
||||||
|
'status' => 'fail',
|
||||||
|
'code' => 400,
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
]);
|
||||||
|
$result = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'mod_user_restriction':
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod')) {
|
||||||
|
http_response_code(401);
|
||||||
|
$result = 0;
|
||||||
|
} else {
|
||||||
|
$target_user_id = prepare_numeric($_POST['target_user_id']);
|
||||||
|
$mod_user_id = prepare_numeric($_POST['mod_user_id']);
|
||||||
|
$restriction_type_id = prepare_numeric($_POST['restriction_type_id']);
|
||||||
|
$expiration_reltime = prepare_numeric($_POST['expiration_reltime'] ?? 0);
|
||||||
|
$expiration_relstep = prepare_numeric($_POST['expiration_relstep'] ?? 0);
|
||||||
|
$expiration_permanent = isset($_POST['expiration_permanent']) && $_POST['expiration_permanent'] === 'on';
|
||||||
|
$expiration_timestamp = $expiration_permanent
|
||||||
|
? 4294967295 // Just add max number
|
||||||
|
: time() + $expiration_reltime * $expiration_relstep;
|
||||||
|
$comment = htmlentities(strip_tags(trim($_POST['comment'])));
|
||||||
|
|
||||||
|
//var_dump($target_user_id, $mod_user_id, $restriction_type_id, $expiration_timestamp, $comment);
|
||||||
|
|
||||||
|
$sql->modify('user_restrictions_all_'.$target_user_id, '
|
||||||
|
INSERT INTO mangadex_user_restrictions
|
||||||
|
(target_user_id, restriction_type_id, mod_user_id, expiration_timestamp, comment)
|
||||||
|
VALUES
|
||||||
|
(?, ?, ?, ?, ?)', [$target_user_id, $restriction_type_id, $mod_user_id, $expiration_timestamp, $comment]);
|
||||||
|
|
||||||
|
// Clear cache
|
||||||
|
$memcached->delete('user_restrictions_active_detailed_'.$target_user_id); // Profile page table
|
||||||
|
$memcached->delete('user_restrictions_active_'.$target_user_id); // User class method
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'mod_lift_user_restriction':
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod')) {
|
||||||
|
http_response_code(401);
|
||||||
|
$result = 0;
|
||||||
|
} else {
|
||||||
|
$restriction_id = prepare_numeric($_POST['restriction_id']);
|
||||||
|
$target_user_id = prepare_numeric($_POST['target_user_id']);
|
||||||
|
$mod_user_id = prepare_numeric($user->user_id);
|
||||||
|
|
||||||
|
//var_dump($restriction_id, $mod_user_id);
|
||||||
|
|
||||||
|
$sql->modify('user_restrictions_all_'.$target_user_id, '
|
||||||
|
UPDATE mangadex_user_restrictions
|
||||||
|
SET
|
||||||
|
mod_user_id = ?,
|
||||||
|
expiration_timestamp = ?
|
||||||
|
WHERE
|
||||||
|
restriction_id = ?', [$mod_user_id, time(), $restriction_id]);
|
||||||
|
|
||||||
|
// Clear cache
|
||||||
|
$memcached->delete('user_restrictions_active_detailed_'.$target_user_id); // Profile page table
|
||||||
|
$memcached->delete('user_restrictions_active_'.$target_user_id); // User class method
|
||||||
|
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'mod_nuke_user_comments':
|
||||||
|
|
||||||
|
if (!validate_level($user, 'mod')) {
|
||||||
|
http_response_code(401);
|
||||||
|
$result = 0;
|
||||||
|
} else {
|
||||||
|
$user_id = prepare_numeric($_GET["id"]);
|
||||||
|
|
||||||
|
$posts = $sql->prep('posts_nuke_select', '
|
||||||
|
SELECT posts.post_id, posts.thread_id, threads.forum_id
|
||||||
|
FROM mangadex_forum_posts AS posts
|
||||||
|
LEFT JOIN mangadex_threads AS threads
|
||||||
|
ON threads.thread_id = posts.thread_id
|
||||||
|
WHERE posts.user_id = ? AND posts.deleted = 0
|
||||||
|
', [$user_id], 'fetchAll', PDO::FETCH_ASSOC, -1);
|
||||||
|
|
||||||
|
$sql->modify('posts_nuke_update', '
|
||||||
|
UPDATE mangadex_forum_posts AS posts
|
||||||
|
SET deleted = 1
|
||||||
|
WHERE posts.user_id = ?
|
||||||
|
', [$user_id]);
|
||||||
|
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
$sql->modify("posts_nuke_update_thread_{$post['thread_id']}", '
|
||||||
|
UPDATE mangadex_threads
|
||||||
|
SET thread_posts = IF(thread_posts > 1, thread_posts - 1, 0)
|
||||||
|
WHERE thread_id = ?
|
||||||
|
LIMIT 1
|
||||||
|
', [$post['thread_id']]);
|
||||||
|
switch ($post['forum_id']) {
|
||||||
|
case 11:
|
||||||
|
$manga_id = $sql->prep('posts_nuke_memcached_manga', ' SELECT manga_id FROM mangadex_mangas WHERE thread_id = ? LIMIT 1 ', [$post['thread_id']], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("manga_$manga_id");
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
$group_id = $sql->prep('posts_nuke_memcached_group', ' SELECT group_id FROM mangadex_groups WHERE thread_id = ? LIMIT 1 ', [$post['thread_id']], 'fetchColumn', '', -1);
|
||||||
|
$memcached->delete("group_$group_id");
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$memcached->delete("user_$user_id");
|
||||||
|
$details = $user_id;
|
||||||
|
print display_alert("success", "Success", "All the posts of user #$user_id have been deleted.");
|
||||||
|
$result = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
case 'admin_edit_user':
|
||||||
|
|
||||||
|
$is_admin = validate_level($user, 'admin');
|
||||||
|
$is_mod = validate_level($user, 'mod');
|
||||||
|
|
||||||
|
$id = prepare_numeric($_GET["id"]);
|
||||||
|
if ($is_admin) {
|
||||||
|
$level_id = prepare_numeric($_POST["level_id"]);
|
||||||
|
$email = $_POST["email"];
|
||||||
|
$username = $_POST["username"];
|
||||||
|
$new_pass = $_POST["new_pass"];
|
||||||
|
$lang_id = prepare_numeric($_POST["lang_id"]);
|
||||||
|
$upload_lang_id = prepare_numeric($_POST["upload_lang_id"]);
|
||||||
|
$upload_group_id = prepare_numeric($_POST["upload_group_id"]);
|
||||||
|
}
|
||||||
|
$avatar = $_POST["avatar"];
|
||||||
|
$website = htmlentities($_POST['website']);
|
||||||
|
$user_bio = htmlentities($_POST['user_bio']);
|
||||||
|
$reset_list_banner = isset($_POST["reset_list_banner"]) ? 1 : 0;
|
||||||
|
$reset_avatar = isset($_POST["reset_avatar"]) ? 1 : 0;
|
||||||
|
|
||||||
|
if ($is_mod) {
|
||||||
|
|
||||||
|
$edit_user = new User($id, 'user_id');
|
||||||
|
|
||||||
|
if ($reset_list_banner && $edit_user->list_banner) {
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/lists/{$edit_user->user_id}.{$edit_user->list_banner}");
|
||||||
|
$sql->modify('admin_edit_list_banner', "UPDATE mangadex_users SET list_banner = '' WHERE user_id = ?", [$edit_user->user_id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($reset_avatar && $edit_user->avatar) {
|
||||||
|
@unlink(ABS_DATA_BASEPATH . "/avatars/{$edit_user->user_id}.{$edit_user->avatar}");
|
||||||
|
$avatar = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($is_admin) {
|
||||||
|
$sql->modify('admin_edit_user', '
|
||||||
|
UPDATE mangadex_users SET username = ?, level_id = ?, email = ?, language = ?, avatar = ?, upload_group_id = ?, upload_lang_id = ?, user_bio = ?, user_website = ? WHERE user_id = ?
|
||||||
|
', [$username, $level_id, $email, $lang_id, $avatar, $upload_group_id, $upload_lang_id, $user_bio, $website, $id]);
|
||||||
|
|
||||||
|
if ($level_id == 0) {
|
||||||
|
$sql->modify('admin_edit_user', "DELETE FROM mangadex_pm_threads WHERE sender_id = ?", [$id]);
|
||||||
|
$sql->modify('admin_edit_user', "DELETE FROM mangadex_pm_msgs WHERE user_id = ?", [$id]);
|
||||||
|
$sql->modify('admin_edit_user', "UPDATE mangadex_users SET avatar = '', user_bio = '', user_website = '' WHERE user_id = ? ", [$id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($new_pass) {
|
||||||
|
$password_hash = password_hash($new_pass, PASSWORD_DEFAULT);
|
||||||
|
$sql->modify('admin_edit_user', ' UPDATE mangadex_users SET password = ? WHERE user_id = ? LIMIT 1 ', [$password_hash, $id]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$sql->modify('admin_edit_user', '
|
||||||
|
UPDATE mangadex_users SET avatar = ?, user_bio = ?, user_website = ? WHERE user_id = ?
|
||||||
|
', [$avatar, $user_bio, $website, $id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$memcached->delete("user_$id");
|
||||||
|
|
||||||
|
$details = $id;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$details = "You can't edit users.";
|
||||||
|
print display_alert('danger', 'Failed', $details); //fail
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = (!is_numeric($details)) ? 0 : 1;
|
||||||
|
break;
|
||||||
|
}
|
464
api/index.php
Normal file
@ -0,0 +1,464 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Tachi') !== FALSE && rand(1,10) <3) {
|
||||||
|
http_response_code(600);
|
||||||
|
die('API currently down');
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if (isset($_GET['_'])) {
|
||||||
|
http_response_code(666);
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
use Mangadex\Model\Guard;
|
||||||
|
|
||||||
|
require_once ('../bootstrap.php');
|
||||||
|
|
||||||
|
require_once (ABSPATH . "/scripts/header.req.php");
|
||||||
|
|
||||||
|
if (!process_user_limit(1500, 'api_')) {
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'Too many hits detected from your IP! Please try again tomorrow.';
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
http_response_code(429);
|
||||||
|
die(json_encode($array));
|
||||||
|
}
|
||||||
|
|
||||||
|
$guard = Guard::getInstance();
|
||||||
|
if (isset($_COOKIE[SESSION_COOKIE_NAME]) || isset($_COOKIE[SESSION_REMEMBERME_COOKIE_NAME])) {
|
||||||
|
$guard->tryRestoreSession($_COOKIE[SESSION_COOKIE_NAME] ?? null, $_COOKIE[SESSION_REMEMBERME_COOKIE_NAME] ?? null);
|
||||||
|
$user = $guard->hasUser() ? $guard->getUser() : $guard->getUser(0); // Fetch guest record (userid=0) if no user could be restored
|
||||||
|
} else {
|
||||||
|
$user = $guard->getUser(0); // Fetch guest
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var $sentry Raven_Client */
|
||||||
|
if (isset($sentry) && isset($user)) {
|
||||||
|
$sentry->user_context([
|
||||||
|
'id' => $user->user_id,
|
||||||
|
'username' => $user->username,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = $_GET['type'] ?? '';
|
||||||
|
|
||||||
|
switch ($type) {
|
||||||
|
case 'manga':
|
||||||
|
|
||||||
|
if (!isset($_GET['id'])) {
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'No ID provided.';
|
||||||
|
http_response_code(400);
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
die(json_encode($array));
|
||||||
|
}
|
||||||
|
|
||||||
|
$manga_id = (int)prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($manga_id);
|
||||||
|
|
||||||
|
if (isset($manga->manga_id)) {
|
||||||
|
$array['manga'] = [
|
||||||
|
'cover_url' => "/images/manga/$manga->manga_id.$manga->manga_image?" . @filemtime(ABS_DATA_BASEPATH . "/manga/$manga->manga_id.$manga->manga_image"),
|
||||||
|
'description' => $manga->manga_description,
|
||||||
|
'title' => $manga->manga_name,
|
||||||
|
'alt_names' => \array_map(function ($alt_name) { return \html_entity_decode($alt_name); }, $manga->get_manga_alt_names()),
|
||||||
|
'artist' => $manga->manga_artist,
|
||||||
|
'author' => $manga->manga_author,
|
||||||
|
'status' => $manga->manga_status_id,
|
||||||
|
'demographic' => $manga->manga_demo_id,
|
||||||
|
'genres' => $manga->get_manga_genres(),
|
||||||
|
'last_chapter' => $manga->manga_last_chapter,
|
||||||
|
'last_volume' => $manga->manga_last_volume,
|
||||||
|
'last_updated' => date('Y-m-d H:i:s', $manga->manga_last_uploaded),
|
||||||
|
'lang_name' => $manga->lang_name,
|
||||||
|
'lang_flag' => $manga->lang_flag,
|
||||||
|
'hentai' => $manga->manga_hentai,
|
||||||
|
//'follow' => $manga->get_user_follow_info($user->user_id),
|
||||||
|
'links' => json_decode($manga->manga_links),
|
||||||
|
'related' => $manga->get_related_manga(),
|
||||||
|
'rating' => [
|
||||||
|
'bayesian' => $manga->manga_bayesian ?? 0,
|
||||||
|
'mean' => $manga->manga_rating ?? 0,
|
||||||
|
'users' => number_format(count($manga->get_user_ratings() ?? 0)),
|
||||||
|
//'personal' => $manga->get_user_rating($user->user_id) ?: 0,
|
||||||
|
],
|
||||||
|
'views' => $manga->manga_views,
|
||||||
|
'follows' => $manga->manga_follows,
|
||||||
|
'comments' => $manga->thread_posts,
|
||||||
|
'last_updated' => $manga->manga_last_uploaded,
|
||||||
|
'covers' => \array_map(function ($cover) use ($manga_id) { return "/images/covers/{$manga_id}v{$cover['volume']}.{$cover['img']}"; }, $manga->get_covers()),
|
||||||
|
];
|
||||||
|
|
||||||
|
$search["chapter_deleted"] = 0;
|
||||||
|
$search["manga_id"] = $manga_id; //manga_id
|
||||||
|
$search["available"] = 1; //available
|
||||||
|
|
||||||
|
$blocked_groups = $user->get_blocked_groups();
|
||||||
|
if ($blocked_groups)
|
||||||
|
$search['blocked_groups'] = array_keys($blocked_groups);
|
||||||
|
|
||||||
|
$order = "(CASE volume WHEN '' THEN 1 END) DESC, abs(volume) DESC, abs(chapter) DESC, group_id ASC";
|
||||||
|
|
||||||
|
$chapters = new Chapters($search);
|
||||||
|
$chapters_obj = $chapters->query_read($order, 8000, 1);
|
||||||
|
$group_list = array();
|
||||||
|
|
||||||
|
foreach ($chapters_obj as $chapter) {
|
||||||
|
$chapter = (object)$chapter;
|
||||||
|
$array['chapter'][$chapter->chapter_id] = [
|
||||||
|
'volume' => $chapter->volume,
|
||||||
|
'chapter' => $chapter->chapter,
|
||||||
|
'title' => html_entity_decode($chapter->title),
|
||||||
|
'lang_name' => $chapter->lang_name,
|
||||||
|
'lang_code' => $chapter->lang_flag,
|
||||||
|
'group_id' => $chapter->group_id,
|
||||||
|
'group_name' => $chapter->group_name,
|
||||||
|
'group_id_2' => $chapter->group_id_2,
|
||||||
|
'group_name_2' => $chapter->group_name_2,
|
||||||
|
'group_id_3' => $chapter->group_id_3,
|
||||||
|
'group_name_3' => $chapter->group_name_3,
|
||||||
|
'timestamp' => $chapter->upload_timestamp,
|
||||||
|
'comments' => $chapter->thread_posts,
|
||||||
|
];
|
||||||
|
|
||||||
|
$group_list[$chapter->group_id] = $chapter->group_name;
|
||||||
|
if($chapter->group_id_2){
|
||||||
|
$group_list[$chapter->group_id_2] = $chapter->group_name_2;
|
||||||
|
}
|
||||||
|
if($chapter->group_id_3){
|
||||||
|
$group_list[$chapter->group_id_3] = $chapter->group_name_3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($group_list as $group_id => $group_name){
|
||||||
|
$array['group'][$group_id] = ['group_name' =>$group_name];
|
||||||
|
}
|
||||||
|
|
||||||
|
$array['status'] = 'OK';
|
||||||
|
/*
|
||||||
|
if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Tachiyomi') !== false) {
|
||||||
|
$url = "https://www.google-analytics.com/collect?";
|
||||||
|
$query = "/title/$manga->manga_id/" . slugify($manga->manga_name);
|
||||||
|
$data = array(
|
||||||
|
'v' => 1,
|
||||||
|
'tid' => 'UA-112305080-1',
|
||||||
|
//'tid' => 'UA-114714674-1',
|
||||||
|
'cid' => md5($ip),
|
||||||
|
't' => 'pageview',
|
||||||
|
'dp' => urlencode($query),
|
||||||
|
'dt' => $manga->manga_name . ' (Title) - Tachi API',
|
||||||
|
//'an' => 'Tachiyomi',
|
||||||
|
//'cd' => 'API',
|
||||||
|
'z' => rand(),
|
||||||
|
);
|
||||||
|
|
||||||
|
httpGet($url, http_build_query_read($data));
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$array['status'] = 'Manga ID does not exist.';
|
||||||
|
http_response_code(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'covers':
|
||||||
|
|
||||||
|
if (!isset($_GET['id'])) {
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'No ID provided.';
|
||||||
|
http_response_code(400);
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
die(json_encode($array));
|
||||||
|
}
|
||||||
|
|
||||||
|
$manga_id = (int)prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$manga = new Manga($manga_id);
|
||||||
|
|
||||||
|
if (isset($manga->manga_id)) {
|
||||||
|
$array['covers'] = \array_map(function ($cover) use ($manga_id) { return "/images/covers/{$manga_id}v{$cover['volume']}.{$cover['img']}"; }, $manga->get_covers());
|
||||||
|
$array['status'] = 'OK';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$array['status'] = 'Manga ID does not exist.';
|
||||||
|
http_response_code(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'chapter':
|
||||||
|
|
||||||
|
if (isset($_GET['hash']) && preg_match('/^[a-z0-9]+$/i', $_GET['hash'])) {
|
||||||
|
$chapter_id = $sql->prep("chapter_{$_GET['hash']}",
|
||||||
|
" SELECT chapter_id FROM mangadex_chapters WHERE chapter_hash = ? LIMIT 1 ",
|
||||||
|
[$_GET['hash']], 'fetchColumn', '', 86400);
|
||||||
|
if (!$chapter_id) {
|
||||||
|
$array['hash'] = $_GET['hash'];
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'Chapter does not exist';
|
||||||
|
http_response_code(404);
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
die(json_encode($array));
|
||||||
|
}
|
||||||
|
} else if (!isset($_GET['id'])) {
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'No ID provided.';
|
||||||
|
http_response_code(400);
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
die(json_encode($array));
|
||||||
|
}
|
||||||
|
|
||||||
|
$chapter_id = $chapter_id ?? prepare_numeric($_GET['id']);
|
||||||
|
|
||||||
|
$chapter = new Chapter($chapter_id);
|
||||||
|
$chapter = (object)$chapter;
|
||||||
|
|
||||||
|
if (isset($chapter->chapter_id)) {
|
||||||
|
|
||||||
|
$target_group = new Group($chapter->group_id);
|
||||||
|
if ($target_group && isset($target_group->group_id) && $target_group->group_id > 0) {
|
||||||
|
$group_members_array = $target_group->get_members();
|
||||||
|
} else {
|
||||||
|
$group_members_array = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($chapter->group_id_2) {
|
||||||
|
$target_group2 = new Group($chapter->group_id_2);
|
||||||
|
if ($target_group2 && isset($target_group2->group_id) && $target_group2->group_id > 0) {
|
||||||
|
$group_members_array = array_merge($group_members_array, $target_group2->get_members());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($chapter->group_id_3) {
|
||||||
|
$target_group3 = new Group($chapter->group_id_3);
|
||||||
|
if ($target_group3 && isset($target_group3->group_id) && $target_group3->group_id > 0) {
|
||||||
|
$group_members_array = array_merge($group_members_array, $target_group3->get_members());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$chapter->available && !validate_level($user, 'pr')) {
|
||||||
|
$array = [
|
||||||
|
'id' => $chapter->chapter_id,
|
||||||
|
'timestamp' => $chapter->upload_timestamp,
|
||||||
|
'volume' => $chapter->volume,
|
||||||
|
'chapter' => $chapter->chapter,
|
||||||
|
'title' => html_entity_decode($chapter->title),
|
||||||
|
'lang_name' => $chapter->lang_name,
|
||||||
|
'lang_code' => $chapter->lang_flag,
|
||||||
|
'manga_id' => $chapter->manga_id,
|
||||||
|
'comments' => $chapter->thread_posts,
|
||||||
|
'status' => 'unavailable',
|
||||||
|
];
|
||||||
|
http_response_code(300);
|
||||||
|
}
|
||||||
|
|
||||||
|
elseif ($chapter->chapter_deleted && !validate_level($user, 'pr')) {
|
||||||
|
$array = [
|
||||||
|
'id' => $chapter->chapter_id,
|
||||||
|
'status' => 'deleted',
|
||||||
|
];
|
||||||
|
http_response_code(410);
|
||||||
|
}
|
||||||
|
|
||||||
|
elseif ($chapter->upload_timestamp < $timestamp ||
|
||||||
|
($user->user_id == $chapter->user_id ||
|
||||||
|
validate_level($user, 'pr') || // Retain pr ability to read delayed chapters
|
||||||
|
($user->user_id && in_array($user->user_id, [$chapter->group_leader_id, $chapter->group_leader_id_2, $chapter->group_leader_id_3])) ||
|
||||||
|
in_array($user->username, $group_members_array)
|
||||||
|
)) {
|
||||||
|
|
||||||
|
$status = 'OK';
|
||||||
|
$manga = new Manga($chapter->manga_id);
|
||||||
|
$long_strip = in_array(36, $manga->get_manga_genres());
|
||||||
|
|
||||||
|
if (substr($chapter->page_order, 0, 4) === 'http') {
|
||||||
|
$page_array = [];
|
||||||
|
$status = 'external';
|
||||||
|
} else {
|
||||||
|
$arr = explode(",", $chapter->page_order);
|
||||||
|
$page_array = array_combine(range(1, count($arr)), array_values($arr));
|
||||||
|
}
|
||||||
|
|
||||||
|
$server_fallback = LOCAL_SERVER_URL;
|
||||||
|
$server_network = null;
|
||||||
|
|
||||||
|
// when a chapter does not exist on the local webserver, it gets an id. since all imageservers share the same data, we can assign any imageserver
|
||||||
|
// with the best location to the user.
|
||||||
|
if ($chapter->server > 0) {
|
||||||
|
if (isset($user->md_at_home) && $user->md_at_home && stripos($chapter->page_order, 'http') === false) {
|
||||||
|
try {
|
||||||
|
$subsubdomain = $mdAtHomeClient->getServerUrl($chapter->chapter_hash, explode(',', $chapter->page_order), _IP);
|
||||||
|
if (!empty($subsubdomain)) {
|
||||||
|
$server_network = $subsubdomain;
|
||||||
|
}
|
||||||
|
} catch (Throwable $t) {
|
||||||
|
trigger_error($t->getMessage(), E_USER_WARNING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$server_id = -1;
|
||||||
|
// If a usersetting overwrites it, take this
|
||||||
|
if (isset($_GET['server'])) {
|
||||||
|
// if the parameter was trash, this returns -1
|
||||||
|
$server_id = get_server_id_by_code($_GET['server']);
|
||||||
|
}
|
||||||
|
if ($server_id < 1) {
|
||||||
|
// Try to select a region based server if we havent set one already
|
||||||
|
$server_id = get_server_id_by_geography();
|
||||||
|
}
|
||||||
|
if ($server_id > 0) {
|
||||||
|
$server_fallback = "https://s$server_id.mangadex.org";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$server = $server_network ?: $server_fallback;
|
||||||
|
|
||||||
|
$data_dir = (isset($_GET['saver']) && $_GET['saver']) ? '/data-saver/' : '/data/';
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
'id' => $chapter->chapter_id,
|
||||||
|
'timestamp' => $chapter->upload_timestamp,
|
||||||
|
'hash' => $chapter->chapter_hash,
|
||||||
|
'volume' => $chapter->volume,
|
||||||
|
'chapter' => $chapter->chapter,
|
||||||
|
'title' => html_entity_decode($chapter->title),
|
||||||
|
'lang_name' => $chapter->lang_name,
|
||||||
|
'lang_code' => $chapter->lang_flag,
|
||||||
|
'manga_id' => $chapter->manga_id,
|
||||||
|
'group_id' => $chapter->group_id,
|
||||||
|
'group_name' => $chapter->group_name,
|
||||||
|
'group_id_2' => $chapter->group_id_2,
|
||||||
|
'group_name_2' => $chapter->group_name_2,
|
||||||
|
'group_id_3' => $chapter->group_id_3,
|
||||||
|
'group_name_3' => $chapter->group_name_3,
|
||||||
|
'comments' => $chapter->thread_posts,
|
||||||
|
'server' => $server.$data_dir,
|
||||||
|
'page_array' => array_values($page_array),
|
||||||
|
'long_strip' => $long_strip,
|
||||||
|
'status' => $status,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!empty($server_network)) {
|
||||||
|
$array['server_fallback'] = $server_fallback.$data_dir;
|
||||||
|
}
|
||||||
|
if ($status === 'external') {
|
||||||
|
$array['external'] = $chapter->page_order;
|
||||||
|
}
|
||||||
|
|
||||||
|
elseif (in_array($chapter->manga_id, RESTRICTED_MANGA_IDS) && !validate_level($user, 'contributor') && $user->get_chapters_read_count() < MINIMUM_CHAPTERS_READ_FOR_RESTRICTED_MANGA) {
|
||||||
|
$array = [
|
||||||
|
'id' => $chapter->chapter_id,
|
||||||
|
'status' => 'restricted',
|
||||||
|
];
|
||||||
|
http_response_code(451);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_views_v2($type, $chapter->chapter_id, $ip, $user->user_id);
|
||||||
|
|
||||||
|
$mark_read = $_GET["mark_read"] ?? true;
|
||||||
|
if ($user->user_id && $mark_read) {
|
||||||
|
$chapter->update_chapter_views($user->user_id, $manga->get_follows_user_id());
|
||||||
|
|
||||||
|
$chapter->update_reading_history($user->user_id, $user->get_reading_history(true));
|
||||||
|
|
||||||
|
$followed_manga_ids_array = $user->get_followed_manga_ids();
|
||||||
|
if (isset($followed_manga_ids_array[$chapter->manga_id])) {
|
||||||
|
if ((int) $followed_manga_ids_array[$chapter->manga_id]['chapter'] == (int) $chapter->chapter - 1)
|
||||||
|
$sql->modify('increment_chapter', ' UPDATE mangadex_follow_user_manga SET chapter = ABS(chapter) + 1 WHERE manga_id = ? AND user_id = ? LIMIT 1 ', [$chapter->manga_id, $user->user_id]);
|
||||||
|
|
||||||
|
if ((int) $followed_manga_ids_array[$chapter->manga_id]['volume'] == (int) $chapter->volume - 1)
|
||||||
|
$sql->modify('increment_volume', ' UPDATE mangadex_follow_user_manga SET volume = ABS(volume) + 1 WHERE manga_id = ? AND user_id = ? LIMIT 1 ', [$chapter->manga_id, $user->user_id]);
|
||||||
|
|
||||||
|
$memcached->delete("user_{$user->user_id}_followed_manga_ids");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$is_tachi = (strpos($_SERVER['HTTP_USER_AGENT'] ?? '', 'Tachiyomi') !== false) ? 1 : 0;
|
||||||
|
[$total_hits, $tachi_hits] = $memcached->get("chapter_hits") ?: [0, 0];
|
||||||
|
$memcached->set("chapter_hits", [$total_hits + 1, $tachi_hits + $is_tachi]);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
$array = [
|
||||||
|
'id' => $chapter->chapter_id,
|
||||||
|
'timestamp' => $chapter->upload_timestamp,
|
||||||
|
'volume' => $chapter->volume,
|
||||||
|
'chapter' => $chapter->chapter,
|
||||||
|
'title' => html_entity_decode($chapter->title),
|
||||||
|
'lang_name' => $chapter->lang_name,
|
||||||
|
'lang_code' => $chapter->lang_flag,
|
||||||
|
'manga_id' => $chapter->manga_id,
|
||||||
|
'group_id' => $chapter->group_id,
|
||||||
|
'group_name' => $chapter->group_name,
|
||||||
|
'group_id_2' => $chapter->group_id_2,
|
||||||
|
'group_name_2' => $chapter->group_name_2,
|
||||||
|
'group_id_3' => $chapter->group_id_3,
|
||||||
|
'group_name_3' => $chapter->group_name_3,
|
||||||
|
'group_website' => $chapter->group_website,
|
||||||
|
'status' => 'delayed',
|
||||||
|
];
|
||||||
|
http_response_code(409);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$array = [
|
||||||
|
'id' => (int) $chapter_id,
|
||||||
|
'status' => 'error',
|
||||||
|
'message' => 'Chapter ID does not exist.',
|
||||||
|
];
|
||||||
|
http_response_code(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'manga_follows':
|
||||||
|
|
||||||
|
if ($user && $user->user_id > 0) {
|
||||||
|
|
||||||
|
if (isset($_GET['manga_id']) && $_GET['manga_id'] > 0) {
|
||||||
|
$manga_id = (int)$_GET['manga_id'];
|
||||||
|
|
||||||
|
$query = <<<SQL
|
||||||
|
SELECT
|
||||||
|
m.manga_name AS title, f.manga_id, f.follow_type, f.volume, f.chapter
|
||||||
|
FROM
|
||||||
|
mangadex_follow_user_manga f,
|
||||||
|
mangadex_mangas m
|
||||||
|
WHERE
|
||||||
|
f.user_id = ? AND f.manga_id = ?
|
||||||
|
AND f.manga_id = m.manga_id
|
||||||
|
SQL;
|
||||||
|
$follows = $sql->prep('api_folows_one_of_any_user', $query, [$user->user_id, $manga_id], 'fetchAll', \PDO::FETCH_ASSOC, -1);
|
||||||
|
} else {
|
||||||
|
$limit = 200;
|
||||||
|
$offset = $limit * ((int) max(1, (int) min(50, $_GET['page'] ?? 1)) - 1);
|
||||||
|
|
||||||
|
$follows = $user->get_followed_manga_ids_api();
|
||||||
|
foreach ($follows AS &$follow) {
|
||||||
|
$follow['title'] = html_entity_decode($follow['title'] ?? '', null, 'UTF-8');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
'result' => $follows,
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
http_response_code(401);
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'No User available. You need to authenticate to use this endpoint.';
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$array['status'] = 'error';
|
||||||
|
$array['message'] = 'Not a valid API endpoint.';
|
||||||
|
http_response_code(404);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//visit_log_api($_SERVER, $ip, $user->user_id, $user->hentai_mode);
|
||||||
|
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
print json_encode($array);
|
85
api/v2/index.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once('../../bootstrap.php');
|
||||||
|
require_once(ABSPATH . '/scripts/header.req.php');
|
||||||
|
|
||||||
|
use Mangadex\Controller\API\ChapterController;
|
||||||
|
use Mangadex\Controller\API\FollowsController;
|
||||||
|
use Mangadex\Controller\API\GroupController;
|
||||||
|
use Mangadex\Controller\API\IndexController;
|
||||||
|
use Mangadex\Controller\API\MangaController;
|
||||||
|
use Mangadex\Controller\API\RelationTypeController;
|
||||||
|
use Mangadex\Controller\API\TagController;
|
||||||
|
use Mangadex\Controller\API\UserController;
|
||||||
|
use Mangadex\Exception\Http\HttpException;
|
||||||
|
use Mangadex\Exception\Http\NotFoundHttpException;
|
||||||
|
use Mangadex\Exception\Http\TooManyRequestsHttpException;
|
||||||
|
use Mangadex\Model\Guard;
|
||||||
|
use Mangadex\Model\JsonResponse;
|
||||||
|
|
||||||
|
$response = new JsonResponse();
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!process_user_limit(1500, 'api_')) {
|
||||||
|
throw new TooManyRequestsHttpException('Too many hits detected from your IP! Please try again tomorrow.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$guard = Guard::getInstance();
|
||||||
|
if (isset($_COOKIE[SESSION_COOKIE_NAME]) || isset($_COOKIE[SESSION_REMEMBERME_COOKIE_NAME])) {
|
||||||
|
$guard->tryRestoreSession($_COOKIE[SESSION_COOKIE_NAME] ?? null, $_COOKIE[SESSION_REMEMBERME_COOKIE_NAME] ?? null);
|
||||||
|
$user = $guard->hasUser() ? $guard->getUser() : $guard->getUser(0); // Fetch guest record (userid=0) if no user could be restored
|
||||||
|
} else {
|
||||||
|
$user = $guard->getUser(0); // Fetch guest
|
||||||
|
}
|
||||||
|
/** @var $sentry Raven_Client */
|
||||||
|
if (isset($sentry) && isset($user)) {
|
||||||
|
$sentry->user_context([
|
||||||
|
'id' => $user->user_id,
|
||||||
|
'username' => $user->username,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = explode('/', $_GET['path']);
|
||||||
|
|
||||||
|
switch ($path[0] ?: 'index') {
|
||||||
|
case 'manga':
|
||||||
|
case 'title':
|
||||||
|
$controller = new MangaController();
|
||||||
|
break;
|
||||||
|
case 'chapter':
|
||||||
|
$controller = new ChapterController();
|
||||||
|
break;
|
||||||
|
case 'user':
|
||||||
|
$controller = new UserController();
|
||||||
|
break;
|
||||||
|
case 'group':
|
||||||
|
$controller = new GroupController();
|
||||||
|
break;
|
||||||
|
case 'tag':
|
||||||
|
$controller = new TagController();
|
||||||
|
break;
|
||||||
|
case 'relations':
|
||||||
|
$controller = new RelationTypeController();
|
||||||
|
break;
|
||||||
|
case 'follows':
|
||||||
|
$controller = new FollowsController();
|
||||||
|
break;
|
||||||
|
case 'index':
|
||||||
|
$controller = new IndexController();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new NotFoundHttpException("Invalid endpoint");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$response = $controller->handleRequest(array_slice($path, 1));
|
||||||
|
} catch (HttpException $e) {
|
||||||
|
$response->setCode($e->getCode());
|
||||||
|
$response->setMessage($e->getMessage());
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
$response->setCode(500);
|
||||||
|
$response->setMessage(DEBUG ? $e->getMessage() : "Internal server error");
|
||||||
|
} finally {
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
http_response_code($response->getCode());
|
||||||
|
echo json_encode($response->normalize());
|
||||||
|
}
|
BIN
apple-touch-icon-120x120-precomposed.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
apple-touch-icon-120x120.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
apple-touch-icon-152x152-precomposed.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
apple-touch-icon-152x152.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
apple-touch-icon-76x76-precomposed.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
apple-touch-icon-76x76.png
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
apple-touch-icon.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
9
bootstrap.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once (__DIR__ . "/config.req.php");
|
||||||
|
|
||||||
|
if (!defined('ABS_DATA_BASEPATH')) {
|
||||||
|
define('ABS_DATA_BASEPATH', ABSPATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once ABSPATH . '/vendor/autoload.php';
|
255
bootstrap/css/awesome-bootstrap-checkbox.css
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
.abc-checkbox {
|
||||||
|
cursor: default;
|
||||||
|
padding-left: 4px; }
|
||||||
|
.abc-checkbox label {
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline;
|
||||||
|
vertical-align: top;
|
||||||
|
position: relative;
|
||||||
|
padding-left: 5px; }
|
||||||
|
.abc-checkbox label::before {
|
||||||
|
cursor: pointer;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
width: 17px;
|
||||||
|
height: 17px;
|
||||||
|
top: 2px;
|
||||||
|
left: 0;
|
||||||
|
margin-left: -1.25rem;
|
||||||
|
border: 1px solid #ced4da;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #fff;
|
||||||
|
transition: border 0.15s ease-in-out, color 0.15s ease-in-out; }
|
||||||
|
.abc-checkbox label::after {
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
left: 0;
|
||||||
|
top: 2px;
|
||||||
|
margin-left: -1.25rem;
|
||||||
|
padding-left: 3px;
|
||||||
|
padding-top: 1px;
|
||||||
|
font-size: 11px;
|
||||||
|
color: #495057; }
|
||||||
|
.abc-checkbox input[type="checkbox"],
|
||||||
|
.abc-checkbox input[type="radio"] {
|
||||||
|
position: static;
|
||||||
|
margin-left: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: 0;
|
||||||
|
z-index: 1; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:focus + label::before,
|
||||||
|
.abc-checkbox input[type="radio"]:focus + label::before {
|
||||||
|
outline: thin dotted;
|
||||||
|
outline: 5px auto -webkit-focus-ring-color;
|
||||||
|
outline-offset: -2px; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox input[type="radio"]:checked + label::after {
|
||||||
|
font-family: "FontAwesome";
|
||||||
|
content: ""; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox input[type="radio"]:indeterminate + label::after {
|
||||||
|
display: block;
|
||||||
|
content: "";
|
||||||
|
width: 10px;
|
||||||
|
height: 3px;
|
||||||
|
background-color: #555555;
|
||||||
|
border-radius: 2px;
|
||||||
|
margin-left: -16.5px;
|
||||||
|
margin-top: 7px; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:disabled + label,
|
||||||
|
.abc-checkbox input[type="radio"]:disabled + label {
|
||||||
|
opacity: 0.65; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:disabled + label::before,
|
||||||
|
.abc-checkbox input[type="radio"]:disabled + label::before {
|
||||||
|
background-color: #e9ecef;
|
||||||
|
cursor: not-allowed; }
|
||||||
|
.abc-checkbox input[type="checkbox"]:disabled + label::after,
|
||||||
|
.abc-checkbox input[type="radio"]:disabled + label::after {
|
||||||
|
cursor: not-allowed; }
|
||||||
|
.abc-checkbox.abc-checkbox-circle label::before {
|
||||||
|
border-radius: 50%; }
|
||||||
|
.abc-checkbox.checkbox-inline {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
.abc-checkbox-primary input[type="checkbox"]:checked + label::before,
|
||||||
|
.abc-checkbox-primary input[type="radio"]:checked + label::before {
|
||||||
|
background-color: #007bff;
|
||||||
|
border-color: #007bff; }
|
||||||
|
.abc-checkbox-primary input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox-primary input[type="radio"]:checked + label::after {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-danger input[type="checkbox"]:checked + label::before,
|
||||||
|
.abc-checkbox-danger input[type="radio"]:checked + label::before {
|
||||||
|
background-color: #dc3545;
|
||||||
|
border-color: #dc3545; }
|
||||||
|
.abc-checkbox-danger input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox-danger input[type="radio"]:checked + label::after {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-info input[type="checkbox"]:checked + label::before,
|
||||||
|
.abc-checkbox-info input[type="radio"]:checked + label::before {
|
||||||
|
background-color: #17a2b8;
|
||||||
|
border-color: #17a2b8; }
|
||||||
|
.abc-checkbox-info input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox-info input[type="radio"]:checked + label::after {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-warning input[type="checkbox"]:checked + label::before,
|
||||||
|
.abc-checkbox-warning input[type="radio"]:checked + label::before {
|
||||||
|
background-color: #ffc107;
|
||||||
|
border-color: #ffc107; }
|
||||||
|
.abc-checkbox-warning input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox-warning input[type="radio"]:checked + label::after {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-success input[type="checkbox"]:checked + label::before,
|
||||||
|
.abc-checkbox-success input[type="radio"]:checked + label::before {
|
||||||
|
background-color: #28a745;
|
||||||
|
border-color: #28a745; }
|
||||||
|
.abc-checkbox-success input[type="checkbox"]:checked + label::after,
|
||||||
|
.abc-checkbox-success input[type="radio"]:checked + label::after {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-primary input[type="checkbox"]:indeterminate + label::before,
|
||||||
|
.abc-checkbox-primary input[type="radio"]:indeterminate + label::before {
|
||||||
|
background-color: #007bff;
|
||||||
|
border-color: #007bff; }
|
||||||
|
.abc-checkbox-primary input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox-primary input[type="radio"]:indeterminate + label::after {
|
||||||
|
background-color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-danger input[type="checkbox"]:indeterminate + label::before,
|
||||||
|
.abc-checkbox-danger input[type="radio"]:indeterminate + label::before {
|
||||||
|
background-color: #dc3545;
|
||||||
|
border-color: #dc3545; }
|
||||||
|
.abc-checkbox-danger input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox-danger input[type="radio"]:indeterminate + label::after {
|
||||||
|
background-color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-info input[type="checkbox"]:indeterminate + label::before,
|
||||||
|
.abc-checkbox-info input[type="radio"]:indeterminate + label::before {
|
||||||
|
background-color: #17a2b8;
|
||||||
|
border-color: #17a2b8; }
|
||||||
|
.abc-checkbox-info input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox-info input[type="radio"]:indeterminate + label::after {
|
||||||
|
background-color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-warning input[type="checkbox"]:indeterminate + label::before,
|
||||||
|
.abc-checkbox-warning input[type="radio"]:indeterminate + label::before {
|
||||||
|
background-color: #ffc107;
|
||||||
|
border-color: #ffc107; }
|
||||||
|
.abc-checkbox-warning input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox-warning input[type="radio"]:indeterminate + label::after {
|
||||||
|
background-color: #fff; }
|
||||||
|
|
||||||
|
.abc-checkbox-success input[type="checkbox"]:indeterminate + label::before,
|
||||||
|
.abc-checkbox-success input[type="radio"]:indeterminate + label::before {
|
||||||
|
background-color: #28a745;
|
||||||
|
border-color: #28a745; }
|
||||||
|
.abc-checkbox-success input[type="checkbox"]:indeterminate + label::after,
|
||||||
|
.abc-checkbox-success input[type="radio"]:indeterminate + label::after {
|
||||||
|
background-color: #fff; }
|
||||||
|
|
||||||
|
.abc-radio {
|
||||||
|
cursor: default;
|
||||||
|
padding-left: 4px; }
|
||||||
|
.abc-radio label {
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline;
|
||||||
|
vertical-align: top;
|
||||||
|
position: relative;
|
||||||
|
padding-left: 5px; }
|
||||||
|
.abc-radio label::before {
|
||||||
|
cursor: pointer;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
width: 17px;
|
||||||
|
height: 17px;
|
||||||
|
top: 2px;
|
||||||
|
left: 0;
|
||||||
|
margin-left: -20px;
|
||||||
|
border: 1px solid #ced4da;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: #fff;
|
||||||
|
transition: border 0.15s ease-in-out; }
|
||||||
|
.abc-radio label::after {
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
content: " ";
|
||||||
|
width: 11px;
|
||||||
|
height: 11px;
|
||||||
|
left: 3px;
|
||||||
|
top: 5px;
|
||||||
|
margin-left: -20px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: #495057;
|
||||||
|
transform: scale(0, 0);
|
||||||
|
transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); }
|
||||||
|
.abc-radio input[type="radio"] {
|
||||||
|
position: static;
|
||||||
|
margin-left: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
opacity: 0;
|
||||||
|
z-index: 1; }
|
||||||
|
.abc-radio input[type="radio"]:focus + label::before {
|
||||||
|
outline: thin dotted;
|
||||||
|
outline: 5px auto -webkit-focus-ring-color;
|
||||||
|
outline-offset: -2px; }
|
||||||
|
.abc-radio input[type="radio"]:checked + label::after {
|
||||||
|
transform: scale(1, 1); }
|
||||||
|
.abc-radio input[type="radio"]:disabled + label {
|
||||||
|
opacity: 0.65; }
|
||||||
|
.abc-radio input[type="radio"]:disabled + label::before {
|
||||||
|
cursor: not-allowed; }
|
||||||
|
.abc-radio input[type="radio"]:disabled + label::after {
|
||||||
|
cursor: not-allowed; }
|
||||||
|
.abc-radio.radio-inline {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
.abc-radio-primary input[type="radio"] + label::after {
|
||||||
|
background-color: #007bff; }
|
||||||
|
.abc-radio-primary input[type="radio"]:checked + label::before {
|
||||||
|
border-color: #007bff; }
|
||||||
|
.abc-radio-primary input[type="radio"]:checked + label::after {
|
||||||
|
background-color: #007bff; }
|
||||||
|
|
||||||
|
.abc-radio-danger input[type="radio"] + label::after {
|
||||||
|
background-color: #dc3545; }
|
||||||
|
.abc-radio-danger input[type="radio"]:checked + label::before {
|
||||||
|
border-color: #dc3545; }
|
||||||
|
.abc-radio-danger input[type="radio"]:checked + label::after {
|
||||||
|
background-color: #dc3545; }
|
||||||
|
|
||||||
|
.abc-radio-info input[type="radio"] + label::after {
|
||||||
|
background-color: #17a2b8; }
|
||||||
|
.abc-radio-info input[type="radio"]:checked + label::before {
|
||||||
|
border-color: #17a2b8; }
|
||||||
|
.abc-radio-info input[type="radio"]:checked + label::after {
|
||||||
|
background-color: #17a2b8; }
|
||||||
|
|
||||||
|
.abc-radio-warning input[type="radio"] + label::after {
|
||||||
|
background-color: #ffc107; }
|
||||||
|
.abc-radio-warning input[type="radio"]:checked + label::before {
|
||||||
|
border-color: #ffc107; }
|
||||||
|
.abc-radio-warning input[type="radio"]:checked + label::after {
|
||||||
|
background-color: #ffc107; }
|
||||||
|
|
||||||
|
.abc-radio-success input[type="radio"] + label::after {
|
||||||
|
background-color: #28a745; }
|
||||||
|
.abc-radio-success input[type="radio"]:checked + label::before {
|
||||||
|
border-color: #28a745; }
|
||||||
|
.abc-radio-success input[type="radio"]:checked + label::after {
|
||||||
|
background-color: #28a745; }
|
||||||
|
|
||||||
|
label .was-validated .form-check-input:invalid .abc-checkbox:before, label
|
||||||
|
.was-validated .form-check-input:invalid .abc-radio:before, label .form-check-input.is-invalid .abc-checkbox:before, label
|
||||||
|
.form-check-input.is-invalid .abc-radio:before {
|
||||||
|
border-color: #dc3545; }
|
1912
bootstrap/css/bootstrap-grid.css
vendored
Normal file
1
bootstrap/css/bootstrap-grid.css.map
Normal file
7
bootstrap/css/bootstrap-grid.min.css
vendored
Normal file
1
bootstrap/css/bootstrap-grid.min.css.map
Normal file
330
bootstrap/css/bootstrap-reboot.css
vendored
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
/*!
|
||||||
|
* Bootstrap Reboot v4.1.1 (https://getbootstrap.com/)
|
||||||
|
* Copyright 2011-2018 The Bootstrap Authors
|
||||||
|
* Copyright 2011-2018 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
||||||
|
*/
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-family: sans-serif;
|
||||||
|
line-height: 1.15;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
-ms-overflow-style: scrollbar;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-ms-viewport {
|
||||||
|
width: device-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #212529;
|
||||||
|
text-align: left;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
[tabindex="-1"]:focus {
|
||||||
|
outline: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr[title],
|
||||||
|
abbr[data-original-title] {
|
||||||
|
text-decoration: underline;
|
||||||
|
-webkit-text-decoration: underline dotted;
|
||||||
|
text-decoration: underline dotted;
|
||||||
|
cursor: help;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
address {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
font-style: normal;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol,
|
||||||
|
ul,
|
||||||
|
dl {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol ol,
|
||||||
|
ul ul,
|
||||||
|
ol ul,
|
||||||
|
ul ol {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
margin: 0 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
position: relative;
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #007bff;
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: transparent;
|
||||||
|
-webkit-text-decoration-skip: objects;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: #0056b3;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:not([href]):not([tabindex]) {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:not([href]):not([tabindex]):focus {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre,
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
samp {
|
||||||
|
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
overflow: auto;
|
||||||
|
-ms-overflow-style: scrollbar;
|
||||||
|
}
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 0 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
vertical-align: middle;
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption {
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.75rem;
|
||||||
|
color: #6c757d;
|
||||||
|
text-align: left;
|
||||||
|
caption-side: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
text-align: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:focus {
|
||||||
|
outline: 1px dotted;
|
||||||
|
outline: 5px auto -webkit-focus-ring-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
select,
|
||||||
|
optgroup,
|
||||||
|
textarea {
|
||||||
|
margin: 0;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
input {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
html [type="button"],
|
||||||
|
[type="reset"],
|
||||||
|
[type="submit"] {
|
||||||
|
-webkit-appearance: button;
|
||||||
|
}
|
||||||
|
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
[type="button"]::-moz-focus-inner,
|
||||||
|
[type="reset"]::-moz-focus-inner,
|
||||||
|
[type="submit"]::-moz-focus-inner {
|
||||||
|
padding: 0;
|
||||||
|
border-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="radio"],
|
||||||
|
input[type="checkbox"] {
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="date"],
|
||||||
|
input[type="time"],
|
||||||
|
input[type="datetime-local"],
|
||||||
|
input[type="month"] {
|
||||||
|
-webkit-appearance: listbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto;
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
min-width: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
legend {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
line-height: inherit;
|
||||||
|
color: inherit;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
progress {
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type="number"]::-webkit-inner-spin-button,
|
||||||
|
[type="number"]::-webkit-outer-spin-button {
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type="search"] {
|
||||||
|
outline-offset: -2px;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[type="search"]::-webkit-search-cancel-button,
|
||||||
|
[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-file-upload-button {
|
||||||
|
font: inherit;
|
||||||
|
-webkit-appearance: button;
|
||||||
|
}
|
||||||
|
|
||||||
|
output {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
summary {
|
||||||
|
display: list-item;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
1
bootstrap/css/bootstrap-reboot.css.map
Normal file
8
bootstrap/css/bootstrap-reboot.min.css
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/*!
|
||||||
|
* Bootstrap Reboot v4.1.1 (https://getbootstrap.com/)
|
||||||
|
* Copyright 2011-2018 The Bootstrap Authors
|
||||||
|
* Copyright 2011-2018 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
||||||
|
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
|
||||||
|
/*# sourceMappingURL=bootstrap-reboot.min.css.map */
|
1
bootstrap/css/bootstrap-reboot.min.css.map
Normal file
392
bootstrap/css/bootstrap-select.css
vendored
Normal file
@ -0,0 +1,392 @@
|
|||||||
|
/*!
|
||||||
|
* Bootstrap-select v1.13.0 (https://developer.snapappointments.com/bootstrap-select)
|
||||||
|
*
|
||||||
|
* Copyright 2012-2018 SnapAppointments, LLC
|
||||||
|
* Licensed under MIT (https://github.com/snapappointments/bootstrap-select/blob/master/LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
select.bs-select-hidden,
|
||||||
|
.bootstrap-select > select.bs-select-hidden,
|
||||||
|
select.selectpicker {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.bootstrap-select {
|
||||||
|
width: 220px \0;
|
||||||
|
/*IE9 and below*/
|
||||||
|
}
|
||||||
|
.bootstrap-select > .dropdown-toggle {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder:active {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:hover,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:focus,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-primary:active,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-secondary:active,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-success:active,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-danger:active,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-info:active,
|
||||||
|
.bootstrap-select > .dropdown-toggle.bs-placeholder.btn-dark:active {
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
.bootstrap-select > select {
|
||||||
|
position: absolute !important;
|
||||||
|
bottom: 0;
|
||||||
|
left: 50%;
|
||||||
|
display: block !important;
|
||||||
|
width: 0.5px !important;
|
||||||
|
height: 100% !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
opacity: 0 !important;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select > select.mobile-device {
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
display: block !important;
|
||||||
|
width: 100% !important;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
.has-error .bootstrap-select .dropdown-toggle,
|
||||||
|
.error .bootstrap-select .dropdown-toggle,
|
||||||
|
.bootstrap-select.is-invalid .dropdown-toggle,
|
||||||
|
.was-validated .bootstrap-select .selectpicker:invalid + .dropdown-toggle {
|
||||||
|
border-color: #b94a48;
|
||||||
|
}
|
||||||
|
.bootstrap-select.is-valid .dropdown-toggle,
|
||||||
|
.was-validated .bootstrap-select .selectpicker:valid + .dropdown-toggle {
|
||||||
|
border-color: #28a745;
|
||||||
|
}
|
||||||
|
.bootstrap-select.fit-width {
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
|
.bootstrap-select:not([class*="col-"]):not([class*="form-control"]):not(.input-group-btn) {
|
||||||
|
width: 220px;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle:focus {
|
||||||
|
outline: thin dotted #333333 !important;
|
||||||
|
outline: 5px auto -webkit-focus-ring-color !important;
|
||||||
|
outline-offset: -2px;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control {
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
:not(.input-group) > .bootstrap-select.form-control:not([class*="col-"]) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control.input-group-btn {
|
||||||
|
z-index: auto;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child) > .btn {
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-select:not(.input-group-btn),
|
||||||
|
.bootstrap-select[class*="col-"] {
|
||||||
|
float: none;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-select.dropdown-menu-right,
|
||||||
|
.bootstrap-select[class*="col-"].dropdown-menu-right,
|
||||||
|
.row .bootstrap-select[class*="col-"].dropdown-menu-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.form-inline .bootstrap-select,
|
||||||
|
.form-horizontal .bootstrap-select,
|
||||||
|
.form-group .bootstrap-select {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.form-group-lg .bootstrap-select.form-control,
|
||||||
|
.form-group-sm .bootstrap-select.form-control {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.form-group-lg .bootstrap-select.form-control .dropdown-toggle,
|
||||||
|
.form-group-sm .bootstrap-select.form-control .dropdown-toggle {
|
||||||
|
height: 100%;
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
border-radius: inherit;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control-sm .dropdown-toggle,
|
||||||
|
.bootstrap-select.form-control-lg .dropdown-toggle {
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
border-radius: inherit;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control-sm .dropdown-toggle {
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
.bootstrap-select.form-control-lg .dropdown-toggle {
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
}
|
||||||
|
.form-inline .bootstrap-select .form-control {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bootstrap-select.disabled,
|
||||||
|
.bootstrap-select > .disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.bootstrap-select.disabled:focus,
|
||||||
|
.bootstrap-select > .disabled:focus {
|
||||||
|
outline: none !important;
|
||||||
|
}
|
||||||
|
.bootstrap-select.bs-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
height: 0 !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
.bootstrap-select.bs-container .dropdown-menu {
|
||||||
|
z-index: 1060;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle:before {
|
||||||
|
content: '';
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle .filter-option {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
padding-top: inherit;
|
||||||
|
padding-right: inherit;
|
||||||
|
padding-bottom: inherit;
|
||||||
|
padding-left: inherit;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle .filter-option-inner {
|
||||||
|
padding-right: inherit;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle .filter-option-inner-inner {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-toggle .caret {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 12px;
|
||||||
|
margin-top: -2px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.input-group .bootstrap-select.form-control .dropdown-toggle {
|
||||||
|
border-radius: inherit;
|
||||||
|
}
|
||||||
|
.bootstrap-select[class*="col-"] .dropdown-toggle {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu {
|
||||||
|
min-width: 100%;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu > .inner:focus {
|
||||||
|
outline: none !important;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu.inner {
|
||||||
|
position: static;
|
||||||
|
float: none;
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li.active small {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li.disabled a {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li a {
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li a.opt {
|
||||||
|
position: relative;
|
||||||
|
padding-left: 2.25em;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li a span.check-mark {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li a span.text {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu li small {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
.bootstrap-select .dropdown-menu .notify {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 5px;
|
||||||
|
width: 96%;
|
||||||
|
margin: 0 2%;
|
||||||
|
min-height: 26px;
|
||||||
|
padding: 3px 5px;
|
||||||
|
background: #f5f5f5;
|
||||||
|
border: 1px solid #e3e3e3;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.9;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.bootstrap-select .no-results {
|
||||||
|
padding: 3px;
|
||||||
|
background: #f5f5f5;
|
||||||
|
margin: 0 5px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.bootstrap-select.fit-width .dropdown-toggle .filter-option {
|
||||||
|
position: static;
|
||||||
|
display: inline;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner,
|
||||||
|
.bootstrap-select.fit-width .dropdown-toggle .filter-option-inner-inner {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.bootstrap-select.fit-width .dropdown-toggle .caret {
|
||||||
|
position: static;
|
||||||
|
top: auto;
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-tick .dropdown-menu .selected span.check-mark {
|
||||||
|
position: absolute;
|
||||||
|
display: inline-block;
|
||||||
|
right: 15px;
|
||||||
|
top: 5px;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-tick .dropdown-menu li a span.text {
|
||||||
|
margin-right: 34px;
|
||||||
|
}
|
||||||
|
.bootstrap-select .bs-ok-default:after {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
width: 0.5em;
|
||||||
|
height: 1em;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 0.26em 0.26em 0;
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
-ms-transform: rotate(45deg);
|
||||||
|
-o-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle,
|
||||||
|
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle {
|
||||||
|
z-index: 1061;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:before {
|
||||||
|
content: '';
|
||||||
|
border-left: 7px solid transparent;
|
||||||
|
border-right: 7px solid transparent;
|
||||||
|
border-bottom: 7px solid rgba(204, 204, 204, 0.2);
|
||||||
|
position: absolute;
|
||||||
|
bottom: -4px;
|
||||||
|
left: 9px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after {
|
||||||
|
content: '';
|
||||||
|
border-left: 6px solid transparent;
|
||||||
|
border-right: 6px solid transparent;
|
||||||
|
border-bottom: 6px solid white;
|
||||||
|
position: absolute;
|
||||||
|
bottom: -4px;
|
||||||
|
left: 10px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:before {
|
||||||
|
bottom: auto;
|
||||||
|
top: -4px;
|
||||||
|
border-top: 7px solid rgba(204, 204, 204, 0.2);
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle .filter-option:after {
|
||||||
|
bottom: auto;
|
||||||
|
top: -4px;
|
||||||
|
border-top: 6px solid white;
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:before {
|
||||||
|
right: 12px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle .filter-option:after {
|
||||||
|
right: 13px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:before,
|
||||||
|
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:before,
|
||||||
|
.bootstrap-select.show-menu-arrow.open > .dropdown-toggle .filter-option:after,
|
||||||
|
.bootstrap-select.show-menu-arrow.show > .dropdown-toggle .filter-option:after {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.bs-searchbox,
|
||||||
|
.bs-actionsbox,
|
||||||
|
.bs-donebutton {
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
.bs-actionsbox {
|
||||||
|
width: 100%;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.bs-actionsbox .btn-group button {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.bs-donebutton {
|
||||||
|
float: left;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
-moz-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.bs-donebutton .btn-group button {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bs-searchbox + .bs-actionsbox {
|
||||||
|
padding: 0 8px 4px;
|
||||||
|
}
|
||||||
|
.bs-searchbox .form-control {
|
||||||
|
margin-bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=bootstrap-select.css.map */
|
1
bootstrap/css/bootstrap-select.css.map
Normal file
6
bootstrap/css/bootstrap-select.min.css
vendored
Normal file
8988
bootstrap/css/bootstrap.css
vendored
Normal file
1
bootstrap/css/bootstrap.css.map
Normal file
7
bootstrap/css/bootstrap.min.css
vendored
Normal file
1
bootstrap/css/bootstrap.min.css.map
Normal file
BIN
bootstrap/fonts/Ubuntu-B.ttf
Normal file
BIN
bootstrap/fonts/Ubuntu-L.ttf
Normal file
BIN
bootstrap/fonts/Ubuntu-M.ttf
Normal file
BIN
bootstrap/fonts/Ubuntu-R.ttf
Normal file
BIN
bootstrap/fonts/glyphicons-halflings-regular.eot
Normal file
288
bootstrap/fonts/glyphicons-halflings-regular.svg
Normal file
@ -0,0 +1,288 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata></metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||||
|
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||||
|
<missing-glyph horiz-adv-x="500" />
|
||||||
|
<glyph horiz-adv-x="0" />
|
||||||
|
<glyph horiz-adv-x="400" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
|
||||||
|
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="¥" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="650" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1300" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="433" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="216" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="162" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="72" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="325" />
|
||||||
|
<glyph unicode="€" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
|
||||||
|
<glyph unicode="₽" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
|
||||||
|
<glyph unicode="−" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="⌛" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
|
||||||
|
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||||
|
<glyph unicode="☁" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
|
||||||
|
<glyph unicode="⛺" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
|
||||||
|
<glyph unicode="✉" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
|
||||||
|
<glyph unicode="✏" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
|
||||||
|
<glyph unicode="" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
|
||||||
|
<glyph unicode="" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
|
||||||
|
<glyph unicode="" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
|
||||||
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
|
||||||
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
|
||||||
|
<glyph unicode="" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
|
||||||
|
<glyph unicode="" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
|
||||||
|
<glyph unicode="" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
|
||||||
|
<glyph unicode="" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
|
||||||
|
<glyph unicode="" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
|
||||||
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
|
||||||
|
<glyph unicode="" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
|
||||||
|
<glyph unicode="" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
|
||||||
|
<glyph unicode="" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
|
<glyph unicode="" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
|
||||||
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
|
||||||
|
<glyph unicode="" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
|
||||||
|
<glyph unicode="" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
|
||||||
|
<glyph unicode="" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
|
||||||
|
<glyph unicode="" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
|
||||||
|
<glyph unicode="" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
|
||||||
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
|
||||||
|
<glyph unicode="" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
|
||||||
|
<glyph unicode="" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
|
||||||
|
<glyph unicode="" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
|
||||||
|
<glyph unicode="" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
|
||||||
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
|
<glyph unicode="" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
|
||||||
|
<glyph unicode="" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
|
||||||
|
<glyph unicode="" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
|
||||||
|
<glyph unicode="" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
|
||||||
|
<glyph unicode="" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
|
||||||
|
<glyph unicode="" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
|
||||||
|
<glyph unicode="" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
|
||||||
|
<glyph unicode="" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
|
||||||
|
<glyph unicode="" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
|
||||||
|
<glyph unicode="" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
|
||||||
|
<glyph unicode="" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
|
||||||
|
<glyph unicode="" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
|
||||||
|
<glyph unicode="" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
|
||||||
|
<glyph unicode="" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
|
||||||
|
<glyph unicode="" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
|
||||||
|
<glyph unicode="" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
|
||||||
|
<glyph unicode="" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
|
||||||
|
<glyph unicode="" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
|
||||||
|
<glyph unicode="" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
|
<glyph unicode="" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
|
||||||
|
<glyph unicode="" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
|
||||||
|
<glyph unicode="" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
|
||||||
|
<glyph unicode="" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
|
||||||
|
<glyph unicode="" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
|
||||||
|
<glyph unicode="" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
|
||||||
|
<glyph unicode="" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
|
||||||
|
<glyph unicode="" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
|
||||||
|
<glyph unicode="" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
|
||||||
|
<glyph unicode="" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
|
||||||
|
<glyph unicode="" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
|
<glyph unicode="" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
|
||||||
|
<glyph unicode="" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
|
||||||
|
<glyph unicode="" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
|
||||||
|
<glyph unicode="" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
|
||||||
|
<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
|
||||||
|
<glyph unicode="" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
|
||||||
|
<glyph unicode="" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
|
||||||
|
<glyph unicode="" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
|
||||||
|
<glyph unicode="" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
|
||||||
|
<glyph unicode="" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
|
||||||
|
<glyph unicode="" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
|
||||||
|
<glyph unicode="" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
|
||||||
|
<glyph unicode="" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
|
||||||
|
<glyph unicode="" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
|
||||||
|
<glyph unicode="" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
|
||||||
|
<glyph unicode="" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
|
||||||
|
<glyph unicode="" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
|
||||||
|
<glyph unicode="" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
|
||||||
|
<glyph unicode="" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
|
||||||
|
<glyph unicode="" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
|
||||||
|
<glyph unicode="" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
|
||||||
|
<glyph unicode="" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
|
||||||
|
<glyph unicode="" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
|
||||||
|
<glyph unicode="" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
|
||||||
|
<glyph unicode="" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
|
||||||
|
<glyph unicode="" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
|
||||||
|
<glyph unicode="" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
|
||||||
|
<glyph unicode="" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
|
||||||
|
<glyph unicode="" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
|
||||||
|
<glyph unicode="" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
|
||||||
|
<glyph unicode="" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
|
<glyph unicode="" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
|
||||||
|
<glyph unicode="" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
|
||||||
|
<glyph unicode="" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
|
||||||
|
<glyph unicode="" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
|
||||||
|
<glyph unicode="" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
|
||||||
|
<glyph unicode="" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
|
||||||
|
<glyph unicode="" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
|
||||||
|
<glyph unicode="" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
|
||||||
|
<glyph unicode="" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
|
||||||
|
<glyph unicode="" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
|
||||||
|
<glyph unicode="" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
|
||||||
|
<glyph unicode="" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
|
||||||
|
<glyph unicode="" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
|
||||||
|
<glyph unicode="" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
|
||||||
|
<glyph unicode="" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
|
||||||
|
<glyph unicode="" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
|
||||||
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
|
||||||
|
<glyph unicode="" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
|
||||||
|
<glyph unicode="" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
|
||||||
|
<glyph unicode="" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
|
||||||
|
<glyph unicode="" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
|
||||||
|
<glyph unicode="" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
|
||||||
|
<glyph unicode="" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
|
||||||
|
<glyph unicode="" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
|
||||||
|
<glyph unicode="" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
|
||||||
|
<glyph unicode="" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
|
||||||
|
<glyph unicode="" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
|
||||||
|
<glyph unicode="" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
|
||||||
|
<glyph unicode="" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
|
||||||
|
<glyph unicode="" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
|
||||||
|
<glyph unicode="" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
|
||||||
|
<glyph unicode="" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
|
||||||
|
<glyph unicode="" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
|
||||||
|
<glyph unicode="" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
|
||||||
|
<glyph unicode="" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
|
||||||
|
<glyph unicode="" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
|
||||||
|
<glyph unicode="" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
|
||||||
|
<glyph unicode="" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
|
||||||
|
<glyph unicode="" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
|
||||||
|
<glyph unicode="" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
|
||||||
|
<glyph unicode="" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
|
||||||
|
<glyph unicode="" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
|
||||||
|
<glyph unicode="" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
|
||||||
|
<glyph unicode="" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
|
||||||
|
<glyph unicode="" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
|
||||||
|
<glyph unicode="" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
|
||||||
|
<glyph unicode="" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
|
||||||
|
<glyph unicode="" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
|
||||||
|
<glyph unicode="" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
|
||||||
|
<glyph unicode="" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
|
||||||
|
<glyph unicode="" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
|
||||||
|
<glyph unicode="" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
|
||||||
|
<glyph unicode="" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
|
||||||
|
<glyph unicode="" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
|
||||||
|
<glyph unicode="" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
|
||||||
|
<glyph unicode="" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
|
||||||
|
<glyph unicode="" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
|
||||||
|
<glyph unicode="" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
|
||||||
|
<glyph unicode="🔑" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
|
||||||
|
<glyph unicode="🚪" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
After Width: | Height: | Size: 106 KiB |
BIN
bootstrap/fonts/glyphicons-halflings-regular.ttf
Normal file
BIN
bootstrap/fonts/glyphicons-halflings-regular.woff
Normal file
BIN
bootstrap/fonts/glyphicons-halflings-regular.woff2
Normal file
3230
bootstrap/js/bootstrap-select.bundle.js
vendored
Normal file
1
bootstrap/js/bootstrap-select.bundle.js.map
Normal file
4
bootstrap/js/bootstrap-select.bundle.min.js
vendored
Normal file
2649
bootstrap/js/bootstrap-select.js
vendored
Normal file
1
bootstrap/js/bootstrap-select.js.map
Normal file
9
bootstrap/js/bootstrap-select.min.js
vendored
Normal file
6444
bootstrap/js/bootstrap.bundle.js
vendored
Normal file
1
bootstrap/js/bootstrap.bundle.js.map
Normal file
7
bootstrap/js/bootstrap.bundle.min.js
vendored
Normal file
1
bootstrap/js/bootstrap.bundle.min.js.map
Normal file
3927
bootstrap/js/bootstrap.js
vendored
Normal file
1
bootstrap/js/bootstrap.js.map
Normal file
7
bootstrap/js/bootstrap.min.js
vendored
Normal file
1
bootstrap/js/bootstrap.min.js.map
Normal file
5
bootstrap/js/popper.min.js
vendored
Normal file
51
check_orphaned_chapters.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (PHP_SAPI !== 'cli') {
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once(__DIR__ . '/bootstrap.php');
|
||||||
|
require_once(__DIR__ . '/scripts/header.req.php');
|
||||||
|
|
||||||
|
$dirPath = $argv[1] ?? '';
|
||||||
|
|
||||||
|
if (!is_dir($dirPath)) {
|
||||||
|
die("Dir doesnt exist\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkChapterHashes(array $hashes): array
|
||||||
|
{
|
||||||
|
global $sql;
|
||||||
|
$replace = \implode(',', \array_fill(0, count($hashes), '?'));
|
||||||
|
|
||||||
|
$dbHashes = $sql->prep('', 'SELECT chapter_hash FROM mangadex_chapters WHERE chapter_hash IN ('.$replace.')', $hashes, 'fetchAll', PDO::FETCH_COLUMN, -1);
|
||||||
|
|
||||||
|
return \array_diff($hashes, $dbHashes);
|
||||||
|
}
|
||||||
|
|
||||||
|
$handle = opendir($dirPath);
|
||||||
|
$dirChunk = [];
|
||||||
|
while (false !== ($entry = readdir($handle))) {
|
||||||
|
if ($entry{0} === '.') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dirChunk[] = $entry;
|
||||||
|
|
||||||
|
if (count($dirChunk) >= 100) {
|
||||||
|
$orphanedHashes = checkChapterHashes($dirChunk);
|
||||||
|
$dirChunk = [];
|
||||||
|
|
||||||
|
foreach ($orphanedHashes AS $hash) {
|
||||||
|
echo "$hash\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (count($dirChunk) > 0) {
|
||||||
|
$orphanedHashes = checkChapterHashes($dirChunk);
|
||||||
|
$dirChunk = [];
|
||||||
|
|
||||||
|
foreach ($orphanedHashes AS $hash) {
|
||||||
|
echo "$hash\n";
|
||||||
|
}
|
||||||
|
}
|
24
composer.json
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "hologfx/mangadex",
|
||||||
|
"type": "project",
|
||||||
|
"license": "proprietary",
|
||||||
|
"require": {
|
||||||
|
"symfony/var-dumper": "^4.1",
|
||||||
|
"maximebf/debugbar": "^1.15",
|
||||||
|
"enygma/gauth": "^0.4.0",
|
||||||
|
"sentry/sentry": "^1.10",
|
||||||
|
"symfony/event-dispatcher": "^4.1",
|
||||||
|
"symfony/http-foundation": "^4.1",
|
||||||
|
"symfony/http-kernel": "^4.1",
|
||||||
|
"ramsey/uuid": "^3.8",
|
||||||
|
"whichbrowser/parser": "^2.0",
|
||||||
|
"geoip2/geoip2": "~2.0",
|
||||||
|
"guzzlehttp/guzzle": "^6.5",
|
||||||
|
"google/apiclient": "^2.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Mangadex\\": "src/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2027
composer.lock
generated
Normal file
210
config.req.example.php
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
<?php
|
||||||
|
define('ABSPATH', __DIR__);
|
||||||
|
define('ABS_DATA_BASEPATH', __DIR__);
|
||||||
|
|
||||||
|
define('DEBUG', false);
|
||||||
|
|
||||||
|
define('DB_USER', 'mangadex');
|
||||||
|
define('DB_PASSWORD', '');
|
||||||
|
define('DB_NAME', 'mangadex');
|
||||||
|
define('DB_HOST', 'localhost');
|
||||||
|
|
||||||
|
define('DB_READ_HOSTS', ['127.0.0.1']);
|
||||||
|
define('DB_READ_NAME', DB_NAME);
|
||||||
|
define('DB_READ_USER', DB_USER);
|
||||||
|
define('DB_READ_PASSWORD', '');
|
||||||
|
|
||||||
|
define('DISCORD_WEBHOOK_REPORT', '');
|
||||||
|
define('DISCORD_WEBHOOK_EVENT', '');
|
||||||
|
define('DISCORD_REPORT_PING_COUNT', 10);
|
||||||
|
define('DISCORD_REPORT_PING_ROLE_ID', '676110785633845288');
|
||||||
|
|
||||||
|
define('SENTRY_DSN', false);
|
||||||
|
define('SENTRY_SAMPLE_RATE', 1);
|
||||||
|
define('SENTRY_CURL_METHOD', 'async'); # [sync, async, exec]
|
||||||
|
define('SENTRY_TIMEOUT', 2);
|
||||||
|
|
||||||
|
define('DOMAIN', 'mangadex.org');
|
||||||
|
define('URL', 'https://mangadex.org/');
|
||||||
|
define('TITLE', 'MangaDex');
|
||||||
|
define('DESCRIPTION', 'Read manga online for free at MangaDex with no ads, high quality images and support scanlation groups!');
|
||||||
|
define('MEMCACHED_HOST', '127.0.0.1');
|
||||||
|
|
||||||
|
define('GOOGLE_CAPTCHA_SITEKEY', 'xxx');
|
||||||
|
define('GOOGLE_CAPTCHA_SECRET', 'xxx');
|
||||||
|
|
||||||
|
define('MD_AT_H_BACKEND_SECRET', 'SECRET');
|
||||||
|
define('MD_AT_H_BACKEND_URL', 'http://mangadex-test.net');
|
||||||
|
|
||||||
|
define('SESSION_COOKIE_NAME', 'mangadex_session');
|
||||||
|
define('SESSION_REMEMBERME_COOKIE_NAME', 'mangadex_rememberme_token');
|
||||||
|
define('SESSION_TIMEOUT', 60*60); // one hour
|
||||||
|
define('SESSION_REMEMBERME_TIMEOUT', 60*60*24*365); // one year
|
||||||
|
define('SESSION_COOKIE_DOMAIN', '.'.DOMAIN);
|
||||||
|
define('SESSION_COOKIE_PATH', '/');
|
||||||
|
|
||||||
|
define('ENABLE_UPLOAD', true);
|
||||||
|
define('ENABLE_REGISTRATION', true);
|
||||||
|
define('FADE_DURATION', 3000);
|
||||||
|
define('ENABLE_2FA', true);
|
||||||
|
|
||||||
|
define('CACHE_TIME', 120); //seconds
|
||||||
|
define('CAPTURE_CACHE_STATS', false); // Uses the Cache class decorator for Memcached to capture and expose memcache stats. Should not be used in production!!!
|
||||||
|
|
||||||
|
define('INCLUDE_JS_REDIRECT', true); // displays the javascript snippet, that redirects to mangadex.org if the url is different to prevent site-mirrors
|
||||||
|
define('DISABLE_HITCOUNTER', false); // Disables the flood check
|
||||||
|
|
||||||
|
define('REQUIRE_CAPTCHA', true); // Enables/Disables the captcha check for certain functionalities, like signup
|
||||||
|
define('GOOGLE_SERVICE_ACCOUNT_PATH', '/var/www/google_service_credentials.json'); // Store this OUTSIDE of the webroot!!!
|
||||||
|
|
||||||
|
define('MAX_CHAPTER_FILESIZE', 104857600); //100*1024*1024
|
||||||
|
|
||||||
|
define('DMS_DISPLAY_LIMIT', 25);
|
||||||
|
|
||||||
|
define('REQUIRE_LOGIN_PAGES', ['users', 'follows', 'followed_manga', 'followed_groups', 'follows_import', 'upload', 'settings', 'messages', 'message', 'send_message', 'activation', 'admin', 'mod', 'group_new', 'manga_new', 'stats', 'social']);
|
||||||
|
|
||||||
|
define('USER_RESTRICTION_CHAPTER_UPLOAD', 1);
|
||||||
|
define('USER_RESTRICTION_POST_COMMENT', 2);
|
||||||
|
define('USER_RESTRICTION_CHAPTER_DELETE', 3);
|
||||||
|
define('USER_RESTRICTION_CREATE_REPORT', 4);
|
||||||
|
define('USER_RESTRICTION_CREATE_DM', 5);
|
||||||
|
define('USER_RESTRICTION_CHANGE_BIOGRAPHY', 6);
|
||||||
|
define('USER_RESTRICTION_CHANGE_AVATAR', 7);
|
||||||
|
define('USER_RESTRICTION_EDIT_TITLES', 8);
|
||||||
|
|
||||||
|
define('THEMES', [1 => 'Light', 2 => 'Dark', 3 => 'Light-Bronze', 4 => 'Dark-Bronze', 5 => 'Light-Slate', 6 => 'Dark-Slate', 7 => 'Abyss' ]);
|
||||||
|
define('ORIG_LANG_ARRAY', [2 => 'Japanese', 1 => 'English', 3 => 'Polish', 8 => 'German', 10 => 'French', 12 => 'Vietnamese', 21 => 'Chinese', 27 => 'Indonesian', 28 => 'Korean', 29 => 'Spanish (LATAM)', 32 => 'Thai', 34 => 'Filipino']);
|
||||||
|
define('STATUS_ARRAY', [1 => 'Ongoing', 2 => 'Completed', 3 => 'Cancelled', 4 => 'Hiatus']);
|
||||||
|
define('MANGA_EXT_LINKS', ['mu' => 'MangaUpdates ID', 'mal' => 'MyAnimeList ID', 'nu' => 'NovelUpdates slug', 'raw' => 'Raw URL', 'engtl' => 'Official Eng URL', 'cdj' => 'CDJapan URL', 'amz' => 'Amazon.co.jp URL', 'ebj' => 'eBookJapan URL', 'bw' => 'Bookwalker ID', 'al' => 'AniList ID', 'kt' => 'Kitsu ID', 'ap' => 'Anime-Planet slug', 'dj' => 'Doujinshi.org ID']);
|
||||||
|
define('MANGA_DEMO', ['None', 'Shounen', 'Shoujo', 'Seinen', 'Josei']);
|
||||||
|
define('MANGA_VIEW_MODE_ICONS', ['th-large', 'th-list', 'bars', 'th']);
|
||||||
|
define('REPORT_TYPES', [0 => 'invalid', 1 => 'Manga', 2 => 'Chapter', 3 => 'Comment', 4 => 'Group', 5 => 'User']);
|
||||||
|
|
||||||
|
define('RESTRICTED_MANGA_IDS', [33691, 35013, 37514, 34291, 37070, 29885, 31106, 20104, 43476, 41743, 42731, 37071, 35251, 42244, 39585, 46603, 46790, 46856, 43140, 46858]);
|
||||||
|
define('MINIMUM_CHAPTERS_READ_FOR_RESTRICTED_MANGA', 100);
|
||||||
|
|
||||||
|
define('MINIMUM_CHAPTERS_READ_FOR_SUPPORT', 20);
|
||||||
|
|
||||||
|
define('ALLOWED_CHAPTER_EXT', ['zip', 'cbz']);
|
||||||
|
define('MAX_IMAGE_FILESIZE', 1048576);
|
||||||
|
define('ALLOWED_IMG_EXT', ['jpg', 'jpeg', 'png', 'gif']);
|
||||||
|
define('ALLOWED_MIME_TYPES', ['image/png', 'image/jpeg', 'image/gif']);
|
||||||
|
define('IMAGE_SERVER', 0);
|
||||||
|
define('IMG_SERVER_URL', 'https://s1.mangadex.org');
|
||||||
|
define('LOCAL_SERVER_URL', 'https://cdndex.com/data/');
|
||||||
|
|
||||||
|
//$server_array = ['eu2' => 1, 'na' => 2, 'eu' => 3, 'na2' => 4, 'na3' => 5];
|
||||||
|
define('IMAGE_SERVER_INFO', [
|
||||||
|
// European imageservers s1, s3, s6
|
||||||
|
1 => [
|
||||||
|
'server_code' => 'eu2',
|
||||||
|
'continent_code' => 'eu',
|
||||||
|
'country_code' => 'fr',
|
||||||
|
],
|
||||||
|
3 => [
|
||||||
|
'server_code' => 'eu',
|
||||||
|
'continent_code' => 'eu',
|
||||||
|
'country_code' => 'fr',
|
||||||
|
],
|
||||||
|
6 => [
|
||||||
|
'server_code' => 'eu3',
|
||||||
|
'continent_code' => 'eu',
|
||||||
|
'country_code' => 'de', // hetzner
|
||||||
|
],
|
||||||
|
// Northamerican servers s2, s5
|
||||||
|
2 => [
|
||||||
|
'server_code' => 'na',
|
||||||
|
'continent_code' => 'na',
|
||||||
|
'country_code' => 'us',
|
||||||
|
],
|
||||||
|
5 => [
|
||||||
|
'server_code' => 'na3',
|
||||||
|
'continent_code' => 'na',
|
||||||
|
'country_code' => 'us',
|
||||||
|
],
|
||||||
|
// Third northamerican server, used for "rest of world"
|
||||||
|
4 => [
|
||||||
|
'server_code' => 'na2',
|
||||||
|
'continent_code' => '??',
|
||||||
|
'country_code' => '',
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
define('IMAGE_SERVER_CONTINENT_MAPPING', [
|
||||||
|
'af' => '??', // Africa
|
||||||
|
'an' => '??', // Antarctica
|
||||||
|
'as' => '??', // Asia
|
||||||
|
'eu' => 'eu', // Europe
|
||||||
|
'na' => 'na', // Northamerica
|
||||||
|
'oc' => '??', // Oceania
|
||||||
|
'sa' => 'na', // Southamerica
|
||||||
|
]);
|
||||||
|
|
||||||
|
define('BBCODE', [
|
||||||
|
'bold' => 'b',
|
||||||
|
'italic' => 'i',
|
||||||
|
'underline' => 'u',
|
||||||
|
'strikethrough' => 's',
|
||||||
|
'align-left' => 'left',
|
||||||
|
'align-center' => 'center',
|
||||||
|
'align-right' => 'right',
|
||||||
|
'image' => 'img',
|
||||||
|
'link' => 'url',
|
||||||
|
'superscript' => 'sup',
|
||||||
|
'subscript' => 'sub',
|
||||||
|
'list-ul' => 'ul',
|
||||||
|
'list-ol' => 'ol',
|
||||||
|
'arrows-alt-h' => 'hr',
|
||||||
|
'eye-slash' => 'spoiler',
|
||||||
|
'code' => 'code',
|
||||||
|
'quote-left' => 'quote'
|
||||||
|
]);
|
||||||
|
define('EMOJIS', ['😀', '😁', '😂', '🤣', '😃', '😄', '😅', '😆', '😉', '😊', '😋', '😎', '😍', '😘', '😗', '😙', '😚', '🙂', '🤗']);
|
||||||
|
|
||||||
|
define('DATE_FORMAT', 'Y-m-d');
|
||||||
|
define('DATETIME_FORMAT', 'Y-m-d H:i:s \U\T\C');
|
||||||
|
|
||||||
|
define('RATINGS', [10 => 'Masterpiece', 9 => 'Great', 8 => 'Very good', 7 => 'Good', 6 => 'Fine', 5 => 'Average', 4 => 'Bad', 3 => 'Very bad', 2 => 'Horrible', 1 => 'Appalling']);
|
||||||
|
|
||||||
|
define('SORT_ARRAY_USERS', ['level_id DESC, username ASC', 'username ASC', 'username DESC', 'user_uploads ASC', 'user_uploads DESC', 'user_views ASC', 'user_views DESC', 'level_id ASC', 'level_id DESC', 'level_id DESC, users.user_id ASC']);
|
||||||
|
define('SORT_ARRAY_GROUPS', ['group_follows DESC, group_last_updated DESC', 'group_name ASC', 'group_name DESC', 'group_likes ASC', 'group_likes DESC', 'group_views ASC', 'group_views DESC', 'group_follows ASC', 'group_follows DESC', 'thread_posts ASC', 'thread_posts DESC', 'group_last_updated ASC', 'group_last_updated DESC']);
|
||||||
|
define('SORT_ARRAY_MANGA', ['manga_last_updated DESC', 'manga_last_updated ASC', 'manga_name ASC', 'manga_name DESC', 'thread_posts ASC', 'thread_posts DESC', 'manga_bayesian ASC', 'manga_bayesian DESC', 'manga_views ASC', 'manga_views DESC', 'manga_follows ASC', 'manga_follows DESC']);
|
||||||
|
|
||||||
|
define('TL_USER_IDS', [1001, 8963, 15294, 1179, 6394, 3816, 15102, 1454, 414, 16364, 9268, 2471, 51914]);
|
||||||
|
|
||||||
|
define('SPAM_WORDS', ['vagina', 'v@gina', 'gg.gg', 'merky.de', 'v@g!na', 'b!tch', 'f.u.ck', 's.lu.tt', '@ss']);
|
||||||
|
|
||||||
|
define('AUTO_FORUM_IDS', [11, 12, 14]);
|
||||||
|
define('CATEGORY_FORUM_IDS', [1, 2, 4, 16]);
|
||||||
|
define('THREAD_LABELS', [':planned:' => "</a> <a class='no-underline'><span class='badge badge-success'>Planned</span>",
|
||||||
|
':maybe:' => "</a> <a class='no-underline'><span class='badge badge-warning'>Maybe</span>",
|
||||||
|
':rejected:' => "</a> <a class='no-underline'><span class='badge badge-danger'>Rejected</span>",
|
||||||
|
':implemented:' => "</a> <a class='no-underline'><span class='badge badge-info'>Implemented</span>",
|
||||||
|
':fixed:' => "</a> <a class='no-underline'><span class='badge badge-success'>Fixed</span>",
|
||||||
|
':will fix:' => "</a> <a class='no-underline'><span class='badge badge-warning'>Will fix</span>",
|
||||||
|
':will investigate:' => "</a> <a class='no-underline'><span class='badge badge-info'>Will investigate</span>",
|
||||||
|
':not a bug:' => "</a> <a class='no-underline'><span class='badge badge-danger'>Not a bug</span>"]);
|
||||||
|
|
||||||
|
define('DEFAULT_AVATARS', ['default1.jpg', 'default2.jpg', 'default3.jpg', 'default4.gif', 'default5.gif']);
|
||||||
|
//define('DEFAULT_AVATARS', ['mdex-sumireko.png']);
|
||||||
|
|
||||||
|
define('WALLET_QR', [
|
||||||
|
'BTC' => [
|
||||||
|
'17jpfzcnKrBewKpyFeRW5tVCu9zpuNkPrh',
|
||||||
|
'18WSPrCVbBqE3fcsxmRyX4MHf7huhdkHvG',
|
||||||
|
'1HeKYAHQfxCGxESBHH96UW6nfk3sWGMBUS',
|
||||||
|
'1KcTeDQHDV6crBruJb6bF8WRN4oMSsRj3a',
|
||||||
|
'1KeZFBiKWCitALEQfJWVGbq89Z3Y7epeFE',
|
||||||
|
'1LjyyRo6jLHKR4dzfGRLyp7pb3MJUCTvbj',
|
||||||
|
'1MqNnXqvehvNvtQL41MZx1NpCZp2NDhvHk',
|
||||||
|
'1MxBCG2xks9mfnZKzwUnGKNnjCbh8CtFnE',
|
||||||
|
'1MZ2uJ2YNokSKCDbdocnzoc4sDt58T7RLt',
|
||||||
|
'1PUgG3Z1WMuZd1TZi8QZKowHMu2MZifMG8'
|
||||||
|
],
|
||||||
|
'ETH' => [
|
||||||
|
'0x0BB95fE37dc1458aAc692E0E9b44F9852B2Aa6Ec',
|
||||||
|
'0x0DfF79f78980277963f1Ded0312f03377559de68',
|
||||||
|
'0x47ef42463B582b78eA89d92A1f1302c7091EC944',
|
||||||
|
'0x4b17f6451F1684931E0EF70c6A9aA020E86c37B5',
|
||||||
|
'0xC513BA4E49E57A07c1b1146B81bCb5ce01F9B270'
|
||||||
|
],
|
||||||
|
]);
|
107
cron/hourly.php
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (PHP_SAPI !== 'cli')
|
||||||
|
die();
|
||||||
|
|
||||||
|
require_once (__DIR__.'/../bootstrap.php');
|
||||||
|
|
||||||
|
//require_once (__DIR__."/../config.req.php"); //must be like this
|
||||||
|
|
||||||
|
require_once (ABSPATH . "/scripts/header.req.php");
|
||||||
|
|
||||||
|
// prune remote file upload tmpfiles
|
||||||
|
$dirh = opendir(sys_get_temp_dir());
|
||||||
|
$nameFormat = 'remote_file_dl_';
|
||||||
|
while (false !== ($entry = readdir($dirh))) {
|
||||||
|
if (strpos($entry, $nameFormat) === 0) {
|
||||||
|
$tpath = sys_get_temp_dir().'/'.$entry;
|
||||||
|
$ageInSeconds = time() - filectime($tpath);
|
||||||
|
if ($ageInSeconds > (60 * 60)) {
|
||||||
|
unlink($tpath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//updated featured
|
||||||
|
$memcached->delete('featured');
|
||||||
|
$manga_lists = new Manga_Lists();
|
||||||
|
$array_of_featured_manga_ids = $manga_lists->get_manga_list(11);
|
||||||
|
if (!empty($array_of_featured_manga_ids)) {
|
||||||
|
$manga_ids_in = prepare_in($array_of_featured_manga_ids);
|
||||||
|
$featured = $sql->prep('featured', "
|
||||||
|
SELECT chapters.manga_id, chapters.chapter_id, chapters.chapter_views, chapters.chapter, chapters.upload_timestamp,
|
||||||
|
mangas.manga_name, mangas.manga_image, mangas.manga_hentai, mangas.manga_bayesian,
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_manga WHERE mangadex_follow_user_manga.manga_id = mangas.manga_id) AS count_follows
|
||||||
|
FROM mangadex_chapters AS chapters
|
||||||
|
LEFT JOIN mangadex_mangas AS mangas
|
||||||
|
ON mangas.manga_id = chapters.manga_id
|
||||||
|
WHERE mangas.manga_hentai = 0
|
||||||
|
AND chapters.chapter_deleted = 0
|
||||||
|
AND mangas.manga_id IN ($manga_ids_in)
|
||||||
|
GROUP BY chapters.manga_id
|
||||||
|
ORDER BY chapters.chapter_views DESC
|
||||||
|
", $array_of_featured_manga_ids , 'fetchAll', PDO::FETCH_ASSOC, 3600);
|
||||||
|
}
|
||||||
|
|
||||||
|
//update new manga
|
||||||
|
$memcached->delete('new_manga');
|
||||||
|
$new_manga = $sql->query_read('new_manga', "
|
||||||
|
SELECT mangas.manga_id, mangas.manga_name, mangas.manga_image, mangas.manga_hentai, chapters.chapter_id, chapters.chapter_views, chapters.chapter, chapters.upload_timestamp
|
||||||
|
FROM mangadex_mangas AS mangas
|
||||||
|
LEFT JOIN mangadex_chapters AS chapters
|
||||||
|
ON mangas.manga_id = chapters.manga_id
|
||||||
|
WHERE mangas.manga_hentai = 0 AND chapters.chapter_id IS NOT NULL
|
||||||
|
GROUP BY mangas.manga_id
|
||||||
|
ORDER BY mangas.manga_id DESC LIMIT 10
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 3600);
|
||||||
|
|
||||||
|
//update top follows
|
||||||
|
$memcached->delete('top_follows');
|
||||||
|
$top_follows = $sql->query_read('top_follows', "
|
||||||
|
SELECT mangas.manga_id, mangas.manga_image, mangas.manga_name, mangas.manga_hentai, mangas.manga_bayesian,
|
||||||
|
(SELECT count(*) FROM mangadex_manga_ratings WHERE mangadex_manga_ratings.manga_id = mangas.manga_id) AS count_pop,
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_manga WHERE mangadex_follow_user_manga.manga_id = mangas.manga_id) AS count_follows
|
||||||
|
FROM mangadex_mangas AS mangas
|
||||||
|
WHERE mangas.manga_hentai = 0
|
||||||
|
ORDER BY count_follows DESC LIMIT 10
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 3600);
|
||||||
|
|
||||||
|
//update top rating
|
||||||
|
$memcached->delete('top_rating');
|
||||||
|
$top_rating = $sql->query_read('top_rating', "
|
||||||
|
SELECT mangas.manga_id, mangas.manga_image, mangas.manga_name, mangas.manga_hentai, mangas.manga_bayesian,
|
||||||
|
(SELECT count(*) FROM mangadex_manga_ratings WHERE mangadex_manga_ratings.manga_id = mangas.manga_id) AS count_pop,
|
||||||
|
(SELECT count(*) FROM mangadex_follow_user_manga WHERE mangadex_follow_user_manga.manga_id = mangas.manga_id) AS count_follows
|
||||||
|
FROM mangadex_mangas AS mangas
|
||||||
|
WHERE mangas.manga_hentai = 0
|
||||||
|
ORDER BY manga_bayesian DESC LIMIT 10
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 3600);
|
||||||
|
|
||||||
|
//process logs
|
||||||
|
$last_timestamp = $sql->query_read('last_timestamp', " SELECT visit_timestamp FROM mangadex_logs_visits ORDER BY visit_timestamp ASC LIMIT 1 ", 'fetchColumn', '', -1) + 3600;
|
||||||
|
for($i = $last_timestamp; $i < ($last_timestamp + 3600); $i+=3600) {
|
||||||
|
$views_guests = $sql->query_read('views_guests', " SELECT count(*) FROM mangadex_logs_visits WHERE visit_timestamp >= ($i - 3600) AND visit_timestamp < $i AND visit_user_id = 0 ", 'fetchColumn', '', -1);
|
||||||
|
$views_logged_in = $sql->query_read('views_logged_in', " SELECT count(*) FROM mangadex_logs_visits WHERE visit_timestamp >= ($i - 3600) AND visit_timestamp < $i AND visit_user_id > 0 ", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
$users_guests = $sql->query_read('users_guests', " SELECT COUNT(*) FROM (SELECT `visit_user_id` FROM `mangadex_logs_visits` WHERE visit_timestamp >= ($i - 3600) AND visit_timestamp < $i AND visit_user_id = 0 GROUP BY `visit_ip`) AS `TABLE` ", 'fetchColumn', '', -1);
|
||||||
|
$users_logged_in = $sql->query_read('users_logged_in', " SELECT COUNT(*) FROM (SELECT `visit_user_id` FROM `mangadex_logs_visits` WHERE visit_timestamp >= ($i - 3600) AND visit_timestamp < $i AND visit_user_id > 0 GROUP BY `visit_user_id`) AS `TABLE` ", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
$sql->modify('insert', ' INSERT INTO `mangadex_logs_visits_summary` (`id`, `timestamp`, `users_guests`, `users_logged_in`, `views_guests`, `views_logged_in`) VALUES (NULL, ?, ?, ?, ?, ?) ', [$i, $users_guests, $users_logged_in, $views_guests, $views_logged_in]);
|
||||||
|
$sql->modify('delete', ' DELETE FROM `mangadex_logs_visits` WHERE visit_timestamp >= (? - 3600) AND visit_timestamp < ? ', [$i, $i]);
|
||||||
|
$sql->modify('delete', ' DELETE FROM `mangadex_logs_api` WHERE visit_timestamp >= (? - 3600) AND visit_timestamp < ? ', [$i, $i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prune old chapter_history data
|
||||||
|
$cutoff = time() - (60 * 60 * 24 * 90); // 90 days
|
||||||
|
$sql->modify('prune_manga_history', 'DELETE FROM mangadex_manga_history WHERE `timestamp` < ?', [$cutoff]);
|
||||||
|
|
||||||
|
// Prune expired ip bans
|
||||||
|
$sql->modify('prune_ip_bans', 'DELETE FROM mangadex_ip_bans WHERE expires < UNIX_TIMESTAMP()', []);
|
||||||
|
|
||||||
|
// Prune expired sessions each month on the 1st
|
||||||
|
if (date('j') == 1 && date('G') < 1) {
|
||||||
|
$sql->modify('prune_sessions', 'DELETE FROM mangadex_sessions WHERE (created + ?) < UNIX_TIMESTAMP()', [60*60*24*365]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//prune old chapter_live_views for trending data
|
||||||
|
$sql->modify('prune_trending', 'DELETE FROM `mangadex_chapter_live_views` WHERE (timestamp + ?) < UNIX_TIMESTAMP()', [60*60*25]);
|
111
cron/hourly2.php
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
if (PHP_SAPI !== 'cli')
|
||||||
|
die();
|
||||||
|
*/
|
||||||
|
require_once (__DIR__.'/../bootstrap.php');
|
||||||
|
|
||||||
|
require_once (ABSPATH . "/scripts/header.req.php");
|
||||||
|
|
||||||
|
//fetch and insert BTC data
|
||||||
|
foreach (WALLET_QR['BTC'] as $qr) {
|
||||||
|
|
||||||
|
$ch = curl_init();
|
||||||
|
// IMPORTANT: the below line is a security risk, read https://paragonie.com/blog/2017/10/certainty-automated-cacert-pem-management-for-php-software
|
||||||
|
// in most cases, you should set it to true
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_URL, "https://chain.api.btc.com/v3/address/$qr/tx");
|
||||||
|
$result = curl_exec($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
$obj = json_decode($result);
|
||||||
|
|
||||||
|
foreach ($obj->data->list as $id => $tx) {
|
||||||
|
$balance = $tx->balance_diff;
|
||||||
|
if ($balance > 0) {
|
||||||
|
$address = $tx->inputs[0]->prev_addresses[0];
|
||||||
|
$hash = $tx->hash;
|
||||||
|
|
||||||
|
$timestamp = $tx->block_time;
|
||||||
|
|
||||||
|
$count = $sql->query_read('views_guests', " SELECT count(*) FROM mangadex_transactions_btc WHERE hash LIKE '$hash' LIMIT 1 ", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
if (!$count) {
|
||||||
|
$sql->modify('update', " INSERT IGNORE INTO mangadex_transactions_btc (timestamp, hash, sender_address, recipient_address, satoshis) VALUES (?, ?, ?, ?, ?); ", [$timestamp, $hash, $address, $qr, $balance]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sleep(5); //be considerate!
|
||||||
|
}
|
||||||
|
|
||||||
|
//fetch and insert ETH data
|
||||||
|
foreach (WALLET_QR['ETH'] as $qr) {
|
||||||
|
|
||||||
|
$ch = curl_init();
|
||||||
|
// IMPORTANT: the below line is a security risk, read https://paragonie.com/blog/2017/10/certainty-automated-cacert-pem-management-for-php-software
|
||||||
|
// in most cases, you should set it to true
|
||||||
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_URL, "http://api.etherscan.io/api?module=account&action=txlist&address=$qr&startblock=0&endblock=99999999&sort=asc&apikey=V8NYD3PUSYCNJVQYMGFF45GB9V55N3JC32");
|
||||||
|
$result = curl_exec($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
$obj = json_decode($result);
|
||||||
|
|
||||||
|
foreach ($obj->result as $id => $tx) {
|
||||||
|
|
||||||
|
$balance = $tx->value;
|
||||||
|
$from = $tx->from;
|
||||||
|
$to = $tx->to;
|
||||||
|
$hash = $tx->hash;
|
||||||
|
|
||||||
|
$timestamp = $tx->timeStamp;
|
||||||
|
|
||||||
|
$count = $sql->query_read('views_guests', " SELECT count(*) FROM mangadex_transactions_eth WHERE hash LIKE '$hash' LIMIT 1 ", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
if (!$count && $from != strtolower($qr)) {
|
||||||
|
$sql->modify('update', " INSERT IGNORE INTO mangadex_transactions_eth (timestamp, hash, sender_address, recipient_address, value) VALUES (?, ?, ?, ?, ?); ", [$timestamp, $hash, $from, $to, $balance]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
sleep(1); //be considerate!
|
||||||
|
}
|
||||||
|
|
||||||
|
//update tx count
|
||||||
|
$txs = $sql->query_read('x', " SELECT * FROM `mangadex_user_paypal` WHERE `paypal` NOT LIKE '%@%' ", 'fetchAll', PDO::FETCH_ASSOC, -1);
|
||||||
|
|
||||||
|
foreach ($txs as $tx) {
|
||||||
|
$count = $sql->query_read('x', "
|
||||||
|
select count(*) FROM mangadex_transactions_btc
|
||||||
|
WHERE hash in (SELECT paypal from mangadex_user_paypal where user_id = {$tx['user_id']}) OR sender_address in (SELECT paypal from mangadex_user_paypal where user_id = {$tx['user_id']})
|
||||||
|
", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
if ($count) {
|
||||||
|
$sql->modify('x', " update mangadex_users set premium = 1 WHERE user_id = ? LIMIT 1 ", [$tx['user_id']]);
|
||||||
|
print "updated {$tx['user_id']}\n";
|
||||||
|
}
|
||||||
|
//$sql->modify('x', " update mangadex_user_paypal set count = ? WHERE paypal like '?' LIMIT 1 ", [$count, $tx['paypal']]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($txs as $tx) {
|
||||||
|
$count = $sql->query_read('x', "
|
||||||
|
select count(*) FROM mangadex_transactions_eth
|
||||||
|
WHERE hash in (SELECT paypal from mangadex_user_paypal where user_id = {$tx['user_id']}) OR sender_address in (SELECT paypal from mangadex_user_paypal where user_id = {$tx['user_id']})
|
||||||
|
", 'fetchColumn', '', -1);
|
||||||
|
|
||||||
|
if ($count) {
|
||||||
|
$sql->modify('x', " update mangadex_users set premium = 1 WHERE user_id = ? LIMIT 1 ", [$tx['user_id']]);
|
||||||
|
print "updated {$tx['user_id']}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//$sql->modify('x', " update mangadex_user_paypal set count = ? WHERE paypal like '?' LIMIT 1 ", [$count, $tx['paypal']]);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
//update premium
|
||||||
|
$txs = $sql->query_read('x', " SELECT * FROM mangadex_user_paypal WHERE `paypal` NOT LIKE '%@%' AND count > 0 ", 'fetchAll', PDO::FETCH_ASSOC, -1);
|
||||||
|
|
||||||
|
foreach ($txs as $tx) {
|
||||||
|
$sql->modify('x', " update mangadex_users set premium = 1 WHERE user_id = ? LIMIT 1 ", [$tx['user_id']]);
|
||||||
|
}*/
|
4
cron/index.php
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?php
|
||||||
|
header("location: /");
|
||||||
|
die();
|
||||||
|
?>
|
115
cron/tenmin.php
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (PHP_SAPI !== 'cli')
|
||||||
|
die();
|
||||||
|
|
||||||
|
require_once (__DIR__.'/../bootstrap.php');
|
||||||
|
|
||||||
|
require_once (ABSPATH . "/scripts/header.req.php");
|
||||||
|
|
||||||
|
$memcached->delete("latest_manga_comments");
|
||||||
|
$latest_manga_comments = $sql->query_read('latest_manga_comments', "
|
||||||
|
SELECT posts.post_id, posts.text, posts.timestamp, posts.thread_id, mangas.manga_name, mangas.manga_id,
|
||||||
|
(SELECT (count(*) -1) DIV 20 + 1 FROM mangadex_forum_posts
|
||||||
|
WHERE mangadex_forum_posts.post_id <= posts.post_id
|
||||||
|
AND mangadex_forum_posts.thread_id = posts.thread_id
|
||||||
|
AND mangadex_forum_posts.deleted = 0) AS thread_page
|
||||||
|
FROM mangadex_forum_posts AS posts
|
||||||
|
LEFT JOIN mangadex_threads AS threads
|
||||||
|
ON posts.thread_id = threads.thread_id
|
||||||
|
LEFT JOIN mangadex_mangas AS mangas
|
||||||
|
ON threads.thread_name = mangas.manga_id
|
||||||
|
WHERE threads.forum_id = 11 AND threads.thread_deleted = 0
|
||||||
|
ORDER BY timestamp DESC LIMIT 10
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 600);
|
||||||
|
|
||||||
|
$memcached->delete("latest_forum_posts");
|
||||||
|
$latest_forum_posts = $sql->query_read('latest_forum_posts', "
|
||||||
|
SELECT posts.post_id, posts.text, posts.timestamp, posts.thread_id, threads.thread_name, forums.forum_name,
|
||||||
|
(SELECT (count(*) -1) DIV 20 + 1 FROM mangadex_forum_posts
|
||||||
|
WHERE mangadex_forum_posts.post_id <= posts.post_id
|
||||||
|
AND mangadex_forum_posts.thread_id = posts.thread_id
|
||||||
|
AND mangadex_forum_posts.deleted = 0) AS thread_page
|
||||||
|
FROM mangadex_forum_posts AS posts
|
||||||
|
LEFT JOIN mangadex_threads AS threads
|
||||||
|
ON posts.thread_id = threads.thread_id
|
||||||
|
LEFT JOIN mangadex_forums AS forums
|
||||||
|
ON threads.forum_id = forums.forum_id
|
||||||
|
WHERE threads.forum_id NOT IN (11, 12, 14, 17, 18, 20) AND threads.thread_deleted = 0
|
||||||
|
ORDER BY timestamp DESC LIMIT 10
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 600);
|
||||||
|
|
||||||
|
$memcached->delete("latest_news_posts");
|
||||||
|
$latest_forum_posts = $sql->query_read('latest_news_posts', "
|
||||||
|
SELECT posts.post_id, posts.text, posts.timestamp, posts.thread_id, threads.thread_name, forums.forum_name,
|
||||||
|
(SELECT (count(*) -1) DIV 20 + 1 FROM mangadex_forum_posts
|
||||||
|
WHERE mangadex_forum_posts.post_id <= posts.post_id
|
||||||
|
AND mangadex_forum_posts.thread_id = posts.thread_id
|
||||||
|
AND mangadex_forum_posts.deleted = 0) AS thread_page
|
||||||
|
FROM mangadex_forum_posts AS posts
|
||||||
|
LEFT JOIN mangadex_threads AS threads
|
||||||
|
ON posts.thread_id = threads.thread_id
|
||||||
|
LEFT JOIN mangadex_forums AS forums
|
||||||
|
ON threads.forum_id = forums.forum_id
|
||||||
|
WHERE threads.forum_id = 26 AND threads.thread_sticky = 1
|
||||||
|
ORDER BY timestamp ASC LIMIT 1
|
||||||
|
", 'fetchAll', PDO::FETCH_ASSOC, 600);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Put delayed chapters that just expired into the last_updated table
|
||||||
|
///
|
||||||
|
|
||||||
|
// Collect all chapters that have been uploaded as delayed, but where the delay is expired
|
||||||
|
$expired_delayed_chapters = $sql->query_read('expired_delayed_chapters', '
|
||||||
|
SELECT c.chapter_id, c.manga_id, c.volume, c.chapter, c.title, c.upload_timestamp, c.user_id, c.lang_id, c.group_id, c.group_id_2, c.group_id_3, c.available FROM mangadex_chapters c, mangadex_delayed_chapters d WHERE d.upload_timestamp < UNIX_TIMESTAMP() AND c.chapter_id = d.chapter_id
|
||||||
|
', 'fetchAll', PDO::FETCH_ASSOC, -1);
|
||||||
|
// Only process if we found any
|
||||||
|
if (!empty($expired_delayed_chapters)) {
|
||||||
|
// Collect all chapter ids in this array, so we can unset them as delayed after this
|
||||||
|
$unexpire_chapter_ids = [];
|
||||||
|
foreach ($expired_delayed_chapters AS $expired_delayed_chapter) {
|
||||||
|
$unexpire_chapter_ids[] = (int)$expired_delayed_chapter['chapter_id'];
|
||||||
|
// Add each chapter to the last updated table. this query should be identical with the trigger inside the mangadex_chapters table
|
||||||
|
$sql->modify('last_updated_delayed', "
|
||||||
|
INSERT INTO mangadex_last_updated (`chapter_id`, `manga_id`, `volume`, `chapter`, `title`, `upload_timestamp`, `user_id`, `lang_id`, `group_id`, `group_id_2`, `group_id_3`, `available`)
|
||||||
|
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
|
||||||
|
ON DUPLICATE KEY UPDATE chapter_id = ?, volume = ?, chapter = ?, title = ?, upload_timestamp = ?, user_id = ?,
|
||||||
|
group_id = ?, group_id_2 = ?, group_id_3 = ?, available = ?;", array_merge(array_values($expired_delayed_chapter), [
|
||||||
|
$expired_delayed_chapter['chapter_id'],
|
||||||
|
$expired_delayed_chapter['volume'],
|
||||||
|
$expired_delayed_chapter['chapter'],
|
||||||
|
$expired_delayed_chapter['title'],
|
||||||
|
$expired_delayed_chapter['upload_timestamp'],
|
||||||
|
$expired_delayed_chapter['user_id'],
|
||||||
|
$expired_delayed_chapter['group_id'],
|
||||||
|
$expired_delayed_chapter['group_id_2'],
|
||||||
|
$expired_delayed_chapter['group_id_3'],
|
||||||
|
$expired_delayed_chapter['available'],
|
||||||
|
]));
|
||||||
|
// Update manga last updated
|
||||||
|
$sql->modify('unexpire_delayed_chapters', " UPDATE mangadex_mangas SET manga_last_uploaded = ? WHERE manga_id = ? LIMIT 1 ", [$expired_delayed_chapter['upload_timestamp'], $expired_delayed_chapter['manga_id']]);
|
||||||
|
}
|
||||||
|
// Set each is_delayed field for all chapters we just transferred to zero, so we dont process them again.
|
||||||
|
$unexpire_in = implode(',', $unexpire_chapter_ids);
|
||||||
|
$sql->modify('unexpire_delayed_chapters', 'DELETE FROM mangadex_delayed_chapters WHERE chapter_id IN ('.$unexpire_in.')', []);
|
||||||
|
}
|
||||||
|
|
||||||
|
$stats = $mdAtHomeClient->getStatus();
|
||||||
|
|
||||||
|
foreach ($stats as $client) {
|
||||||
|
$client_id = (int) $client['client_id'];
|
||||||
|
$user_id = (int) $client['user_id'];
|
||||||
|
$subsubdomain = substr($client['url'], 8, 27);
|
||||||
|
if (strpos($subsubdomain, '.') === 0)
|
||||||
|
$subsubdomain = '*.' . substr($client['url'], 9, 13);
|
||||||
|
$url = explode(':', $client['url']);
|
||||||
|
$port = (int) $url[2];
|
||||||
|
$client_ip = $client['ip'];
|
||||||
|
$available = (int) $client['available'];
|
||||||
|
$shard_count = (int) $client['shard_count'];
|
||||||
|
$speed = ((int) $client['speed']) / 125000;
|
||||||
|
$images_served = (int) $client['images_served'];
|
||||||
|
$images_failed = (int) $client['images_failed'];
|
||||||
|
$bytes_served = (int) $client['bytes_served'];
|
||||||
|
$sql->modify('x', " update mangadex_clients set upload_speed = ?, client_ip = ?, client_subsubdomain = ?, client_port = ?, client_available = ?, shard_count = ?, images_served = ?, images_failed = ?, bytes_served = ?, update_timestamp = UNIX_TIMESTAMP() WHERE client_id = ? AND user_id = ? LIMIT 1 ", [$speed, $client_ip, $subsubdomain, $port, $available, $shard_count, $images_served, $images_failed, $bytes_served, $client_id, $user_id]);
|
||||||
|
}
|
13
dberror.html
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
|
||||||
|
<title>Database Error - MangaDex</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1 style="text-align: center; ">Database Error</h1>
|
||||||
|
<hr />
|
||||||
|
<a href="/"><img style="margin: 0 auto; display: block;" src="/images/avatars/default1.jpg" alt="DB Error" /></a>
|
||||||
|
<p style="text-align: center; ">The Database server is under heavy load and can't serve your request. Please wait a bit and try refreshing the page.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
61
f2banned_hook.php
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// UNCOMMENT THIS TO DISABLE
|
||||||
|
//die('');
|
||||||
|
|
||||||
|
if (php_sapi_name() !== 'cli') die();
|
||||||
|
|
||||||
|
// DB
|
||||||
|
include "config.req.php";
|
||||||
|
|
||||||
|
$dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$db = new PDO($dsn, DB_USER, DB_PASSWORD);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
die('Connection failed: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prune?
|
||||||
|
|
||||||
|
if (($argv[1] ?? false) === 'prune') {
|
||||||
|
prune_entries($db);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ip = $argv[1] ?? false;
|
||||||
|
|
||||||
|
log_ipban($ip, $db);
|
||||||
|
|
||||||
|
// ========= FUNCTIONS
|
||||||
|
|
||||||
|
function log_ipban($ip, $db) {
|
||||||
|
|
||||||
|
$logfile = '/var/log/nginx/mangadex.org.error.log';
|
||||||
|
|
||||||
|
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
|
||||||
|
die('invalid ip');
|
||||||
|
}
|
||||||
|
|
||||||
|
// LOG
|
||||||
|
|
||||||
|
$lines = [];
|
||||||
|
$cmd = sprintf('tail -n 500 %s | grep %s', $logfile, escapeshellarg($ip));
|
||||||
|
$res = exec($cmd, $lines);
|
||||||
|
|
||||||
|
if (empty($lines)) {
|
||||||
|
die('Empty result');
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = substr(implode("\n", $lines), 0, 65535);
|
||||||
|
|
||||||
|
$stmt = $db->prepare('INSERT INTO mangadex_fail2ban_log (ip, logs) VALUES (?, ?)');
|
||||||
|
$stmt->execute([$ip, $text]);
|
||||||
|
|
||||||
|
die('OK');
|
||||||
|
}
|
||||||
|
|
||||||
|
function prune_entries($db) {
|
||||||
|
$db->exec('DELETE FROM mangadex_fail2ban_log WHERE DATE_ADD(`time`, INTERVAL 1 DAY) < NOW()');
|
||||||
|
die("Pruned.\n");
|
||||||
|
}
|
||||||
|
|
BIN
favicon-16x16.png
Normal file
After Width: | Height: | Size: 932 B |
BIN
favicon-192x192.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
favicon-32x32.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
favicon-96x96.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
34
fontawesome/LICENSE.txt
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
Font Awesome Free License
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Font Awesome Free is free, open source, and GPL friendly. You can use it for
|
||||||
|
commercial projects, open source projects, or really almost whatever you want.
|
||||||
|
Full Font Awesome Free license: https://fontawesome.com/license/free.
|
||||||
|
|
||||||
|
# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
|
||||||
|
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
|
||||||
|
packaged as SVG and JS file types.
|
||||||
|
|
||||||
|
# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
|
||||||
|
In the Font Awesome Free download, the SIL OFL license applies to all icons
|
||||||
|
packaged as web and desktop font files.
|
||||||
|
|
||||||
|
# Code: MIT License (https://opensource.org/licenses/MIT)
|
||||||
|
In the Font Awesome Free download, the MIT license applies to all non-font and
|
||||||
|
non-icon files.
|
||||||
|
|
||||||
|
# Attribution
|
||||||
|
Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font
|
||||||
|
Awesome Free files already contain embedded comments with sufficient
|
||||||
|
attribution, so you shouldn't need to do anything additional when using these
|
||||||
|
files normally.
|
||||||
|
|
||||||
|
We've kept attribution comments terse, so we ask that you do not actively work
|
||||||
|
to remove them from files, especially code. They're a great way for folks to
|
||||||
|
learn about Font Awesome.
|
||||||
|
|
||||||
|
# Brand Icons
|
||||||
|
All brand icons are trademarks of their respective owners. The use of these
|
||||||
|
trademarks does not indicate endorsement of the trademark holder by Font
|
||||||
|
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
|
||||||
|
to represent the company, product, or service to which they refer.**
|
4556
fontawesome/css/all.css
vendored
Normal file
15
fontawesome/css/brands.css
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Brands';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-brands-400.eot");
|
||||||
|
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
|
||||||
|
|
||||||
|
.fab {
|
||||||
|
font-family: 'Font Awesome 5 Brands';
|
||||||
|
font-weight: 400; }
|
4522
fontawesome/css/fontawesome.css
vendored
Normal file
15
fontawesome/css/regular.css
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-regular-400.eot");
|
||||||
|
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
|
||||||
|
|
||||||
|
.far {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-weight: 400; }
|
16
fontawesome/css/solid.css
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
*/
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 900;
|
||||||
|
font-display: block;
|
||||||
|
src: url("../webfonts/fa-solid-900.eot");
|
||||||
|
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
|
||||||
|
|
||||||
|
.fa,
|
||||||
|
.fas {
|
||||||
|
font-family: 'Font Awesome 5 Free';
|
||||||
|
font-weight: 900; }
|
371
fontawesome/css/svg-with-js.css
vendored
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
*/
|
||||||
|
svg:not(:root).svg-inline--fa {
|
||||||
|
overflow: visible; }
|
||||||
|
|
||||||
|
.svg-inline--fa {
|
||||||
|
display: inline-block;
|
||||||
|
font-size: inherit;
|
||||||
|
height: 1em;
|
||||||
|
overflow: visible;
|
||||||
|
vertical-align: -.125em; }
|
||||||
|
.svg-inline--fa.fa-lg {
|
||||||
|
vertical-align: -.225em; }
|
||||||
|
.svg-inline--fa.fa-w-1 {
|
||||||
|
width: 0.0625em; }
|
||||||
|
.svg-inline--fa.fa-w-2 {
|
||||||
|
width: 0.125em; }
|
||||||
|
.svg-inline--fa.fa-w-3 {
|
||||||
|
width: 0.1875em; }
|
||||||
|
.svg-inline--fa.fa-w-4 {
|
||||||
|
width: 0.25em; }
|
||||||
|
.svg-inline--fa.fa-w-5 {
|
||||||
|
width: 0.3125em; }
|
||||||
|
.svg-inline--fa.fa-w-6 {
|
||||||
|
width: 0.375em; }
|
||||||
|
.svg-inline--fa.fa-w-7 {
|
||||||
|
width: 0.4375em; }
|
||||||
|
.svg-inline--fa.fa-w-8 {
|
||||||
|
width: 0.5em; }
|
||||||
|
.svg-inline--fa.fa-w-9 {
|
||||||
|
width: 0.5625em; }
|
||||||
|
.svg-inline--fa.fa-w-10 {
|
||||||
|
width: 0.625em; }
|
||||||
|
.svg-inline--fa.fa-w-11 {
|
||||||
|
width: 0.6875em; }
|
||||||
|
.svg-inline--fa.fa-w-12 {
|
||||||
|
width: 0.75em; }
|
||||||
|
.svg-inline--fa.fa-w-13 {
|
||||||
|
width: 0.8125em; }
|
||||||
|
.svg-inline--fa.fa-w-14 {
|
||||||
|
width: 0.875em; }
|
||||||
|
.svg-inline--fa.fa-w-15 {
|
||||||
|
width: 0.9375em; }
|
||||||
|
.svg-inline--fa.fa-w-16 {
|
||||||
|
width: 1em; }
|
||||||
|
.svg-inline--fa.fa-w-17 {
|
||||||
|
width: 1.0625em; }
|
||||||
|
.svg-inline--fa.fa-w-18 {
|
||||||
|
width: 1.125em; }
|
||||||
|
.svg-inline--fa.fa-w-19 {
|
||||||
|
width: 1.1875em; }
|
||||||
|
.svg-inline--fa.fa-w-20 {
|
||||||
|
width: 1.25em; }
|
||||||
|
.svg-inline--fa.fa-pull-left {
|
||||||
|
margin-right: .3em;
|
||||||
|
width: auto; }
|
||||||
|
.svg-inline--fa.fa-pull-right {
|
||||||
|
margin-left: .3em;
|
||||||
|
width: auto; }
|
||||||
|
.svg-inline--fa.fa-border {
|
||||||
|
height: 1.5em; }
|
||||||
|
.svg-inline--fa.fa-li {
|
||||||
|
width: 2em; }
|
||||||
|
.svg-inline--fa.fa-fw {
|
||||||
|
width: 1.25em; }
|
||||||
|
|
||||||
|
.fa-layers svg.svg-inline--fa {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0; }
|
||||||
|
|
||||||
|
.fa-layers {
|
||||||
|
display: inline-block;
|
||||||
|
height: 1em;
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: -.125em;
|
||||||
|
width: 1em; }
|
||||||
|
.fa-layers svg.svg-inline--fa {
|
||||||
|
-webkit-transform-origin: center center;
|
||||||
|
transform-origin: center center; }
|
||||||
|
|
||||||
|
.fa-layers-text, .fa-layers-counter {
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center; }
|
||||||
|
|
||||||
|
.fa-layers-text {
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
-webkit-transform-origin: center center;
|
||||||
|
transform-origin: center center; }
|
||||||
|
|
||||||
|
.fa-layers-counter {
|
||||||
|
background-color: #ff253a;
|
||||||
|
border-radius: 1em;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: #fff;
|
||||||
|
height: 1.5em;
|
||||||
|
line-height: 1;
|
||||||
|
max-width: 5em;
|
||||||
|
min-width: 1.5em;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: .25em;
|
||||||
|
right: 0;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
top: 0;
|
||||||
|
-webkit-transform: scale(0.25);
|
||||||
|
transform: scale(0.25);
|
||||||
|
-webkit-transform-origin: top right;
|
||||||
|
transform-origin: top right; }
|
||||||
|
|
||||||
|
.fa-layers-bottom-right {
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
top: auto;
|
||||||
|
-webkit-transform: scale(0.25);
|
||||||
|
transform: scale(0.25);
|
||||||
|
-webkit-transform-origin: bottom right;
|
||||||
|
transform-origin: bottom right; }
|
||||||
|
|
||||||
|
.fa-layers-bottom-left {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
top: auto;
|
||||||
|
-webkit-transform: scale(0.25);
|
||||||
|
transform: scale(0.25);
|
||||||
|
-webkit-transform-origin: bottom left;
|
||||||
|
transform-origin: bottom left; }
|
||||||
|
|
||||||
|
.fa-layers-top-right {
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
-webkit-transform: scale(0.25);
|
||||||
|
transform: scale(0.25);
|
||||||
|
-webkit-transform-origin: top right;
|
||||||
|
transform-origin: top right; }
|
||||||
|
|
||||||
|
.fa-layers-top-left {
|
||||||
|
left: 0;
|
||||||
|
right: auto;
|
||||||
|
top: 0;
|
||||||
|
-webkit-transform: scale(0.25);
|
||||||
|
transform: scale(0.25);
|
||||||
|
-webkit-transform-origin: top left;
|
||||||
|
transform-origin: top left; }
|
||||||
|
|
||||||
|
.fa-lg {
|
||||||
|
font-size: 1.33333em;
|
||||||
|
line-height: 0.75em;
|
||||||
|
vertical-align: -.0667em; }
|
||||||
|
|
||||||
|
.fa-xs {
|
||||||
|
font-size: .75em; }
|
||||||
|
|
||||||
|
.fa-sm {
|
||||||
|
font-size: .875em; }
|
||||||
|
|
||||||
|
.fa-1x {
|
||||||
|
font-size: 1em; }
|
||||||
|
|
||||||
|
.fa-2x {
|
||||||
|
font-size: 2em; }
|
||||||
|
|
||||||
|
.fa-3x {
|
||||||
|
font-size: 3em; }
|
||||||
|
|
||||||
|
.fa-4x {
|
||||||
|
font-size: 4em; }
|
||||||
|
|
||||||
|
.fa-5x {
|
||||||
|
font-size: 5em; }
|
||||||
|
|
||||||
|
.fa-6x {
|
||||||
|
font-size: 6em; }
|
||||||
|
|
||||||
|
.fa-7x {
|
||||||
|
font-size: 7em; }
|
||||||
|
|
||||||
|
.fa-8x {
|
||||||
|
font-size: 8em; }
|
||||||
|
|
||||||
|
.fa-9x {
|
||||||
|
font-size: 9em; }
|
||||||
|
|
||||||
|
.fa-10x {
|
||||||
|
font-size: 10em; }
|
||||||
|
|
||||||
|
.fa-fw {
|
||||||
|
text-align: center;
|
||||||
|
width: 1.25em; }
|
||||||
|
|
||||||
|
.fa-ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 2.5em;
|
||||||
|
padding-left: 0; }
|
||||||
|
.fa-ul > li {
|
||||||
|
position: relative; }
|
||||||
|
|
||||||
|
.fa-li {
|
||||||
|
left: -2em;
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
width: 2em;
|
||||||
|
line-height: inherit; }
|
||||||
|
|
||||||
|
.fa-border {
|
||||||
|
border: solid 0.08em #eee;
|
||||||
|
border-radius: .1em;
|
||||||
|
padding: .2em .25em .15em; }
|
||||||
|
|
||||||
|
.fa-pull-left {
|
||||||
|
float: left; }
|
||||||
|
|
||||||
|
.fa-pull-right {
|
||||||
|
float: right; }
|
||||||
|
|
||||||
|
.fa.fa-pull-left,
|
||||||
|
.fas.fa-pull-left,
|
||||||
|
.far.fa-pull-left,
|
||||||
|
.fal.fa-pull-left,
|
||||||
|
.fab.fa-pull-left {
|
||||||
|
margin-right: .3em; }
|
||||||
|
|
||||||
|
.fa.fa-pull-right,
|
||||||
|
.fas.fa-pull-right,
|
||||||
|
.far.fa-pull-right,
|
||||||
|
.fal.fa-pull-right,
|
||||||
|
.fab.fa-pull-right {
|
||||||
|
margin-left: .3em; }
|
||||||
|
|
||||||
|
.fa-spin {
|
||||||
|
-webkit-animation: fa-spin 2s infinite linear;
|
||||||
|
animation: fa-spin 2s infinite linear; }
|
||||||
|
|
||||||
|
.fa-pulse {
|
||||||
|
-webkit-animation: fa-spin 1s infinite steps(8);
|
||||||
|
animation: fa-spin 1s infinite steps(8); }
|
||||||
|
|
||||||
|
@-webkit-keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
@keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
.fa-rotate-90 {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
|
||||||
|
-webkit-transform: rotate(90deg);
|
||||||
|
transform: rotate(90deg); }
|
||||||
|
|
||||||
|
.fa-rotate-180 {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
|
||||||
|
-webkit-transform: rotate(180deg);
|
||||||
|
transform: rotate(180deg); }
|
||||||
|
|
||||||
|
.fa-rotate-270 {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
|
||||||
|
-webkit-transform: rotate(270deg);
|
||||||
|
transform: rotate(270deg); }
|
||||||
|
|
||||||
|
.fa-flip-horizontal {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
|
||||||
|
-webkit-transform: scale(-1, 1);
|
||||||
|
transform: scale(-1, 1); }
|
||||||
|
|
||||||
|
.fa-flip-vertical {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
|
||||||
|
-webkit-transform: scale(1, -1);
|
||||||
|
transform: scale(1, -1); }
|
||||||
|
|
||||||
|
.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
|
||||||
|
-webkit-transform: scale(-1, -1);
|
||||||
|
transform: scale(-1, -1); }
|
||||||
|
|
||||||
|
:root .fa-rotate-90,
|
||||||
|
:root .fa-rotate-180,
|
||||||
|
:root .fa-rotate-270,
|
||||||
|
:root .fa-flip-horizontal,
|
||||||
|
:root .fa-flip-vertical,
|
||||||
|
:root .fa-flip-both {
|
||||||
|
-webkit-filter: none;
|
||||||
|
filter: none; }
|
||||||
|
|
||||||
|
.fa-stack {
|
||||||
|
display: inline-block;
|
||||||
|
height: 2em;
|
||||||
|
position: relative;
|
||||||
|
width: 2.5em; }
|
||||||
|
|
||||||
|
.fa-stack-1x,
|
||||||
|
.fa-stack-2x {
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0; }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-stack-1x {
|
||||||
|
height: 1em;
|
||||||
|
width: 1.25em; }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-stack-2x {
|
||||||
|
height: 2em;
|
||||||
|
width: 2.5em; }
|
||||||
|
|
||||||
|
.fa-inverse {
|
||||||
|
color: #fff; }
|
||||||
|
|
||||||
|
.sr-only {
|
||||||
|
border: 0;
|
||||||
|
clip: rect(0, 0, 0, 0);
|
||||||
|
height: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 1px; }
|
||||||
|
|
||||||
|
.sr-only-focusable:active, .sr-only-focusable:focus {
|
||||||
|
clip: auto;
|
||||||
|
height: auto;
|
||||||
|
margin: 0;
|
||||||
|
overflow: visible;
|
||||||
|
position: static;
|
||||||
|
width: auto; }
|
||||||
|
|
||||||
|
.svg-inline--fa .fa-primary {
|
||||||
|
fill: var(--fa-primary-color, currentColor);
|
||||||
|
opacity: 1;
|
||||||
|
opacity: var(--fa-primary-opacity, 1); }
|
||||||
|
|
||||||
|
.svg-inline--fa .fa-secondary {
|
||||||
|
fill: var(--fa-secondary-color, currentColor);
|
||||||
|
opacity: 0.4;
|
||||||
|
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-swap-opacity .fa-primary {
|
||||||
|
opacity: 0.4;
|
||||||
|
opacity: var(--fa-secondary-opacity, 0.4); }
|
||||||
|
|
||||||
|
.svg-inline--fa.fa-swap-opacity .fa-secondary {
|
||||||
|
opacity: 1;
|
||||||
|
opacity: var(--fa-primary-opacity, 1); }
|
||||||
|
|
||||||
|
.svg-inline--fa mask .fa-primary,
|
||||||
|
.svg-inline--fa mask .fa-secondary {
|
||||||
|
fill: black; }
|
||||||
|
|
||||||
|
.fad.fa-inverse {
|
||||||
|
color: #fff; }
|
2172
fontawesome/css/v4-shims.css
vendored
Normal file
5
fontawesome/css/v4-shims.min.css
vendored
Normal file
4441
fontawesome/js/all.js
Normal file
571
fontawesome/js/brands.js
Normal file
2478
fontawesome/js/fontawesome.js
Normal file
280
fontawesome/js/regular.js
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
/*!
|
||||||
|
* Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com
|
||||||
|
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||||
|
*/
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var _WINDOW = {};
|
||||||
|
var _DOCUMENT = {};
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (typeof window !== 'undefined') _WINDOW = window;
|
||||||
|
if (typeof document !== 'undefined') _DOCUMENT = document;
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
var _ref = _WINDOW.navigator || {},
|
||||||
|
_ref$userAgent = _ref.userAgent,
|
||||||
|
userAgent = _ref$userAgent === void 0 ? '' : _ref$userAgent;
|
||||||
|
|
||||||
|
var WINDOW = _WINDOW;
|
||||||
|
var DOCUMENT = _DOCUMENT;
|
||||||
|
var IS_BROWSER = !!WINDOW.document;
|
||||||
|
var IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';
|
||||||
|
var IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');
|
||||||
|
|
||||||
|
var NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';
|
||||||
|
var PRODUCTION = function () {
|
||||||
|
try {
|
||||||
|
return "production" === 'production';
|
||||||
|
} catch (e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
|
||||||
|
function bunker(fn) {
|
||||||
|
try {
|
||||||
|
fn();
|
||||||
|
} catch (e) {
|
||||||
|
if (!PRODUCTION) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _defineProperty(obj, key, value) {
|
||||||
|
if (key in obj) {
|
||||||
|
Object.defineProperty(obj, key, {
|
||||||
|
value: value,
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
obj[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _objectSpread(target) {
|
||||||
|
for (var i = 1; i < arguments.length; i++) {
|
||||||
|
var source = arguments[i] != null ? arguments[i] : {};
|
||||||
|
var ownKeys = Object.keys(source);
|
||||||
|
|
||||||
|
if (typeof Object.getOwnPropertySymbols === 'function') {
|
||||||
|
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
|
||||||
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
ownKeys.forEach(function (key) {
|
||||||
|
_defineProperty(target, key, source[key]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
var w = WINDOW || {};
|
||||||
|
if (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};
|
||||||
|
if (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};
|
||||||
|
if (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};
|
||||||
|
if (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];
|
||||||
|
var namespace = w[NAMESPACE_IDENTIFIER];
|
||||||
|
|
||||||
|
function defineIcons(prefix, icons) {
|
||||||
|
var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
||||||
|
var _params$skipHooks = params.skipHooks,
|
||||||
|
skipHooks = _params$skipHooks === void 0 ? false : _params$skipHooks;
|
||||||
|
var normalized = Object.keys(icons).reduce(function (acc, iconName) {
|
||||||
|
var icon = icons[iconName];
|
||||||
|
var expanded = !!icon.icon;
|
||||||
|
|
||||||
|
if (expanded) {
|
||||||
|
acc[icon.iconName] = icon.icon;
|
||||||
|
} else {
|
||||||
|
acc[iconName] = icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {
|
||||||
|
namespace.hooks.addPack(prefix, normalized);
|
||||||
|
} else {
|
||||||
|
namespace.styles[prefix] = _objectSpread({}, namespace.styles[prefix] || {}, normalized);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Font Awesome 4 used the prefix of `fa` for all icons. With the introduction
|
||||||
|
* of new styles we needed to differentiate between them. Prefix `fa` is now an alias
|
||||||
|
* for `fas` so we'll easy the upgrade process for our users by automatically defining
|
||||||
|
* this as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
if (prefix === 'fas') {
|
||||||
|
defineIcons('fa', icons);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var icons = {
|
||||||
|
"address-book": [448, 512, [], "f2b9", "M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z"],
|
||||||
|
"address-card": [576, 512, [], "f2bb", "M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H48V80h480v352zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2zM360 320h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8z"],
|
||||||
|
"angry": [496, 512, [], "f556", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-144c-33.6 0-65.2 14.8-86.8 40.6-8.5 10.2-7.1 25.3 3.1 33.8s25.3 7.2 33.8-3c24.8-29.7 75-29.7 99.8 0 8.1 9.7 23.2 11.9 33.8 3 10.2-8.5 11.5-23.6 3.1-33.8-21.6-25.8-53.2-40.6-86.8-40.6zm-48-72c10.3 0 19.9-6.7 23-17.1 3.8-12.7-3.4-26.1-16.1-29.9l-80-24c-12.8-3.9-26.1 3.4-29.9 16.1-3.8 12.7 3.4 26.1 16.1 29.9l28.2 8.5c-3.1 4.9-5.3 10.4-5.3 16.6 0 17.7 14.3 32 32 32s32-14.4 32-32.1zm199-54.9c-3.8-12.7-17.1-19.9-29.9-16.1l-80 24c-12.7 3.8-19.9 17.2-16.1 29.9 3.1 10.4 12.7 17.1 23 17.1 0 17.7 14.3 32 32 32s32-14.3 32-32c0-6.2-2.2-11.7-5.3-16.6l28.2-8.5c12.7-3.7 19.9-17.1 16.1-29.8z"],
|
||||||
|
"arrow-alt-circle-down": [512, 512, [], "f358", "M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z"],
|
||||||
|
"arrow-alt-circle-left": [512, 512, [], "f359", "M8 256c0 137 111 248 248 248s248-111 248-248S393 8 256 8 8 119 8 256zm448 0c0 110.5-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56s200 89.5 200 200zm-72-20v40c0 6.6-5.4 12-12 12H256v67c0 10.7-12.9 16-20.5 8.5l-99-99c-4.7-4.7-4.7-12.3 0-17l99-99c7.6-7.6 20.5-2.2 20.5 8.5v67h116c6.6 0 12 5.4 12 12z"],
|
||||||
|
"arrow-alt-circle-right": [512, 512, [], "f35a", "M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm72 20v-40c0-6.6 5.4-12 12-12h116v-67c0-10.7 12.9-16 20.5-8.5l99 99c4.7 4.7 4.7 12.3 0 17l-99 99c-7.6 7.6-20.5 2.2-20.5-8.5v-67H140c-6.6 0-12-5.4-12-12z"],
|
||||||
|
"arrow-alt-circle-up": [512, 512, [], "f35b", "M256 504c137 0 248-111 248-248S393 8 256 8 8 119 8 256s111 248 248 248zm0-448c110.5 0 200 89.5 200 200s-89.5 200-200 200S56 366.5 56 256 145.5 56 256 56zm20 328h-40c-6.6 0-12-5.4-12-12V256h-67c-10.7 0-16-12.9-8.5-20.5l99-99c4.7-4.7 12.3-4.7 17 0l99 99c7.6 7.6 2.2 20.5-8.5 20.5h-67v116c0 6.6-5.4 12-12 12z"],
|
||||||
|
"bell": [448, 512, [], "f0f3", "M439.39 362.29c-19.32-20.76-55.47-51.99-55.47-154.29 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84C118.56 68.1 64.08 130.3 64.08 208c0 102.3-36.15 133.53-55.47 154.29-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h383.8c19.12 0 32-15.6 32.1-32 .05-7.55-2.61-15.27-8.61-21.71zM67.53 368c21.22-27.97 44.42-74.33 44.53-159.42 0-.2-.06-.38-.06-.58 0-61.86 50.14-112 112-112s112 50.14 112 112c0 .2-.06.38-.06.58.11 85.1 23.31 131.46 44.53 159.42H67.53zM224 512c35.32 0 63.97-28.65 63.97-64H160.03c0 35.35 28.65 64 63.97 64z"],
|
||||||
|
"bell-slash": [640, 512, [], "f1f6", "M633.99 471.02L36 3.51C29.1-2.01 19.03-.9 13.51 6l-10 12.49C-2.02 25.39-.9 35.46 6 40.98l598 467.51c6.9 5.52 16.96 4.4 22.49-2.49l10-12.49c5.52-6.9 4.41-16.97-2.5-22.49zM163.53 368c16.71-22.03 34.48-55.8 41.4-110.58l-45.47-35.55c-3.27 90.73-36.47 120.68-54.84 140.42-6 6.45-8.66 14.16-8.61 21.71.11 16.4 12.98 32 32.1 32h279.66l-61.4-48H163.53zM320 96c61.86 0 112 50.14 112 112 0 .2-.06.38-.06.58.02 16.84 1.16 31.77 2.79 45.73l59.53 46.54c-8.31-22.13-14.34-51.49-14.34-92.85 0-77.7-54.48-139.9-127.94-155.16V32c0-17.67-14.32-32-31.98-32s-31.98 14.33-31.98 32v20.84c-26.02 5.41-49.45 16.94-69.13 32.72l38.17 29.84C275 103.18 296.65 96 320 96zm0 416c35.32 0 63.97-28.65 63.97-64H256.03c0 35.35 28.65 64 63.97 64z"],
|
||||||
|
"bookmark": [384, 512, [], "f02e", "M336 0H48C21.49 0 0 21.49 0 48v464l192-112 192 112V48c0-26.51-21.49-48-48-48zm0 428.43l-144-84-144 84V54a6 6 0 0 1 6-6h276c3.314 0 6 2.683 6 5.996V428.43z"],
|
||||||
|
"building": [448, 512, [], "f1ad", "M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z"],
|
||||||
|
"calendar": [448, 512, [], "f133", "M400 64h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V160h352v298c0 3.3-2.7 6-6 6z"],
|
||||||
|
"calendar-alt": [448, 512, [], "f073", "M148 288h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm108-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 96v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm-96 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm96-260v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"calendar-check": [448, 512, [], "f274", "M400 64h-48V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H160V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v52H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V160h352v298a6 6 0 0 1-6 6zm-52.849-200.65L198.842 404.519c-4.705 4.667-12.303 4.637-16.971-.068l-75.091-75.699c-4.667-4.705-4.637-12.303.068-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l44.104 44.461 111.072-110.181c4.705-4.667 12.303-4.637 16.971.068l22.536 22.718c4.667 4.705 4.636 12.303-.069 16.97z"],
|
||||||
|
"calendar-minus": [448, 512, [], "f272", "M124 328c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v24c0 6.6-5.4 12-12 12H124zm324-216v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"calendar-plus": [448, 512, [], "f271", "M336 292v24c0 6.6-5.4 12-12 12h-76v76c0 6.6-5.4 12-12 12h-24c-6.6 0-12-5.4-12-12v-76h-76c-6.6 0-12-5.4-12-12v-24c0-6.6 5.4-12 12-12h76v-76c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v76h76c6.6 0 12 5.4 12 12zm112-180v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"calendar-times": [448, 512, [], "f273", "M311.7 374.7l-17 17c-4.7 4.7-12.3 4.7-17 0L224 337.9l-53.7 53.7c-4.7 4.7-12.3 4.7-17 0l-17-17c-4.7-4.7-4.7-12.3 0-17l53.7-53.7-53.7-53.7c-4.7-4.7-4.7-12.3 0-17l17-17c4.7-4.7 12.3-4.7 17 0l53.7 53.7 53.7-53.7c4.7-4.7 12.3-4.7 17 0l17 17c4.7 4.7 4.7 12.3 0 17L257.9 304l53.7 53.7c4.8 4.7 4.8 12.3.1 17zM448 112v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h48V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h128V12c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v52h48c26.5 0 48 21.5 48 48zm-48 346V160H48v298c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"caret-square-down": [448, 512, [], "f150", "M125.1 208h197.8c10.7 0 16.1 13 8.5 20.5l-98.9 98.3c-4.7 4.7-12.2 4.7-16.9 0l-98.9-98.3c-7.7-7.5-2.3-20.5 8.4-20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"caret-square-left": [448, 512, [], "f191", "M272 157.1v197.8c0 10.7-13 16.1-20.5 8.5l-98.3-98.9c-4.7-4.7-4.7-12.2 0-16.9l98.3-98.9c7.5-7.7 20.5-2.3 20.5 8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"caret-square-right": [448, 512, [], "f152", "M176 354.9V157.1c0-10.7 13-16.1 20.5-8.5l98.3 98.9c4.7 4.7 4.7 12.2 0 16.9l-98.3 98.9c-7.5 7.7-20.5 2.3-20.5-8.4zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"caret-square-up": [448, 512, [], "f151", "M322.9 304H125.1c-10.7 0-16.1-13-8.5-20.5l98.9-98.3c4.7-4.7 12.2-4.7 16.9 0l98.9 98.3c7.7 7.5 2.3 20.5-8.4 20.5zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"chart-bar": [512, 512, [], "f080", "M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z"],
|
||||||
|
"check-circle": [512, 512, [], "f058", "M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z"],
|
||||||
|
"check-square": [448, 512, [], "f14a", "M400 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm0 400H48V80h352v352zm-35.864-241.724L191.547 361.48c-4.705 4.667-12.303 4.637-16.97-.068l-90.781-91.516c-4.667-4.705-4.637-12.303.069-16.971l22.719-22.536c4.705-4.667 12.303-4.637 16.97.069l59.792 60.277 141.352-140.216c4.705-4.667 12.303-4.637 16.97.068l22.536 22.718c4.667 4.706 4.637 12.304-.068 16.971z"],
|
||||||
|
"circle": [512, 512, [], "f111", "M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z"],
|
||||||
|
"clipboard": [384, 512, [], "f328", "M336 64h-80c0-35.3-28.7-64-64-64s-64 28.7-64 64H48C21.5 64 0 85.5 0 112v352c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zM192 40c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zm144 418c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h42v36c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-36h42c3.3 0 6 2.7 6 6z"],
|
||||||
|
"clock": [512, 512, [], "f017", "M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm61.8-104.4l-84.9-61.7c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v141.7l66.8 48.6c5.4 3.9 6.5 11.4 2.6 16.8L334.6 349c-3.9 5.3-11.4 6.5-16.8 2.6z"],
|
||||||
|
"clone": [512, 512, [], "f24d", "M464 0H144c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h320c26.51 0 48-21.49 48-48v-48h48c26.51 0 48-21.49 48-48V48c0-26.51-21.49-48-48-48zM362 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h42v224c0 26.51 21.49 48 48 48h224v42a6 6 0 0 1-6 6zm96-96H150a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h308a6 6 0 0 1 6 6v308a6 6 0 0 1-6 6z"],
|
||||||
|
"closed-captioning": [512, 512, [], "f20a", "M464 64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48zm-6 336H54c-3.3 0-6-2.7-6-6V118c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v276c0 3.3-2.7 6-6 6zm-211.1-85.7c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.8-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7l-17.5 30.5c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7zm190.4 0c1.7 2.4 1.5 5.6-.5 7.7-53.6 56.9-172.8 32.1-172.8-67.9 0-97.3 121.7-119.5 172.5-70.1 2.1 2 2.5 3.2 1 5.7L420 220.2c-1.9 3.1-6.2 4-9.1 1.7-40.8-32-94.6-14.9-94.6 31.2 0 48 51 70.5 92.2 32.6 2.8-2.5 7.1-2.1 9.2.9l19.6 27.7z"],
|
||||||
|
"comment": [512, 512, [], "f075", "M256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z"],
|
||||||
|
"comment-alt": [512, 512, [], "f27a", "M448 0H64C28.7 0 0 28.7 0 64v288c0 35.3 28.7 64 64 64h96v84c0 7.1 5.8 12 12 12 2.4 0 4.9-.7 7.1-2.4L304 416h144c35.3 0 64-28.7 64-64V64c0-35.3-28.7-64-64-64zm16 352c0 8.8-7.2 16-16 16H288l-12.8 9.6L208 428v-60H64c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16h384c8.8 0 16 7.2 16 16v288z"],
|
||||||
|
"comment-dots": [512, 512, [], "f4ad", "M144 208c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm112 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zM256 32C114.6 32 0 125.1 0 240c0 47.6 19.9 91.2 52.9 126.3C38 405.7 7 439.1 6.5 439.5c-6.6 7-8.4 17.2-4.6 26S14.4 480 24 480c61.5 0 110-25.7 139.1-46.3C192 442.8 223.2 448 256 448c141.4 0 256-93.1 256-208S397.4 32 256 32zm0 368c-26.7 0-53.1-4.1-78.4-12.1l-22.7-7.2-19.5 13.8c-14.3 10.1-33.9 21.4-57.5 29 7.3-12.1 14.4-25.7 19.9-40.2l10.6-28.1-20.6-21.8C69.7 314.1 48 282.2 48 240c0-88.2 93.3-160 208-160s208 71.8 208 160-93.3 160-208 160z"],
|
||||||
|
"comments": [576, 512, [], "f086", "M532 386.2c27.5-27.1 44-61.1 44-98.2 0-80-76.5-146.1-176.2-157.9C368.3 72.5 294.3 32 208 32 93.1 32 0 103.6 0 192c0 37 16.5 71 44 98.2-15.3 30.7-37.3 54.5-37.7 54.9-6.3 6.7-8.1 16.5-4.4 25 3.6 8.5 12 14 21.2 14 53.5 0 96.7-20.2 125.2-38.8 9.2 2.1 18.7 3.7 28.4 4.9C208.1 407.6 281.8 448 368 448c20.8 0 40.8-2.4 59.8-6.8C456.3 459.7 499.4 480 553 480c9.2 0 17.5-5.5 21.2-14 3.6-8.5 1.9-18.3-4.4-25-.4-.3-22.5-24.1-37.8-54.8zm-392.8-92.3L122.1 305c-14.1 9.1-28.5 16.3-43.1 21.4 2.7-4.7 5.4-9.7 8-14.8l15.5-31.1L77.7 256C64.2 242.6 48 220.7 48 192c0-60.7 73.3-112 160-112s160 51.3 160 112-73.3 112-160 112c-16.5 0-33-1.9-49-5.6l-19.8-4.5zM498.3 352l-24.7 24.4 15.5 31.1c2.6 5.1 5.3 10.1 8 14.8-14.6-5.1-29-12.3-43.1-21.4l-17.1-11.1-19.9 4.6c-16 3.7-32.5 5.6-49 5.6-54 0-102.2-20.1-131.3-49.7C338 339.5 416 272.9 416 192c0-3.4-.4-6.7-.7-10C479.7 196.5 528 238.8 528 288c0 28.7-16.2 50.6-29.7 64z"],
|
||||||
|
"compass": [496, 512, [], "f14e", "M347.94 129.86L203.6 195.83a31.938 31.938 0 0 0-15.77 15.77l-65.97 144.34c-7.61 16.65 9.54 33.81 26.2 26.2l144.34-65.97a31.938 31.938 0 0 0 15.77-15.77l65.97-144.34c7.61-16.66-9.54-33.81-26.2-26.2zm-77.36 148.72c-12.47 12.47-32.69 12.47-45.16 0-12.47-12.47-12.47-32.69 0-45.16 12.47-12.47 32.69-12.47 45.16 0 12.47 12.47 12.47 32.69 0 45.16zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z"],
|
||||||
|
"copy": [448, 512, [], "f0c5", "M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"],
|
||||||
|
"copyright": [512, 512, [], "f1f9", "M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm107.351-101.064c-9.614 9.712-45.53 41.396-104.065 41.396-82.43 0-140.484-61.425-140.484-141.567 0-79.152 60.275-139.401 139.762-139.401 55.531 0 88.738 26.62 97.593 34.779a11.965 11.965 0 0 1 1.936 15.322l-18.155 28.113c-3.841 5.95-11.966 7.282-17.499 2.921-8.595-6.776-31.814-22.538-61.708-22.538-48.303 0-77.916 35.33-77.916 80.082 0 41.589 26.888 83.692 78.277 83.692 32.657 0 56.843-19.039 65.726-27.225 5.27-4.857 13.596-4.039 17.82 1.738l19.865 27.17a11.947 11.947 0 0 1-1.152 15.518z"],
|
||||||
|
"credit-card": [576, 512, [], "f09d", "M527.9 32H48.1C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48.1 48h479.8c26.6 0 48.1-21.5 48.1-48V80c0-26.5-21.5-48-48.1-48zM54.1 80h467.8c3.3 0 6 2.7 6 6v42H48.1V86c0-3.3 2.7-6 6-6zm467.8 352H54.1c-3.3 0-6-2.7-6-6V256h479.8v170c0 3.3-2.7 6-6 6zM192 332v40c0 6.6-5.4 12-12 12h-72c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h72c6.6 0 12 5.4 12 12zm192 0v40c0 6.6-5.4 12-12 12H236c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h136c6.6 0 12 5.4 12 12z"],
|
||||||
|
"dizzy": [496, 512, [], "f567", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-33.8-217.9c7.8-7.8 7.8-20.5 0-28.3L196.3 192l17.9-17.9c7.8-7.8 7.8-20.5 0-28.3-7.8-7.8-20.5-7.8-28.3 0L168 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.9 7.7 20.5 7.7 28.4-.2zm160-92.2c-7.8-7.8-20.5-7.8-28.3 0L328 163.7l-17.8-17.8c-7.8-7.8-20.5-7.8-28.3 0-7.8 7.8-7.8 20.5 0 28.3l17.9 17.9-17.9 17.9c-7.8 7.8-7.8 20.5 0 28.3 7.8 7.8 20.5 7.8 28.3 0l17.8-17.8 17.8 17.8c7.8 7.8 20.5 7.8 28.3 0 7.8-7.8 7.8-20.5 0-28.3l-17.8-18 17.9-17.9c7.7-7.8 7.7-20.4 0-28.2zM248 272c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64z"],
|
||||||
|
"dot-circle": [512, 512, [], "f192", "M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z"],
|
||||||
|
"edit": [576, 512, [], "f044", "M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z"],
|
||||||
|
"envelope": [512, 512, [], "f0e0", "M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"],
|
||||||
|
"envelope-open": [512, 512, [], "f2b6", "M494.586 164.516c-4.697-3.883-111.723-89.95-135.251-108.657C337.231 38.191 299.437 0 256 0c-43.205 0-80.636 37.717-103.335 55.859-24.463 19.45-131.07 105.195-135.15 108.549A48.004 48.004 0 0 0 0 201.485V464c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V201.509a48 48 0 0 0-17.414-36.993zM464 458a6 6 0 0 1-6 6H54a6 6 0 0 1-6-6V204.347c0-1.813.816-3.526 2.226-4.665 15.87-12.814 108.793-87.554 132.364-106.293C200.755 78.88 232.398 48 256 48c23.693 0 55.857 31.369 73.41 45.389 23.573 18.741 116.503 93.493 132.366 106.316a5.99 5.99 0 0 1 2.224 4.663V458zm-31.991-187.704c4.249 5.159 3.465 12.795-1.745 16.981-28.975 23.283-59.274 47.597-70.929 56.863C336.636 362.283 299.205 400 256 400c-43.452 0-81.287-38.237-103.335-55.86-11.279-8.967-41.744-33.413-70.927-56.865-5.21-4.187-5.993-11.822-1.745-16.981l15.258-18.528c4.178-5.073 11.657-5.843 16.779-1.726 28.618 23.001 58.566 47.035 70.56 56.571C200.143 320.631 232.307 352 256 352c23.602 0 55.246-30.88 73.41-45.389 11.994-9.535 41.944-33.57 70.563-56.568 5.122-4.116 12.601-3.346 16.778 1.727l15.258 18.526z"],
|
||||||
|
"eye": [576, 512, [], "f06e", "M288 144a110.94 110.94 0 0 0-31.24 5 55.4 55.4 0 0 1 7.24 27 56 56 0 0 1-56 56 55.4 55.4 0 0 1-27-7.24A111.71 111.71 0 1 0 288 144zm284.52 97.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400c-98.65 0-189.09-55-237.93-144C98.91 167 189.34 112 288 112s189.09 55 237.93 144C477.1 345 386.66 400 288 400z"],
|
||||||
|
"eye-slash": [640, 512, [], "f070", "M634 471L36 3.51A16 16 0 0 0 13.51 6l-10 12.49A16 16 0 0 0 6 41l598 467.49a16 16 0 0 0 22.49-2.49l10-12.49A16 16 0 0 0 634 471zM296.79 146.47l134.79 105.38C429.36 191.91 380.48 144 320 144a112.26 112.26 0 0 0-23.21 2.47zm46.42 219.07L208.42 260.16C210.65 320.09 259.53 368 320 368a113 113 0 0 0 23.21-2.46zM320 112c98.65 0 189.09 55 237.93 144a285.53 285.53 0 0 1-44 60.2l37.74 29.5a333.7 333.7 0 0 0 52.9-75.11 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64c-36.7 0-71.71 7-104.63 18.81l46.41 36.29c18.94-4.3 38.34-7.1 58.22-7.1zm0 288c-98.65 0-189.08-55-237.93-144a285.47 285.47 0 0 1 44.05-60.19l-37.74-29.5a333.6 333.6 0 0 0-52.89 75.1 32.35 32.35 0 0 0 0 29.19C89.72 376.41 197.08 448 320 448c36.7 0 71.71-7.05 104.63-18.81l-46.41-36.28C359.28 397.2 339.89 400 320 400z"],
|
||||||
|
"file": [384, 512, [], "f15b", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48z"],
|
||||||
|
"file-alt": [384, 512, [], "f15c", "M288 248v28c0 6.6-5.4 12-12 12H108c-6.6 0-12-5.4-12-12v-28c0-6.6 5.4-12 12-12h168c6.6 0 12 5.4 12 12zm-12 72H108c-6.6 0-12 5.4-12 12v28c0 6.6 5.4 12 12 12h168c6.6 0 12-5.4 12-12v-28c0-6.6-5.4-12-12-12zm108-188.1V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V48C0 21.5 21.5 0 48 0h204.1C264.8 0 277 5.1 286 14.1L369.9 98c9 8.9 14.1 21.2 14.1 33.9zm-128-80V128h76.1L256 51.9zM336 464V176H232c-13.3 0-24-10.7-24-24V48H48v416h288z"],
|
||||||
|
"file-archive": [384, 512, [], "f1c6", "M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z"],
|
||||||
|
"file-audio": [384, 512, [], "f1c7", "M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm144-76.024c0 10.691-12.926 16.045-20.485 8.485L136 360.486h-28c-6.627 0-12-5.373-12-12v-56c0-6.627 5.373-12 12-12h28l35.515-36.947c7.56-7.56 20.485-2.206 20.485 8.485v135.952zm41.201-47.13c9.051-9.297 9.06-24.133.001-33.439-22.149-22.752 12.235-56.246 34.395-33.481 27.198 27.94 27.212 72.444.001 100.401-21.793 22.386-56.947-10.315-34.397-33.481z"],
|
||||||
|
"file-code": [384, 512, [], "f1c9", "M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z"],
|
||||||
|
"file-excel": [384, 512, [], "f1c3", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm212-240h-28.8c-4.4 0-8.4 2.4-10.5 6.3-18 33.1-22.2 42.4-28.6 57.7-13.9-29.1-6.9-17.3-28.6-57.7-2.1-3.9-6.2-6.3-10.6-6.3H124c-9.3 0-15 10-10.4 18l46.3 78-46.3 78c-4.7 8 1.1 18 10.4 18h28.9c4.4 0 8.4-2.4 10.5-6.3 21.7-40 23-45 28.6-57.7 14.9 30.2 5.9 15.9 28.6 57.7 2.1 3.9 6.2 6.3 10.6 6.3H260c9.3 0 15-10 10.4-18L224 320c.7-1.1 30.3-50.5 46.3-78 4.7-8-1.1-18-10.3-18z"],
|
||||||
|
"file-image": [384, 512, [], "f1c5", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z"],
|
||||||
|
"file-pdf": [384, 512, [], "f1c1", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z"],
|
||||||
|
"file-powerpoint": [384, 512, [], "f1c4", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm72-60V236c0-6.6 5.4-12 12-12h69.2c36.7 0 62.8 27 62.8 66.3 0 74.3-68.7 66.5-95.5 66.5V404c0 6.6-5.4 12-12 12H132c-6.6 0-12-5.4-12-12zm48.5-87.4h23c7.9 0 13.9-2.4 18.1-7.2 8.5-9.8 8.4-28.5.1-37.8-4.1-4.6-9.9-7-17.4-7h-23.9v52z"],
|
||||||
|
"file-video": [384, 512, [], "f1c8", "M369.941 97.941l-83.882-83.882A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v416c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48V131.882a48 48 0 0 0-14.059-33.941zM332.118 128H256V51.882L332.118 128zM48 464V48h160v104c0 13.255 10.745 24 24 24h104v288H48zm228.687-211.303L224 305.374V268c0-11.046-8.954-20-20-20H100c-11.046 0-20 8.954-20 20v104c0 11.046 8.954 20 20 20h104c11.046 0 20-8.954 20-20v-37.374l52.687 52.674C286.704 397.318 304 390.28 304 375.986V264.011c0-14.311-17.309-21.319-27.313-11.314z"],
|
||||||
|
"file-word": [384, 512, [], "f1c2", "M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm220.1-208c-5.7 0-10.6 4-11.7 9.5-20.6 97.7-20.4 95.4-21 103.5-.2-1.2-.4-2.6-.7-4.3-.8-5.1.3.2-23.6-99.5-1.3-5.4-6.1-9.2-11.7-9.2h-13.3c-5.5 0-10.3 3.8-11.7 9.1-24.4 99-24 96.2-24.8 103.7-.1-1.1-.2-2.5-.5-4.2-.7-5.2-14.1-73.3-19.1-99-1.1-5.6-6-9.7-11.8-9.7h-16.8c-7.8 0-13.5 7.3-11.7 14.8 8 32.6 26.7 109.5 33.2 136 1.3 5.4 6.1 9.1 11.7 9.1h25.2c5.5 0 10.3-3.7 11.6-9.1l17.9-71.4c1.5-6.2 2.5-12 3-17.3l2.9 17.3c.1.4 12.6 50.5 17.9 71.4 1.3 5.3 6.1 9.1 11.6 9.1h24.7c5.5 0 10.3-3.7 11.6-9.1 20.8-81.9 30.2-119 34.5-136 1.9-7.6-3.8-14.9-11.6-14.9h-15.8z"],
|
||||||
|
"flag": [512, 512, [], "f024", "M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z"],
|
||||||
|
"flushed": [496, 512, [], "f579", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm96-312c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm-112 24c0-44.2-35.8-80-80-80s-80 35.8-80 80 35.8 80 80 80 80-35.8 80-80zm-80 48c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zm160 144H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z"],
|
||||||
|
"folder": [512, 512, [], "f07b", "M464 128H272l-54.63-54.63c-6-6-14.14-9.37-22.63-9.37H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zm0 272H48V112h140.12l54.63 54.63c6 6 14.14 9.37 22.63 9.37H464v224z"],
|
||||||
|
"folder-open": [576, 512, [], "f07c", "M527.9 224H480v-48c0-26.5-21.5-48-48-48H272l-64-64H48C21.5 64 0 85.5 0 112v288c0 26.5 21.5 48 48 48h400c16.5 0 31.9-8.5 40.7-22.6l79.9-128c20-31.9-3-73.4-40.7-73.4zM48 118c0-3.3 2.7-6 6-6h134.1l64 64H426c3.3 0 6 2.7 6 6v42H152c-16.8 0-32.4 8.8-41.1 23.2L48 351.4zm400 282H72l77.2-128H528z"],
|
||||||
|
"font-awesome-logo-full": [3992, 512, ["Font Awesome"], "f4e6", "M454.6 0H57.4C25.9 0 0 25.9 0 57.4v397.3C0 486.1 25.9 512 57.4 512h397.3c31.4 0 57.4-25.9 57.4-57.4V57.4C512 25.9 486.1 0 454.6 0zm-58.9 324.9c0 4.8-4.1 6.9-8.9 8.9-19.2 8.1-39.7 15.7-61.5 15.7-40.5 0-68.7-44.8-163.2 2.5v51.8c0 30.3-45.7 30.2-45.7 0v-250c-9-7-15-17.9-15-30.3 0-21 17.1-38.2 38.2-38.2 21 0 38.2 17.1 38.2 38.2 0 12.2-5.8 23.2-14.9 30.2v21c37.1-12 65.5-34.4 146.1-3.4 26.6 11.4 68.7-15.7 76.5-15.7 5.5 0 10.3 4.1 10.3 8.9v160.4zm432.9-174.2h-137v70.1H825c39.8 0 40.4 62.2 0 62.2H691.6v105.6c0 45.5-70.7 46.4-70.7 0V128.3c0-22 18-39.8 39.8-39.8h167.8c39.6 0 40.5 62.2.1 62.2zm191.1 23.4c-169.3 0-169.1 252.4 0 252.4 169.9 0 169.9-252.4 0-252.4zm0 196.1c-81.6 0-82.1-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm372.4 53.4c-17.5 0-31.4-13.9-31.4-31.4v-117c0-62.4-72.6-52.5-99.1-16.4v133.4c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c43.3-51.6 162.4-60.4 162.4 39.3v141.5c.3 30.4-31.5 31.4-31.7 31.4zm179.7 2.9c-44.3 0-68.3-22.9-68.3-65.8V235.2H1488c-35.6 0-36.7-55.3 0-55.3h15.5v-37.3c0-41.3 63.8-42.1 63.8 0v37.5h24.9c35.4 0 35.7 55.3 0 55.3h-24.9v108.5c0 29.6 26.1 26.3 27.4 26.3 31.4 0 52.6 56.3-22.9 56.3zM1992 123c-19.5-50.2-95.5-50-114.5 0-107.3 275.7-99.5 252.7-99.5 262.8 0 42.8 58.3 51.2 72.1 14.4l13.5-35.9H2006l13 35.9c14.2 37.7 72.1 27.2 72.1-14.4 0-10.1 5.3 6.8-99.1-262.8zm-108.9 179.1l51.7-142.9 51.8 142.9h-103.5zm591.3-85.6l-53.7 176.3c-12.4 41.2-72 41-84 0l-42.3-135.9-42.3 135.9c-12.4 40.9-72 41.2-84.5 0l-54.2-176.3c-12.5-39.4 49.8-56.1 60.2-16.9L2213 342l45.3-139.5c10.9-32.7 59.6-34.7 71.2 0l45.3 139.5 39.3-142.4c10.3-38.3 72.6-23.8 60.3 16.9zm275.4 75.1c0-42.4-33.9-117.5-119.5-117.5-73.2 0-124.4 56.3-124.4 126 0 77.2 55.3 126.4 128.5 126.4 31.7 0 93-11.5 93-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-109 8.4-115.9-43.8h148.3c16.3 0 29.3-13.4 29.3-28.9zM2571 277.7c9.5-73.4 113.9-68.6 118.6 0H2571zm316.7 148.8c-31.4 0-81.6-10.5-96.6-31.9-12.4-17 2.5-39.8 21.8-39.8 16.3 0 36.8 22.9 77.7 22.9 27.4 0 40.4-11 40.4-25.8 0-39.8-142.9-7.4-142.9-102 0-40.4 35.3-75.7 98.6-75.7 31.4 0 74.1 9.9 87.6 29.4 10.8 14.8-1.4 36.2-20.9 36.2-15.1 0-26.7-17.3-66.2-17.3-22.9 0-37.8 10.5-37.8 23.8 0 35.9 142.4 6 142.4 103.1-.1 43.7-37.4 77.1-104.1 77.1zm266.8-252.4c-169.3 0-169.1 252.4 0 252.4 170.1 0 169.6-252.4 0-252.4zm0 196.1c-81.8 0-82-139.8 0-139.8 82.5 0 82.4 139.8 0 139.8zm476.9 22V268.7c0-53.8-61.4-45.8-85.7-10.5v134c0 41.3-63.8 42.1-63.8 0V268.7c0-52.1-59.5-47.4-85.7-10.1v133.6c0 41.5-63.3 41.8-63.3 0V208c0-40 63.1-41.6 63.1 0v3.4c9.9-14.4 41.8-37.3 78.6-37.3 35.3 0 57.7 16.4 66.7 43.8 13.9-21.8 45.8-43.8 82.6-43.8 44.3 0 70.7 23.4 70.7 72.7v145.3c.5 17.3-13.5 31.4-31.9 31.4 3.5.1-31.3 1.1-31.3-31.3zM3992 291.6c0-42.4-32.4-117.5-117.9-117.5-73.2 0-127.5 56.3-127.5 126 0 77.2 58.3 126.4 131.6 126.4 31.7 0 91.5-11.5 91.5-39.8 0-18.3-21.1-31.5-39.3-22.4-49.4 26.2-110.5 8.4-117.5-43.8h149.8c16.3 0 29.1-13.4 29.3-28.9zm-180.5-13.9c9.7-74.4 115.9-68.3 120.1 0h-120.1z"],
|
||||||
|
"frown": [496, 512, [], "f119", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z"],
|
||||||
|
"frown-open": [496, 512, [], "f57a", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-48-248c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 112c-35.6 0-88.8 21.3-95.8 61.2-2 11.8 9 21.5 20.5 18.1 31.2-9.6 59.4-15.3 75.3-15.3s44.1 5.7 75.3 15.3c11.4 3.5 22.5-6.3 20.5-18.1-7-39.9-60.2-61.2-95.8-61.2z"],
|
||||||
|
"futbol": [496, 512, [], "f1e3", "M483.8 179.4C449.8 74.6 352.6 8 248.1 8c-25.4 0-51.2 3.9-76.7 12.2C41.2 62.5-30.1 202.4 12.2 332.6 46.2 437.4 143.4 504 247.9 504c25.4 0 51.2-3.9 76.7-12.2 130.2-42.3 201.5-182.2 159.2-312.4zm-74.5 193.7l-52.2 6.4-43.7-60.9 24.4-75.2 71.1-22.1 38.9 36.4c-.2 30.7-7.4 61.1-21.7 89.2-4.7 9.3-10.7 17.8-16.8 26.2zm0-235.4l-10.4 53.1-70.7 22-64.2-46.5V92.5l47.4-26.2c39.2 13 73.4 38 97.9 71.4zM184.9 66.4L232 92.5v73.8l-64.2 46.5-70.6-22-10.1-52.5c24.3-33.4 57.9-58.6 97.8-71.9zM139 379.5L85.9 373c-14.4-20.1-37.3-59.6-37.8-115.3l39-36.4 71.1 22.2 24.3 74.3-43.5 61.7zm48.2 67l-22.4-48.1 43.6-61.7H287l44.3 61.7-22.4 48.1c-6.2 1.8-57.6 20.4-121.7 0z"],
|
||||||
|
"gem": [576, 512, [], "f3a5", "M464 0H112c-4 0-7.8 2-10 5.4L2 152.6c-2.9 4.4-2.6 10.2.7 14.2l276 340.8c4.8 5.9 13.8 5.9 18.6 0l276-340.8c3.3-4.1 3.6-9.8.7-14.2L474.1 5.4C471.8 2 468.1 0 464 0zm-19.3 48l63.3 96h-68.4l-51.7-96h56.8zm-202.1 0h90.7l51.7 96H191l51.6-96zm-111.3 0h56.8l-51.7 96H68l63.3-96zm-43 144h51.4L208 352 88.3 192zm102.9 0h193.6L288 435.3 191.2 192zM368 352l68.2-160h51.4L368 352z"],
|
||||||
|
"grimace": [496, 512, [], "f57f", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm16 16H152c-26.5 0-48 21.5-48 48v32c0 26.5 21.5 48 48 48h192c26.5 0 48-21.5 48-48v-32c0-26.5-21.5-48-48-48zm-168 96h-24c-8.8 0-16-7.2-16-16v-8h40v24zm0-40h-40v-8c0-8.8 7.2-16 16-16h24v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm64 40h-48v-24h48v24zm0-40h-48v-24h48v24zm56 24c0 8.8-7.2 16-16 16h-24v-24h40v8zm0-24h-40v-24h24c8.8 0 16 7.2 16 16v8z"],
|
||||||
|
"grin": [496, 512, [], "f580", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32z"],
|
||||||
|
"grin-alt": [496, 512, [], "f581", "M200.3 248c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zm128 0c12.4-18.7 15.1-37.3 15.7-56-.5-18.7-3.3-37.3-15.7-56-8-12-25.1-11.4-32.7 0-12.4 18.7-15.1 37.3-15.7 56 .5 18.7 3.3 37.3 15.7 56 8.1 12 25.2 11.4 32.7 0zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3z"],
|
||||||
|
"grin-beam": [496, 512, [], "f582", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-235.9-72.9c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3zm160 0c3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3z"],
|
||||||
|
"grin-beam-sweat": [496, 512, [], "f583", "M440 160c29.5 0 53.3-26.3 53.3-58.7 0-25-31.7-75.5-46.2-97.3-3.6-5.3-10.7-5.3-14.2 0-14.5 21.8-46.2 72.3-46.2 97.3 0 32.4 23.8 58.7 53.3 58.7zM248 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zm105.3-52.9c-24.6 15.7-46 12.9-46.4 12.9 6.9 20.2 10.8 41.8 10.8 64.3 0 110.3-89.7 200-200 200S48 366.3 48 256 137.7 56 248 56c39.8 0 76.8 11.8 108 31.9 1.7-9.5 6.3-24.1 17.2-45.7C336.4 20.6 293.7 8 248 8 111 8 0 119 0 256s111 248 248 248 248-111 248-248c0-27-4.4-52.9-12.4-77.2zM168 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z"],
|
||||||
|
"grin-hearts": [496, 512, [], "f584", "M353.6 304.6c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-152.8-48.9c4.5 1.2 9.2-1.5 10.5-6l19.4-69.9c5.6-20.3-7.4-41.1-28.8-44.5-18.6-3-36.4 9.8-41.5 27.9l-2 7.1-7.1-1.9c-18.2-4.7-38.2 4.3-44.9 22-7.7 20.2 3.8 41.9 24.2 47.2l70.2 18.1zm188.8-65.3c-6.7-17.6-26.7-26.7-44.9-22l-7.1 1.9-2-7.1c-5-18.1-22.8-30.9-41.5-27.9-21.4 3.4-34.4 24.2-28.8 44.5l19.4 69.9c1.2 4.5 5.9 7.2 10.5 6l70.2-18.2c20.4-5.3 31.9-26.9 24.2-47.1zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200z"],
|
||||||
|
"grin-squint": [496, 512, [], "f585", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.4-17.7 15.3 7.9 47.1 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-234.7-40.8c3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3l-80-48c-5.1-3-11.4-1.9-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11.1.1 15.5zm242.9 2.5c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11-.1-15.5-3.8-4.4-10.2-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48z"],
|
||||||
|
"grin-squint-tears": [512, 512, [], "f586", "M117.1 384.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 479 124.3 420.8 128 395c.8-6.4-4.6-11.8-10.9-10.9zm-41.2-41.7C40.3 268 53 176.1 114.6 114.6 152.4 76.8 202.6 56 256 56c36.2 0 70.8 9.8 101.2 27.7 3.8-20.3 8-36.1 12-48.3C333.8 17.2 294.9 8 256 8 192.5 8 129.1 32.2 80.6 80.6c-74.1 74.1-91.3 183.4-52 274 12.2-4.1 27.7-8.3 47.3-12.2zm352.3-187.6c45 76.6 34.9 176.9-30.8 242.6-37.8 37.8-88 58.6-141.4 58.6-30.5 0-59.8-7-86.4-19.8-3.9 19.5-8 35-12.2 47.2 31.4 13.6 65 20.6 98.7 20.6 63.5 0 126.9-24.2 175.4-72.6 78.1-78.1 93.1-195.4 45.2-288.6-12.3 4-28.2 8.1-48.5 12zm-33.3-26.9c25.8-3.7 84-13.7 100.9-30.6 21.9-21.9 21.5-57.9-.9-80.3s-58.3-22.8-80.3-.9C397.7 33 387.7 91.2 384 117c-.8 6.4 4.6 11.8 10.9 10.9zm-187 108.3c-3-3-7.2-4.2-11.4-3.2L106 255.7c-5.7 1.4-9.5 6.7-9.1 12.6.5 5.8 5.1 10.5 10.9 11l52.3 4.8 4.8 52.3c.5 5.8 5.2 10.4 11 10.9h.9c5.5 0 10.3-3.7 11.7-9.1l22.6-90.5c1-4.2-.2-8.5-3.2-11.5zm39.7-25.1l90.5-22.6c5.7-1.4 9.5-6.7 9.1-12.6-.5-5.8-5.1-10.5-10.9-11l-52.3-4.8-4.8-52.3c-.5-5.8-5.2-10.4-11-10.9-5.6-.1-11.2 3.4-12.6 9.1L233 196.5c-1 4.1.2 8.4 3.2 11.4 5 5 11.3 3.2 11.4 3.2zm52 88.5c-29.1 29.1-59.7 52.9-83.9 65.4-9.2 4.8-10 17.5-1.7 23.4 38.9 27.7 107 6.2 143.7-30.6S416 253 388.3 214.1c-5.8-8.2-18.5-7.6-23.4 1.7-12.3 24.2-36.2 54.7-65.3 83.8z"],
|
||||||
|
"grin-stars": [496, 512, [], "f587", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm105.6-151.4c-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 7.9 47.2 71.3 80 123.3 80s115.3-32.9 123.3-80c1.6-9.8-7.7-18.4-17.7-15.3zm-227.9-57.5c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.5 1.9-12.2-4.3-13.2l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6.1 34.9zm259.7-72.7l-34.9-5-15.5-31.6c-2.9-5.8-11-5.8-13.9 0l-15.5 31.6-34.9 5c-6.2.9-8.9 8.6-4.3 13.2l25.4 24.6-6 34.9c-1 6.2 5.4 11 11 7.9l31.3-16.3 31.3 16.3c5.6 3.1 12-1.7 11-7.9l-6-34.9 25.4-24.6c4.5-4.6 1.8-12.2-4.4-13.2z"],
|
||||||
|
"grin-tears": [640, 512, [], "f588", "M117.1 256.1c-25.8 3.7-84 13.7-100.9 30.6-21.9 21.9-21.5 57.9.9 80.3s58.3 22.8 80.3.9C114.3 351 124.3 292.8 128 267c.8-6.4-4.6-11.8-10.9-10.9zm506.7 30.6c-16.9-16.9-75.1-26.9-100.9-30.6-6.3-.9-11.7 4.5-10.8 10.8 3.7 25.8 13.7 84 30.6 100.9 21.9 21.9 57.9 21.5 80.3-.9 22.3-22.3 22.7-58.3.8-80.2zm-126.6 61.7C463.8 412.3 396.9 456 320 456c-76.9 0-143.8-43.7-177.2-107.6-12.5 37.4-25.2 43.9-28.3 46.5C159.1 460.7 234.5 504 320 504s160.9-43.3 205.5-109.1c-3.2-2.7-15.9-9.2-28.3-46.5zM122.7 224.5C137.9 129.2 220.5 56 320 56c99.5 0 182.1 73.2 197.3 168.5 2.1-.2 5.2-2.4 49.5 7C554.4 106 448.7 8 320 8S85.6 106 73.2 231.4c44.5-9.4 47.1-7.2 49.5-6.9zM320 400c51.9 0 115.3-32.9 123.3-80 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.8-3.1-19.4 5.3-17.7 15.3 8 47.1 71.4 80 123.3 80zm130.3-168.3c3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.6 6.2 4.6 9.3 3.7zM240 189.4c12.3 0 23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.8 19.2-21.6 31.5-21.6z"],
|
||||||
|
"grin-tongue": [496, 512, [], "f589", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zM168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z"],
|
||||||
|
"grin-tongue-squint": [496, 512, [], "f58a", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3zm36.9-281.1c-3.8-4.4-10.3-5.5-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.7 1.7 15.3-2.5 3.8-4.5 3.8-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zm-162.9 45.5l-80-48c-5-3-11.4-2-15.3 2.5-3.8 4.5-3.8 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.6 4.2 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3s-2.2-8.1-5.8-10.3z"],
|
||||||
|
"grin-tongue-wink": [496, 512, [], "f58b", "M152 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm176-52c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80zm0 128c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-72c-13.3 0-24 10.7-24 24s10.7 24 24 24 24-10.7 24-24-10.7-24-24-24zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm64 400c0 35.6-29.1 64.5-64.9 64-35.1-.5-63.1-29.8-63.1-65v-42.8l17.7-8.8c15-7.5 31.5 1.7 34.9 16.5l2.8 12.1c2.1 9.2 15.2 9.2 17.3 0l2.8-12.1c3.4-14.8 19.8-24.1 34.9-16.5l17.7 8.8V408zm28.2 25.3c2.2-8.1 3.8-16.5 3.8-25.3v-43.5c14.2-12.4 24.4-27.5 27.3-44.5 1.7-9.9-7.7-18.5-17.7-15.3-25.9 8.3-64.4 13.1-105.6 13.1s-79.6-4.8-105.6-13.1c-9.9-3.1-19.4 5.3-17.7 15.3 2.9 17 13.1 32.1 27.3 44.5V408c0 8.8 1.6 17.2 3.8 25.3C91.8 399.9 48 333 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 77-43.8 143.9-107.8 177.3z"],
|
||||||
|
"grin-wink": [496, 512, [], "f58c", "M328 180c-25.69 0-55.88 16.92-59.86 42.12-1.75 11.22 11.5 18.24 19.83 10.84l9.55-8.48c14.81-13.19 46.16-13.19 60.97 0l9.55 8.48c8.48 7.43 21.56.25 19.83-10.84C383.88 196.92 353.69 180 328 180zm-160 60c17.67 0 32-14.33 32-32s-14.33-32-32-32-32 14.33-32 32 14.33 32 32 32zm185.55 64.64c-25.93 8.3-64.4 13.06-105.55 13.06s-79.62-4.75-105.55-13.06c-9.94-3.13-19.4 5.37-17.71 15.34C132.67 367.13 196.06 400 248 400s115.33-32.87 123.26-80.02c1.68-9.89-7.67-18.48-17.71-15.34zM248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 448c-110.28 0-200-89.72-200-200S137.72 56 248 56s200 89.72 200 200-89.72 200-200 200z"],
|
||||||
|
"hand-lizard": [576, 512, [], "f258", "M556.686 290.542L410.328 64.829C397.001 44.272 374.417 32 349.917 32H56C25.121 32 0 57.122 0 88v8c0 44.112 35.888 80 80 80h196.042l-18.333 48H144c-48.523 0-88 39.477-88 88 0 30.879 25.121 56 56 56h131.552c2.987 0 5.914.549 8.697 1.631L352 408.418V480h224V355.829c0-23.225-6.679-45.801-19.314-65.287zM528 432H400v-23.582c0-19.948-12.014-37.508-30.604-44.736l-99.751-38.788A71.733 71.733 0 0 0 243.552 320H112c-4.411 0-8-3.589-8-8 0-22.056 17.944-40 40-40h113.709c19.767 0 37.786-12.407 44.84-30.873l24.552-64.281c8.996-23.553-8.428-48.846-33.63-48.846H80c-17.645 0-32-14.355-32-32v-8c0-4.411 3.589-8 8-8h293.917c8.166 0 15.693 4.09 20.137 10.942l146.358 225.715A71.84 71.84 0 0 1 528 355.829V432z"],
|
||||||
|
"hand-paper": [448, 512, [], "f256", "M372.57 112.641v-10.825c0-43.612-40.52-76.691-83.039-65.546-25.629-49.5-94.09-47.45-117.982.747C130.269 26.456 89.144 57.945 89.144 102v126.13c-19.953-7.427-43.308-5.068-62.083 8.871-29.355 21.796-35.794 63.333-14.55 93.153L132.48 498.569a32 32 0 0 0 26.062 13.432h222.897c14.904 0 27.835-10.289 31.182-24.813l30.184-130.958A203.637 203.637 0 0 0 448 310.564V179c0-40.62-35.523-71.992-75.43-66.359zm27.427 197.922c0 11.731-1.334 23.469-3.965 34.886L368.707 464h-201.92L51.591 302.303c-14.439-20.27 15.023-42.776 29.394-22.605l27.128 38.079c8.995 12.626 29.031 6.287 29.031-9.283V102c0-25.645 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V67c0-25.663 36.571-24.81 36.571.691V256c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16V101.125c0-25.672 36.57-24.81 36.57.691V256c0 8.837 7.163 16 16 16h6.857c8.837 0 16-7.163 16-16v-76.309c0-26.242 36.57-25.64 36.57-.691v131.563z"],
|
||||||
|
"hand-peace": [448, 512, [], "f25b", "M362.146 191.976c-13.71-21.649-38.761-34.016-65.006-30.341V74c0-40.804-32.811-74-73.141-74-40.33 0-73.14 33.196-73.14 74L160 168l-18.679-78.85C126.578 50.843 83.85 32.11 46.209 47.208 8.735 62.238-9.571 104.963 5.008 142.85l55.757 144.927c-30.557 24.956-43.994 57.809-24.733 92.218l54.853 97.999C102.625 498.97 124.73 512 148.575 512h205.702c30.744 0 57.558-21.44 64.555-51.797l27.427-118.999a67.801 67.801 0 0 0 1.729-15.203L448 256c0-44.956-43.263-77.343-85.854-64.024zM399.987 326c0 1.488-.169 2.977-.502 4.423l-27.427 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H148.575c-6.486 0-12.542-3.621-15.805-9.449l-54.854-98c-4.557-8.141-2.619-18.668 4.508-24.488l26.647-21.764a16 16 0 0 0 4.812-18.139l-64.09-166.549C37.226 92.956 84.37 74.837 96.51 106.389l59.784 155.357A16 16 0 0 0 171.227 272h11.632c8.837 0 16-7.163 16-16V74c0-34.375 50.281-34.43 50.281 0v182c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16v-28c0-25.122 36.567-25.159 36.567 0v28c0 8.837 7.163 16 16 16h6.856c8.837 0 16-7.163 16-16 0-25.12 36.567-25.16 36.567 0v70z"],
|
||||||
|
"hand-point-down": [448, 512, [], "f0a7", "M188.8 512c45.616 0 83.2-37.765 83.2-83.2v-35.647a93.148 93.148 0 0 0 22.064-7.929c22.006 2.507 44.978-3.503 62.791-15.985C409.342 368.1 448 331.841 448 269.299V248c0-60.063-40-98.512-40-127.2v-2.679c4.952-5.747 8-13.536 8-22.12V32c0-17.673-12.894-32-28.8-32H156.8C140.894 0 128 14.327 128 32v64c0 8.584 3.048 16.373 8 22.12v2.679c0 6.964-6.193 14.862-23.668 30.183l-.148.129-.146.131c-9.937 8.856-20.841 18.116-33.253 25.851C48.537 195.798 0 207.486 0 252.8c0 56.928 35.286 92 83.2 92 8.026 0 15.489-.814 22.4-2.176V428.8c0 45.099 38.101 83.2 83.2 83.2zm0-48c-18.7 0-35.2-16.775-35.2-35.2V270.4c-17.325 0-35.2 26.4-70.4 26.4-26.4 0-35.2-20.625-35.2-44 0-8.794 32.712-20.445 56.1-34.926 14.575-9.074 27.225-19.524 39.875-30.799 18.374-16.109 36.633-33.836 39.596-59.075h176.752C364.087 170.79 400 202.509 400 248v21.299c0 40.524-22.197 57.124-61.325 50.601-8.001 14.612-33.979 24.151-53.625 12.925-18.225 19.365-46.381 17.787-61.05 4.95V428.8c0 18.975-16.225 35.2-35.2 35.2zM328 64c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z"],
|
||||||
|
"hand-point-left": [512, 512, [], "f0a5", "M0 220.8C0 266.416 37.765 304 83.2 304h35.647a93.148 93.148 0 0 0 7.929 22.064c-2.507 22.006 3.503 44.978 15.985 62.791C143.9 441.342 180.159 480 242.701 480H264c60.063 0 98.512-40 127.2-40h2.679c5.747 4.952 13.536 8 22.12 8h64c17.673 0 32-12.894 32-28.8V188.8c0-15.906-14.327-28.8-32-28.8h-64c-8.584 0-16.373 3.048-22.12 8H391.2c-6.964 0-14.862-6.193-30.183-23.668l-.129-.148-.131-.146c-8.856-9.937-18.116-20.841-25.851-33.253C316.202 80.537 304.514 32 259.2 32c-56.928 0-92 35.286-92 83.2 0 8.026.814 15.489 2.176 22.4H83.2C38.101 137.6 0 175.701 0 220.8zm48 0c0-18.7 16.775-35.2 35.2-35.2h158.4c0-17.325-26.4-35.2-26.4-70.4 0-26.4 20.625-35.2 44-35.2 8.794 0 20.445 32.712 34.926 56.1 9.074 14.575 19.524 27.225 30.799 39.875 16.109 18.374 33.836 36.633 59.075 39.596v176.752C341.21 396.087 309.491 432 264 432h-21.299c-40.524 0-57.124-22.197-50.601-61.325-14.612-8.001-24.151-33.979-12.925-53.625-19.365-18.225-17.787-46.381-4.95-61.05H83.2C64.225 256 48 239.775 48 220.8zM448 360c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z"],
|
||||||
|
"hand-point-right": [512, 512, [], "f0a4", "M428.8 137.6h-86.177a115.52 115.52 0 0 0 2.176-22.4c0-47.914-35.072-83.2-92-83.2-45.314 0-57.002 48.537-75.707 78.784-7.735 12.413-16.994 23.317-25.851 33.253l-.131.146-.129.148C135.662 161.807 127.764 168 120.8 168h-2.679c-5.747-4.952-13.536-8-22.12-8H32c-17.673 0-32 12.894-32 28.8v230.4C0 435.106 14.327 448 32 448h64c8.584 0 16.373-3.048 22.12-8h2.679c28.688 0 67.137 40 127.2 40h21.299c62.542 0 98.8-38.658 99.94-91.145 12.482-17.813 18.491-40.785 15.985-62.791A93.148 93.148 0 0 0 393.152 304H428.8c45.435 0 83.2-37.584 83.2-83.2 0-45.099-38.101-83.2-83.2-83.2zm0 118.4h-91.026c12.837 14.669 14.415 42.825-4.95 61.05 11.227 19.646 1.687 45.624-12.925 53.625 6.524 39.128-10.076 61.325-50.6 61.325H248c-45.491 0-77.21-35.913-120-39.676V215.571c25.239-2.964 42.966-21.222 59.075-39.596 11.275-12.65 21.725-25.3 30.799-39.875C232.355 112.712 244.006 80 252.8 80c23.375 0 44 8.8 44 35.2 0 35.2-26.4 53.075-26.4 70.4h158.4c18.425 0 35.2 16.5 35.2 35.2 0 18.975-16.225 35.2-35.2 35.2zM88 384c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z"],
|
||||||
|
"hand-point-up": [448, 512, [], "f0a6", "M105.6 83.2v86.177a115.52 115.52 0 0 0-22.4-2.176c-47.914 0-83.2 35.072-83.2 92 0 45.314 48.537 57.002 78.784 75.707 12.413 7.735 23.317 16.994 33.253 25.851l.146.131.148.129C129.807 376.338 136 384.236 136 391.2v2.679c-4.952 5.747-8 13.536-8 22.12v64c0 17.673 12.894 32 28.8 32h230.4c15.906 0 28.8-14.327 28.8-32v-64c0-8.584-3.048-16.373-8-22.12V391.2c0-28.688 40-67.137 40-127.2v-21.299c0-62.542-38.658-98.8-91.145-99.94-17.813-12.482-40.785-18.491-62.791-15.985A93.148 93.148 0 0 0 272 118.847V83.2C272 37.765 234.416 0 188.8 0c-45.099 0-83.2 38.101-83.2 83.2zm118.4 0v91.026c14.669-12.837 42.825-14.415 61.05 4.95 19.646-11.227 45.624-1.687 53.625 12.925 39.128-6.524 61.325 10.076 61.325 50.6V264c0 45.491-35.913 77.21-39.676 120H183.571c-2.964-25.239-21.222-42.966-39.596-59.075-12.65-11.275-25.3-21.725-39.875-30.799C80.712 279.645 48 267.994 48 259.2c0-23.375 8.8-44 35.2-44 35.2 0 53.075 26.4 70.4 26.4V83.2c0-18.425 16.5-35.2 35.2-35.2 18.975 0 35.2 16.225 35.2 35.2zM352 424c13.255 0 24 10.745 24 24s-10.745 24-24 24-24-10.745-24-24 10.745-24 24-24z"],
|
||||||
|
"hand-pointer": [448, 512, [], "f25a", "M358.182 179.361c-19.493-24.768-52.679-31.945-79.872-19.098-15.127-15.687-36.182-22.487-56.595-19.629V67c0-36.944-29.736-67-66.286-67S89.143 30.056 89.143 67v161.129c-19.909-7.41-43.272-5.094-62.083 8.872-29.355 21.795-35.793 63.333-14.55 93.152l109.699 154.001C134.632 501.59 154.741 512 176 512h178.286c30.802 0 57.574-21.5 64.557-51.797l27.429-118.999A67.873 67.873 0 0 0 448 326v-84c0-46.844-46.625-79.273-89.818-62.639zM80.985 279.697l27.126 38.079c8.995 12.626 29.031 6.287 29.031-9.283V67c0-25.12 36.571-25.16 36.571 0v175c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16v-35c0-25.12 36.571-25.16 36.571 0v35c0 8.836 7.163 16 16 16H272c8.837 0 16-7.164 16-16v-21c0-25.12 36.571-25.16 36.571 0v21c0 8.836 7.163 16 16 16h6.857c8.837 0 16-7.164 16-16 0-25.121 36.571-25.16 36.571 0v84c0 1.488-.169 2.977-.502 4.423l-27.43 119.001c-1.978 8.582-9.29 14.576-17.782 14.576H176c-5.769 0-11.263-2.878-14.697-7.697l-109.712-154c-14.406-20.223 14.994-42.818 29.394-22.606zM176.143 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.733 0-14-7.163-14-16zm75.428 0v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16zM327 400v-96c0-8.837 6.268-16 14-16h6c7.732 0 14 7.163 14 16v96c0 8.837-6.268 16-14 16h-6c-7.732 0-14-7.163-14-16z"],
|
||||||
|
"hand-rock": [512, 512, [], "f255", "M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z"],
|
||||||
|
"hand-scissors": [512, 512, [], "f257", "M256 480l70-.013c5.114 0 10.231-.583 15.203-1.729l118.999-27.427C490.56 443.835 512 417.02 512 386.277V180.575c0-23.845-13.03-45.951-34.005-57.69l-97.999-54.853c-34.409-19.261-67.263-5.824-92.218 24.733L142.85 37.008c-37.887-14.579-80.612 3.727-95.642 41.201-15.098 37.642 3.635 80.37 41.942 95.112L168 192l-94-9.141c-40.804 0-74 32.811-74 73.14 0 40.33 33.196 73.141 74 73.141h87.635c-3.675 26.245 8.692 51.297 30.341 65.006C178.657 436.737 211.044 480 256 480zm0-48.013c-25.16 0-25.12-36.567 0-36.567 8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16h-28c-25.159 0-25.122-36.567 0-36.567h28c8.837 0 16-7.163 16-16v-6.856c0-8.837-7.163-16-16-16H74c-34.43 0-34.375-50.281 0-50.281h182c8.837 0 16-7.163 16-16v-11.632a16 16 0 0 0-10.254-14.933L106.389 128.51c-31.552-12.14-13.432-59.283 19.222-46.717l166.549 64.091a16.001 16.001 0 0 0 18.139-4.812l21.764-26.647c5.82-7.127 16.348-9.064 24.488-4.508l98 54.854c5.828 3.263 9.449 9.318 9.449 15.805v205.701c0 8.491-5.994 15.804-14.576 17.782l-119.001 27.427a19.743 19.743 0 0 1-4.423.502h-70z"],
|
||||||
|
"hand-spock": [512, 512, [], "f259", "M501.03053,116.17605c-19.39059-31.50779-51.24406-35.72849-66.31044-35.01756-14.11325-50.81051-62.0038-54.08-70.73816-54.08a74.03091,74.03091,0,0,0-72.23816,58.916l-4.64648,22.66014-13.68357-53.207c-9.09569-35.37107-46.412-64.05074-89.66-53.07223a73.89749,73.89749,0,0,0-55.121,78.94722,73.68273,73.68273,0,0,0-64.8495,94.42181l24.35933,82.19721c-38.24017-7.54492-62.79677,16.18358-68.11512,21.84764a73.6791,73.6791,0,0,0,3.19921,104.19329l91.36509,85.9765A154.164,154.164,0,0,0,220.62279,512h107.4549A127.30079,127.30079,0,0,0,452.3392,413.86139l57.623-241.96272A73.20274,73.20274,0,0,0,501.03053,116.17605Zm-37.7597,44.60544L405.64788,402.74812a79.46616,79.46616,0,0,1-77.57019,61.25972H220.62279a106.34052,106.34052,0,0,1-73.1366-28.998l-91.369-85.98041C31.34381,325.72669,66.61133,288.131,91.39644,311.5392l51.123,48.10739c5.42577,5.10937,13.48239.71679,13.48239-5.82617a246.79914,246.79914,0,0,0-10.17771-70.1523l-36.01362-121.539c-9.7324-32.88279,39.69916-47.27145,49.38664-14.625l31.3437,105.77923c5.59374,18.90428,33.78119,10.71288,28.9648-8.00781L177.06427,80.23662c-8.50389-33.1035,41.43157-45.64646,49.86515-12.83593l47.32609,184.035c4.42773,17.24218,29.16207,16.5039,32.71089-.80468l31.791-154.9706c6.81054-33.1074,57.51748-24.10741,50.11906,11.96288L360.32764,246.78924c-3.72265,18.10936,23.66793,24.63084,28.05659,6.21679L413.185,148.85962C421.1498,115.512,471.14,127.79713,463.27083,160.78149Z"],
|
||||||
|
"handshake": [640, 512, [], "f2b5", "M519.2 127.9l-47.6-47.6A56.252 56.252 0 0 0 432 64H205.2c-14.8 0-29.1 5.9-39.6 16.3L118 127.9H0v255.7h64c17.6 0 31.8-14.2 31.9-31.7h9.1l84.6 76.4c30.9 25.1 73.8 25.7 105.6 3.8 12.5 10.8 26 15.9 41.1 15.9 18.2 0 35.3-7.4 48.8-24 22.1 8.7 48.2 2.6 64-16.8l26.2-32.3c5.6-6.9 9.1-14.8 10.9-23h57.9c.1 17.5 14.4 31.7 31.9 31.7h64V127.9H519.2zM48 351.6c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16zm390-6.9l-26.1 32.2c-2.8 3.4-7.8 4-11.3 1.2l-23.9-19.4-30 36.5c-6 7.3-15 4.8-18 2.4l-36.8-31.5-15.6 19.2c-13.9 17.1-39.2 19.7-55.3 6.6l-97.3-88H96V175.8h41.9l61.7-61.6c2-.8 3.7-1.5 5.7-2.3H262l-38.7 35.5c-29.4 26.9-31.1 72.3-4.4 101.3 14.8 16.2 61.2 41.2 101.5 4.4l8.2-7.5 108.2 87.8c3.4 2.8 3.9 7.9 1.2 11.3zm106-40.8h-69.2c-2.3-2.8-4.9-5.4-7.7-7.7l-102.7-83.4 12.5-11.4c6.5-6 7-16.1 1-22.6L367 167.1c-6-6.5-16.1-6.9-22.6-1l-55.2 50.6c-9.5 8.7-25.7 9.4-34.6 0-9.3-9.9-8.5-25.1 1.2-33.9l65.6-60.1c7.4-6.8 17-10.5 27-10.5l83.7-.2c2.1 0 4.1.8 5.5 2.3l61.7 61.6H544v128zm48 47.7c-8.8 0-16-7.2-16-16s7.2-16 16-16 16 7.2 16 16c0 8.9-7.2 16-16 16z"],
|
||||||
|
"hdd": [576, 512, [], "f0a0", "M567.403 235.642L462.323 84.589A48 48 0 0 0 422.919 64H153.081a48 48 0 0 0-39.404 20.589L8.597 235.642A48.001 48.001 0 0 0 0 263.054V400c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V263.054c0-9.801-3-19.366-8.597-27.412zM153.081 112h269.838l77.913 112H75.168l77.913-112zM528 400H48V272h480v128zm-32-64c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32zm-96 0c0 17.673-14.327 32-32 32s-32-14.327-32-32 14.327-32 32-32 32 14.327 32 32z"],
|
||||||
|
"heart": [512, 512, [], "f004", "M458.4 64.3C400.6 15.7 311.3 23 256 79.3 200.7 23 111.4 15.6 53.6 64.3-21.6 127.6-10.6 230.8 43 285.5l175.4 178.7c10 10.2 23.4 15.9 37.6 15.9 14.3 0 27.6-5.6 37.6-15.8L469 285.6c53.5-54.7 64.7-157.9-10.6-221.3zm-23.6 187.5L259.4 430.5c-2.4 2.4-4.4 2.4-6.8 0L77.2 251.8c-36.5-37.2-43.9-107.6 7.3-150.7 38.9-32.7 98.9-27.8 136.5 10.5l35 35.7 35-35.7c37.8-38.5 97.8-43.2 136.5-10.6 51.1 43.1 43.5 113.9 7.3 150.8z"],
|
||||||
|
"hospital": [448, 512, [], "f0f8", "M128 244v-40c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v40c0 6.627-5.373 12-12 12h-40c-6.627 0-12-5.373-12-12zm140 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm-76 84v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm76 12h40c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12zm180 124v36H0v-36c0-6.627 5.373-12 12-12h19.5V85.035C31.5 73.418 42.245 64 55.5 64H144V24c0-13.255 10.745-24 24-24h112c13.255 0 24 10.745 24 24v40h88.5c13.255 0 24 9.418 24 21.035V464H436c6.627 0 12 5.373 12 12zM79.5 463H192v-67c0-6.627 5.373-12 12-12h40c6.627 0 12 5.373 12 12v67h112.5V112H304v24c0 13.255-10.745 24-24 24H168c-13.255 0-24-10.745-24-24v-24H79.5v351zM266 64h-26V38a6 6 0 0 0-6-6h-20a6 6 0 0 0-6 6v26h-26a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h26v26a6 6 0 0 0 6 6h20a6 6 0 0 0 6-6V96h26a6 6 0 0 0 6-6V70a6 6 0 0 0-6-6z"],
|
||||||
|
"hourglass": [384, 512, [], "f254", "M368 48h4c6.627 0 12-5.373 12-12V12c0-6.627-5.373-12-12-12H12C5.373 0 0 5.373 0 12v24c0 6.627 5.373 12 12 12h4c0 80.564 32.188 165.807 97.18 208C47.899 298.381 16 383.9 16 464h-4c-6.627 0-12 5.373-12 12v24c0 6.627 5.373 12 12 12h360c6.627 0 12-5.373 12-12v-24c0-6.627-5.373-12-12-12h-4c0-80.564-32.188-165.807-97.18-208C336.102 213.619 368 128.1 368 48zM64 48h256c0 101.62-57.307 184-128 184S64 149.621 64 48zm256 416H64c0-101.62 57.308-184 128-184s128 82.38 128 184z"],
|
||||||
|
"id-badge": [384, 512, [], "f2c1", "M336 0H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm0 464H48V48h288v416zM144 112h96c8.8 0 16-7.2 16-16s-7.2-16-16-16h-96c-8.8 0-16 7.2-16 16s7.2 16 16 16zm48 176c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z"],
|
||||||
|
"id-card": [576, 512, [], "f2c2", "M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 400H303.2c.9-4.5.8 3.6.8-22.4 0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6 0 26-.2 17.9.8 22.4H48V144h480v288zm-168-80h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm0-64h112c4.4 0 8-3.6 8-8v-16c0-4.4-3.6-8-8-8H360c-4.4 0-8 3.6-8 8v16c0 4.4 3.6 8 8 8zm-168 96c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64z"],
|
||||||
|
"image": [512, 512, [], "f03e", "M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm-6 336H54a6 6 0 0 1-6-6V118a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v276a6 6 0 0 1-6 6zM128 152c-22.091 0-40 17.909-40 40s17.909 40 40 40 40-17.909 40-40-17.909-40-40-40zM96 352h320v-80l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L192 304l-39.515-39.515c-4.686-4.686-12.284-4.686-16.971 0L96 304v48z"],
|
||||||
|
"images": [576, 512, [], "f302", "M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v48H54a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6v-10h48zm42-336H150a6 6 0 0 0-6 6v244a6 6 0 0 0 6 6h372a6 6 0 0 0 6-6V86a6 6 0 0 0-6-6zm6-48c26.51 0 48 21.49 48 48v256c0 26.51-21.49 48-48 48H144c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h384zM264 144c0 22.091-17.909 40-40 40s-40-17.909-40-40 17.909-40 40-40 40 17.909 40 40zm-72 96l39.515-39.515c4.686-4.686 12.284-4.686 16.971 0L288 240l103.515-103.515c4.686-4.686 12.284-4.686 16.971 0L480 208v80H192v-48z"],
|
||||||
|
"keyboard": [576, 512, [], "f11c", "M528 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h480c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm8 336c0 4.411-3.589 8-8 8H48c-4.411 0-8-3.589-8-8V112c0-4.411 3.589-8 8-8h480c4.411 0 8 3.589 8 8v288zM170 270v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-336 82v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm384 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zM122 188v-28c0-6.627-5.373-12-12-12H82c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm96 0v-28c0-6.627-5.373-12-12-12h-28c-6.627 0-12 5.373-12 12v28c0 6.627 5.373 12 12 12h28c6.627 0 12-5.373 12-12zm-98 158v-16c0-6.627-5.373-12-12-12H180c-6.627 0-12 5.373-12 12v16c0 6.627 5.373 12 12 12h216c6.627 0 12-5.373 12-12z"],
|
||||||
|
"kiss": [496, 512, [], "f596", "M168 176c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm136 132c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z"],
|
||||||
|
"kiss-beam": [496, 512, [], "f597", "M168 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm56-148c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36C290.6 335.3 304 321 304 308zm24-156c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2 7.2 5.6 8.3 3.5 1 7.5-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 5.9-4.5 5.6-8.3-3.1-42.1-32-71.4-55.8-71.4z"],
|
||||||
|
"kiss-wink-heart": [504, 512, [], "f598", "M304 308.5c0-19.2-28.8-41.5-71.5-44-3.8-.4-7.4 2.4-8.2 6.2-.9 3.8 1.1 7.7 4.7 9.2l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-5.7 2.4-6 12.2 0 14.8l16.9 7.2c13 5.5 20.8 13.5 20.8 21.5s-7.8 16-20.7 21.5l-17 7.2c-3.6 1.5-5.6 5.4-4.7 9.2.8 3.6 4.1 6.2 7.8 6.2h.5c42.8-2.5 71.5-24.8 71.5-44 0-13-13.4-27.3-35.2-36 21.7-9.1 35.1-23.4 35.1-36.4zm70.5-83.5l9.5 8.5c3.8 3.3 9.3 4 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 5.8 3.1 11.2.7 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0zM136 208.5c0 17.7 14.3 32 32 32s32-14.3 32-32-14.3-32-32-32-32 14.3-32 32zm365.1 194c-8-20.8-31.5-31.5-53.1-25.9l-8.4 2.2-2.3-8.4c-5.9-21.4-27-36.5-49-33-25.2 4-40.6 28.6-34 52.6l22.9 82.6c1.5 5.3 7 8.5 12.4 7.1l83-21.5c24.1-6.3 37.7-31.8 28.5-55.7zM334 436.3c-26.1 12.5-55.2 19.7-86 19.7-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200c0 22.1-3.7 43.3-10.4 63.2 9 6.4 17 14.2 22.6 23.9 6.4.1 12.6 1.4 18.6 2.9 10.9-27.9 17.1-58.2 17.1-90C496 119 385 8 248 8S0 119 0 256s111 248 248 248c35.4 0 68.9-7.5 99.4-20.9-2.5-7.3 4.3 17.2-13.4-46.8z"],
|
||||||
|
"laugh": [496, 512, [], "f599", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 224c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm-160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z"],
|
||||||
|
"laugh-beam": [496, 512, [], "f59a", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM328 152c-23.8 0-52.7 29.3-56 71.4-.7 8.6 10.8 11.9 14.9 4.5l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.1-42.1-32-71.4-55.8-71.4zm-201 75.9l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c4.1 7.4 15.6 4 14.9-4.5-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.6 8.5 10.9 11.9 15.1 4.5zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z"],
|
||||||
|
"laugh-squint": [496, 512, [], "f59b", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6S48 309.4 48 256s20.8-103.6 58.6-141.4S194.6 56 248 56s103.6 20.8 141.4 58.6S448 202.6 448 256s-20.8 103.6-58.6 141.4zM343.6 196l33.6-40.3c8.6-10.3-3.8-24.8-15.4-18l-80 48c-7.8 4.7-7.8 15.9 0 20.6l80 48c11.5 6.8 24-7.6 15.4-18L343.6 196zm-209.4 58.3l80-48c7.8-4.7 7.8-15.9 0-20.6l-80-48c-11.6-6.9-24 7.7-15.4 18l33.6 40.3-33.6 40.3c-8.7 10.4 3.8 24.8 15.4 18zM362.4 288H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z"],
|
||||||
|
"laugh-wink": [496, 512, [], "f59c", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm141.4 389.4c-37.8 37.8-88 58.6-141.4 58.6s-103.6-20.8-141.4-58.6C68.8 359.6 48 309.4 48 256s20.8-103.6 58.6-141.4C144.4 76.8 194.6 56 248 56s103.6 20.8 141.4 58.6c37.8 37.8 58.6 88 58.6 141.4s-20.8 103.6-58.6 141.4zM328 164c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1zm-160 60c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm194.4 64H133.6c-8.2 0-14.5 7-13.5 15 7.5 59.2 58.9 105 121.1 105h13.6c62.2 0 113.6-45.8 121.1-105 1-8-5.3-15-13.5-15z"],
|
||||||
|
"lemon": [512, 512, [], "f094", "M484.112 27.889C455.989-.233 416.108-8.057 387.059 8.865 347.604 31.848 223.504-41.111 91.196 91.197-41.277 223.672 31.923 347.472 8.866 387.058c-16.922 29.051-9.1 68.932 19.022 97.054 28.135 28.135 68.011 35.938 97.057 19.021 39.423-22.97 163.557 49.969 295.858-82.329 132.474-132.477 59.273-256.277 82.331-295.861 16.922-29.05 9.1-68.931-19.022-97.054zm-22.405 72.894c-38.8 66.609 45.6 165.635-74.845 286.08-120.44 120.443-219.475 36.048-286.076 74.843-22.679 13.207-64.035-27.241-50.493-50.488 38.8-66.609-45.6-165.635 74.845-286.08C245.573 4.702 344.616 89.086 411.219 50.292c22.73-13.24 64.005 27.288 50.488 50.491zm-169.861 8.736c1.37 10.96-6.404 20.957-17.365 22.327-54.846 6.855-135.779 87.787-142.635 142.635-1.373 10.989-11.399 18.734-22.326 17.365-10.961-1.37-18.735-11.366-17.365-22.326 9.162-73.286 104.167-168.215 177.365-177.365 10.953-1.368 20.956 6.403 22.326 17.364z"],
|
||||||
|
"life-ring": [512, 512, [], "f1cd", "M256 504c136.967 0 248-111.033 248-248S392.967 8 256 8 8 119.033 8 256s111.033 248 248 248zm-103.398-76.72l53.411-53.411c31.806 13.506 68.128 13.522 99.974 0l53.411 53.411c-63.217 38.319-143.579 38.319-206.796 0zM336 256c0 44.112-35.888 80-80 80s-80-35.888-80-80 35.888-80 80-80 80 35.888 80 80zm91.28 103.398l-53.411-53.411c13.505-31.806 13.522-68.128 0-99.974l53.411-53.411c38.319 63.217 38.319 143.579 0 206.796zM359.397 84.72l-53.411 53.411c-31.806-13.505-68.128-13.522-99.973 0L152.602 84.72c63.217-38.319 143.579-38.319 206.795 0zM84.72 152.602l53.411 53.411c-13.506 31.806-13.522 68.128 0 99.974L84.72 359.398c-38.319-63.217-38.319-143.579 0-206.796z"],
|
||||||
|
"lightbulb": [352, 512, [], "f0eb", "M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"],
|
||||||
|
"list-alt": [512, 512, [], "f022", "M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z"],
|
||||||
|
"map": [576, 512, [], "f279", "M560.02 32c-1.96 0-3.98.37-5.96 1.16L384.01 96H384L212 35.28A64.252 64.252 0 0 0 191.76 32c-6.69 0-13.37 1.05-19.81 3.14L20.12 87.95A32.006 32.006 0 0 0 0 117.66v346.32C0 473.17 7.53 480 15.99 480c1.96 0 3.97-.37 5.96-1.16L192 416l172 60.71a63.98 63.98 0 0 0 40.05.15l151.83-52.81A31.996 31.996 0 0 0 576 394.34V48.02c0-9.19-7.53-16.02-15.98-16.02zM224 90.42l128 45.19v285.97l-128-45.19V90.42zM48 418.05V129.07l128-44.53v286.2l-.64.23L48 418.05zm480-35.13l-128 44.53V141.26l.64-.24L528 93.95v288.97z"],
|
||||||
|
"meh": [496, 512, [], "f11a", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm8 144H160c-13.2 0-24 10.8-24 24s10.8 24 24 24h176c13.2 0 24-10.8 24-24s-10.8-24-24-24z"],
|
||||||
|
"meh-blank": [496, 512, [], "f5a4", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-280c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm160 0c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z"],
|
||||||
|
"meh-rolling-eyes": [496, 512, [], "f5a5", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm88-304c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm0 112c-22.1 0-40-17.9-40-40 0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40zm-104-40c0-39.8-32.2-72-72-72s-72 32.2-72 72 32.2 72 72 72 72-32.2 72-72zm-112 0c0-13.6 7.3-25.1 17.7-32.3-1 2.6-1.7 5.3-1.7 8.3 0 13.3 10.7 24 24 24s24-10.7 24-24c0-2.9-.7-5.7-1.7-8.3 10.4 7.2 17.7 18.7 17.7 32.3 0 22.1-17.9 40-40 40s-40-17.9-40-40zm192 128H184c-13.2 0-24 10.8-24 24s10.8 24 24 24h128c13.2 0 24-10.8 24-24s-10.8-24-24-24z"],
|
||||||
|
"minus-square": [448, 512, [], "f146", "M108 284c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h232c6.6 0 12 5.4 12 12v32c0 6.6-5.4 12-12 12H108zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"money-bill-alt": [640, 512, [], "f3d1", "M320 144c-53.02 0-96 50.14-96 112 0 61.85 42.98 112 96 112 53 0 96-50.13 96-112 0-61.86-42.98-112-96-112zm40 168c0 4.42-3.58 8-8 8h-64c-4.42 0-8-3.58-8-8v-16c0-4.42 3.58-8 8-8h16v-55.44l-.47.31a7.992 7.992 0 0 1-11.09-2.22l-8.88-13.31a7.992 7.992 0 0 1 2.22-11.09l15.33-10.22a23.99 23.99 0 0 1 13.31-4.03H328c4.42 0 8 3.58 8 8v88h16c4.42 0 8 3.58 8 8v16zM608 64H32C14.33 64 0 78.33 0 96v320c0 17.67 14.33 32 32 32h576c17.67 0 32-14.33 32-32V96c0-17.67-14.33-32-32-32zm-16 272c-35.35 0-64 28.65-64 64H112c0-35.35-28.65-64-64-64V176c35.35 0 64-28.65 64-64h416c0 35.35 28.65 64 64 64v160z"],
|
||||||
|
"moon": [512, 512, [], "f186", "M279.135 512c78.756 0 150.982-35.804 198.844-94.775 28.27-34.831-2.558-85.722-46.249-77.401-82.348 15.683-158.272-47.268-158.272-130.792 0-48.424 26.06-92.292 67.434-115.836 38.745-22.05 28.999-80.788-15.022-88.919A257.936 257.936 0 0 0 279.135 0c-141.36 0-256 114.575-256 256 0 141.36 114.576 256 256 256zm0-464c12.985 0 25.689 1.201 38.016 3.478-54.76 31.163-91.693 90.042-91.693 157.554 0 113.848 103.641 199.2 215.252 177.944C402.574 433.964 344.366 464 279.135 464c-114.875 0-208-93.125-208-208s93.125-208 208-208z"],
|
||||||
|
"newspaper": [576, 512, [], "f1ea", "M552 64H112c-20.858 0-38.643 13.377-45.248 32H24c-13.255 0-24 10.745-24 24v272c0 30.928 25.072 56 56 56h496c13.255 0 24-10.745 24-24V88c0-13.255-10.745-24-24-24zM48 392V144h16v248c0 4.411-3.589 8-8 8s-8-3.589-8-8zm480 8H111.422c.374-2.614.578-5.283.578-8V112h416v288zM172 280h136c6.627 0 12-5.373 12-12v-96c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v96c0 6.627 5.373 12 12 12zm28-80h80v40h-80v-40zm-40 140v-24c0-6.627 5.373-12 12-12h136c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H172c-6.627 0-12-5.373-12-12zm192 0v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0-144v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12zm0 72v-24c0-6.627 5.373-12 12-12h104c6.627 0 12 5.373 12 12v24c0 6.627-5.373 12-12 12H364c-6.627 0-12-5.373-12-12z"],
|
||||||
|
"object-group": [512, 512, [], "f247", "M500 128c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v256H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V128h12zm-52-64h32v32h-32V64zM32 64h32v32H32V64zm32 384H32v-32h32v32zm416 0h-32v-32h32v32zm-40-64h-12c-6.627 0-12 5.373-12 12v12H96v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h320v12c0 6.627 5.373 12 12 12h12v256zm-36-192h-84v-52c0-6.628-5.373-12-12-12H108c-6.627 0-12 5.372-12 12v168c0 6.628 5.373 12 12 12h84v52c0 6.628 5.373 12 12 12h200c6.627 0 12-5.372 12-12V204c0-6.628-5.373-12-12-12zm-268-24h144v112H136V168zm240 176H232v-24h76c6.627 0 12-5.372 12-12v-76h56v112z"],
|
||||||
|
"object-ungroup": [576, 512, [], "f248", "M564 224c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12h-88v-24h12c6.627 0 12-5.373 12-12V44c0-6.627-5.373-12-12-12h-72c-6.627 0-12 5.373-12 12v12H96V44c0-6.627-5.373-12-12-12H12C5.373 32 0 37.373 0 44v72c0 6.627 5.373 12 12 12h12v160H12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h88v24h-12c-6.627 0-12 5.373-12 12v72c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12V224h12zM352 64h32v32h-32V64zm0 256h32v32h-32v-32zM64 352H32v-32h32v32zm0-256H32V64h32v32zm32 216v-12c0-6.627-5.373-12-12-12H72V128h12c6.627 0 12-5.373 12-12v-12h224v12c0 6.627 5.373 12 12 12h12v160h-12c-6.627 0-12 5.373-12 12v12H96zm128 136h-32v-32h32v32zm280-64h-12c-6.627 0-12 5.373-12 12v12H256v-12c0-6.627-5.373-12-12-12h-12v-24h88v12c0 6.627 5.373 12 12 12h72c6.627 0 12-5.373 12-12v-72c0-6.627-5.373-12-12-12h-12v-88h88v12c0 6.627 5.373 12 12 12h12v160zm40 64h-32v-32h32v32zm0-256h-32v-32h32v32z"],
|
||||||
|
"paper-plane": [512, 512, [], "f1d8", "M440 6.5L24 246.4c-34.4 19.9-31.1 70.8 5.7 85.9L144 379.6V464c0 46.4 59.2 65.5 86.6 28.6l43.8-59.1 111.9 46.2c5.9 2.4 12.1 3.6 18.3 3.6 8.2 0 16.3-2.1 23.6-6.2 12.8-7.2 21.6-20 23.9-34.5l59.4-387.2c6.1-40.1-36.9-68.8-71.5-48.9zM192 464v-64.6l36.6 15.1L192 464zm212.6-28.7l-153.8-63.5L391 169.5c10.7-15.5-9.5-33.5-23.7-21.2L155.8 332.6 48 288 464 48l-59.4 387.3z"],
|
||||||
|
"pause-circle": [512, 512, [], "f28b", "M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm96-280v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16zm-112 0v160c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h48c8.8 0 16 7.2 16 16z"],
|
||||||
|
"play-circle": [512, 512, [], "f144", "M371.7 238l-176-107c-15.8-8.8-35.7 2.5-35.7 21v208c0 18.4 19.8 29.8 35.7 21l176-101c16.4-9.1 16.4-32.8 0-42zM504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256z"],
|
||||||
|
"plus-square": [448, 512, [], "f0fe", "M352 240v32c0 6.6-5.4 12-12 12h-88v88c0 6.6-5.4 12-12 12h-32c-6.6 0-12-5.4-12-12v-88h-88c-6.6 0-12-5.4-12-12v-32c0-6.6 5.4-12 12-12h88v-88c0-6.6 5.4-12 12-12h32c6.6 0 12 5.4 12 12v88h88c6.6 0 12 5.4 12 12zm96-160v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-48 346V86c0-3.3-2.7-6-6-6H54c-3.3 0-6 2.7-6 6v340c0 3.3 2.7 6 6 6h340c3.3 0 6-2.7 6-6z"],
|
||||||
|
"question-circle": [512, 512, [], "f059", "M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 448c-110.532 0-200-89.431-200-200 0-110.495 89.472-200 200-200 110.491 0 200 89.471 200 200 0 110.53-89.431 200-200 200zm107.244-255.2c0 67.052-72.421 68.084-72.421 92.863V300c0 6.627-5.373 12-12 12h-45.647c-6.627 0-12-5.373-12-12v-8.659c0-35.745 27.1-50.034 47.579-61.516 17.561-9.845 28.324-16.541 28.324-29.579 0-17.246-21.999-28.693-39.784-28.693-23.189 0-33.894 10.977-48.942 29.969-4.057 5.12-11.46 6.071-16.666 2.124l-27.824-21.098c-5.107-3.872-6.251-11.066-2.644-16.363C184.846 131.491 214.94 112 261.794 112c49.071 0 101.45 38.304 101.45 88.8zM298 368c0 23.159-18.841 42-42 42s-42-18.841-42-42 18.841-42 42-42 42 18.841 42 42z"],
|
||||||
|
"registered": [512, 512, [], "f25d", "M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 448c-110.532 0-200-89.451-200-200 0-110.531 89.451-200 200-200 110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200zm110.442-81.791c-53.046-96.284-50.25-91.468-53.271-96.085 24.267-13.879 39.482-41.563 39.482-73.176 0-52.503-30.247-85.252-101.498-85.252h-78.667c-6.617 0-12 5.383-12 12V380c0 6.617 5.383 12 12 12h38.568c6.617 0 12-5.383 12-12v-83.663h31.958l47.515 89.303a11.98 11.98 0 0 0 10.593 6.36h42.81c9.14 0 14.914-9.799 10.51-17.791zM256.933 239.906h-33.875v-64.14h27.377c32.417 0 38.929 12.133 38.929 31.709-.001 20.913-11.518 32.431-32.431 32.431z"],
|
||||||
|
"sad-cry": [496, 512, [], "f5b3", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm144 386.4V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v151.4C315.5 447 282.8 456 248 456s-67.5-9-96-24.6V280c0-13.2-10.8-24-24-24s-24 10.8-24 24v114.4c-34.6-36-56-84.7-56-138.4 0-110.3 89.7-200 200-200s200 89.7 200 200c0 53.7-21.4 102.5-56 138.4zM205.8 234.5c4.4-2.4 6.9-7.4 6.1-12.4-4-25.2-34.2-42.1-59.8-42.1s-55.9 16.9-59.8 42.1c-.8 5 1.7 10 6.1 12.4 4.4 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.3 7.9 4.8 13.7 1.6zM344 180c-25.7 0-55.9 16.9-59.8 42.1-.8 5 1.7 10 6.1 12.4 4.5 2.4 9.9 1.8 13.7-1.6l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c2.5 2.2 8 4.7 13.7 1.6 4.4-2.4 6.9-7.4 6.1-12.4-3.9-25.2-34.1-42.1-59.8-42.1zm-96 92c-30.9 0-56 28.7-56 64s25.1 64 56 64 56-28.7 56-64-25.1-64-56-64z"],
|
||||||
|
"sad-tear": [496, 512, [], "f5b4", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm8-152c-13.2 0-24 10.8-24 24s10.8 24 24 24c23.8 0 46.3 10.5 61.6 28.8 8.1 9.8 23.2 11.9 33.8 3.1 10.2-8.5 11.6-23.6 3.1-33.8C330 320.8 294.1 304 256 304zm-88-64c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-165.6 98.8C151 290.1 126 325.4 126 342.9c0 22.7 18.8 41.1 42 41.1s42-18.4 42-41.1c0-17.5-25-52.8-36.4-68.1-2.8-3.7-8.4-3.7-11.2 0z"],
|
||||||
|
"save": [448, 512, [], "f0c7", "M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 0 1 1.757 4.243V426a6 6 0 0 1-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z"],
|
||||||
|
"share-square": [576, 512, [], "f14d", "M561.938 158.06L417.94 14.092C387.926-15.922 336 5.097 336 48.032v57.198c-42.45 1.88-84.03 6.55-120.76 17.99-35.17 10.95-63.07 27.58-82.91 49.42C108.22 199.2 96 232.6 96 271.94c0 61.697 33.178 112.455 84.87 144.76 37.546 23.508 85.248-12.651 71.02-55.74-15.515-47.119-17.156-70.923 84.11-78.76V336c0 42.993 51.968 63.913 81.94 33.94l143.998-144c18.75-18.74 18.75-49.14 0-67.88zM384 336V232.16C255.309 234.082 166.492 255.35 206.31 376 176.79 357.55 144 324.08 144 271.94c0-109.334 129.14-118.947 240-119.85V48l144 144-144 144zm24.74 84.493a82.658 82.658 0 0 0 20.974-9.303c7.976-4.952 18.286.826 18.286 10.214V464c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h132c6.627 0 12 5.373 12 12v4.486c0 4.917-2.987 9.369-7.569 11.152-13.702 5.331-26.396 11.537-38.05 18.585a12.138 12.138 0 0 1-6.28 1.777H54a6 6 0 0 0-6 6v340a6 6 0 0 0 6 6h340a6 6 0 0 0 6-6v-25.966c0-5.37 3.579-10.059 8.74-11.541z"],
|
||||||
|
"smile": [496, 512, [], "f118", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z"],
|
||||||
|
"smile-beam": [496, 512, [], "f5b8", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm84-143.4c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.6-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.2-8.4-25.3-7.1-33.8 3.1zM136.5 211c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4s-52.7 29.3-56 71.4c-.3 3.7 2.1 7.2 5.7 8.3 3.4 1.1 7.4-.5 9.3-3.7l9.5-17zM328 152c-23.8 0-52.7 29.3-56 71.4-.3 3.7 2.1 7.2 5.7 8.3 3.5 1.1 7.4-.5 9.3-3.7l9.5-17c7.7-13.7 19.2-21.6 31.5-21.6s23.8 7.9 31.5 21.6l9.5 17c2.1 3.7 6.2 4.7 9.3 3.7 3.6-1.1 6-4.5 5.7-8.3-3.3-42.1-32.2-71.4-56-71.4z"],
|
||||||
|
"smile-wink": [496, 512, [], "f4da", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm117.8-146.4c-10.2-8.5-25.3-7.1-33.8 3.1-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8zM168 240c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-60c-25.7 0-55.9 16.9-59.9 42.1-1.7 11.2 11.5 18.2 19.8 10.8l9.5-8.5c14.8-13.2 46.2-13.2 61 0l9.5 8.5c8.5 7.4 21.6.3 19.8-10.8-3.8-25.2-34-42.1-59.7-42.1z"],
|
||||||
|
"snowflake": [448, 512, [], "f2dc", "M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z"],
|
||||||
|
"square": [448, 512, [], "f0c8", "M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z"],
|
||||||
|
"star": [576, 512, [], "f005", "M528.1 171.5L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6zM388.6 312.3l23.7 138.4L288 385.4l-124.3 65.3 23.7-138.4-100.6-98 139-20.2 62.2-126 62.2 126 139 20.2-100.6 98z"],
|
||||||
|
"star-half": [576, 512, [], "f089", "M288 385.3l-124.3 65.4 23.7-138.4-100.6-98 139-20.2 62.2-126V0c-11.4 0-22.8 5.9-28.7 17.8L194 150.2 47.9 171.4c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.1 23 46 46.4 33.7L288 439.6v-54.3z"],
|
||||||
|
"sticky-note": [448, 512, [], "f249", "M448 348.106V80c0-26.51-21.49-48-48-48H48C21.49 32 0 53.49 0 80v351.988c0 26.51 21.49 48 48 48h268.118a48 48 0 0 0 33.941-14.059l83.882-83.882A48 48 0 0 0 448 348.106zm-128 80v-76.118h76.118L320 428.106zM400 80v223.988H296c-13.255 0-24 10.745-24 24v104H48V80h352z"],
|
||||||
|
"stop-circle": [512, 512, [], "f28d", "M504 256C504 119 393 8 256 8S8 119 8 256s111 248 248 248 248-111 248-248zm-448 0c0-110.5 89.5-200 200-200s200 89.5 200 200-89.5 200-200 200S56 366.5 56 256zm296-80v160c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16z"],
|
||||||
|
"sun": [512, 512, [], "f185", "M494.2 221.9l-59.8-40.5 13.7-71c2.6-13.2-1.6-26.8-11.1-36.4-9.6-9.5-23.2-13.7-36.2-11.1l-70.9 13.7-40.4-59.9c-15.1-22.3-51.9-22.3-67 0l-40.4 59.9-70.8-13.7C98 60.4 84.5 64.5 75 74.1c-9.5 9.6-13.7 23.1-11.1 36.3l13.7 71-59.8 40.5C6.6 229.5 0 242 0 255.5s6.7 26 17.8 33.5l59.8 40.5-13.7 71c-2.6 13.2 1.6 26.8 11.1 36.3 9.5 9.5 22.9 13.7 36.3 11.1l70.8-13.7 40.4 59.9C230 505.3 242.6 512 256 512s26-6.7 33.5-17.8l40.4-59.9 70.9 13.7c13.4 2.7 26.8-1.6 36.3-11.1 9.5-9.5 13.6-23.1 11.1-36.3l-13.7-71 59.8-40.5c11.1-7.5 17.8-20.1 17.8-33.5-.1-13.6-6.7-26.1-17.9-33.7zm-112.9 85.6l17.6 91.2-91-17.6L256 458l-51.9-77-90.9 17.6 17.6-91.2-76.8-52 76.8-52-17.6-91.2 91 17.6L256 53l51.9 76.9 91-17.6-17.6 91.1 76.8 52-76.8 52.1zM256 152c-57.3 0-104 46.7-104 104s46.7 104 104 104 104-46.7 104-104-46.7-104-104-104zm0 160c-30.9 0-56-25.1-56-56s25.1-56 56-56 56 25.1 56 56-25.1 56-56 56z"],
|
||||||
|
"surprise": [496, 512, [], "f5c2", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm0-176c-35.3 0-64 28.7-64 64s28.7 64 64 64 64-28.7 64-64-28.7-64-64-64zm-48-72c0-17.7-14.3-32-32-32s-32 14.3-32 32 14.3 32 32 32 32-14.3 32-32zm128-32c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z"],
|
||||||
|
"thumbs-down": [512, 512, [], "f165", "M466.27 225.31c4.674-22.647.864-44.538-8.99-62.99 2.958-23.868-4.021-48.565-17.34-66.99C438.986 39.423 404.117 0 327 0c-7 0-15 .01-22.22.01C201.195.01 168.997 40 128 40h-10.845c-5.64-4.975-13.042-8-21.155-8H32C14.327 32 0 46.327 0 64v240c0 17.673 14.327 32 32 32h64c11.842 0 22.175-6.438 27.708-16h7.052c19.146 16.953 46.013 60.653 68.76 83.4 13.667 13.667 10.153 108.6 71.76 108.6 57.58 0 95.27-31.936 95.27-104.73 0-18.41-3.93-33.73-8.85-46.54h36.48c48.602 0 85.82-41.565 85.82-85.58 0-19.15-4.96-34.99-13.73-49.84zM64 296c-13.255 0-24-10.745-24-24s10.745-24 24-24 24 10.745 24 24-10.745 24-24 24zm330.18 16.73H290.19c0 37.82 28.36 55.37 28.36 94.54 0 23.75 0 56.73-47.27 56.73-18.91-18.91-9.46-66.18-37.82-94.54C206.9 342.89 167.28 272 138.92 272H128V85.83c53.611 0 100.001-37.82 171.64-37.82h37.82c35.512 0 60.82 17.12 53.12 65.9 15.2 8.16 26.5 36.44 13.94 57.57 21.581 20.384 18.699 51.065 5.21 65.62 9.45 0 22.36 18.91 22.27 37.81-.09 18.91-16.71 37.82-37.82 37.82z"],
|
||||||
|
"thumbs-up": [512, 512, [], "f164", "M466.27 286.69C475.04 271.84 480 256 480 236.85c0-44.015-37.218-85.58-85.82-85.58H357.7c4.92-12.81 8.85-28.13 8.85-46.54C366.55 31.936 328.86 0 271.28 0c-61.607 0-58.093 94.933-71.76 108.6-22.747 22.747-49.615 66.447-68.76 83.4H32c-17.673 0-32 14.327-32 32v240c0 17.673 14.327 32 32 32h64c14.893 0 27.408-10.174 30.978-23.95 44.509 1.001 75.06 39.94 177.802 39.94 7.22 0 15.22.01 22.22.01 77.117 0 111.986-39.423 112.94-95.33 13.319-18.425 20.299-43.122 17.34-66.99 9.854-18.452 13.664-40.343 8.99-62.99zm-61.75 53.83c12.56 21.13 1.26 49.41-13.94 57.57 7.7 48.78-17.608 65.9-53.12 65.9h-37.82c-71.639 0-118.029-37.82-171.64-37.82V240h10.92c28.36 0 67.98-70.89 94.54-97.46 28.36-28.36 18.91-75.63 37.82-94.54 47.27 0 47.27 32.98 47.27 56.73 0 39.17-28.36 56.72-28.36 94.54h103.99c21.11 0 37.73 18.91 37.82 37.82.09 18.9-12.82 37.81-22.27 37.81 13.489 14.555 16.371 45.236-5.21 65.62zM88 432c0 13.255-10.745 24-24 24s-24-10.745-24-24 10.745-24 24-24 24 10.745 24 24z"],
|
||||||
|
"times-circle": [512, 512, [], "f057", "M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z"],
|
||||||
|
"tired": [496, 512, [], "f5c8", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm129.1-303.8c-3.8-4.4-10.3-5.4-15.3-2.5l-80 48c-3.6 2.2-5.8 6.1-5.8 10.3s2.2 8.1 5.8 10.3l80 48c5.4 3.2 11.8 1.6 15.3-2.5 3.8-4.5 3.9-11 .1-15.5L343.6 208l33.6-40.3c3.8-4.5 3.7-11.1-.1-15.5zM220 208c0-4.2-2.2-8.1-5.8-10.3l-80-48c-5-3-11.5-1.9-15.3 2.5-3.8 4.5-3.9 11-.1 15.5l33.6 40.3-33.6 40.3c-3.8 4.5-3.7 11 .1 15.5 3.5 4.1 9.9 5.7 15.3 2.5l80-48c3.6-2.2 5.8-6.1 5.8-10.3zm28 64c-45.4 0-100.9 38.3-107.8 93.3-1.5 11.8 6.9 21.6 15.5 17.9C178.4 373.5 212 368 248 368s69.6 5.5 92.3 15.2c8.5 3.7 17-6 15.5-17.9-6.9-55-62.4-93.3-107.8-93.3z"],
|
||||||
|
"trash-alt": [448, 512, [], "f2ed", "M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"],
|
||||||
|
"user": [448, 512, [], "f007", "M313.6 304c-28.7 0-42.5 16-89.6 16-47.1 0-60.8-16-89.6-16C60.2 304 0 364.2 0 438.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-25.6c0-74.2-60.2-134.4-134.4-134.4zM400 464H48v-25.6c0-47.6 38.8-86.4 86.4-86.4 14.6 0 38.3 16 89.6 16 51.7 0 74.9-16 89.6-16 47.6 0 86.4 38.8 86.4 86.4V464zM224 288c79.5 0 144-64.5 144-144S303.5 0 224 0 80 64.5 80 144s64.5 144 144 144zm0-240c52.9 0 96 43.1 96 96s-43.1 96-96 96-96-43.1-96-96 43.1-96 96-96z"],
|
||||||
|
"user-circle": [496, 512, [], "f2bd", "M248 104c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96zm0 144c-26.5 0-48-21.5-48-48s21.5-48 48-48 48 21.5 48 48-21.5 48-48 48zm0-240C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-49.7 0-95.1-18.3-130.1-48.4 14.9-23 40.4-38.6 69.6-39.5 20.8 6.4 40.6 9.6 60.5 9.6s39.7-3.1 60.5-9.6c29.2 1 54.7 16.5 69.6 39.5-35 30.1-80.4 48.4-130.1 48.4zm162.7-84.1c-24.4-31.4-62.1-51.9-105.1-51.9-10.2 0-26 9.6-57.6 9.6-31.5 0-47.4-9.6-57.6-9.6-42.9 0-80.6 20.5-105.1 51.9C61.9 339.2 48 299.2 48 256c0-110.3 89.7-200 200-200s200 89.7 200 200c0 43.2-13.9 83.2-37.3 115.9z"],
|
||||||
|
"window-close": [512, 512, [], "f410", "M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z"],
|
||||||
|
"window-maximize": [512, 512, [], "f2d0", "M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z"],
|
||||||
|
"window-minimize": [512, 512, [], "f2d1", "M480 480H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h448c17.7 0 32 14.3 32 32s-14.3 32-32 32z"],
|
||||||
|
"window-restore": [512, 512, [], "f2d2", "M464 0H144c-26.5 0-48 21.5-48 48v48H48c-26.5 0-48 21.5-48 48v320c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h48c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-96 464H48V256h320v208zm96-96h-48V144c0-26.5-21.5-48-48-48H144V48h320v320z"]
|
||||||
|
};
|
||||||
|
|
||||||
|
bunker(function () {
|
||||||
|
defineIcons('far', icons);
|
||||||
|
});
|
||||||
|
|
||||||
|
}());
|
1124
fontawesome/js/solid.js
Normal file
68
fontawesome/js/v4-shims.js
Normal file
19
fontawesome/less/_animated.less
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// Animated Icons
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-spin {
|
||||||
|
animation: fa-spin 2s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-pulse {
|
||||||
|
animation: fa-spin 1s infinite steps(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fa-spin {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
16
fontawesome/less/_bordered-pulled.less
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// Bordered & Pulled
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-border {
|
||||||
|
border-radius: .1em;
|
||||||
|
border: solid .08em @fa-border-color;
|
||||||
|
padding: .2em .25em .15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-pull-left { float: left; }
|
||||||
|
.@{fa-css-prefix}-pull-right { float: right; }
|
||||||
|
|
||||||
|
.@{fa-css-prefix}, .fas, .far, .fal, .fab {
|
||||||
|
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
|
||||||
|
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
|
||||||
|
}
|
12
fontawesome/less/_core.less
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Base Class Definition
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.@{fa-css-prefix}, .fas, .far, .fal, .fad, .fab {
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
display: inline-block;
|
||||||
|
font-style: normal;
|
||||||
|
font-variant: normal;
|
||||||
|
text-rendering: auto;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
6
fontawesome/less/_fixed-width.less
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// Fixed Width Icons
|
||||||
|
// -------------------------
|
||||||
|
.@{fa-css-prefix}-fw {
|
||||||
|
text-align: center;
|
||||||
|
width: (20em / 16);
|
||||||
|
}
|
1441
fontawesome/less/_icons.less
vendored
Normal file
27
fontawesome/less/_larger.less
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Icon Sizes
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
.larger(@factor) when (@factor > 0) {
|
||||||
|
.larger((@factor - 1));
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-@{factor}x {
|
||||||
|
font-size: (@factor * 1em);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* makes the font 33% larger relative to the icon container */
|
||||||
|
.@{fa-css-prefix}-lg {
|
||||||
|
font-size: (4em / 3);
|
||||||
|
line-height: (3em / 4);
|
||||||
|
vertical-align: -.0667em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-xs {
|
||||||
|
font-size: .75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.@{fa-css-prefix}-sm {
|
||||||
|
font-size: .875em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.larger(10);
|