Commit 15ec20e9 by xuning

新任务

parent ded58319
......@@ -20,6 +20,10 @@
7981EAF02B6FC07800F357E7 /* XVCategoryTitleCellModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAEF2B6FC07800F357E7 /* XVCategoryTitleCellModel.m */; };
7981EAF32B6FC08F00F357E7 /* XVCategoryTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAF22B6FC08F00F357E7 /* XVCategoryTitleCell.m */; };
7981EAF62B6FD62200F357E7 /* XVOrderSortView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAF52B6FD62200F357E7 /* XVOrderSortView.m */; };
7981EAF92B71205A00F357E7 /* XVJobStatusToolView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAF82B71205A00F357E7 /* XVJobStatusToolView.m */; };
7981EAFC2B71272D00F357E7 /* XVNewJobViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAFB2B71272D00F357E7 /* XVNewJobViewCell.m */; };
7981EAFF2B712CC700F357E7 /* HBLockSliderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EAFE2B712CC700F357E7 /* HBLockSliderView.m */; };
7981EB042B7273B500F357E7 /* XVPersonalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7981EB032B7273B500F357E7 /* XVPersonalViewController.m */; };
799DF0C62B6BD8AF00680907 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0C52B6BD8AF00680907 /* AppDelegate.m */; };
799DF0D12B6BD8B100680907 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 799DF0D02B6BD8B100680907 /* Assets.xcassets */; };
799DF0D42B6BD8B100680907 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 799DF0D22B6BD8B100680907 /* LaunchScreen.storyboard */; };
......@@ -68,6 +72,14 @@
7981EAF22B6FC08F00F357E7 /* XVCategoryTitleCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVCategoryTitleCell.m; sourceTree = "<group>"; };
7981EAF42B6FD62200F357E7 /* XVOrderSortView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVOrderSortView.h; sourceTree = "<group>"; };
7981EAF52B6FD62200F357E7 /* XVOrderSortView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVOrderSortView.m; sourceTree = "<group>"; };
7981EAF72B71205A00F357E7 /* XVJobStatusToolView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVJobStatusToolView.h; sourceTree = "<group>"; };
7981EAF82B71205A00F357E7 /* XVJobStatusToolView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVJobStatusToolView.m; sourceTree = "<group>"; };
7981EAFA2B71272D00F357E7 /* XVNewJobViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVNewJobViewCell.h; sourceTree = "<group>"; };
7981EAFB2B71272D00F357E7 /* XVNewJobViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVNewJobViewCell.m; sourceTree = "<group>"; };
7981EAFD2B712CC700F357E7 /* HBLockSliderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBLockSliderView.h; sourceTree = "<group>"; };
7981EAFE2B712CC700F357E7 /* HBLockSliderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBLockSliderView.m; sourceTree = "<group>"; };
7981EB022B7273B500F357E7 /* XVPersonalViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVPersonalViewController.h; sourceTree = "<group>"; };
7981EB032B7273B500F357E7 /* XVPersonalViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVPersonalViewController.m; sourceTree = "<group>"; };
799DF0C12B6BD8AF00680907 /* fastservice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fastservice.app; sourceTree = BUILT_PRODUCTS_DIR; };
799DF0C42B6BD8AF00680907 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
799DF0C52B6BD8AF00680907 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
......@@ -154,10 +166,16 @@
7981EAD02B6F655500F357E7 /* View */ = {
isa = PBXGroup;
children = (
7981EAFD2B712CC700F357E7 /* HBLockSliderView.h */,
7981EAFE2B712CC700F357E7 /* HBLockSliderView.m */,
7981EAD12B6F656900F357E7 /* XVCustomBarView.h */,
7981EAD22B6F656900F357E7 /* XVCustomBarView.m */,
7981EAF42B6FD62200F357E7 /* XVOrderSortView.h */,
7981EAF52B6FD62200F357E7 /* XVOrderSortView.m */,
7981EAF72B71205A00F357E7 /* XVJobStatusToolView.h */,
7981EAF82B71205A00F357E7 /* XVJobStatusToolView.m */,
7981EAFA2B71272D00F357E7 /* XVNewJobViewCell.h */,
7981EAFB2B71272D00F357E7 /* XVNewJobViewCell.m */,
);
path = View;
sourceTree = "<group>";
......@@ -175,6 +193,23 @@
path = CustomCategoryView;
sourceTree = "<group>";
};
7981EB002B72739300F357E7 /* Personal */ = {
isa = PBXGroup;
children = (
7981EB012B72739D00F357E7 /* Controller */,
);
path = Personal;
sourceTree = "<group>";
};
7981EB012B72739D00F357E7 /* Controller */ = {
isa = PBXGroup;
children = (
7981EB022B7273B500F357E7 /* XVPersonalViewController.h */,
7981EB032B7273B500F357E7 /* XVPersonalViewController.m */,
);
path = Controller;
sourceTree = "<group>";
};
799DF0B82B6BD8AE00680907 = {
isa = PBXGroup;
children = (
......@@ -196,6 +231,7 @@
799DF0C32B6BD8AF00680907 /* fastservice */ = {
isa = PBXGroup;
children = (
7981EB002B72739300F357E7 /* Personal */,
7981EACB2B6F635F00F357E7 /* Main */,
799DF1162B6D2B1300680907 /* Login */,
799DF0F12B6BDA1400680907 /* Base */,
......@@ -491,11 +527,15 @@
799DF0F72B6BDA1400680907 /* BRPlaceholderTextView.m in Sources */,
7981EAF02B6FC07800F357E7 /* XVCategoryTitleCellModel.m in Sources */,
799DF0F82B6BDA1400680907 /* NSString+Unicode.m in Sources */,
7981EAFF2B712CC700F357E7 /* HBLockSliderView.m in Sources */,
7981EAF92B71205A00F357E7 /* XVJobStatusToolView.m in Sources */,
799DF0D72B6BD8B100680907 /* main.m in Sources */,
7981EB042B7273B500F357E7 /* XVPersonalViewController.m in Sources */,
7981EAF32B6FC08F00F357E7 /* XVCategoryTitleCell.m in Sources */,
7981EAF62B6FD62200F357E7 /* XVOrderSortView.m in Sources */,
7981EAC42B6E800900F357E7 /* XVInputFieldView.m in Sources */,
7981EAD92B6FB53E00F357E7 /* XVNewJobViewController.m in Sources */,
7981EAFC2B71272D00F357E7 /* XVNewJobViewCell.m in Sources */,
799DF11A2B6D2B3200680907 /* XVLoginViewController.m in Sources */,
7981EAED2B6FC05B00F357E7 /* XVCategoryTitleView.m in Sources */,
799DF0FB2B6BDA1400680907 /* WRNavigationBar.m in Sources */,
......
{
"images" : [
{
"filename" : "huadong.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "huadong@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "huadong@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "if-settings@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "new_order@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "闹钟@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
......@@ -58,6 +58,8 @@
_tableView.backgroundColor = DEFAULT_BACKGROUND_COLOR;
_tableView.rowHeight = UITableViewAutomaticDimension;
_tableView.estimatedRowHeight = 100;
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
return _tableView;
}
......
......@@ -71,7 +71,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface UIButton (XVAdd)
@property (nonatomic, assign) NSTimeInterval cs_acceptEventInterval; // 可以用这个给重复点击加间隔
/**
自定义响应边界 UIEdgeInsetsMake(-3, -4, -5, -6). 表示扩大
例如: self.btn.hitEdgeInsets = UIEdgeInsetsMake(-3, -4, -5, -6);
......
......@@ -12,7 +12,7 @@ static const char * kHitEdgeInsets = "hitEdgeInsets";
static const char * kHitScale = "hitScale";
static const char * kHitWidthScale = "hitWidthScale";
static const char * kHitHeightScale = "hitHeightScale";
static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";
@implementation UIView (XVAdd)
#pragma mark - 设置部分圆角
/**
......@@ -106,6 +106,69 @@ static const char * kHitHeightScale = "hitHeightScale";
@implementation UIButton (XVAdd)
// 在load时执行hook
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
//分别获取
SEL beforeSelector = @selector(sendAction:to:forEvent:);
SEL afterSelector = @selector(cs_sendAction:to:forEvent:);
Method beforeMethod = class_getInstanceMethod(class, beforeSelector);
Method afterMethod = class_getInstanceMethod(class, afterSelector);
//先尝试给原来的方法添加实现,如果原来的方法不存在就可以添加成功。返回为YES,否则
//返回为NO。
//UIButton 真的没有sendAction方法的实现,这是继承了UIControl的而已,UIControl才真正的实现了。
BOOL didAddMethod =
class_addMethod(class,
beforeSelector,
method_getImplementation(afterMethod),
method_getTypeEncoding(afterMethod));
NSLog(@"%d",didAddMethod);
if (didAddMethod) {
// 如果之前不存在,但是添加成功了,此时添加成功的是cs_sendAction方法的实现
// 这里只需要方法替换
class_replaceMethod(class,
afterSelector,
method_getImplementation(beforeMethod),
method_getTypeEncoding(beforeMethod));
} else {
//本来如果存在就进行交换
method_exchangeImplementations(afterMethod, beforeMethod);
}
});
}
- (void)cs_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
if ([NSDate date].timeIntervalSince1970 - self.cs_acceptEventTime < self.cs_acceptEventInterval) {
return;
}
if (self.cs_acceptEventInterval > 0) {
self.cs_acceptEventTime = [NSDate date].timeIntervalSince1970;
}
[self cs_sendAction:action to:target forEvent:event];
}
- (NSTimeInterval)cs_acceptEventInterval {
return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];
}
- (void)setCs_acceptEventInterval:(NSTimeInterval)cs_acceptEventInterval {
objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(cs_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
static const char *UIControl_acceptEventTime = "UIControl_acceptEventTime";
- (NSTimeInterval)cs_acceptEventTime {
return [objc_getAssociatedObject(self, UIControl_acceptEventTime) doubleValue];
}
- (void)setCs_acceptEventTime:(NSTimeInterval)cs_acceptEventTime {
objc_setAssociatedObject(self, UIControl_acceptEventTime, @(cs_acceptEventTime), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setHighlighted:(BOOL)highlighted {
}
......
......@@ -7,9 +7,16 @@
//
#import "XVNewJobViewController.h"
#import "XVJobStatusToolView.h"
#import "XVNewJobViewCell.h"
@interface XVNewJobViewController ()<UITextFieldDelegate>
@property (nonatomic, strong) UITextField *searchField;
@property (nonatomic, strong) XVJobStatusToolView *toolView;
@end
@implementation XVNewJobViewController
......@@ -23,8 +30,62 @@
}
- (void)viewDidLoad {
[super viewDidLoad];
[[NSUserDefaults standardUserDefaults] setValue:@(YES) forKey:@"_UIConstraintBasedLayoutLogUnsatisfiable"];
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 100;
self.tableView.estimatedSectionFooterHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
[self.tableView registerClass:[XVNewJobViewCell class] forCellReuseIdentifier:@"XVNewJobViewCell"];
[self setupUI];
}
- (void)setupUI {
[self.view addSubview:self.searchField];
[self.searchField mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view).mas_offset(6);
make.centerX.mas_equalTo(self.view);
make.width.mas_equalTo(SCREEN_WIDTH-24);
make.height.mas_equalTo(35);
}];
[self.view addSubview:self.toolView];
[self.toolView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(self.view);
make.centerX.mas_equalTo(self.view);
make.width.mas_equalTo(SCREEN_WIDTH);
make.height.mas_equalTo(61 + KiPhoneXSafeAreaDValue);
}];
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view).mas_offset(51);
make.left.right.mas_equalTo(self.view);
make.bottom.mas_equalTo(self.view.mas_safeAreaLayoutGuideBottom).mas_offset(-61);
}];
}
#pragma mark - TableViewDelegate & Datasource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
XVNewJobViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"XVNewJobViewCell"];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
}
- (void)textFieldDidChange:(UITextField *)textField {
self.view.backgroundColor = kRandomColor;
}
- (UITextField *)searchField {
......@@ -43,12 +104,17 @@
_searchField.clearButtonMode = UITextFieldViewModeAlways;
[_searchField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
kViewBorderRadius(self.searchField, 35/2, 0, [UIColor clearColor]);
}
return _searchField;
}
- (XVJobStatusToolView *)toolView {
if(_toolView == nil) {
_toolView = [[XVJobStatusToolView alloc]init];
_toolView.backgroundColor = [UIColor colorWithHexString:@"#EEEEEE"];
}
return _toolView;
}
@end
//
// HBLockSliderView.h
// MySliderDemo
//
// Created by 屌炸天 on 16/9/18.
// Copyright © 2016年 yhb. All rights reserved.
//
#import <UIKit/UIKit.h>
@class HBLockSliderView;
@protocol HBLockSliderDelegate <NSObject>
@optional
- (void)sliderValueChanging:(HBLockSliderView *)slider;
- (void)sliderEndValueChanged:(HBLockSliderView *)slider;
@end
@interface HBLockSliderView : UIView
@property (nonatomic, assign) CGFloat value;
@property (nonatomic, copy) NSString *text;
@property (nonatomic, strong)UIFont *font;
@property (nonatomic,strong) UIImage *thumbImage;
@property (nonatomic,strong) UIImage *finishImage;
@property (nonatomic, assign) BOOL thumbHidden;
/**
* 拖动后是否返回
*/
@property (nonatomic,assign) BOOL thumbBack;
@property (nonatomic, weak) id<HBLockSliderDelegate> delegate;
/**
* 设置滑动条进度
* value取值0~1
*/
- (void)setSliderValue:(CGFloat)value;
/**
* 动画设置滑动条进度
*/
- (void)setSliderValue:(CGFloat)value animation:(BOOL)animation completion:(void(^)(BOOL finish))completion;
/**
* 设置滑动条颜色
*
* @param backgroud 背景色
* @param foreground 前景色
* @param thumb 滑动控件颜色
* @param border 边框色
*/
- (void)setColorForBackgroud:(UIColor *)backgroud foreground:(UIColor *)foreground thumb:(UIColor *)thumb border:(UIColor *)border textColor:(UIColor *)textColor;
/**
* 设置滑动控件的起始图片和完成图片(可选)
*
* @param beginImage 启始图片
* @param endImage 完成图片
*/
- (void)setThumbBeginImage:(UIImage *)beginImage finishImage:(UIImage *)finishImage;
/**
* 移除圆角和边框
*/
- (void)removeRoundCorners:(BOOL)corners border:(BOOL)border;
- (void)setRoundCorners:(CGFloat)corners;
@end
//
// XVJobStatusToolView.h
// fastservice
//
// Created by xuning on 2/5/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface XVJobStatusToolView : UIView
@end
NS_ASSUME_NONNULL_END
//
// XVJobStatusToolView.m
// fastservice
//
// Created by xuning on 2/5/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import "XVJobStatusToolView.h"
@interface XVJobStatusToolView()
@property (nonatomic, strong) UIButton *settingButton;
@property (nonatomic, strong) UIButton *statusButton;
@end
@implementation XVJobStatusToolView
- (instancetype)initWithFrame:(CGRect)frame {
if(self = [super initWithFrame:frame]) {
[self setupUI];
}
return self;
}
- (void)setupUI {
[self addSubview:self.settingButton];
self.settingButton.frame = CGRectMake(22, 11, 48, 39);
[self.settingButton setTitleEdgeInsets:
UIEdgeInsetsMake(self.settingButton.frame.size.height/2,
(self.settingButton.frame.size.width-self.settingButton.titleLabel.intrinsicContentSize.width)/2-self.settingButton.imageView.frame.size.width,
0,
(self.settingButton.frame.size.width-self.settingButton.titleLabel.intrinsicContentSize.width)/2)];
[self.settingButton setImageEdgeInsets:
UIEdgeInsetsMake(
0,
(self.settingButton.frame.size.width-self.settingButton.imageView.frame.size.width)/2,
self.settingButton.titleLabel.intrinsicContentSize.height,
(self.settingButton.frame.size.width-self.settingButton.imageView.frame.size.width)/2)];
[self addSubview:self.statusButton];
[self.statusButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self).mas_offset(90);
make.right.mas_equalTo(self).mas_offset(-11);
make.top.mas_equalTo(self).mas_offset(11);
make.height.mas_equalTo(39);
}];
kViewBorderRadius(self.statusButton, 4, 0, COLOR_THEMEGRENN);
}
- (UIButton *)settingButton {
if(_settingButton == nil) {
_settingButton = [[UIButton alloc]initWithTitle:@"接单设置" fontSize:12 titleColor:F_415058_COLOR normalImageName:@"if-settings" selectedImgName:@"if-settings" backgroundColor:nil];
}
return _settingButton;
}
- (UIButton *)statusButton {
if(_statusButton == nil) {
_statusButton = [[UIButton alloc]initWithTitle:@"上线" fontSize:14 titleColor:[UIColor whiteColor] bgColor:COLOR_THEMEGRENN];
}
return _statusButton;
}
@end
//
// XVNewJobViewCell.h
// fastservice
//
// Created by xuning on 2/5/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface XVNewJobViewCell : UITableViewCell
@end
NS_ASSUME_NONNULL_END
//
// XVPersonalViewController.h
// fastservice
//
// Created by xuning on 2/6/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import "XVBaseViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface XVPersonalViewController : XVBaseViewController
@end
NS_ASSUME_NONNULL_END
//
// XVPersonalViewController.m
// fastservice
//
// Created by xuning on 2/6/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import "XVPersonalViewController.h"
@interface XVPersonalViewController ()
@end
@implementation XVPersonalViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
......@@ -59,6 +59,7 @@
#define F_666666_COLOR [UIColor colorWithHexString:@"#666666"]
#define F_606060_COLOR [UIColor colorWithHexString:@"#606060"]
#define F_BBBBBB_COLOR [UIColor colorWithHexString:@"#BBBBBB"]
#define F_101010_COLOR [UIColor colorWithHexString:@"#101010"]
#define E9_3_COLOR [UIColor colorWithHexString:@"#e9e9e9"]
#define F2_3_COLOR [UIColor colorWithHexString:@"#f2f2f2"]
......@@ -69,7 +70,7 @@
#define EF_3_COLOR [UIColor colorWithHexString:@"#efefef"]
#define B2_3_COLOR [UIColor colorWithHexString:@"#b2b2b2"]
#define DEFAULT_BACKGROUND_COLOR kHexRGB(0xf8f8f8)
#define DEFAULT_BACKGROUND_COLOR kHexRGB(0xf7f7f7)
#define kViewBorderRadius(View, Radius, Width, Color)\
[View.layer setCornerRadius:(Radius)];\
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment