新评判
This commit is contained in:
		
							parent
							
								
									fd44196a1d
								
							
						
					
					
						commit
						88f00ddfcf
					
				| @ -27,7 +27,7 @@ | ||||
| #define JUDGE_VERSION_MAJOR  1 | ||||
| #define JUDGE_VERSION_MINOR  0 | ||||
| #define JUDGE_VERSION_PATCH  3 | ||||
| #define JUDGE_VERSION_STAMP  "2505132200b" | ||||
| #define JUDGE_VERSION_STAMP  "2505201042b" | ||||
| #if JUDGE_USE_OLD | ||||
| #   undef JUDGE_VERSION_STAMP | ||||
| #   define JUDGE_VERSION_STAMP  "2411121010b.old" | ||||
|  | ||||
| @ -635,27 +635,29 @@ bool ExamCarSub3::Init_KM3_Global() | ||||
|         //只有掉头项目才有右掉头一说  //20150516
 | ||||
|         examItem->bYdt = (itemNo == Sub3ItemType12Dtxx && parm1->TXT2 == "ydt" ? true : false); //是否右掉头
 | ||||
| 
 | ||||
|         //如果是满分学习的 czlx=1 m_stuInfo.czlx //满分学习非必考项目,一开始考试就通知外壳合格变绿
 | ||||
|         //满分学习,如果都没配默认都要做,   如果配了就是配哪个做哪个没配不做
 | ||||
|         //大车夜考,如果都没配默认都算完成,  如果配了就是配哪个做哪个没配不做
 | ||||
|         //如果是满分学习的 czlx=1 m_stuInfo.czlx
 | ||||
|         if(m_stuInfo.mfxx && itemNo != Sub3ItemType13Yjxs && IS_A1A2A3B1B2C6(cartype)) | ||||
|         { | ||||
|             if(m_car.MFXX_KSXM != "") | ||||
|             { | ||||
|                 std::string s  = "," + std::to_string(itemNo) + ","; | ||||
|                 std::string ss = "," + m_car.MFXX_KSXM + ","; | ||||
|             if(!Tools::pos(s, ss)) //非必考直接算完成变绿
 | ||||
|                 if(!Tools::pos(s, ss)) | ||||
|                 { | ||||
|                     examItem->NoID = true; | ||||
|                     KM3EndItem(itemNo,true,false); | ||||
|                 } | ||||
|             } | ||||
|         //对夜考项目进行特殊处理 //大车夜考非必考项目,一开始考试就通知外壳合格变绿
 | ||||
|         } | ||||
|         //对夜考项目进行特殊处理
 | ||||
|         if(m_car.Night_ID == true && itemNo != Sub3ItemType13Yjxs) | ||||
|         { | ||||
|             std::string s  = "," + std::to_string(itemNo) + ","; | ||||
|             std::string ss = "," + m_car.DC_YK_Must + ","; | ||||
|             if(!Tools::pos(s, ss)) //非必考直接算完成变绿
 | ||||
|             if(!Tools::pos(s, ss)) | ||||
|             { | ||||
|                 //examItem->Item_Color = itemStateHg;
 | ||||
|                 //examItem->TestPro = ItemProFlagIdle;
 | ||||
|                 //examItem->FinishFlag = true;
 | ||||
|                 examItem->NoID = true; | ||||
|                 KM3EndItem(itemNo,isReplay(),false); //轨迹回放工具回放模式要发时间,不然项目不好变绿
 | ||||
|             } | ||||
| @ -3230,22 +3232,23 @@ void ExamCarSub3::Km3NewEnterItem() | ||||
|     TChuanGan* cg = m_cg; | ||||
|     //1、非前进状态忽略
 | ||||
|     TChuanGan* his1 = historyChuanGan(1); | ||||
|     if(cg->move != moveForward || his1->move != moveForward) | ||||
|     if(cg->move == moveBackward || his1->move == moveBackward) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     if(cg->move == moveStop && his1->move == moveStop && | ||||
|        cg->real.gps.sd < 0.1 && his1->real.gps.sd < 0.1) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     //if(cg->move != moveForward || his1->move != moveForward)
 | ||||
|     //{
 | ||||
|     //    return;
 | ||||
|     //}
 | ||||
| 
 | ||||
|     //2、速度是0也退出
 | ||||
|     //if(cg->real.gps.sd < 0.1 || his1->real.gps.sd < 0.1) return; //ai_CS_GPS
 | ||||
|     //3、非差分状态忽略//非差分状态不允许进项目
 | ||||
|     //417参数为1,在差分状态才能进入自动评判项目 417没设的话,不判断是不是差分状态 20250428
 | ||||
|     if(TableSysSet->get417() == "1") | ||||
|     { | ||||
|         if(!cg->real.gps.rtkEnabled) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if(!cg->real.gps.valid()) return; | ||||
| 
 | ||||
|     static constexpr double KK0 = GPS_DIV; | ||||
| @ -3409,11 +3412,18 @@ void ExamCarSub3::Km3NewEnterItem() | ||||
|         if(mpt->point_type > 0 && Tools::pos("+", Road_Code) == false) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             //417参数为1,在差分状态才能进入自动评判项目 417没设的话,不判断是不是差分状态 20250428
 | ||||
|             if(TableSysSet->get417() == "1" && !cg->real.gps.rtkEnabled) | ||||
|             { | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 ReadItemByPoint(crossPointNo); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //(*2024-03-05*)
 | ||||
|         //ReadItemByPoint(crossPointNo);
 | ||||
|  | ||||
| @ -3,7 +3,14 @@ | ||||
| 
 | ||||
| #define ENTER_ITEM_AND_MARK(mark) \ | ||||
| { \ | ||||
|     if(doEnterItem()) { loginfo("enter item %d-%s", itemNo(), itemName().c_str()); }  \ | ||||
|     if(doEnterMark(true)) { loginfo("enter item %d-%s", itemNo(), itemName().c_str()); }  \ | ||||
|     m_existMark = true; \ | ||||
|     { mark; };      \ | ||||
| } | ||||
| 
 | ||||
| #define ENTER_COMM_AND_MARK(mark) \ | ||||
| { \ | ||||
|     if(doEnterMark(false)) { loginfo("enter item %d-%s", itemNo(), itemName().c_str()); }  \ | ||||
|     m_existMark = true; \ | ||||
|     { mark; };      \ | ||||
| } | ||||
| @ -107,11 +114,11 @@ JUDGE_STAGE_IMPL(Sub2Judge03Cftc, Sub2CftcStage0) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     //中停扣分(前进状态中停的)
 | ||||
|     if(cgcu->move == moveForward && cg01->move == moveStop && cg05->move == moveStop && cg10->move == moveStop) | ||||
|     { | ||||
|         ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_MORE(MARK_SUB2_CFTC_02)); //add enter
 | ||||
|     } | ||||
|     //中停扣分(前进状态中停的) //侧方只有在开始后退以后才扣中停
 | ||||
|     //if(cgcu->move == moveForward && cg01->move == moveStop && cg05->move == moveStop && cg10->move == moveStop)
 | ||||
|     //{
 | ||||
|     //    ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_MORE(MARK_SUB2_CFTC_02)); //add enter
 | ||||
|     //}
 | ||||
| 
 | ||||
|     //穿越结束线了
 | ||||
|     if(m_endLineFlag == true && cgcu->move == moveForward) | ||||
| @ -353,6 +360,15 @@ bool Sub2Judge03Cftc::doEnterItem() | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool Sub2Judge03Cftc::doEnterMark(bool isItemMark) | ||||
| { | ||||
|     if(isItemMark) //只有项目扣分才会进项目事件,压线通用评判不会触发进项目
 | ||||
|     { | ||||
|         return doEnterItem(); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void Sub2Judge03Cftc::calcCrossLine() | ||||
| { | ||||
|     TChuanGan* cgcu = m_car->historyChuanGan(); | ||||
| @ -530,14 +546,14 @@ void Sub2Judge03Cftc::touchLineMark(LineNum num) | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 ENTER_ITEM_AND_MARK(JUDGE_MARK_COMM_MUST_MORE(MARK_SUB2_COMM_91)); //标准的
 | ||||
|                 ENTER_COMM_AND_MARK(JUDGE_MARK_COMM_MUST_MORE(MARK_SUB2_COMM_91)); //标准的
 | ||||
|             } | ||||
|         } | ||||
|         else if(m_stage == Sub2CftcStage1 || m_stage == Sub2CftcStage2) | ||||
|         { | ||||
|             if(s609_2 == 1) | ||||
|             { | ||||
|                 ENTER_ITEM_AND_MARK(JUDGE_MARK_COMM_MUST_MORE(MARK_SUB2_COMM_91)); | ||||
|                 ENTER_COMM_AND_MARK(JUDGE_MARK_COMM_MUST_MORE(MARK_SUB2_COMM_91)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | ||||
| @ -56,6 +56,7 @@ private: | ||||
|     void calcCrossLine(); | ||||
|     //执行进项目
 | ||||
|     bool doEnterItem(); | ||||
|     bool doEnterMark(bool isItemMark); | ||||
|     //判断是否非标准测绘项目L23线 非标准返回false
 | ||||
|     bool isStandard(); | ||||
| 
 | ||||
|  | ||||
| @ -175,6 +175,7 @@ void Sub3Judge12Lkdt::dealJudgeItem() | ||||
|                 ctl->ZXD_GuanBi = true; | ||||
|             } | ||||
|             m_exam->TestPro = ItemProFlagEnd; | ||||
|             JudgeFlagEnd(); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| @ -236,6 +237,7 @@ void Sub3Judge12Lkdt::dealJudgeItem() | ||||
|             if(cg->ai_ljjl_cm - m_itemv.StopLine_JLCM >= dis2) | ||||
|             { | ||||
|                 m_exam->TestPro = ItemProFlagEnd; | ||||
|                 JudgeFlagEnd(); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| @ -326,6 +328,7 @@ void Sub3Judge12Lkdt::dealJudgeItem() | ||||
|         if(cg->ai_ljjl_cm - m_itemv.Start_JL_CM > m_itemv.XMJL_Mi * 100) | ||||
|         { | ||||
|             m_exam->TestPro = ItemProFlagEnd; | ||||
|             JudgeFlagEnd(); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| @ -394,6 +397,7 @@ void Sub3Judge12Lkdt::dealJudgeItem() | ||||
|                 if(OKFlag == true) | ||||
|                 { | ||||
|                     m_exam->TestPro = ItemProFlagEnd; | ||||
|                     JudgeFlagEnd(); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
| @ -429,22 +433,6 @@ void Sub3Judge12Lkdt::dealJudgeItem() | ||||
|         str += buf; | ||||
|     } | ||||
| 
 | ||||
|     if(m_exam->TestPro == ItemProFlagEnd) | ||||
|     { | ||||
|         if(m_itemv.LuK_Fx_PointNo > 0) | ||||
|         { | ||||
|             if(m_itemv.OKFangXiangPt_SuccessFlag == false && m_itemv.ReadNextLuDuanFlag == true) | ||||
|             { | ||||
|                 JUDGE_MARK_SUB3(12, "41", true); | ||||
|             } | ||||
|         } | ||||
|         if(m_itemv.slowDown.Js_Passed == false) | ||||
|         { | ||||
|             //对可能出现危险的情形未采取减速、鸣喇叭等安全措施
 | ||||
|             JUDGE_MARK_SUB3(12, "46", false); //20170505
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     str += msg; | ||||
|     showStatus(JUDGE_UTF8S("[大路口掉头]") + str); | ||||
| 
 | ||||
| @ -465,6 +453,25 @@ void Sub3Judge12Lkdt::JudgeFXD() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Sub3Judge12Lkdt::JudgeFlagEnd() | ||||
| { | ||||
|     if(m_exam->TestPro == ItemProFlagEnd) | ||||
|     { | ||||
|         if(m_itemv.LuK_Fx_PointNo > 0) | ||||
|         { | ||||
|             if(m_itemv.OKFangXiangPt_SuccessFlag == false && m_itemv.ReadNextLuDuanFlag == true) | ||||
|             { | ||||
|                 JUDGE_MARK_SUB3(12, "41", true); | ||||
|             } | ||||
|         } | ||||
|         if(m_itemv.slowDown.Js_Passed == false) | ||||
|         { | ||||
|             //对可能出现危险的情形未采取减速、鸣喇叭等安全措施
 | ||||
|             JUDGE_MARK_SUB3(12, "46", false); //20170505
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Sub3Judge12Lkdt::NS3JudgeVision_41501(bool opportunity) | ||||
| { | ||||
|     //不观察左、右方交通情况,转弯通过路口时,未观察侧前方交通情况,
 | ||||
|  | ||||
| @ -36,6 +36,7 @@ public: | ||||
| 
 | ||||
| protected: | ||||
|     void JudgeFXD(); | ||||
|     void JudgeFlagEnd(); | ||||
| private: | ||||
|     TSub3Item12Lkdt m_itemv; | ||||
| 
 | ||||
|  | ||||
| @ -12,8 +12,10 @@ export default class TcpClient { | ||||
|   private localIpPort: string = '' | ||||
|   private oppositeIp: string = '' | ||||
|   private oppositeIpPort: string = '' | ||||
|   private num: number = 0//重连次数
 | ||||
|   private tcpSendNum: number = 0//重连次数
 | ||||
|   private num: number = 0 | ||||
|   //重连次数
 | ||||
|   private tcpSendNum: number = 0 | ||||
|   //重连次数
 | ||||
|   private folderPath | ||||
| 
 | ||||
|   private tcp: any = null | ||||
| @ -50,7 +52,7 @@ export default class TcpClient { | ||||
| 
 | ||||
|   bindTcp() { | ||||
|     this.writeLog({ | ||||
|       time:dateFormat(new Date()), | ||||
|       time: dateFormat(new Date()), | ||||
|       message: `${TAG} tcpbind localIp${this.localIp} ${this.localIpPort}`, | ||||
|     }) | ||||
|     return new Promise((resolve, reject) => { | ||||
| @ -59,7 +61,7 @@ export default class TcpClient { | ||||
|       }, err => { | ||||
|         if (err) { | ||||
|           this.writeLog({ | ||||
|             time:dateFormat(new Date()), | ||||
|             time: dateFormat(new Date()), | ||||
|             message: `${TAG} tcpbind error ${JSON.stringify(err)}`, | ||||
|           }) | ||||
|           setTimeout(async () => { | ||||
| @ -84,8 +86,8 @@ export default class TcpClient { | ||||
| 
 | ||||
|   connectTcp() { | ||||
|     this.writeLog({ | ||||
|       time:dateFormat(new Date()), | ||||
|       message: `${TAG} tcpConnect oppositeIp ${ this.oppositeIp} ${this.oppositeIpPort}`, | ||||
|       time: dateFormat(new Date()), | ||||
|       message: `${TAG} tcpConnect oppositeIp ${this.oppositeIp} ${this.oppositeIpPort}`, | ||||
|     }) | ||||
|     return new Promise((resolve, reject) => { | ||||
|       let promise = this.tcp.connect({ | ||||
| @ -98,9 +100,9 @@ export default class TcpClient { | ||||
|           keepAlive: true, | ||||
|         }, err => { | ||||
|           if (err) { | ||||
|             console.log('getCloseTconnectsuccess','error',globalThis.getCloseTcp) | ||||
|             console.log('getCloseTconnectsuccess', 'error', globalThis.getCloseTcp) | ||||
|             this.writeLog({ | ||||
|               time:dateFormat(new Date()), | ||||
|               time: dateFormat(new Date()), | ||||
|               message: `${TAG} TCPconnect error ${JSON.stringify(err)}`, | ||||
|             }) | ||||
|             setTimeout(() => { | ||||
| @ -114,9 +116,9 @@ export default class TcpClient { | ||||
|         globalThis.getCloseTcp = false | ||||
|         resolve(true) | ||||
|       }).catch(err => { | ||||
|         console.log('socketTag','error') | ||||
|         console.log('socketTag', 'error') | ||||
|         this.writeLog({ | ||||
|           time:dateFormat(new Date()), | ||||
|           time: dateFormat(new Date()), | ||||
|           message: `${TAG} TCPconnect error2 ${JSON.stringify(err)}`, | ||||
|         }) | ||||
|         // globalThis.getCloseTcp = true
 | ||||
| @ -144,14 +146,14 @@ export default class TcpClient { | ||||
|       }).catch(err => { | ||||
|         console.log(`${TAG} TCP send error ${JSON.stringify(err)}`) | ||||
|         this.tcpSendNum++ | ||||
|         if(!globalThis.getCloseTcp&&this.tcpSendNum>10){ | ||||
|         if (!globalThis.getCloseTcp && this.tcpSendNum > 10) { | ||||
|           globalThis.getCloseTcp = true | ||||
|           setTimeout(async () => { | ||||
|             getTCP(true) | ||||
|           }, 3000) | ||||
|           this.tcpSendNum=0 | ||||
|           this.tcpSendNum = 0 | ||||
|           return | ||||
|         } | ||||
|         globalThis.getCloseTcp=true | ||||
|         // this.writeLog({
 | ||||
|         //   time:dateFormat(new Date()),
 | ||||
|         //   message: `${TAG} TCPsend error ${JSON.stringify(err)}`,
 | ||||
| @ -167,7 +169,7 @@ export default class TcpClient { | ||||
|       //   time:dateFormat(new Date()),
 | ||||
|       //   PLC:`${TAG} Tcponmessage`,
 | ||||
|       // })
 | ||||
|       globalThis.tcpStep=0 | ||||
|       globalThis.tcpStep = 0 | ||||
|       globalThis.tcpUdpError = false | ||||
| 
 | ||||
|       // console.log('messageLengt',,value.message.length))
 | ||||
| @ -182,10 +184,10 @@ export default class TcpClient { | ||||
|         callback && callback('') | ||||
|       } | ||||
|       clearInterval(globalThis.intervaltcp) | ||||
|       globalThis.intervaltcp=setInterval(()=>{ | ||||
|       globalThis.intervaltcp = setInterval(() => { | ||||
|         //程序断开
 | ||||
|         if (globalThis.tcpUdpError) { | ||||
|           console.log(TAG,'tcp信号丢失') | ||||
|           console.log(TAG, 'tcp信号丢失') | ||||
|           // getTCP()
 | ||||
|           prompt.showToast({ | ||||
|             message: 'tcp信号丢失', | ||||
| @ -193,24 +195,27 @@ export default class TcpClient { | ||||
|           }); | ||||
|         } | ||||
|         this.writeLog({ | ||||
|           time:dateFormat(new Date()), | ||||
|           time: dateFormat(new Date()), | ||||
|           message: `${TAG} tcp信号丢失`, | ||||
|         }) | ||||
|         globalThis.tcpUdpError = true; | ||||
|       },3000) | ||||
|       }, 3000) | ||||
|       // callback(value.message)
 | ||||
|     }); | ||||
|   } | ||||
|   async writeLog(param){ | ||||
| 
 | ||||
|   async writeLog(param) { | ||||
|     // const fileUtil = new FileUtil(globalThis.context)
 | ||||
|     // fileUtil.editFile(`${this.folderPath}/plcLog.txt`, JSON.stringify(param)+`\n`)
 | ||||
|   } | ||||
|   async initPath(){ | ||||
| 
 | ||||
|   async initPath() { | ||||
|     return | ||||
|     const fileUtil = new FileUtil(globalThis.context) | ||||
|     const date=dateFormat(new Date).split(' ')[0] | ||||
|     const date = dateFormat(new Date).split(' ')[0] | ||||
|     this.folderPath = await fileUtil.initFolder(`/PLC/${date}`); | ||||
|   } | ||||
| 
 | ||||
|   offTcp(callback) { | ||||
|     console.log(TAG, 'tcpofff') | ||||
|     this.tcp.off('testTagofmessg', callback); | ||||
| @ -223,10 +228,10 @@ export default class TcpClient { | ||||
|       promise.then(() => { | ||||
|         globalThis.getCloseTcp = true | ||||
|         this.writeLog({ | ||||
|           time:dateFormat(new Date()), | ||||
|           time: dateFormat(new Date()), | ||||
|           message: `${TAG} tcp closeSuccess`, | ||||
|         }) | ||||
|         console.log('getCloseTcpsocketTagclose','success',globalThis.getCloseTcp) | ||||
|         console.log('getCloseTcpsocketTagclose', 'success', globalThis.getCloseTcp) | ||||
| 
 | ||||
|         console.log(TAG, 'tcpCloseSuccess') | ||||
|         callback() | ||||
| @ -236,10 +241,10 @@ export default class TcpClient { | ||||
|           getTCP(true) | ||||
|         }, 9000) | ||||
|         this.writeLog({ | ||||
|           time:dateFormat(new Date()), | ||||
|           time: dateFormat(new Date()), | ||||
|           message: `${TAG} tcpclose error ${JSON.stringify(err)}`, | ||||
|         }) | ||||
|         console.log('getCloseTcpsocketTagclose','error',globalThis.getCloseTcp) | ||||
|         console.log('getCloseTcpsocketTagclose', 'error', globalThis.getCloseTcp) | ||||
| 
 | ||||
|         reslove(false) | ||||
|       }); | ||||
|  | ||||
| @ -61,8 +61,6 @@ struct Index { | ||||
|   private avPlayer | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   private serviceExtProxy: IdlServiceExtProxy | ||||
|   @State judgeVersion: string = "" | ||||
|   private version: string = judgeConfig.version | ||||
| 
 | ||||
|   @Styles | ||||
|   commStyle(){ | ||||
| @ -199,12 +197,12 @@ struct Index { | ||||
|       Column() { | ||||
|         Row() { | ||||
|           Column() { | ||||
|             Text('V外壳:' + this.version) | ||||
|             Text('V外壳:' + globalThis.version) | ||||
|               .fontColor('#CCAE7A') | ||||
|               .fontSize(18 * globalThis.ratio) | ||||
|               .width('30%') | ||||
|               .margin({ bottom: 10 }) | ||||
|             Text('V评判:' + this.judgeVersion) | ||||
|             Text('V评判:' + globalThis.judgeVersion) | ||||
|               .fontColor('#CCAE7A') | ||||
|               .fontSize(18 * globalThis.ratio) | ||||
|               .width('30%') | ||||
| @ -600,7 +598,6 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async initParams() { | ||||
|     this.judgeVersion = await examJudgeVersion() | ||||
|     await getUDP(this.context, false) | ||||
|     this.loading = false | ||||
|     await getDeviceInfo(this.context) | ||||
|  | ||||
| @ -117,6 +117,7 @@ export default struct RealTime { | ||||
|   async aboutToDisappear() { | ||||
|     clearInterval(this.timer) | ||||
|   } | ||||
| 
 | ||||
|   async aboutToAppear() { | ||||
|     this.version = (await examJudgeVersion()) + "/" + judgeConfig.version | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| //考试回放开关
 | ||||
| export const judgeConfig = { | ||||
|   // 外壳版本号
 | ||||
|   version: "2025.05.15.01", | ||||
|   version: "2025.05.20.01", | ||||
|   //本地目录开关
 | ||||
|   isTrajectoryOpen: false, | ||||
|   //是否开启拍照
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user