v2.8
1. config.php 添加参数(line.57-63)
1.1 所以改了几乎所有文件
2. 删除 hlw tom hop,合并成 replace.php
3. 删除 cache.php whitelist.php 的连接数据库代码,只在 log.php 连接一次
pull/3/head
david082321 4 years ago
parent 2397122063
commit aec5ad4c15

Binary file not shown.

Binary file not shown.

@ -5,11 +5,8 @@ if(!defined('SYSTEM')){
exit(BLOCK_RETURN);
}
// 获取 access_key
$access_key = @$_GET['access_key'];
// 判断 access_key
if ($access_key != ""){
$url = "https://black.qimo.ink/?access_key=".$access_key;
if (ACCESS_KEY != ""){ // access_key 是否存在
$url = "https://black.qimo.ink/?access_key=".ACCESS_KEY;
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
@ -18,15 +15,9 @@ if ($access_key != ""){
curl_close($ch);
// 如果是黑名单
if ($out=="ban"){
if (REPLACE_TYPE=="hlw"){ // 替换成葫芦娃
include ("hlw.php");
hlw();
}elseif (REPLACE_TYPE=="tom"){ // 替换成猫和老鼠
include ("tom.php");
tom();
}elseif (REPLACE_TYPE=="hop"){ // 替换成hop
include ("hop.php");
hop();
if (REPLACE_TYPE=="hlw" || REPLACE_TYPE=="tom" || REPLACE_TYPE=="hop"){ // 替换成葫芦娃、猫和老鼠、hop
include ("replace.php");
replace();
}else {
exit(BLOCK_RETURN);
}

@ -5,51 +5,31 @@ if(!defined('SYSTEM')){
exit(BLOCK_RETURN);
}
$db_host=DB_HOST;
$db_user=DB_USER;
$db_pass=DB_PASS;
$db_name=DB_NAME;
$dbh='mysql:host='.$db_host.';'.'dbname='.$db_name;
try{
$dbh = new PDO($dbh,$db_user,$db_pass);
//echo '成功';
}catch(PDOException $e){
//echo '失败';
}
// 参数
$access_key = @$_GET['access_key'];
$area = @$_GET['area'];
$cid = @$_GET['cid'];
$ep_id = @$_GET['ep_id'];
$refresh_cache = 0;
if ($access_key ==""){
$type = "0"; // 未登录
if (ACCESS_KEY ==""){
define('TYPE', 0); //未登录
}else{
// 判断大会员
$sqlco = "SELECT `due_date` FROM `keys` WHERE `access_key` = '".$access_key."'";
$sqlco = "SELECT `due_date` FROM `keys` WHERE `access_key` = '".ACCESS_KEY."'";
$cres = $dbh -> query($sqlco);
$vnum = $cres -> fetch();
$due = $vnum['due_date'];
if ((int)$due > time()*1000 ){
$type = "2"; // 大会员
define('TYPE', 2); // 大会员
}else{
$type = "1"; // 不是大会员
define('TYPE', 1); // 不是大会员
}
}
// 获取缓存
function get_cache(){
global $dbh;
global $type;
global $area;
global $cid;
global $ep_id;
global $refresh_cache;
$ts = time();
$sqlco = "SELECT * FROM `cache` WHERE `area` = '$area' AND `type` = '$type' AND `cid` = '$cid' AND `ep_id` = '$ep_id'";
$sqlco = "SELECT * FROM `cache` WHERE `area` = '".AREA."' AND `type` = '".TYPE."' AND `cid` = '".CID."' AND `ep_id` = '".EP_ID."'";
$cres = $dbh -> query($sqlco);
$vnum = $cres -> fetch();
$cache = $vnum['cache'];
@ -70,10 +50,6 @@ function get_cache(){
// 写入缓存
function write_cache(){
global $dbh;
global $type;
global $area;
global $cid;
global $ep_id;
global $SERVER_AREA;
global $output;
global $refresh_cache;
@ -89,20 +65,20 @@ function write_cache(){
$out = $out.'orderid='.$b[1];
}
$output = $out.$a[count($a)-1];
$sql ="INSERT INTO `cache` (`add_time`,`area`,`type`,`cid`,`ep_id`,`cache`) VALUES ('$ts','$area','$type','$cid','$ep_id','$output')";
$sql ="INSERT INTO `cache` (`add_time`,`area`,`type`,`cid`,`ep_id`,`cache`) VALUES ('$ts','".AREA."','".TYPE."','".CID."','".EP_ID."','$output')";
// 刷新缓存
if ($refresh_cache==1){
$sql = "UPDATE `cache` SET `add_time` = '$ts', `cache` = '$output' WHERE `area` = '$area' AND `type` = '$type' AND `cid` = '$cid' AND `ep_id` = '$ep_id';";
$sql = "UPDATE `cache` SET `add_time` = '$ts', `cache` = '$output' WHERE `area` = '".AREA."' AND `type` = '".TYPE."' AND `cid` = '".CID."' AND `ep_id` = '".EP_ID."';";
}
$dbh -> exec($sql);
// 10403 地区错误
}else if ($code == "-10403" && in_array($area, $SERVER_AREA)){
$sql ="INSERT INTO `cache` (`add_time`,`area`,`type`,`cid`,`ep_id`,`cache`) VALUES ('9999999999','$area','$type','$cid','$ep_id','$output')";
$dbh -> exec($sql);
// 404 泰版地区错误
}else if ($code == "-404" && in_array($area, $SERVER_AREA)){
$sql ="INSERT INTO `cache` (`add_time`,`area`,`type`,`cid`,`ep_id`,`cache`) VALUES ('9999999999','$area','$type','$cid','$ep_id','$output')";
$dbh -> exec($sql);
// 缓存地区错误
}else if (in_array(AREA, $SERVER_AREA)){
$sql ="INSERT INTO `cache` (`add_time`,`area`,`type`,`cid`,`ep_id`,`cache`) VALUES ('9999999999','".AREA."','".TYPE."','".CID."','".EP_ID."','$output')";
if ($code == "-10403"){// 10403 地区错误
$dbh -> exec($sql);
}else if ($code == "-404" && AREA == "th"){// 404 泰版地区错误
$dbh -> exec($sql);
}
}
}

@ -3,7 +3,7 @@ if(!defined('SYSTEM')){header('HTTP/1.1 404 Not Found');}// 防止外部破解
// 封锁
define('BLOCK_TYPE','blacklist'); // 封锁类型none 不封锁, blacklist 黑名单, whitelist 本地白名单
define('REPLACE_TYPE', "tom"); // 是否替换视频(仅黑/白名单时生效)。hlw 葫芦娃, tom 猫和老鼠hop 妖王av17001合集
define('REPLACE_TYPE', "tom"); // 是否替换视频(仅黑/白名单时生效)。hlw 葫芦娃, tom 猫和老鼠, hop 妖王av17001合集
define('NEED_LOGIN', 0); //是否要登录用户才能用。0 否, 1 是
define('BILIROAMING', 1); //是否要用哔哩漫游才能使用。0 否, 1 是
define('LOCK_AREA', 0); //服务器锁区,须设置$SERVER_AREA。0 否, 1 是
@ -31,7 +31,7 @@ $SERVER_AREA = array(); // 空白,不锁区
// API相关
define('CUSTOM_HOST_DEFAULT', 'api.bilibili.com'); // 兼容未发送 area 参数的其他脚本
define('CUSTOM_HOST_CN', 'api.bilibili.com'); // CN 解析api
define('CUSTOM_HOST_HK', 'api.bilibili.com'); // HK 解析api
define('CUSTOM_HOST_HK', 'api.bilibili.com'); // HK 解析api
define('CUSTOM_HOST_TW', 'api.bilibili.com'); // TW 解析api
define('CUSTOM_HOST_TH', 'api.global.bilibili.com'); //泰区 解析api
define('CUSTOM_HOST_SUB', 'app.global.bilibili.com'); //泰区 搜索字幕用api
@ -52,4 +52,13 @@ $hosts=array("workers.dev","workers.dev");
// 其他
define('WELCOME', 'Success!'); //首页欢迎语
define('BLOCK_RETURN', '{"code":-10403,"message":"你已被封锁"}'); //封锁返回内容
// 参数,不懂就别改
define('APPKEY', '1d8b6e7d45233436');
define('APPSEC', '560c52ccd288fed045859ed18bffd973');
define('ACCESS_KEY', @$_GET['access_key']);
define('AREA', @$_GET['area']);
define('CID', @$_GET['cid']);
define('EP_ID', @$_GET['ep_id']);
define('TS', @$_GET['ts']);
?>

@ -1,116 +0,0 @@
<?php
// 防止外部破解
if(!defined('SYSTEM')){
header('HTTP/1.1 404 Not Found');
exit(BLOCK_RETURN);
}
function hlw(){
$url = "https://black.qimo.ink/hlw.php";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
'User-Agent: '.@$_SERVER["HTTP_USER_AGENT"]
));
$output = curl_exec($ch);
curl_close($ch);
// 分析 output
$array = json_decode($output, true);
$timelength = $array['timelength'];
$base_url = $array['v_base_url'];
$bandwidth = $array['v_bandwidth'];
$backup_url = $array['v_backup_url'];
$a_base_url = $array['a_base_url'];
$a_bandwidth = $array['a_bandwidth'];
$a_backup_url = $array['a_backup_url'];
// 获取缓存
if (SAVE_CACHE==1){
include ("cache.php");
$output2 = get_cache();
}else{
$output2 = "";
}
if ($output2 == ""){
global $host;
global $path;
// 判断来源
if ($path=="/intl/gateway/v2/ogv/playurl"){
$type = "intl";
}elseif ($path=="/pgc/player/api/playurl"){
$type = "main";
}
// 转发到指定服务器
$url = "https://".$host.$path."?".$_SERVER['QUERY_STRING'];
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
'User-Agent: '.@$_SERVER["HTTP_USER_AGENT"]
));
$output2 = curl_exec($ch);
curl_close($ch);
// 写入缓存
if (SAVE_CACHE==1){
$output = $output2;
write_cache();
}
}
if ($type=="intl"){
// 替换成葫芦娃
$array2 = json_decode($output2, true);
$array2['data']['video_info']['timelength'] = $timelength;
// 替换视频
// 好像是count不到正确数量不晓得有没有人会改的
//$v_count = count($array2['data']['video_info']['stream_list']);
for($j=0 ; $j<5; $j++){
$array2['data']['video_info']['stream_list'][$j]['dash_video']['base_url'] = $base_url;
$array2['data']['video_info']['stream_list'][$j]['dash_video']['backup_url'] = $backup_url;
$array2['data']['video_info']['stream_list'][$j]['dash_video']['bandwidth'] = $bandwidth;
}
// 替换音频
//$a_count = count($array2['data']['video_info']['dash_audio']);
for($j=0 ; $j<3 ; $j++){
$array2['data']['video_info']['dash_audio'][$j]['base_url'] = $a_base_url;
$array2['data']['video_info']['dash_audio'][$j]['backup_url'] = $a_backup_url;
$array2['data']['video_info']['dash_audio'][$j]['bandwidth'] = $a_bandwidth;
}
}else{
// 替换成葫芦娃
$array2 = json_decode($output2, true);
$array2['timelength'] = $timelength;
// 替换视频
$video = $array2['dash']['video'];
$count3 = count($video);
for($j=0 ; $j<$count3; $j++){
$array2['dash']['video'][$j]['base_url'] = $base_url;
$array2['dash']['video'][$j]['backup_url'] = $backup_url;
$array2['dash']['video'][$j]['bandwidth'] = $bandwidth;
}
// 替换音频
$audio = $array2['dash']['audio'];
$count4 = count($audio);
for($j=0 ; $j<$count4 ; $j++){
$array2['dash']['audio'][$j]['base_url'] = $a_base_url;
$array2['dash']['audio'][$j]['backup_url'] = $a_backup_url;
$array2['dash']['audio'][$j]['bandwidth'] = $a_bandwidth;
}
}
// 发送内容
header('Content-Type: application/json; charset=utf-8');
$output3 = json_encode($array2);
$output3 = str_replace("\/","/",$output3);
print($output3);
exit();
}
?>

@ -1,5 +1,6 @@
<?php
define('SYSTEM', TRUE); // 防止外部破解
define('VERSION', '2.8');
include ("config.php"); // 加载配置
// 缓存用
@ -7,15 +8,14 @@ if (SAVE_CACHE==1){
include ("log.php");
}
// 服务器锁区
function lock_area(){
$area = @$_GET['area'];
if ( !empty($SERVER_AREA) && !in_array($area, $SERVER_AREA) && LOCK_AREA=="1" ){
exit(BLOCK_RETURN);
if (LOCK_AREA==1){
if ( !empty($SERVER_AREA) && !in_array(AREA, $SERVER_AREA) ){
exit(BLOCK_RETURN);
}
}
}
//echo $area;
// 判断要转发的host
$path = explode('/index.php', $_SERVER['PHP_SELF'])[0];
@ -27,9 +27,9 @@ if ($path=="/intl/gateway/v2/ogv/playurl"){
}elseif ($path=="/intl/gateway/v2/app/subtitle"){
$host = CUSTOM_HOST_SUB;
}elseif ($path=="/pgc/player/api/playurl"){
if ($area=="cn"){$host = CUSTOM_HOST_CN;}
else if ($area=="hk"){$host = CUSTOM_HOST_HK;}
else if ($area=="tw"){$host = CUSTOM_HOST_TW;}
if (AREA=="cn"){$host = CUSTOM_HOST_CN;}
else if (AREA=="hk"){$host = CUSTOM_HOST_HK;}
else if (AREA=="tw"){$host = CUSTOM_HOST_TW;}
else {$host = CUSTOM_HOST_DEFAULT;}
lock_area();
}else {
@ -37,12 +37,12 @@ if ($path=="/intl/gateway/v2/ogv/playurl"){
exit(WELCOME);
}
//echo $host;
// 模块请求都会带上X-From-Biliroaming的请求头为了防止被盗用可以加上请求头判断
$headerStringValue = $_SERVER['HTTP_X_FROM_BILIROAMING'];
if ($headerStringValue=="" && BILIROAMING==1){
exit(BLOCK_RETURN);
if (BILIROAMING==1){
if ($headerStringValue==""){
exit(BLOCK_RETURN);
}
}
// 鉴权

@ -20,9 +20,8 @@ try{
//pass
}
$access_key = @$_GET['access_key'];
if ($access_key !=""){
$sqlco = "SELECT `uid` as num FROM `keys` WHERE `access_key` = '".$access_key."'";
if (ACCESS_KEY !=""){
$sqlco = "SELECT `uid` as num FROM `keys` WHERE `access_key` = '".ACCESS_KEY."'";
$cres = $dbh -> query($sqlco);
$vnum = $cres -> fetch();
$uid = $vnum['num'];
@ -31,19 +30,15 @@ if ($access_key !=""){
$uid = $out[0];
$due = $out[1];
if ($uid != "0"){
$sql =" INSERT INTO `keys` (`add_time`,`uid`,`access_key`,`due_date`) VALUES (now(),'$uid','$access_key','$due')";
$sql =" INSERT INTO `keys` (`add_time`,`uid`,`access_key`,`due_date`) VALUES (now(),'$uid','".ACCESS_KEY."','$due')";
$dbh -> exec($sql);
}
}
}
function get_userinfo(){
$access_key = $_GET['access_key'];
$ts = $_GET['ts'];
$appkey = "1d8b6e7d45233436";
$appsec = "560c52ccd288fed045859ed18bffd973";
$sign = md5("access_key=".$access_key."&appkey=".$appkey."&ts=".$ts.$appsec);
$testurl = "https://app.bilibili.com/x/v2/account/myinfo?access_key=".$access_key."&appkey=".$appkey."&ts=".$ts."&sign=".$sign;
$sign = md5("access_key=".ACCESS_KEY."&appkey=".APPKEY."&ts=".TS.APPSEC);
$testurl = "https://app.bilibili.com/x/v2/account/myinfo?access_key=".ACCESS_KEY."&appkey=".APPKEY."&ts=".TS."&sign=".$sign;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

@ -5,8 +5,16 @@ if(!defined('SYSTEM')){
exit(BLOCK_RETURN);
}
function hop(){
$url = "https://bili.tuturu.top/av17001.php";
function replace(){
if (REPLACE_TYPE=="hlw"){
$url = 'https://black.qimo.ink/hlw.php';
}else if (REPLACE_TYPE=="tom"){
$url = 'https://black.qimo.ink/TandJ.php';
}else if (REPLACE_TYPE=="hop"){
$url = 'https://bili.tuturu.top/av17001.php';
}else{
$url = 'https://black.qimo.ink/TandJ.php';
}
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);

@ -1,116 +0,0 @@
<?php
// 防止外部破解
if(!defined('SYSTEM')){
header('HTTP/1.1 404 Not Found');
exit(BLOCK_RETURN);
}
function tom(){
$url = "https://black.qimo.ink/TandJ.php";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
'User-Agent: '.@$_SERVER["HTTP_USER_AGENT"]
));
$output = curl_exec($ch);
curl_close($ch);
// 分析 output
$array = json_decode($output, true);
$timelength = $array['timelength'];
$base_url = $array['v_base_url'];
$bandwidth = $array['v_bandwidth'];
$backup_url = $array['v_backup_url'];
$a_base_url = $array['a_base_url'];
$a_bandwidth = $array['a_bandwidth'];
$a_backup_url = $array['a_backup_url'];
// 获取缓存
if (SAVE_CACHE==1){
include ("cache.php");
$output2 = get_cache();
}else{
$output2 = "";
}
if ($output2 == ""){
global $host;
global $path;
// 判断来源
if ($path=="/intl/gateway/v2/ogv/playurl"){
$type = "intl";
}elseif ($path=="/pgc/player/api/playurl"){
$type = "main";
}
// 转发到指定服务器
$url = "https://".$host.$path."?".$_SERVER['QUERY_STRING'];
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
'User-Agent: '.@$_SERVER["HTTP_USER_AGENT"]
));
$output2 = curl_exec($ch);
curl_close($ch);
// 写入缓存
if (SAVE_CACHE==1){
$output = $output2;
write_cache();
}
}
if ($type=="intl"){
// 替换成猫和老鼠
$array2 = json_decode($output2, true);
$array2['data']['video_info']['timelength'] = $timelength;
// 替换视频
// 好像是count不到正确数量不晓得有没有人会改的
//$v_count = count($array2['data']['video_info']['stream_list']);
for($j=0 ; $j<5; $j++){
$array2['data']['video_info']['stream_list'][$j]['dash_video']['base_url'] = $base_url;
$array2['data']['video_info']['stream_list'][$j]['dash_video']['backup_url'] = $backup_url;
$array2['data']['video_info']['stream_list'][$j]['dash_video']['bandwidth'] = $bandwidth;
}
// 替换音频
//$a_count = count($array2['data']['video_info']['dash_audio']);
for($j=0 ; $j<3 ; $j++){
$array2['data']['video_info']['dash_audio'][$j]['base_url'] = $a_base_url;
$array2['data']['video_info']['dash_audio'][$j]['backup_url'] = $a_backup_url;
$array2['data']['video_info']['dash_audio'][$j]['bandwidth'] = $a_bandwidth;
}
}else{
// 替换猫和老鼠
$array2 = json_decode($output2, true);
$array2['timelength'] = $timelength;
// 替换视频
$video = $array2['dash']['video'];
$count3 = count($video);
for($j=0 ; $j<$count3; $j++){
$array2['dash']['video'][$j]['base_url'] = $base_url;
$array2['dash']['video'][$j]['backup_url'] = $backup_url;
$array2['dash']['video'][$j]['bandwidth'] = $bandwidth;
}
// 替换音频
$audio = $array2['dash']['audio'];
$count4 = count($audio);
for($j=0 ; $j<$count4 ; $j++){
$array2['dash']['audio'][$j]['base_url'] = $a_base_url;
$array2['dash']['audio'][$j]['backup_url'] = $a_backup_url;
$array2['dash']['audio'][$j]['bandwidth'] = $a_bandwidth;
}
}
// 发送内容
header('Content-Type: application/json; charset=utf-8');
$output3 = json_encode($array2);
$output3 = str_replace("\/","/",$output3);
print($output3);
exit();
}
?>

@ -5,9 +5,7 @@ if(!defined('SYSTEM')){
exit(BLOCK_RETURN);
}
$access_key = @$_GET['access_key']; // 获取 access_key
if ($access_key != ""){ // access_key 是否存在
if (ACCESS_KEY != ""){ // access_key 是否存在
if (SAVE_CACHE==1){ // 是否开启缓存
$uid = get_uid_fromsql(); // 从数据库获取
}else{
@ -17,16 +15,10 @@ if ($access_key != ""){ // access_key 是否存在
if (in_array($uid, $WHITELIST)) {
// pass
}else{
if (REPLACE_TYPE=="hlw"){ // 替换成葫芦娃
include ("hlw.php");
hlw();
}elseif (REPLACE_TYPE=="tom"){ // 替换成猫和老鼠
include ("tom.php");
tom();
}elseif (REPLACE_TYPE=="hop"){ // 替换成hop
include ("hop.php");
hop();
}else{
if (REPLACE_TYPE=="hlw" || REPLACE_TYPE=="tom" || REPLACE_TYPE=="hop"){ // 替换成葫芦娃、猫和老鼠、hop
include ("replace.php");
replace();
}else {
exit(BLOCK_RETURN);
}
}
@ -35,12 +27,8 @@ if ($access_key != ""){ // access_key 是否存在
}
function get_uid(){
$access_key = $_GET['access_key'];
$ts = time();
$appkey = "1d8b6e7d45233436";
$appsec = "560c52ccd288fed045859ed18bffd973";
$sign = md5("access_key=".$access_key."&appkey=".$appkey."&ts=".$ts.$appsec);
$testurl = "https://app.bilibili.com/x/v2/account/myinfo?access_key=".$access_key."&appkey=".$appkey."&ts=".$ts."&sign=".$sign;
$sign = md5("access_key=".ACCESS_KEY."&appkey=".APPKEY."&ts=".TS.APPSEC);
$testurl = "https://app.bilibili.com/x/v2/account/myinfo?access_key=".ACCESS_KEY."&appkey=".APPKEY."&ts=".TS."&sign=".$sign;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $testurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@ -57,21 +45,8 @@ function get_uid(){
}
function get_uid_fromsql(){
$db_host=DB_HOST;
$db_user=DB_USER;
$db_pass=DB_PASS;
$db_name=DB_NAME;
$dbh='mysql:host='.$db_host.';'.'dbname='.$db_name;
try{
$dbh = new PDO($dbh,$db_user,$db_pass);
//echo '成功';
}catch(PDOException $e){
//echo '错误';
$uid = get_uid();
return $uid;
}
$access_key = $_GET['access_key'];
$sqlco = "SELECT `uid` FROM `keys` WHERE `access_key` = '".$access_key."'";
global $dbh;
$sqlco = "SELECT `uid` FROM `keys` WHERE `access_key` = '".ACCESS_KEY."'";
$cres = $dbh -> query($sqlco);
$vnum = $cres -> fetch();
$uid = $vnum['uid'];

Loading…
Cancel
Save