VOS_UINT32 NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitMmSuspendRspExpired_InterSysHo_WaitMmSuspendRsp:ENTERED"); /* 向接入层发送挂起失败 */ NAS_MMC_SndSuspendRsp(NAS_MML_GetCurrNetRatType(), RRC_NAS_SUSPEND_FAILURE); /* 根据挂起的发起方,构造一条恢复消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg); /* 向MM/GMM进行恢复 */ NAS_MMC_SndGmmResumeInd(&stResumeIndMsg); NAS_MMC_SndMmResumeInd(&stResumeIndMsg); NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_FAIL, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出状态机*/ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmResumeRsp_InterSysHo_WaitMmResumeRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 状态机上下文标记已收到MMCMM_RESUME_RSP */ NAS_MMC_ClearResumeRspFlag_InterSysHo(NAS_MMC_MM_RESUME_RSP_FLG); /* 未收齐GMM的MMCGMM_RESUME_RSP和 MM的MMCMM_RESUEM_RSP,返回继续等待 */ if ( NAS_MMC_RESUME_RSP_NULL_FLG != NAS_MMC_GetResumeRspFlg_InterSysHo() ) { return VOS_TRUE; } /* 如果已经收齐,停止TI_NAS_MMC_WAIT_MM_RESUME_RSP */ NAS_MMC_StopTimer( TI_NAS_MMC_WAIT_MM_RESUME_RSP ); /* 向接入发送恢复回复 */ NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType()); /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */ /* 发送状态机成功的结果 */ NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出当前状态机: */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvLmmSysCfgCnfExpired_SysCfg_WaitLmmSysCfgCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_MML_PLMN_RAT_PRIO_STRU *pstPrePrioRatList; /* 打印定时器超时异常LOG */ NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvLmmSysCfgCnfExpired_SysCfg_WaitLmmSysCfgCnf():TI_NAS_MMC_WAIT_LMM_SYSCFG_CNF timeout"); /* 向MMA回复SYSCFG设置失败 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_FAILURE_OTHER); /* syscfg设置失败需要恢复之前的接入技术和优先级 */ pstPrePrioRatList = NAS_MMC_GetPrePrioRatList_SysCfg(); NAS_MML_SetMsSysCfgPrioRatList(pstPrePrioRatList); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置失败 */ NAS_MMC_SndSysCfgRslt(VOS_FALSE, VOS_FALSE); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmResumeRsp_InterSysOos_WaitMmResumeRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { NAS_MMC_ClearResumeRspFlag_InterSysOos( NAS_MMC_MM_RESUME_RSP_FLG ); /* 未收齐GMM的MMCGMM_RESUME_RSP和 MM的MMCMM_RESUEM_RSP,返回继续等待 */ if ( NAS_MMC_RESUME_RSP_NULL_FLG != NAS_MMC_GetResumeRspFlg_InterSysOos() ) { return VOS_TRUE; } /* 如果已经收齐,停止MMC_WAIT_MM_RESUME_RSP_TIMER */ NAS_MMC_StopTimer( TI_NAS_MMC_WAIT_MM_RESUME_RSP ); /* 向接入发送恢复回复 */ NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType()); /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */ /* 发送suspend状态机完成消息 */ NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出当前状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 停止定时器 */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_WAS_SUSPEND_REL_CNF); /* 根据挂起的发起方,构造一条恢复消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg); /* 向MM/GMM进行恢复 */ NAS_MMC_SndGmmResumeInd(&stResumeIndMsg); NAS_MMC_SndMmResumeInd(&stResumeIndMsg); NAS_MML_InitCampRai(NAS_MML_GetCurrCampPlmnInfo()); /* 更新服务状态 */ NAS_MMC_SetCsServiceStatus(NAS_MMC_NO_SERVICE); NAS_MMC_SetPsServiceStatus(NAS_MMC_NO_SERVICE); /* 向MM/GMM/TAF报出服务区流程 */ NAS_MMC_SndMmCoverageLostInd(); NAS_MMC_SndGmmCoverageLostInd(); /* 更新服务状态 */ NAS_MMC_SndMmaCoverageInd( MMA_MMC_COVERAGE_AREA_CHANGE_MODE_LOST ); /* 通知TAF当前的服务状态 */ NAS_MMC_SndMmaServiceStatusInd(MMA_MMC_SRVDOMAIN_CS_PS, MMA_MMC_SERVICE_STATUS_NO_SERVICE); /* 更新驻留状态 */ NAS_MMC_SetAsCellCampOn(NAS_MMC_AS_CELL_NOT_CAMP_ON); /* 根据接口约定,当WRR发送RRMM_SUSPEND_REL_CNF时,已经进入了IDLE,但是WRR不会向MM/GMM发送连接释放指示, 所以MMC需要本地清除连接标志 */ NAS_MML_SetRrcConnStatusFlg(VOS_FALSE); NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_ABORTED, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出当前状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvTiWaitWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { RRMM_RESUME_IND_ST stResumeIndMsg; /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitWasSuspendRelCnf_InterSysOos_WaitWasSuspendRelCnf:ENTERED"); /* 根据挂起的发起方,构造一条恢复消息 */ NAS_MMC_BulidResumeMsg(NAS_MML_GetCurrNetRatType(), &stResumeIndMsg); /* 向MM/GMM进行恢复 */ NAS_MMC_SndGmmResumeInd(&stResumeIndMsg); NAS_MMC_SndMmResumeInd(&stResumeIndMsg); NAS_MML_InitCampRai(NAS_MML_GetCurrCampPlmnInfo()); /* 更新服务状态 */ NAS_MMC_SetCsServiceStatus(NAS_MMC_NO_SERVICE); NAS_MMC_SetPsServiceStatus(NAS_MMC_NO_SERVICE); /* 向MM/GMM/TAF报出服务区流程 */ NAS_MMC_SndMmCoverageLostInd(); NAS_MMC_SndGmmCoverageLostInd(); /* 更新服务状态 */ NAS_MMC_SndMmaCoverageInd( MMA_MMC_COVERAGE_AREA_CHANGE_MODE_LOST ); /* 通知TAF当前的服务状态 */ NAS_MMC_SndMmaServiceStatusInd(MMA_MMC_SRVDOMAIN_CS_PS, MMA_MMC_SERVICE_STATUS_NO_SERVICE); /* 更新驻留状态 */ NAS_MMC_SetAsCellCampOn(NAS_MMC_AS_CELL_NOT_CAMP_ON); NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_PLMNSEARCH, NAS_MMC_SUSPEND_ABORTED, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出当前状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvTiWaitMmResumeRspExpired_InterSysHo_WaitMmResumeRsp( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { /* 异常打印 */ NAS_WARNING_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvTiWaitMmResumeRspExpired_InterSysHo_WaitMmResumeRsp:ENTERED"); /* 向接入发送恢复回复 */ NAS_MMC_SndResumeRsp(NAS_MML_GetCurrNetRatType()); /* 模式切换时不再通知接入层NAS_MMC_SndInfoReportReq,接入层从模时收到主动上报请求后自行保存 */ /* 发送状态机成功的结果 */ NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_HANDOVER, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); /* 退出当前状态机: */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_ProcResumeRspFromLteToHrpd_InterSysCellResel(VOS_VOID) { #if ((FEATURE_ON == FEATURE_CL_INTERWORK) || ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE))) if (MMC_RESUME_ORIGEN_HRPD == NAS_MMC_GetResumeOrign_InterSysCellResel()) { /* 通知LMM当前已经恢复 */ NAS_MMC_SndLmmResumeNotify(); /* 发送状态机成功的结果 */ #if (FEATURE_ON == FEATURE_CL_INTERWORK) NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_CELLRESELECT, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); #endif #if ((FEATURE_ON == FEATURE_UE_MODE_CDMA) && (FEATURE_ON == FEATURE_LTE)) if (MMC_SUSPEND_CAUSE_CELLRESELECT == NAS_MMC_GetSuspendCause(NAS_MMC_GetCurrEntryMsg())) { NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_CELLRESELECT, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); } else /* 非重选,即重定向 */ { NAS_MMC_SndSuspendRsltMsg(MMC_SUSPEND_CAUSE_REDIRECTION, NAS_MMC_SUSPEND_SUCCESS, NAS_MMC_SUSPEND_FAIL_CAUSE_BUTT, VOS_NULL_PTR); } #endif /* 退出当前状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } else #endif { return VOS_FALSE; } }
VOS_UINT32 NAS_MMC_RcvLmmSysCfgCnf_SysCfg_WaitLmmSysCfgCnf( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { MMA_MMC_SYS_CFG_SET_REQ_STRU *pstSysCfgMsg = VOS_NULL_PTR; NAS_MMC_ENTRY_MSG_STRU *pstEntryMsg = VOS_NULL_PTR; LMM_MMC_SYS_CFG_CNF_STRU *pstSysCfgCnf = VOS_NULL_PTR; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enNextRat; VOS_UINT32 ulNeedSyscfgPlmnSrch; NAS_MML_PLMN_RAT_PRIO_STRU *pstPrePrioRatList; /* 停止等待LMM的SYSCFG回复定时器 */ NAS_MMC_StopTimer(TI_NAS_MMC_WAIT_LMM_SYSCFG_CNF); /* 若syscfg设置失败,进行错误打印,退出SYSCFG状态机 */ pstSysCfgCnf = (LMM_MMC_SYS_CFG_CNF_STRU *)pstMsg; if ( MMC_LMM_FAIL == pstSysCfgCnf->ulRst) { NAS_ERROR_LOG(WUEPS_PID_MMC, "NAS_MMC_RcvLmmSysCfgCnf_SysCfg_WaitLmmSysCfgCnf:ERROR:SYSCFG SET FAIL!"); /* 向MMA回复SYSCFG设置失败消息 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_FAILURE_OTHER); /* syscfg设置失败需要恢复之前的接入技术和优先级 */ pstPrePrioRatList = NAS_MMC_GetPrePrioRatList_SysCfg(); NAS_MML_SetMsSysCfgPrioRatList(pstPrePrioRatList); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置失败,不需要搜网 */ NAS_MMC_SndSysCfgRslt(VOS_FALSE, VOS_FALSE); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } /* 获取syscfg状态机入口消息信息 */ pstEntryMsg = NAS_MMC_GetCurrEntryMsg(); pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU *)(pstEntryMsg->aucEntryMsgBuffer); /* 未完成SYSCFG的所有模式设置,向接入模发送SYSCFG设置请求 */ enNextRat = NAS_MMC_GetNextSettingRat_SysCfg(); if (NAS_MML_NET_RAT_TYPE_BUTT != enNextRat) { NAS_MMC_SetRatModeSysCfgReq_SysCfg(enNextRat, pstSysCfgMsg); return VOS_TRUE; } /* 完成了所有模式的SYSCFG设置,保存SYSCFG设置内容信息 */ NAS_MMC_SaveUserSyscfgInfo_SysCfg(pstSysCfgMsg); /* SYSCFG设置完成后,进行小区信息的更新 */ NAS_MMC_UpdateCellInfo_SysCfg(); /* 向MMA回复SYSCFG设置成功原语 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_SUCCESS); /* 若需要发起搜网,发出由SYSCFG引起的内部搜网信息 */ ulNeedSyscfgPlmnSrch = NAS_MMC_GetPlmnSearchFlag_SysCfg(); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置成功 */ NAS_MMC_SndSysCfgRslt(VOS_TRUE, ulNeedSyscfgPlmnSrch); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; }
VOS_UINT32 NAS_MMC_RcvMmaSysCfgSetReq_SysCfg_Init( VOS_UINT32 ulEventType, struct MsgCB *pstMsg ) { MMA_MMC_SYS_CFG_SET_REQ_STRU *pstSysCfgMsg = VOS_NULL_PTR; VOS_UINT32 ulRrcConnExistFlag; VOS_UINT32 ulNeedSyscfgPlmnSrch; NAS_MML_NET_RAT_TYPE_ENUM_UINT8 enCurrRat; VOS_UINT32 ulFlg; VOS_UINT32 ulUsimStausFlg; NAS_MMC_PLMN_SELECTION_MODE_ENUM_UINT8 enPlmnSelectionMode; NAS_MML_PLMN_RAT_PRIO_STRU *pstPrePrioRatList; NAS_MML_PLMN_RAT_PRIO_STRU stSyscfgPrioRatList; pstPrePrioRatList = NAS_MML_GetMsPrioRatList(); /* 取得当前的SYSCFG消息 */ pstSysCfgMsg = (MMA_MMC_SYS_CFG_SET_REQ_STRU *)pstMsg; /* 若用户设置的SYSCFG消息只有漫游特性改变,则不需要通知接入层 */ if ( VOS_TRUE == pstSysCfgMsg->ucOnlyRoamParaChanged ) { /* 向MMA回复SYSCFG设置成功原语 */ NAS_MMC_SndMmaSysCfgCnf(MMA_MMC_SYS_CFG_SET_SUCCESS); /* 默认漫游设置不需要进行搜网 */ ulNeedSyscfgPlmnSrch = VOS_FALSE; /* 判断SYSCFG对ROAM特性的设置是否需要导致搜网 */ ulUsimStausFlg = NAS_MML_IsUsimStausValid(); ulFlg = NAS_MMC_CheckRoamSettingPlmnSelection_SysCfg(pstSysCfgMsg); if ( (VOS_TRUE == ulUsimStausFlg) && (VOS_TRUE == ulFlg) ) { ulNeedSyscfgPlmnSrch = VOS_TRUE; /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */ enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode(); if ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode) { /* 保存指定搜网前驻留的PlmnID及接入技术 */ NAS_MMC_SaveUserReselPlmnInfo(); } } /* 保存用户设置的漫游信息 */ NAS_MML_SetRoamCapability(pstSysCfgMsg->enRoamCapability); /* 通知上层状态机SYSCFG状态机运行结果,syscfg设置成功 */ NAS_MMC_SndSysCfgRslt(VOS_TRUE, ulNeedSyscfgPlmnSrch); /* 退出SYSCFG状态机 */ NAS_MMC_FSM_QuitFsmL2(); return VOS_TRUE; } /* 保存入口消息 */ NAS_MMC_SaveCurEntryMsg(ulEventType, pstMsg); /* 根据当前模信息,完成向接入层下发SYSCFG顺序表的设置 */ NAS_MMC_SetSysCfgSendingOrder_SysCfg( NAS_MMC_GetDestModeRat_SysCfg(pstSysCfgMsg) ); /* 判断SYSCFG设置是否需要发起搜网 */ ulNeedSyscfgPlmnSrch = NAS_MMC_IsPlmnSelectionNeeded_SysCfg(pstSysCfgMsg); /* 保存搜网信息到状态机上下文中 */ NAS_MMC_SetPlmnSearchFlag_SysCfg(ulNeedSyscfgPlmnSrch); /*手动模式时,syscfg需要触发搜网时,需要将当前正常服务的plmn和接入技术保存一下作为用户重选的plmn id和接入技术 */ enPlmnSelectionMode = NAS_MMC_GetPlmnSelectionMode(); if ( ( NAS_MMC_PLMN_SELECTION_MODE_MANUAL == enPlmnSelectionMode) && (VOS_TRUE == ulNeedSyscfgPlmnSrch)) { /* 保存指定搜网前驻留的PlmnID及接入技术 */ NAS_MMC_SaveUserReselPlmnInfo(); } /* 保持syscfg设置前的接入技术和优先级 */ NAS_MMC_SetPrePrioRatList_SysCfg(pstPrePrioRatList); /* 赋值用户设置的接入技术优先级 */ PS_MEM_CPY(&stSyscfgPrioRatList, &(pstSysCfgMsg->stRatPrioList), sizeof(NAS_MML_PLMN_RAT_PRIO_STRU) ); NAS_MML_SetMsSysCfgPrioRatList(&stSyscfgPrioRatList); /* 获取当前模的信令链接存在信息 */ ulRrcConnExistFlag = NAS_MML_IsRrcConnExist(); if ( (VOS_TRUE == ulNeedSyscfgPlmnSrch) && (VOS_FALSE == ulRrcConnExistFlag) ) { /* 向GMM发送搜网指示 */ NAS_MMC_SndGmmPlmnSchInit(); /* 向MM发送搜网指示 */ NAS_MMC_SndMmPlmnSchInit(); } /* 当前不需要搜网或不存在信令链接 */ if ( (VOS_FALSE == ulNeedSyscfgPlmnSrch) || (VOS_FALSE == ulRrcConnExistFlag) ) { /* 获取需要设置SYSCFG的接入技术 */ enCurrRat = NAS_MMC_GetNextSettingRat_SysCfg(); NAS_MMC_SetRatModeSysCfgReq_SysCfg(enCurrRat, pstSysCfgMsg); return VOS_TRUE; } /* 当前SYSCFG设置完后需要搜网,且当前有信令链接存在,则进行如下设置 */ #if (FEATURE_ON == FEATURE_LTE) /* 取得当前的接入模式 */ enCurrRat = NAS_MML_GetCurrNetRatType(); if ( NAS_MML_NET_RAT_TYPE_LTE == enCurrRat ) { /* 当前为L模,向lmm下发链接释放请求 */ NAS_MMC_SndLmmRelReq(); NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE); /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_EPS_CONN_REL_IND); /* 启动等待L模回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_EPS_CONN_REL_IND, TI_NAS_MMC_WAIT_EPS_CONN_REL_IND_LEN); return VOS_TRUE; } #endif /* 当前在GU模下,主动请求释放链接 */ NAS_MMC_SndMmRelReq(); NAS_MMC_SndGmmRelReq(); NAS_MMC_SetSpecPlmnSearchState(NAS_MMC_SPEC_PLMN_SEARCH_RUNNING); NAS_MMC_SetRelRequestFlag_SysCfg(VOS_TRUE); /* 进行SYSCFG状态机的子状态的迁移:迁移到等待链接释放子状态 */ NAS_MMC_FSM_SetCurrState(NAS_MMC_SYSCFG_STA_WAIT_RRC_CONN_REL_IND); /* 启动等待回复定时器 */ NAS_MMC_StartTimer(TI_NAS_MMC_WAIT_RRC_CONN_REL, TI_NAS_MMC_WAIT_RRC_CONN_REL_LEN); return VOS_TRUE; }