Commit 3159f1dc by ludi

修复一些ui问题

parent 8920fece
Showing with 96 additions and 106 deletions
...@@ -102,7 +102,7 @@ ...@@ -102,7 +102,7 @@
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
00E501FF2E0543A800579DB0 /* Exceptions for "NotificationService" folder in "NotificationService" target */ = { 00E501FF2E0543A800579DB0 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet; isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = ( membershipExceptions = (
"NotificationService-Info.plist", "NotificationService-Info.plist",
...@@ -112,18 +112,7 @@ ...@@ -112,18 +112,7 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFileSystemSynchronizedRootGroup section */
00E501F42E0543A800579DB0 /* NotificationService */ = { 00E501F42E0543A800579DB0 /* NotificationService */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (00E501FF2E0543A800579DB0 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = NotificationService; sourceTree = "<group>"; };
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
00E501FF2E0543A800579DB0 /* Exceptions for "NotificationService" folder in "NotificationService" target */,
);
explicitFileTypes = {
};
explicitFolders = (
);
path = NotificationService;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */ /* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
...@@ -426,10 +415,14 @@ ...@@ -426,10 +415,14 @@
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
inputPaths = (
);
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-frameworks.sh\"\n";
...@@ -443,10 +436,14 @@ ...@@ -443,10 +436,14 @@
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources-${CONFIGURATION}-input-files.xcfilelist",
); );
inputPaths = (
);
name = "[CP] Copy Pods Resources"; name = "[CP] Copy Pods Resources";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources-${CONFIGURATION}-output-files.xcfilelist",
); );
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-FuSiLive/Pods-FuSiLive-resources.sh\"\n";
...@@ -676,7 +673,7 @@ ...@@ -676,7 +673,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_ENTITLEMENTS = FuSiLive/FuSiLive.entitlements; CODE_SIGN_ENTITLEMENTS = FuSiLive/FuSiLive.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 202506260039; CURRENT_PROJECT_VERSION = 202506260040;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 6GG26BHUMC; DEVELOPMENT_TEAM = 6GG26BHUMC;
ENABLE_ON_DEMAND_RESOURCES = NO; ENABLE_ON_DEMAND_RESOURCES = NO;
...@@ -941,7 +938,7 @@ ...@@ -941,7 +938,7 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_ENTITLEMENTS = FuSiLive/FuSiLive.entitlements; CODE_SIGN_ENTITLEMENTS = FuSiLive/FuSiLive.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 202506260039; CURRENT_PROJECT_VERSION = 202506260040;
DEFINES_MODULE = YES; DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 6GG26BHUMC; DEVELOPMENT_TEAM = 6GG26BHUMC;
ENABLE_ON_DEMAND_RESOURCES = NO; ENABLE_ON_DEMAND_RESOURCES = NO;
......
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "live_pk_control_search_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "live_pk_control_search_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
...@@ -418,6 +418,10 @@ class FUSPKControlContributionHotDataCell: UITableViewCell { ...@@ -418,6 +418,10 @@ class FUSPKControlContributionHotDataCell: UITableViewCell {
var level = model.level var level = model.level
if isVip == 0 { if isVip == 0 {
level = -1 level = -1
self.richImageView.isHidden = true
}
else {
self.richImageView.isHidden = false
} }
self.richImageView.image = .fus_image(withLevel: level) self.richImageView.image = .fus_image(withLevel: level)
......
...@@ -108,16 +108,16 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView { ...@@ -108,16 +108,16 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView {
override func makeUI() { override func makeUI() {
super.makeUI() super.makeUI()
let bottomBgColorView = UIView() // let bottomBgColorView = UIView()
bottomBgColorView.backgroundColor = .init(hex: "#F0F0F0") // bottomBgColorView.backgroundColor = .init(hex: "#F0F0F0")
self.addSubview(bottomBgColorView) // self.addSubview(bottomBgColorView)
bottomBgColorView.snp.makeConstraints { make in // bottomBgColorView.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(16) // make.left.right.equalToSuperview().inset(16)
make.bottom.equalToSuperview() // make.bottom.equalToSuperview()
make.height.equalTo(10) // make.height.equalTo(10)
} // }
bgImageView.backgroundColor = .init(hex: "#F0F0F0") // bgImageView.backgroundColor = .init(hex: "#F0F0F0")
bgImageView.layer.cornerRadius = 8 bgImageView.layer.cornerRadius = 8
bgImageView.layer.masksToBounds = true bgImageView.layer.masksToBounds = true
bgImageView.isUserInteractionEnabled = true bgImageView.isUserInteractionEnabled = true
...@@ -125,7 +125,7 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView { ...@@ -125,7 +125,7 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView {
bgImageView.snp.makeConstraints { make in bgImageView.snp.makeConstraints { make in
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
make.top.equalTo(10) make.top.equalTo(10)
make.left.right.equalToSuperview().inset(16) make.left.right.equalToSuperview().inset(8)
} }
titleLabel.font = .fus_themeMediumFont(17) titleLabel.font = .fus_themeMediumFont(17)
...@@ -146,7 +146,7 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView { ...@@ -146,7 +146,7 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView {
} }
let searchBgView = UIView() let searchBgView = UIView()
searchBgView.backgroundColor = .white searchBgView.backgroundColor = .init(hex: "#F0F0F0")
searchBgView.layer.cornerRadius = 34/2.0 searchBgView.layer.cornerRadius = 34/2.0
searchBgView.layer.masksToBounds = true searchBgView.layer.masksToBounds = true
bgImageView.addSubview(searchBgView) bgImageView.addSubview(searchBgView)
...@@ -158,7 +158,8 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView { ...@@ -158,7 +158,8 @@ class FUSPKControlSearchPlayerPlayerListHeader: FUSBaseView {
make.top.equalTo(titleLabel.snp.bottom) make.top.equalTo(titleLabel.snp.bottom)
} }
let searchIcon = UIImageView(image: FUSShowRoomCenterBunble.imageNamed("live_pk_control_search_icon")) let searchIcon = UIImageView(image: FUSShowRoomCenterBunble.imageNamed("fus_home_navi_search_icon"))
searchIcon.contentMode = .scaleAspectFit
searchBgView.addSubview(searchIcon) searchBgView.addSubview(searchIcon)
searchIcon.snp.makeConstraints { make in searchIcon.snp.makeConstraints { make in
make.left.equalTo(10) make.left.equalTo(10)
...@@ -257,23 +258,23 @@ class FUSPKControlSearchPlayerPlayerListCell: UITableViewCell { ...@@ -257,23 +258,23 @@ class FUSPKControlSearchPlayerPlayerListCell: UITableViewCell {
let lineView = UIView() let lineView = UIView()
func makeUI(){ func makeUI(){
let topBgColorView = UIView() // let topBgColorView = UIView()
topBgColorView.backgroundColor = .init(hex: "#F0F0F0") // topBgColorView.backgroundColor = .init(hex: "#F0F0F0")
self.addSubview(topBgColorView) // self.addSubview(topBgColorView)
topBgColorView.snp.makeConstraints { make in // topBgColorView.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(16) // make.left.right.equalToSuperview().inset(16)
make.top.equalToSuperview() // make.top.equalToSuperview()
make.height.equalTo(10) // make.height.equalTo(10)
} // }
bgImageView.backgroundColor = .init(hex: "#F0F0F0") // bgImageView.backgroundColor = .init(hex: "#F0F0F0")
bgImageView.layer.cornerRadius = 8 bgImageView.layer.cornerRadius = 8
bgImageView.layer.masksToBounds = true bgImageView.layer.masksToBounds = true
bgImageView.isUserInteractionEnabled = true bgImageView.isUserInteractionEnabled = true
self.contentView.addSubview(bgImageView) self.contentView.addSubview(bgImageView)
bgImageView.snp.makeConstraints { make in bgImageView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview() make.top.bottom.equalToSuperview()
make.left.right.equalToSuperview().inset(16) make.left.right.equalToSuperview().inset(8)
} }
faceView.layer.cornerRadius = 40 / 2.0 faceView.layer.cornerRadius = 40 / 2.0
...@@ -391,6 +392,10 @@ class FUSPKControlSearchPlayerPlayerListCell: UITableViewCell { ...@@ -391,6 +392,10 @@ class FUSPKControlSearchPlayerPlayerListCell: UITableViewCell {
var level = model.level var level = model.level
if isVip == false { if isVip == false {
level = -1 level = -1
self.richImageView.isHidden = true
}
else {
self.richImageView.isHidden = false
} }
self.richImageView.image = .fus_image(withLevel: level) self.richImageView.image = .fus_image(withLevel: level)
...@@ -420,18 +425,18 @@ class FUSPKControlSearchPlayerNoDataCell: UITableViewCell { ...@@ -420,18 +425,18 @@ class FUSPKControlSearchPlayerNoDataCell: UITableViewCell {
func makeUI(){ func makeUI(){
let topColorView = UIView() // let topColorView = UIView()
topColorView.backgroundColor = .init(hex: "#F0F0F0") // topColorView.backgroundColor = .init(hex: "#F0F0F0")
self.contentView.addSubview(topColorView) // self.contentView.addSubview(topColorView)
topColorView.snp.makeConstraints { make in // topColorView.snp.makeConstraints { make in
make.left.right.equalToSuperview().inset(16) // make.left.right.equalToSuperview().inset(16)
make.top.equalToSuperview() // make.top.equalToSuperview()
make.height.equalTo(10) // make.height.equalTo(10)
} // }
bgImageView.layer.cornerRadius = 8 bgImageView.layer.cornerRadius = 8
bgImageView.layer.masksToBounds = true bgImageView.layer.masksToBounds = true
bgImageView.backgroundColor = .init(hex: "#F0F0F0") // bgImageView.backgroundColor = .init(hex: "#F0F0F0")
self.contentView.addSubview(bgImageView) self.contentView.addSubview(bgImageView)
bgImageView.snp.makeConstraints { make in bgImageView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview() make.top.bottom.equalToSuperview()
......
...@@ -149,13 +149,20 @@ class FUSPKUserContributionLogCell: UITableViewCell { ...@@ -149,13 +149,20 @@ class FUSPKUserContributionLogCell: UITableViewCell {
var level = model.level var level = model.level
if model.inVip == 0 { if model.inVip == 0 {
level = 0 level = -1
} }
if model.inHide == "1" { if model.inHide == "1" {
level = -1 level = -1
} }
if level < 0 {
self.richImageView.isHidden = true
}
else {
self.richImageView.isHidden = false
}
self.faceView.setWebImageWithSubURLString(model.face) self.faceView.setWebImageWithSubURLString(model.face)
self.richImageView.image = .fus_image(withLevel: level) self.richImageView.image = .fus_image(withLevel: level)
self.nicknameLabel.text = model.nickname.removingPercentEncoding self.nicknameLabel.text = model.nickname.removingPercentEncoding
......
...@@ -26,7 +26,7 @@ public class FUSPKControlContributionView: FUSPKControlSubBaseView { ...@@ -26,7 +26,7 @@ public class FUSPKControlContributionView: FUSPKControlSubBaseView {
let tableView = UITableView(frame: .zero, style: .grouped) let tableView = UITableView(frame: .zero, style: .grouped)
let bottomStatusBgView = UIView() let bottomStatusBgView = UIView()
let goPkBtn = FUSStyleButton(type: .custom) let goPkBtn = FUSStyleButton(type: .custom)
private let emptyView = FUSEmptyView(frame: CGRectMake(0, 0, UIView.fus_screenW(), 300)) private let emptyView = UIView(frame: CGRectMake(0, 0, UIView.fus_screenW(), 300))
let pkStatusBgView = FUSPKControlContributionPkStatusView(frame: .zero) let pkStatusBgView = FUSPKControlContributionPkStatusView(frame: .zero)
/// 控制section的显示 /// 控制section的显示
...@@ -101,7 +101,13 @@ public class FUSPKControlContributionView: FUSPKControlSubBaseView { ...@@ -101,7 +101,13 @@ public class FUSPKControlContributionView: FUSPKControlSubBaseView {
// emptyView.isHidden = true // emptyView.isHidden = true
emptyView.backgroundColor = .clear emptyView.backgroundColor = .clear
self.emptyView.fus_setEmptyViewIcon(.fus_emptyImg(), title: .fus_localString("暂无数据"), buttonTittle: "") let emptyShowView = FUSEmptyView(frame: CGRectMake(0, 0, 200, 200))
emptyShowView.fus_setEmptyViewIcon(.fus_emptyImg(), title: .fus_localString("暂无数据"), buttonTittle: "")
emptyView.addSubview(emptyShowView)
emptyShowView.snp.makeConstraints { make in
make.center.equalToSuperview()
make.size.equalTo(emptyShowView.size)
}
let bottomBgView = UIImageView() let bottomBgView = UIImageView()
bottomBgView.backgroundColor = .white bottomBgView.backgroundColor = .white
......
...@@ -170,8 +170,8 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -170,8 +170,8 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
let avatarTapBtn = UIButton(type: .custom) let avatarTapBtn = UIButton(type: .custom)
let bgImageView = UIImageView(image: FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_blue")) let bgImageView = UIImageView(image: FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_blue"))
let faceView = FUSRichIconView(frame: CGRectMake(0, 0, 40, 40)) let faceView = UIImageView(frame: CGRectMake(0, 0, 40, 40))
let richImageView = UIImageView(frame: .init(x: 0, y: 0, width: 37, height: 14)) let richImageView = UIImageView()
let nicknameLabel = UILabel() let nicknameLabel = UILabel()
let muteBtn = UIButton(type: .custom) let muteBtn = UIButton(type: .custom)
let muteDescLabel = UILabel() let muteDescLabel = UILabel()
...@@ -197,6 +197,8 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -197,6 +197,8 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
make.left.top.equalToSuperview().inset(6) make.left.top.equalToSuperview().inset(6)
} }
faceView.layer.cornerRadius = 40 / 2.0
faceView.layer.masksToBounds = true
bgImageView.addSubview(faceView) bgImageView.addSubview(faceView)
faceView.snp.makeConstraints { make in faceView.snp.makeConstraints { make in
make.left.equalTo(28) make.left.equalTo(28)
...@@ -209,19 +211,14 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -209,19 +211,14 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
make.edges.equalTo(faceView).inset(-10) make.edges.equalTo(faceView).inset(-10)
} }
bgImageView.addSubview(richImageView)
richImageView.snp.makeConstraints { make in
make.left.equalTo(faceView.snp.right).offset(8)
make.centerY.equalToSuperview()
make.width.equalTo(37)
make.height.equalTo(14)
}
nicknameLabel.font = .fus_themeMediumFont(15) nicknameLabel.font = .fus_themeMediumFont(15)
nicknameLabel.textColor = .fus_textColorRich()
bgImageView.addSubview(nicknameLabel) bgImageView.addSubview(nicknameLabel)
nicknameLabel.snp.makeConstraints { make in
make.left.equalTo(richImageView.snp.right).offset(6) bgImageView.addSubview(richImageView)
make.centerY.equalToSuperview() richImageView.snp.makeConstraints { make in
make.left.equalTo(nicknameLabel.snp.right).offset(2)
make.centerY.equalTo(faceView.snp.centerY)
} }
muteBtn.setImage(FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_mute_off"), for: .normal) muteBtn.setImage(FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_mute_off"), for: .normal)
...@@ -233,6 +230,12 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -233,6 +230,12 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
make.size.equalTo(CGSizeMake(40, 40)) make.size.equalTo(CGSizeMake(40, 40))
} }
nicknameLabel.snp.makeConstraints { make in
make.left.equalTo(faceView.snp.right).offset(8)
make.centerY.equalTo(faceView.snp.centerY)
make.right.lessThanOrEqualTo(muteBtn.snp.left).offset(-80)
}
muteDescLabel.font = .fus_themeMediumFont(11) muteDescLabel.font = .fus_themeMediumFont(11)
// if FUSLocalizationHelper.fus_isChineseEnvironment() == false { // if FUSLocalizationHelper.fus_isChineseEnvironment() == false {
// muteDescLabel.font = .fus_themeMediumFont(9) // muteDescLabel.font = .fus_themeMediumFont(9)
...@@ -263,27 +266,6 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -263,27 +266,6 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
} }
public func fus_setup(model: FUSPKAnchorModel) { public func fus_setup(model: FUSPKAnchorModel) {
let isVip = model.vip == 1
var level = model.level
self.nicknameLabel.textColor = .white
if isVip, let levelModel = FUSSwiftCacheDataShare.share.fus_levelModel(level: level) {
self.nicknameLabel.textColor = .init(hex: levelModel.color)
richImageView.setWebImageWithSubURLString(levelModel.icon)
richImageView.isHidden = false
nicknameLabel.snp.makeConstraints { make in
make.left.equalTo(richImageView.snp.right).offset(6)
make.centerY.equalToSuperview()
}
}else {
richImageView.isHidden = true
level = 0
nicknameLabel.snp.makeConstraints { make in
make.left.equalTo(faceView.snp.right).offset(8)
make.centerY.equalToSuperview()
}
}
if model.sideColor == .red { if model.sideColor == .red {
self.bgImageView.image = FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_red") self.bgImageView.image = FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_red")
...@@ -292,7 +274,18 @@ class FUSPKControlOpponentInfoView: FUSBaseView { ...@@ -292,7 +274,18 @@ class FUSPKControlOpponentInfoView: FUSBaseView {
self.bgImageView.image = FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_blue") self.bgImageView.image = FUSShowRoomCenterBunble.imageNamed("live_pk_control_opponent_info_bg_blue")
} }
self.faceView.fus_setupIcon(withFacePath: model.face ?? "", level: level) let isVip = model.vip == 1
var level = model.level
if isVip == false {
level = -1
self.richImageView.isHidden = true
}
else {
self.richImageView.isHidden = false
}
self.richImageView.image = .fus_image(withLevel: level)
self.faceView.setWebImageWithSubURLString(model.face)
self.nicknameLabel.text = model.nickname?.removingPercentEncoding self.nicknameLabel.text = model.nickname?.removingPercentEncoding
} }
......
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 sign in to comment