public without sharing class RepairHandler extends Oly_TriggerHandler {
    private Map<Id, Repair__c> newMap;
    private Map<Id, Repair__c> oldMap;
    private List<Repair__c> newList;
    private List<Repair__c> oldList;

    // 已经更新过的RAMap 已经更新过的申请书不需要再次更新
    private static Map<Id, Rental_Apply__c> updatedRa = new Map<Id, Rental_Apply__c>();
    // 需要更新的RAMap
    private static Map<Id, Rental_Apply__c> needSendEmailRa = new Map<Id, Rental_Apply__c>();

    private final String GETILABEL = FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li);

    public RepairHandler() {
        this.newMap = (Map<Id, Repair__c>) Trigger.newMap;
        this.oldMap = (Map<Id, Repair__c>) Trigger.oldMap;
        this.newList = (List<Repair__c>) Trigger.new;
        this.oldList = (List<Repair__c>) Trigger.old;
    }

    protected override void beforeInsert() {
        beforeSetValue();
        beforeCheck();
    }

    protected override void beforeUpdate() {
        needSendEmailRa = new Map<Id, Rental_Apply__c>();
        beforeSetValue();
        beforeCheck();
    }

    protected override void afterUpdate() {
        reDetailRepair();
        //明細の修理削除
        cleanDetailRepair();
        // OLY_OCM-520 更新申请 使用目的2为一般用户、保修用户并且关联修理Repair__c的状态变为0.删除、0.取消，给备品中心的邮箱地址发邮件
        setNeedSendEmailRa();
        if (!needSendEmailRa.isEmpty()) {
            update needSendEmailRa.values();
        }

        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 start
        if(!StaticParameter.rentalApplyIsRunning){
            RepairAfterUpdate();
        }
        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 end
    }

    protected override void afterInsert() {
        reDetailRepair();

        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 start
        if(!StaticParameter.rentalApplyIsRunning){
            RepairAfterInsert();
        }
        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 end
    }

    protected override void afterDelete() {
        //明細の修理削除
        cleanDetailRepair();

        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 start
        if(!StaticParameter.rentalApplyIsRunning){
            RepairAfterDelete();
        }
        //SWAG-BE532K  QIS逻辑修改 update by vivek 2019-7-22 end
    }

    private void beforeSetValue() {
        List<String> depId = new List<String> ();
        List<String> omnId = new List<String> ();
        for (Repair__c nObj : newList) {
            nObj.Rental_Apply_Equipment_Set_Detail_Id__c = nObj.Rental_Apply_Equipment_Set_Detail__c;
            nObj.TransferApplyDetail_Id__c = nObj.TransferApplyDetail__c;

            // LHJ DOJ1-2 20200707 Start
            if(Trigger.isUpdate && nObj.ifDeadHurt__c != '有' && oldMap.get(nObj.Id).ifDeadHurt__c == '有'  && !StaticParameter.EscapeRepairUpdate ) {
                nObj.ifDeadHurtChange__c = True;
            }
            if(Trigger.isUpdate && String.isBlank(nObj.OSHRAConfirmUser__c) && String.isNotBlank(nObj.if_Repair_Allowed__c)) {
                nObj.OSHRAConfirmUser__c = UserInfo.getUserId();
                nObj.OSHRAConfirmDate__c = System.now();
            }
            // LHJ DOJ1-2 20200707 End
            // 备品检测标识 20200702 LD Start
            if ((Trigger.isInsert && nObj.SAP_Transfer_time__c != null
                    || Trigger.isUpdate && nObj.SAP_Transfer_time__c != null && oldMap.get(nObj.Id).SAP_Transfer_time__c == null)
                    && nObj.CheckFixtureModel_Pro__c == True
                ) {
                    // 保存战略科室分类id
                    depId.add(nObj.Department_Class__c);
                    // 保存产品型号
                    omnId.add(nObj.OwnershipMachine_No__c);
            }
            // 备品检测标识 20200702 LD End
            
            // 包含报修子单的修理 修理单状态编号变更发送AWS Start
            if (Trigger.isUpdate) {
                Repair__c oldrpr = oldMap.get(nObj.Id);
                // 2022/04/20 zhangyuheng  update start
                if ((nObj.OTSRepairOrder__c == oldrpr.OTSRepairOrder__c) && // OTS订单号发生改变，即时发送AWS
                    (nObj.DeliveryLogisticsNo__c == oldrpr.DeliveryLogisticsNo__c) && // 送修物流单号发生改变，即时发送AWS
                    (nObj.Returns_Product_waySAP__c == oldrpr.Returns_Product_waySAP__c) && // 送修方式发生改变且寄送日有值，即时发送AWS
                    (nObj.FSE_ApplyForRepair_time__c == oldrpr.FSE_ApplyForRepair_time__c) &&                   // FSE申请修理日发生改变，即时发送AWS
                    (nObj.Repair_Ordered_DateTime__c == oldrpr.Repair_Ordered_DateTime__c) &&                   // 4.修理品RC受理日（小程序）发生改变，即时发送AWS
                    (nObj.Repair_Firstestimated_Date__c == oldrpr.Repair_Firstestimated_Date__c) &&             // 初次报价日（不用）发生改变，即时发送AWS
                    (nObj.Repair_Shipped_DateTime__c == oldrpr.Repair_Shipped_DateTime__c) &&                   // 11.RC修理品返送日（小程序）发生改变，即时发送AWS
                    (nObj.Repair_Final_Inspection_DateTime__c == oldrpr.Repair_Final_Inspection_DateTime__c) && // 10.最终检测日（小程序）发生改变，即时发送AWS
                    (nObj.Agreed_DateTime__c == oldrpr.Agreed_DateTime__c) &&                                   //7.用户同意日（小程序）发生改变，即时发送AWS
                    (nObj.Agreed_Date__c == oldrpr.Agreed_Date__c) &&                                           // 7.用户同意日发生改变，即时发送AWS
                    (nObj.engineerSendDate__c == oldrpr.engineerSendDate__c)
                    ) {
                    // 2022/04/20 zhangyuheng  update end
                    if (String.isNotBlank(nObj.RepairSubOrder__c) && nObj.RepairOrderStatusCode__c != oldrpr.RepairOrderStatusCode__c) {
                        nObj.AwaitToSendAWS__c = true;
                    } 
                    // 2022/04/20 zhangyuheng  update start
                }
                // 2022/04/20 zhangyuheng  update end
                
            }
            // 包含报修子单的修理 修理单状态编号变更发送AWS End
            
        }
        StaticParameter.EscapeRepairUpdate = True;
        // 备品检测标识 20200702 LD Start
        Map<String,Integer> depMap = new Map<String,Integer>();

        // 20210622 SQL优化 Start
        //List<Asset> assList = [SELECT Department_Class__c,OwnershipMachine_No__c  FROM Asset WHERE Department_Class__c in :depId  AND OwnershipMachine_No__c in :omnId];
        List<Asset> assList = new List<Asset>();
        if (depId.size() > 0 || omnId.size() > 0) {
            assList = [SELECT Department_Class__c,OwnershipMachine_No__c  FROM Asset WHERE Department_Class__c in :depId  AND OwnershipMachine_No__c in :omnId];
        }
        // 20210622 SQL优化 End
        
        for (Asset ass : assList) {
            if (depMap.get(ass.Department_Class__c+'-'+ass.OwnershipMachine_No__c) == null){
                depMap.put(ass.Department_Class__c+'-'+ass.OwnershipMachine_No__c,1);
            }else{
                Integer val = depMap.get(ass.Department_Class__c+'-'+ass.OwnershipMachine_No__c);
                depMap.put(ass.Department_Class__c+'-'+ass.OwnershipMachine_No__c,val+1);
            }
        }

        for (Repair__c nObj : newList) {
            if ((Trigger.isInsert && nObj.SAP_Transfer_time__c != null
                    || Trigger.isUpdate && nObj.SAP_Transfer_time__c != null && oldMap.get(nObj.Id).SAP_Transfer_time__c == null)
                ) {

                if (depMap.get(nObj.Department_Class__c+'-'+nObj.OwnershipMachine_No__c) == 1
                        && nObj.CheckFixtureModel_Pro__c == True
                        && (!(nObj.NewProductGuaranteeObject__c == '1: 新品保修'
                            || nObj.NewProductGuaranteeObject__c == '2: 服务多年保修'
                            || nObj.NewProductGuaranteeObject__c == '8: 市场多年保修'
                            || nObj.Contract_status__c == '契約'))) {

                    nObj.IfCheckFixture__c = true;
                } else {
                    nObj.IfCheckFixture__c = false;
                }

            }
        }
        // 备品检测标识 20200702 LD End
    }

    private void reDetailRepair() {
        // {Asset.Id: [Repair.Id]}
        Map<Id, List<Id>> assetsMap = new Map<Id, List<Id>>();
        List<RepairSubOrder__c> updateRepairSubOrderList = new List<RepairSubOrder__c>();
        for (Repair__c nObj : newList) {
            Repair__c oObj;
            if (Trigger.isUpdate) {
                oObj = oldMap.get(nObj.Id);
            }
            if (Trigger.isInsert || (oObj.Delivered_Product__c != nObj.Delivered_Product__c
                        && oObj.Delivered_Product__c != null)) {
                if (!assetsMap.containsKey(nObj.Delivered_Product__c)) {
                    assetsMap.put(nObj.Delivered_Product__c, new List<Id>());
                }
                assetsMap.get(nObj.Delivered_Product__c).add(nObj.Id);
            }

            if (Trigger.isInsert) {
                if (String.isNotBlank(nObj.RepairSubOrder__c)) {
                    RepairSubOrder__c repairSubOrder = new RepairSubOrder__c();
                    repairSubOrder.Id = nObj.RepairSubOrder__c;
                    repairSubOrder.Status__c = '已转修理';
                    updateRepairSubOrderList.add(repairSubOrder);
                }
            }
        }
        if (updateRepairSubOrderList.size() > 0) {
            update updateRepairSubOrderList;
        }
        if (assetsMap.isEmpty()) {
            return;
        }

        // 检索出个体管理并且已借出并修理的Asset
        List<Asset> haveLastAsset = [SELECT Id, Name
                                       FROM Asset
                                      WHERE Id = :assetsMap.keySet()
                                        AND ((Last_Reserve_RAES_Detail__c != null AND Last_Reserve_RAES_Detail__r.Repair__c != null)
                                            OR (Last_Reserve_TAES_Detail__c != null AND Last_Reserve_TAES_Detail__r.Repair__c != null))
                                        AND Manage_type__c = :GETILABEL
                                        order by Id];

        if (haveLastAsset.size() > 0) {
            for (Asset ass : haveLastAsset) {
                newMap.get(assetsMap.get(ass.Id)[0]).addError(String.format('{0}保有设备 {1} 已经在修理中,无法再次创建修理', new String[] {GETILABEL, ass.Name}));
            }
        }

        List<Rental_Apply_Equipment_Set_Detail__c> raesds = [Select Id, Asset__c
                From Rental_Apply_Equipment_Set_Detail__c
                Where Asset__c = :assetsMap.keySet()
                AND Arrival_in_wh__c = false
                AND Repair__c = null
                AND (Inspection_result_after_NG_F__c = '维修'
                        OR Inspection_result_NG__c = '维修')
                order by Asset__c, After_Inspection_time_F__c nulls last, Pre_inspection_time__c];

        List<Rental_Apply_Equipment_Set_Detail__c> raesdss = new List<Rental_Apply_Equipment_Set_Detail__c>();
        List<Repair__c> rs = new List<Repair__c>();

        for (Rental_Apply_Equipment_Set_Detail__c  raesd : raesds) {
            List<Id> rIdSet = assetsMap.get(raesd.Asset__c);
            if (rIdSet.isEmpty()) {
                continue;
            }
            rs.add(new Repair__c(Id = rIdSet[0], Rental_Apply_Equipment_Set_Detail__c = raesd.Id));
            raesd.Repair__c = rIdSet[0];
            rIdSet.remove(0);
            raesdss.add(raesd);
        }
        if(!raesdss.isEmpty()) {
            update raesdss;
        }
        Set<Id> transferAssetIdSet = new Set<Id>();
        for(Id assId: assetsMap.keySet()) {
            if(assetsMap.get(assId).size() > 0) {
                transferAssetIdSet.add(assId);
            }
        }
        if(!transferAssetIdSet.isEmpty()) {
            List<TransferApplyDetail__c> tadss = new List<TransferApplyDetail__c>();
            List<TransferApplyDetail__c> tads = [Select Id, Asset__c
                    From TransferApplyDetail__c
                    Where Asset__c = :transferAssetIdSet
                    AND Arrival_in_wh__c = false
                    AND Repair__c = null
                    AND (Inspection_result_after_NG_F__c = '维修'
                            OR Inspection_result_NG__c = '维修')
                    order by Asset__c, After_Inspection_time_F__c nulls last, Pre_inspection_time__c];
            for (TransferApplyDetail__c  tad : tads) {
                List<Id> rIdSet = assetsMap.get(tad.Asset__c);
                if (rIdSet.isEmpty()) {
                    continue;
                }
                rs.add(new Repair__c(Id = rIdSet[0], TransferApplyDetail__c = tad.Id));
                tad.Repair__c = rIdSet[0];
                rIdSet.remove(0);
                tadss.add(tad);
            }
            if(!tadss.isEmpty()) {
                update tadss;
            }
        }

        if (!rs.isEmpty()) {
            update rs;
        }
    }

    //新規の場合何もしません
    private void cleanDetailRepair() {
        List<Repair__c> repList;
        if (trigger.isDelete) {
            repList = oldList;
        } else {
            repList = newList;
        }

        List<Rental_Apply_Equipment_Set_Detail__c> raesdList = new List<Rental_Apply_Equipment_Set_Detail__c>();

        for (Repair__c rep : repList) {
            if (Trigger.isDelete && String.isNotBlank(rep.Rental_Apply_Equipment_Set_Detail__c)) {
                raesdList.add(new Rental_Apply_Equipment_Set_Detail__c(Id = rep.Rental_Apply_Equipment_Set_Detail__c,
                            Repair__c = null));
            } else {
                /* OLY_OCM-424 Start 修理状态为取消/删除时，对修理单来讲，属于完成状态。和修理完成做相同处理 */
                // Repair__c oldObj = oldMap.get(rep.Id);
                // if ((rep.Status__c == '0.取消' || rep.Status__c == '0.删除')
                //     && (oldObj.Status__c != '0.取消' && rep.Status__c != '0.删除')
                //     && String.isNotBlank(rep.Rental_Apply_Equipment_Set_Detail__c)) {
                //     raesdList.add(new Rental_Apply_Equipment_Set_Detail__c(Id = rep.Rental_Apply_Equipment_Set_Detail__c,
                //                 Repair__c = null));
                // }
                /* OLY_OCM-424 End */
            }
        }

        if (!raesdList.isEmpty()) {
            update raesdList;
        }
    }

    // OLY_OCM-520 更新申请 使用目的2为一般用户、保修用户并且关联修理Repair__c的状态变为0.删除、0.取消，给备品中心的邮箱地址发邮件
    private void setNeedSendEmailRa() {
        Set<Id> reIdSet = new Set<Id>();
        for (Repair__c nObj : newList) {
            Repair__c oldObj = oldMap.get(nObj.Id);
            if ((nObj.Status1__c == '0.取消' || nObj.Status1__c == '0.删除')
                && (oldObj.Status1__c != '0.取消' && oldObj.Status1__c != '0.删除')) {
                reIdSet.add(nObj.Id);
            }
        }
        if (reIdSet.size() > 0) {
            List<Rental_Apply__c> ras = [SELECT Id,
                                                SendRepairCancelDeleteEmail__c,
                                                RA_Status__c
                                           FROM Rental_Apply__c
                                          WHERE (demo_purpose2__c = '一般用户'
                                                OR demo_purpose2__c = '保修用户'
                                                OR demo_purpose2__c = '市场多年保修'
                                                OR demo_purpose2__c = '再修理'
                                                OR demo_purpose2__c = '故障排查'
                                                ) // 使用目的2是一般用户或者保修用户
                                            AND RA_Status__c != :FixtureUtil.raStatusMap.get(FixtureUtil.RaStatus.Qu_Xiao.ordinal()) // 已经取消的申请书不发送邮件
                                            AND SendRepairCancelDeleteEmail__c = false // 已经发送过的申请书不发送邮件
                                            AND Id != :updatedRa.keySet() // 已经更新过的申请书不需要再次更新
                                            AND Repair__c = :reIdSet];
            if (ras.size() > 0) {
                for (Rental_Apply__c ra : ras) {
                    ra.SendRepairCancelDeleteEmail__c = true;
                    needSendEmailRa.put(ra.Id, ra);
                    updatedRa.put(ra.Id, ra);
                }
            }
        }
    }

    //SWAG-BE532K  update QIS修理逻辑 by vivek 2019-7-22 start
    public void RepairAfterDelete(){
        List<Repair__c> repList = oldList;

        List<Repair__c> repairList = new List<Repair__c>();

        Map<Id,Repair__c> qisRepMap = new Map<Id,Repair__c>();

        List<QIS_Report__c> qisList = new List<QIS_Report__c>();

        Set<Id> qisIdSet  = new Set<Id>();

        Map<Id,List<Repair__c>> qisRepListMap = new Map<Id,List<Repair__c>>();

        for(Repair__c rep : repList){
            if(rep.QIS_ID__c != null){
                if(rep.Status1__c != '0.删除' && rep.Status1__c != '0.取消' && rep.Return_Without_Repair__c == false ){
                    repairList.add(rep);
                    qisIdSet.add(rep.QIS_ID__c);
                }
            }
        }

        if( repairList != null && !repairList.isEmpty()){
            List<Repair__c> allRepairList = [select id,QIS_ID__c,CreatedDate from Repair__c
                    where Status1__c != '0.删除'
                            and Status1__c != '0.取消'
                            and Return_Without_Repair__c = false
                            and QIS_ID__c =: qisIdSet
                            order by CreatedDate desc];
            List<Rental_Apply__c> rentalList = [select Id,QIS_number__c,QISRepair__c from Rental_Apply__c where QIS_number__c =: QISidSet and Status__c != '取消' and demo_purpose2__c = '索赔QIS'];
            // 为减少sql，通过rep.QIS_ID__c来对符合条件的修理进行分组，获得一个键为QIS的id值为修理的list的map
            for(Id str : qisIdSet){
                List<Repair__c> repairForMap = new List<Repair__c>();
                for(Repair__c rep : allRepairList){
                    if(rep.QIS_ID__c == str){
                        repairForMap.add(rep);
                    }
                }
                if(!repairForMap.isEmpty()){
                    qisRepListMap.put(str, repairForMap);
                }
                // qisRepListMap.put(str, repairForMap);
            }

            for(Repair__c rep : repairList){
                if(qisRepListMap.get(rep.QIS_ID__c) != null){
                    qisRepMap.put(rep.QIS_ID__c, qisRepListMap.get(rep.QIS_ID__c)[0]);
                }else{
                    qisRepMap.put(rep.QIS_ID__c, null);
                }
            }

            for(Id idd : qisRepMap.keySet()){
                QIS_Report__c qis = new QIS_Report__c();
                qis.Id = idd;
                if(qisRepMap.get(idd) != null){
                    qis.Repair__c = qisRepMap.get(idd).Id;
                }else{
                    qis.Repair__c = null;
                }
                // qis.Repair__c = qisRepMap.get(idd).Id;
                qisList.add(qis);
            }

            for(Rental_Apply__c rent : rentalList){
                // rent.QISRepair__c = qisRepMap.get(rent.QIS_number__c).Id;
                if(qisRepMap.get(rent.QIS_number__c) != null){
                    rent.QISRepair__c = qisRepMap.get(rent.QIS_number__c).Id;
                }else{
                    rent.QISRepair__c = null;
                }
            }
            update qisList;
            if(rentalList.size() > 0 ){
                update rentalList;
            }
        }

    }

    public void RepairAfterInsert(){

        List<Repair__c> repairList = newList;
        List<Repair__c> repairUseList = new List<Repair__c>();
        Map<String,Repair__c> qismap = new Map<String,Repair__c>();
        List<QIS_Report__c> qisList = new List<QIS_Report__c>();

        for(Repair__c rep : repairList){
            if(rep.Status1__c != '0.删除' && rep.Status1__c != '0.取消' && rep.Return_Without_Repair__c == false && rep.QIS_ID__c != null ){
                // qismap.put(rep.QIS_ID__c, rep);
                if(qismap.get(rep.QIS_ID__c) != null){
                    if(qismap.get(rep.QIS_ID__c).CreatedDate < rep.CreatedDate){
                        qismap.put(rep.QIS_ID__c, rep);
                    }
                }else{
                    qismap.put(rep.QIS_ID__c, rep);
                }
            }
        }
        if(!qismap.isEmpty() ){
            for(String str : qismap.keySet()){
                repairUseList.add(qismap.get(str));
            }
        }
        if(repairUseList != null && !repairUseList.isEmpty()){
            for(Repair__c repair : repairUseList){
                QIS_Report__c qis = new QIS_Report__c();
                qis.Id = repair.QIS_ID__c;
                qis.Repair__c = repair.Id;
                qisList.add(qis);
            }
            update qisList;
            Set<String> QISidSet = qismap.keySet();
            List<Rental_Apply__c> rentalList = [select Id,QIS_number__c,QISRepair__c from Rental_Apply__c where QIS_number__c =: QISidSet  and Status__c != '取消' and demo_purpose2__c = '索赔QIS'];
            if(rentalList != null && !rentalList.isEmpty() ){
                for(Rental_Apply__c rent : rentalList){
                    rent.QISRepair__c = qismap.get(rent.QIS_number__c).Id;
                }
                update rentalList;
            }
        }
    }

    private void beforeCheck(){
        for (Repair__c nObj : newList) {
             
            // 通过报修子单来源 数据验证
            if (String.isNotBlank(nObj.RepairSubOrder__c)) {
                if (Trigger.isInsert) {//新增验证

                    if (String.isBlank(nObj.DeliveryLogisticsMode__c)) {
                        nObj.addError('送修物流方式 不能为空，请确认');
                    } else if ('快递'.equals(nObj.DeliveryLogisticsMode__c)) {
                        if (nobj.engineerSendDate__c == null) {
                           nObj.addError('送修物流方式 是快递，工程师修理品寄送日 不能为空，请确认'); 
                        }
                        // 20220104 取消 送修物流单号 Start
                        // if (String.isBlank(nObj.DeliveryLogisticsNo__c)) {
                        //    nObj.addError('送修物流方式 是快递，送修物流单号 不能为空，请确认');  
                        // }
                        // 20220104 取消 送修物流单号 END
                    }

                    if (('RC修理'.equals(nobj.On_site_repair__c) ||
                         '直送SORC修理'.equals(nobj.On_site_repair__c) || 
                         '直送OGZ修理'.equals(nobj.On_site_repair__c) ) && nobj.Send_To_RC_Date__c == null ) {
                        nObj.addError('RC修理，直送SORC修理和直送OGZ修理的话，必须要输入3.修理品RC寄送日。');
                    }
                } else {//变更
                    Repair__c oldObj = oldMap.get(nObj.Id);
                    if (nObj.SAP_Transfer_time__c != null) {
                        if (oldObj.DeliveryLogisticsMode__c != nObj.DeliveryLogisticsMode__c) {
                            nObj.addError('已发送给新服务系统 送修物流方式 不能修改，请了解'); 
                        }

                        if (oldObj.engineerSendDate__c != nObj.engineerSendDate__c) {
                            nObj.addError('已发送给新服务系统 工程师修理品寄送日 不能修改，请了解'); 
                        }

                        if (oldObj.DeliveryLogisticsNo__c != nObj.DeliveryLogisticsNo__c) {
                            nObj.addError('已发送给新服务系统 送修物流单号 不能修改，请了解'); 
                        }
                    }
                }
            }

        }
    }

    public void RepairAfterUpdate(){
        // 插入的repair list
        List<Repair__c> repairList = newList;
        List<QIS_Report__c> qisList = new List<QIS_Report__c>();
        // 有效到有效的list
        List<Repair__c> repairUToUList = new List<Repair__c>();
        // 无效到有效的list
        List<Repair__c> repairNToUList = new List<Repair__c>();
        // 有效到无效的list
        List<Repair__c> repairUToNList = new List<Repair__c>();
        // 无效到无效的list
        List<Repair__c> repairNtoNList = new List<Repair__c>();
        // List<Repair__c> repairUseList = new List<Repair__c>();
        // // 不符合条件的repair list
        // List<Repair__c> repairNoUseList = new List<Repair__c>();
        // 一直找到最新的修理
        Map<Id,Repair__c> qisRepMap = new Map<Id,Repair__c>();
        Integer i = 0;

        Set<Id> qisIdSet  = new Set<Id>();
        // 记录SQL记录
        Map<Id,List<Repair__c>> qisRepListMap = new Map<Id,List<Repair__c>>();

        for(Repair__c rep : repairList){
            if(rep.QIS_ID__c != null){
                // 判断有效到有效
                if(rep.Status1__c != '0.删除' && rep.Status1__c != '0.取消' && rep.Return_Without_Repair__c == false && oldMap.get(rep.Id).Status1__c != '0.删除' && oldMap.get(rep.Id).Status1__c != '0.取消' && oldMap.get(rep.Id).Return_Without_Repair__c == false){
                    if(rep.QISLatestIsEmpty__c){
                        i++;
                        qisIdSet.add(rep.QIS_ID__c);
                    }
                    repairUToUList.add(rep);
                }
                // 判断无效到有效
                if(rep.Status1__c != '0.删除' && rep.Status1__c != '0.取消' && rep.Return_Without_Repair__c == false && (oldMap.get(rep.Id).Status1__c == '0.删除' || oldMap.get(rep.Id).Status1__c == '0.取消' || oldMap.get(rep.Id).Return_Without_Repair__c == true) ){
                    repairNToUList.add(rep);
                    qisIdSet.add(rep.QIS_ID__c);
                }
                // 判断有效到无效
                if( (rep.Status1__c == '0.删除' || rep.Status1__c == '0.取消' || rep.Return_Without_Repair__c == true ) && (oldMap.get(rep.Id).Status1__c != '0.删除' && oldMap.get(rep.Id).Status1__c != '0.取消' && oldMap.get(rep.Id).Return_Without_Repair__c == false) ){
                    repairUToNList.add(rep);
                    qisIdSet.add(rep.QIS_ID__c);
                }
                // 判断无效到无效
                // if( (rep.Status1__c == '0.删除' || rep.Status1__c == '0.取消' || rep.Return_Without_Repair__c == true ) && ( oldMap.get(rep.Id).Status1__c == '0.删除' || oldMap.get(rep.Id).Status1__c == '0.取消' || oldMap.get(rep.Id).Return_Without_Repair__c == true) ){
                //     repairNToNList.add(rep);
                // }
            }
        }
        // SQL执行条件（空更新的时候，从有效到无效，从无效到有效）
        if( i>0 || repairNToUList.size() > 0 || repairUToNList.size() > 0){
            List<Repair__c> allRepairList = [select id,QIS_ID__c,CreatedDate from Repair__c
                    where Status1__c != '0.删除'
                            and Status1__c != '0.取消'
                            and Return_Without_Repair__c = false
                            and QIS_ID__c =: qisIdSet
                            order by CreatedDate desc];
            List<Rental_Apply__c> rentalList = [select Id,QIS_number__c,QISRepair__c from Rental_Apply__c where QIS_number__c =: QISidSet  and Status__c != '取消' and demo_purpose2__c = '索赔QIS'];
            // 为减少sql，通过rep.QIS_ID__c来对符合条件的修理进行分组，获得一个键为QIS的id值为修理的list的map
            for(Id str : qisIdSet){
                List<Repair__c> repairForMap = new List<Repair__c>();
                for(Repair__c rep : allRepairList){
                    if(rep.QIS_ID__c == str){
                        repairForMap.add(rep);
                    }
                }
                if(!repairForMap.isEmpty()){
                    qisRepListMap.put(str, repairForMap);
                }
            }

            // 空更新(只有有效到有效，无效到无效不存在更新)
            if( i > 0){
                for(Repair__c rep : repairUToUList){
                    if(rep.QISLatestIsEmpty__c){
                        qisRepMap.put(rep.QIS_ID__c, qisRepListMap.get(rep.QIS_ID__c)[0]);
                    }
                }
            }
            // 无效到有效或者有效到无效
            if(repairNToUList.size() > 0 || repairUToNList.size() > 0){
                for(Repair__c rep : repairNToUList){
                    qisRepMap.put(rep.QIS_ID__c, qisRepListMap.get(rep.QIS_ID__c)[0]);
                }
                // 有效变为无效的可能存在置空
                for(Repair__c rep : repairUToNList){
                    if(qisRepListMap.get(rep.QIS_ID__c) != null){
                    // if(qisRepListMap != null){
                        qisRepMap.put(rep.QIS_ID__c, qisRepListMap.get(rep.QIS_ID__c)[0]);
                    }else{
                        qisRepMap.put(rep.QIS_ID__c, null);
                    }
                }
            }
            // List<QIS_Report__c> qisList = new List<QIS_Report__c>();
            for(Id idd : qisRepMap.keySet()){
                QIS_Report__c qis = new QIS_Report__c();
                qis.Id = idd;
                if(qisRepMap.get(idd) != null){
                    qis.Repair__c = qisRepMap.get(idd).Id;
                }else{
                    qis.Repair__c = null;
                }
                qisList.add(qis);
            }

            for(Rental_Apply__c rent : rentalList){
                if(qisRepMap.get(rent.QIS_number__c) != null){
                    rent.QISRepair__c = qisRepMap.get(rent.QIS_number__c).Id;
                }else{
                    rent.QISRepair__c = null;
                }
            }

            update qisList;
            if(rentalList.size() > 0 ){
                update rentalList;
            }
        }
    }
    //SWAG-BE532K  update QIS修理逻辑 by vivek 2019-7-22 end

    @TestVisible private static void test() {
        if (false == Test.isRunningTest()) return;
        Integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
   }
}