first commit

This commit is contained in:
Jane Doe 2025-03-04 15:25:38 +08:00
commit 4ad00dedd5
188 changed files with 7420 additions and 0 deletions

393
app.js Normal file
View File

@ -0,0 +1,393 @@
// 引入封装加密包
const aes = require('./utils/aes')
App({
onLaunch: function(e) {
var t = this;
const query = e.query
const inviter_nickname = query.uuid || ''
console.log("邀请人id", inviter_nickname)
wx.setStorageSync('inviter_nickname', inviter_nickname);
this.globalData.launchOptions = e,
this.getUserInfo().then(function() {
console.log(e)
}).catch(function(e) {
console.error("获取用户信息失败:", e);
});
},
getCurrentTabbar(selected, that) {
if (typeof that.getTabBar === 'function' &&
that.getTabBar()) {
that.getTabBar().setData({
selected: selected
})
}
},
onShow() {
console.log('执行app.jsonShow')
console.log(1)
},
getPopupConfig() {
return new Promise((resolve, reject) => {
this.apiRequest({
url: '/popup-config/', // 后端接口地址
method: 'POST',
success: res => {
console.log(res)
if (res.data) {
const { is_enabled, popup_type, content } = res.data.data;
// 存储到本地缓存
wx.setStorageSync('popupEnabled', is_enabled);
wx.setStorageSync('popupType', popup_type);
wx.setStorageSync('popupContent', content);
console.log('弹窗配置已成功获取');
resolve(res.data.data); // 返回获取到的数据
} else {
console.warn('弹窗数据获取失败');
reject(new Error('弹窗数据获取失败'));
}
},
fail: error => {
console.error('请求失败:', error);
reject(error);
}
});
});
},
广告(){
wx.navigateTo({
url: "/pages/details/details",
success() {
console.log('跳转成功');
},
fail(err) {
console.error('跳转失败:', err);
}
});
},
checkUpdateVersion() {
console.log('检查微信版本是否支持更新机制');
if (wx.canIUse('getUpdateManager')) {
const updateManager = wx.getUpdateManager();
updateManager.onCheckForUpdate(function (res) {
console.log('检查新版本', res);
if (res.hasUpdate) {
updateManager.onUpdateReady(function () {
console.log('新版本下载完成');
wx.showModal({
title: '更新提示',
content: '新版本已准备好,是否重启应用?',
success: (res) => {
if (res.confirm) {
console.log('用户确认更新');
updateManager.applyUpdate();
}
}
});
});
updateManager.onUpdateFailed(function () {
console.log('新版本下载失败');
wx.showModal({
title: '已经有新版本了~',
content: '新版本下载失败,请检查网络设置后重试。',
showCancel: false,
});
});
} else {
console.log('当前是最新版本');
}
});
} else {
wx.showModal({
title: '温馨提示',
content: '当前微信版本过低,无法使用自动更新功能,请升级到最新微信版本后重试。',
showCancel: false,
});
}
},
/**
* 登陆并获取用户信息token
* @param {*} callback
*/
getUserInfo: async function () {
wx.showLoading({
title: '正在加载...'
});
try {
let openid = wx.getStorageSync('openid');
if (!openid) {
const loginRes = await this.login();
openid = loginRes.data.userInfo.openid;
wx.setStorageSync('openid', openid);
this.globalData.hasUserInfo = true;
}
await this.getinfo(); // 调用 getinfo 方法获取用户信息
wx.hideLoading();
} catch (error) {
console.error('操作失败:', error);
wx.hideLoading();
throw error; // 将错误向上抛出,让调用者可以捕获
}
},
login: function () {
return new Promise((resolve, reject) => {
wx.login({
success: res => {
const code = res.code;
this.apiRequest({
url: '/myapp/login/',
method: 'POST',
data: {
code,
data: res.encryptedData,
iv: res.iv,
Options: this.globalData.launchOptions
},
success: res => resolve(res),
fail: error => reject(error)
});
},
fail: error => reject(error)
});
});
},
getinfo: function () {
return new Promise((resolve, reject) => {
this.apiRequest({
url: '/myapp/userinfo/',
method: 'POST',
data: {
'openid': wx.getStorageSync('openid'),
},
success: res => {
console.log('获取信息成功', res);
this.processUserInfo(res.data.userInfo, res.data.membershipTypeList);
resolve();
},
fail: error => {
console.error('获取信息失败:', error);
reject(error);
}
});
});
},
processUserInfo: function (userInfo, membershipTypeList) {
// 更新用户信息到本地存储
wx.setStorageSync('userId', userInfo.nickname);
wx.setStorageSync('uuid', userInfo.nickname);
wx.setStorageSync('openid', userInfo.openid);
wx.setStorageSync('token', userInfo.token);
wx.setStorageSync('dailyVideoQuota', userInfo.daily_video_quota);
wx.setStorageSync('totalParseNum', userInfo.usage_count);
wx.setStorageSync('defaultDailyFreeParseNum', userInfo.coins);
wx.setStorageSync('isMember', userInfo.is_member);
wx.setStorageSync('startTime', userInfo.member_start_time);
wx.setStorageSync('endTime', userInfo.member_end_time);
wx.setStorageSync('cards', membershipTypeList);
wx.setStorageSync('invitees_count', userInfo.invitees_count);
wx.setStorageSync('balance', userInfo.balance);
// 检查会员状态
this.checkMembershipExpiration(userInfo.member_end_time, userInfo.is_member);
},
checkMembershipExpiration: function (endTimeStr, isMember) {
if (endTimeStr && isMember) {
const currentTimeStamp = Date.now(); // 当前时间戳(毫秒)
// 判断 endTimeStr 是时间戳还是日期字符串
const endTime = typeof endTimeStr === "number"
? endTimeStr * 1000 // 如果是秒时间戳,转换为毫秒
: new Date(endTimeStr).getTime(); // 如果是字符串,解析为毫秒
// 验证时间是否有效
if (isNaN(endTime)) {
console.error("无效的时间格式:", endTimeStr);
return;
}
console.log("当前时间戳(毫秒):", currentTimeStamp);
console.log("会员到期时间戳(毫秒):", endTime);
// 检查会员是否过期
if (currentTimeStamp > endTime) {
wx.setStorageSync('isMember', false);
console.log('会员已过期,更新会员状态');
}
}
},
check_status: function() {
var e = this;
return new Promise(function(t, n) {
e.apiRequest({
url: "/api/check_status/?param=0",
method: "GET",
success: function(e) {
t(e);
},
fail: function(e) {
n(e);
}
});
});
},
globalData: {
selected: 0,
userInfo: null,
hasUserInfo: false,
// chatApiDomain: "https://chat.guimiaokeji.com",
chatApiDomain: "https://chat.guimiaokeji.com",
apiDomain: 'https://kuaiying.bytefunction.com', //生产
downloadPrefix: 'https://kuaiying.bytefunction.com/proxy?url=', // 通过代理服务器中转微信限制资源域名不同平台cdn域名千变万化
defaultDailyFreeParseNum: 0, //免费次数
totalParseNum: 0, //总次数
uuid: null,
isMember: true, // 假设默认为会员
startTime: null,
endTime: null,
launchOptions:null //页面参数
},
//chat服务统一调用接口的方法
chatApiRequest: function (options) {
const timestamp = Date.now();
let t = timestamp
let x = aes.Encrypt(String(timestamp))
return wx.request({
url: this.globalData.chatApiDomain + options.url,
method: options.method ? options.method : 'GET',
enableChunked: options.enableChunked?options.enableChunked:false,
header: {
'Authorization': 'Bearer ' + wx.getStorageSync('token'),
'Accept': 'application/json',
'x': x,
't': t
},
dataType: 'json',
data: options.data,
success: res => {
switch (res.statusCode) {
case 200:
options.success(res);
break;
case 401:
this.toLogin();
break;
case 422:
break;
case 404:
wx.showToast({
title: '请求地址不存在',
icon: 'none'
})
break;
default:
wx.showToast({
title: res.data.error,
icon: 'none'
})
}
},
fail: res => {
if (options.fail) {
options.fail(res);
}
},
complete: res => {
if (options.complete) {
options.complete(res);
}
}
});
},
//全局统一调用接口的方法
apiRequest: function (options) {
const timestamp = Date.now();
let t = timestamp
let x = aes.Encrypt(String(timestamp))
wx.request({
url: this.globalData.apiDomain + options.url,
method: options.method ? options.method : 'GET',
header: {
'Authorization': 'Bearer ' + wx.getStorageSync('token'),
'Accept': 'application/json',
'x': x,
't': t
},
dataType: 'json',
data: options.data,
success: res => {
switch (res.statusCode) {
case 200:
options.success(res);
break;
case 401:
this.toLogin();
break;
case 422:
break;
case 404:
wx.showToast({
title: '请求地址不存在',
icon: 'none'
})
break;
default:
wx.showToast({
title: res.data.message,
icon: 'none'
})
}
},
fail: res => {
if (options.fail) {
options.fail(res);
}
},
complete: res => {
if (options.complete) {
options.complete(res);
}
}
});
},
// 上传图片
uploadFile: function (filePath) {
return new Promise((resolve, reject) => {
wx.uploadFile({
url: this.globalData.apiDomain + "/myapp/upload_image/", // 上传的服务器接口地址
filePath: filePath,
name: 'image_file',
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data)
} else {
reject(res)
}
},
fail: (err) => {
console.error('Upload failed:', err);
wx.showToast({
title: '上传错误',
icon: 'error'
});
}
})
})
},
// 生成视频额度是否为0
noQuota: function(){
let dailyVideoQuota = wx.getStorageSync('dailyVideoQuota')
return dailyVideoQuota < 1
}
});

60
app.json Normal file
View File

@ -0,0 +1,60 @@
{
"pages": [
"pages/index/index",
"pages/mine/mine",
"pages/video/video",
"pages/extract/extract",
"pages/users/users",
"pages/agent/agent",
"pages/invite/invite",
"pages/faq/faq",
"pages/vip_recharge/vip_recharge",
"pages/business_cooperation/business_cooperation",
"pages/invite_incentive/invite_incentive",
"pages/video_list/video_list",
"pages/aitools/aitools",
"pages/details/details",
"pages/bot-list/bot-list"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "WeChat",
"navigationBarTextStyle": "black"
},
"tabBar": {
"custom": true,
"color": "#bfbfbf",
"selectedColor": "#337AFF",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "images/主页.png",
"selectedIconPath": "images/主页点击.png"
},
{
"pagePath": "pages/aitools/aitools",
"text": "写文案",
"iconPath": "images/AI分析.png",
"selectedIconPath": "images/AI分析点击.png"
},
{
"pagePath": "pages/video_list/video_list",
"text": "违规检测",
"iconPath": "images/文案库.png",
"selectedIconPath": "images/文案库点击.png"
},
{
"pagePath": "pages/mine/mine",
"text": "我的",
"iconPath": "images/我的.png",
"selectedIconPath": "images/我的点击.png"
}
]
},
"sitemapLocation": "sitemap.json"
}

10
app.wxss Normal file
View File

@ -0,0 +1,10 @@
/**app.wxss**/
.container {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 200rpx 0;
box-sizing: border-box;
}

44
custom-tab-bar/index.js Normal file
View File

@ -0,0 +1,44 @@
Component({
data: {
selected: 0,
color: "#bfbfbf",
selectedColor: "#337AFF",
list: [
{
pagePath: "/pages/index/index",
iconPath: "/images/主页.png",
selectedIconPath: "/images/主页点击.png",
text: "首页"
},
{
pagePath: "/pages/aitools/aitools",
iconPath: "/images/AI分析.png",
selectedIconPath: "/images/AI分析.png",
text: "写文案"
},
{
pagePath: "/pages/video_list/video_list",
iconPath: "/images/文案库.png",
selectedIconPath: "/images/文案库点击.png",
text: "违规检测"
},
{
pagePath: "/pages/mine/mine",
iconPath: "/images/my.png",
selectedIconPath: "/images/我的点击.png",
text: "我的"
}
]
},
attached() {},
methods: {
switchTab(e) {
const data = e.currentTarget.dataset
const url = data.path
console.log(data)
wx.switchTab({
url
})
}
}
});

View File

@ -0,0 +1,3 @@
{
"component": true
}

View File

@ -0,0 +1,8 @@
<view class="tab-bar">
<block wx:for="{{list}}" wx:key="index">
<view class="tab-bar-item" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab">
<image class="tab-bar-icon" src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image>
<text class="tab-bar-text" style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</text>
</view>
</block>
</view>

35
custom-tab-bar/index.wxss Normal file
View File

@ -0,0 +1,35 @@
.tab-bar {
position: fixed;
bottom: 0;
width: 100%;
height: 60px;
background-color: #222238;
border-top:solid 1px rgba(233, 213, 213,0.5);
display: flex;
justify-content: space-around;
align-items: center;
z-index: 9999; /* 确保 z-index 足够高 */
}
.tab-bar-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
flex: 1;
transition: all 0.3s;
}
.tab-bar-icon {
width: 24px;
height: 24px;
margin-bottom: 5px;
}
.tab-bar-text {
margin-bottom: 10px;
font-size: 12px;
font-family: Arial, sans-serif;
}

BIN
icons/back.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
icons/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
icons/folder.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

BIN
icons/lw.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
images/1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
images/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
images/2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
images/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
images/3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
images/4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
images/AI分析.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

BIN
images/AI分析点击.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 949 B

BIN
images/ChatGPT-copy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
images/Likee.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
images/Runwayml.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

BIN
images/Twitter.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/VIP.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
images/YouTube.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/aws.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
images/butterfly-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
images/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1022 B

BIN
images/dianshu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/f.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
images/header.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
images/huiyuan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
images/icon-clear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
images/icon-faq.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/icon-home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
images/icon-lock.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 832 B

BIN
images/icon-me-selected.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
images/icon-me.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
images/icon-more.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

BIN
images/icon-set.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/icon-upload.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

BIN
images/index.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
images/index.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
images/indexs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
images/instagram.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/link_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
images/loading.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
images/logo-365yg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
images/logo-douyin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
images/logo-gitShow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
images/logo-meipai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
images/logo-miaopai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
images/logo-microview.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
images/me-bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
images/my.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

BIN
images/mys.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
images/radar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
images/share.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
images/submit_success.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
images/t.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
images/t.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
images/tiktok-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
images/tiktok.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 851 B

BIN
images/timg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
images/upload.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
images/upload_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
images/y.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
images/youtube.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

BIN
images/主页.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
images/主页点击.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
images/二维码.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
images/人民币.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
images/代理商.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
images/任务进程.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
images/会员、vip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
images/兑换码.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
images/关闭.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

BIN
images/写作.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

BIN
images/分享.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
images/分享2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
images/分支.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
images/分类.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

BIN
images/切换角色.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 794 B

BIN
images/多素材.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

BIN
images/客服.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
images/客服二维码.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
images/客服优先.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
images/帮助.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
images/帮助2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
images/平台.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
images/我的.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
images/我的点击.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
images/手.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

BIN
images/接口配置.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
images/搜索.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More