| | |
| | |
|
| | | import java.io.PrintWriter;
|
| | | import java.io.UnsupportedEncodingException;
|
| | | import java.util.HashMap;
|
| | | import java.util.Map;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | |
|
| | | import org.springframework.stereotype.Controller;
|
| | | import org.springframework.web.bind.annotation.RequestMapping;
|
| | | import org.yeshi.utils.JsonUtil;
|
| | |
|
| | | import com.google.gson.Gson;
|
| | | import com.google.gson.GsonBuilder;
|
| | | import com.yeshi.fanli.entity.accept.AcceptData;
|
| | | import com.yeshi.fanli.entity.bus.help.AppPageNotification;
|
| | | import com.yeshi.fanli.service.inter.help.AppPageNotificationService;
|
| | | import com.yeshi.fanli.service.manger.AppUpdateManager;
|
| | | import com.yeshi.fanli.util.Constant;
|
| | | import com.yeshi.fanli.util.StringUtil;
|
| | | import com.yeshi.fanli.util.VersionUtil;
|
| | |
|
| | | import org.yeshi.utils.HttpUtil;
|
| | | import org.yeshi.utils.JsonUtil;
|
| | |
|
| | | @Controller
|
| | | @RequestMapping("api/v1/help")
|
| | |
| | |
|
| | | @Resource
|
| | | private AppPageNotificationService appPageNotificationService;
|
| | |
|
| | | @Resource
|
| | | private AppUpdateManager appUpdateManager;
|
| | |
|
| | | /**
|
| | | * 获取app页面的通知
|
| | |
| | | String platform = acceptData.getPlatform();
|
| | | String version = acceptData.getVersion();
|
| | |
|
| | | AppPageNotification ap = appPageNotificationService.getValidNotificationByTypeCache(type,platform, Integer.parseInt(version));
|
| | | AppPageNotification ap = appPageNotificationService.getValidNotificationByTypeCache(type, platform,
|
| | | Integer.parseInt(version));
|
| | | if ("home".equalsIgnoreCase(type) && VersionUtil.smallerThan_1_5_1(platform, version) && ap != null) {
|
| | | AppPageNotification no = new AppPageNotification();
|
| | | no.setContentUrl("");
|
| | |
| | |
|
| | | @RequestMapping(value = "updateApp")
|
| | | public void updateApp(AcceptData acceptData, PrintWriter out) {
|
| | | Map<String, String> params = new HashMap<>();
|
| | | if ("android".equalsIgnoreCase(acceptData.getPlatform())) {// android更新
|
| | | // acceptData.setVersion("10");
|
| | | params.put("method", "update");
|
| | | params.put("Platform", "Android");
|
| | | params.put("Version", acceptData.getVersion());
|
| | | params.put("device ", acceptData.getDevice());
|
| | | params.put("time", System.currentTimeMillis() + "");
|
| | | params.put("Package", acceptData.getPackages());
|
| | | params.put("device", acceptData.getDevice());
|
| | | params.put("platform", "Android");
|
| | | params.put("key", "a3f390d88e4c41f2747bfa2f1b5f87db");
|
| | | params.put("versionCode", acceptData.getVersion() + "");
|
| | | } else {// IOS更新
|
| | | params.put("method", "update");
|
| | | params.put("Platform", "IOS");
|
| | | params.put("Version", acceptData.getVersion());
|
| | | params.put("device ", acceptData.getDevice());
|
| | | params.put("time", System.currentTimeMillis() + "");
|
| | | params.put("Package", acceptData.getPackages());
|
| | | params.put("device", acceptData.getDevice());
|
| | | params.put("platform", "IOS");
|
| | | params.put("key", "32bb90e8976aab5298d5da10fe66f21d");
|
| | | params.put("versionCode", acceptData.getVersion() + "");
|
| | | }
|
| | | String url = "http://update.yeshitv.com:8090/update/update";
|
| | | String result = HttpUtil.post(url, params, null);
|
| | | String result = appUpdateManager.getUpdateInfoCache(acceptData);
|
| | | try {
|
| | | out.print(new String(result.getBytes("ISO-8859-1"), "UTF-8"));
|
| | | } catch (UnsupportedEncodingException e) {
|
| | |
| | | import org.yeshi.utils.mybatis.Column;
|
| | | import org.yeshi.utils.mybatis.Table;
|
| | |
|
| | | import jxl.write.DateTime;
|
| | |
|
| | | /**
|
| | | * 邀请订单补贴
|
| | | *
|
| | |
| | | private Date getTime;
|
| | | @Column(name = "os_level")
|
| | | private Integer level;// 直接/间接
|
| | | @Column(name = "os_valid_time")
|
| | | private Date validTime;
|
| | | @Column(name = "os_invalid_time")
|
| | | private Date inValidTime;
|
| | |
|
| | | public Date getInValidTime() {
|
| | | return inValidTime;
|
| | | }
|
| | |
|
| | | public void setInValidTime(Date inValidTime) {
|
| | | this.inValidTime = inValidTime;
|
| | | }
|
| | |
|
| | | public Date getValidTime() {
|
| | | return validTime;
|
| | | }
|
| | |
|
| | | public void setValidTime(Date validTime) {
|
| | | this.validTime = validTime;
|
| | | }
|
| | |
|
| | | public Integer getLevel() {
|
| | | return level;
|
| | |
| | | @Column(name = "otr_level")
|
| | | private Integer level;// 直接/间接补贴
|
| | |
|
| | | @Column(name = "otr_valid_time")
|
| | | private Date validTime;
|
| | | |
| | | @Column(name = "otr_invalid_time")
|
| | | private Date inValidTime;
|
| | | |
| | | |
| | | public Date getValidTime() {
|
| | | return validTime;
|
| | | }
|
| | |
|
| | | public void setValidTime(Date validTime) {
|
| | | this.validTime = validTime;
|
| | | }
|
| | |
|
| | | public Date getInValidTime() {
|
| | | return inValidTime;
|
| | | }
|
| | |
|
| | | public void setInValidTime(Date inValidTime) {
|
| | | this.inValidTime = inValidTime;
|
| | | }
|
| | |
|
| | | public Integer getLevel() {
|
| | | return level;
|
| | | }
|
| | |
| | | jdbcType="TIMESTAMP" /> |
| | | <result column="os_get_time" property="getTime" jdbcType="TIMESTAMP" /> |
| | | <result column="os_level" property="level" jdbcType="INTEGER" /> |
| | | <result column="os_valid_time" property="validTime" jdbcType="TIMESTAMP" /> |
| | | <result column="os_invalid_time" property="inValidTime" |
| | | jdbcType="TIMESTAMP" /> |
| | | </resultMap> |
| | | <sql id="Base_Column_List">os_id,os_uid,os_money,os_order_no,os_source_type,os_state,os_create_time,os_update_time,os_original_money,os_pre_get_time,os_get_time,os_level |
| | | <sql id="Base_Column_List">os_id,os_uid,os_money,os_order_no,os_source_type,os_state,os_create_time,os_update_time,os_original_money,os_pre_get_time,os_get_time,os_level,os_valid_time,os_invalid_time |
| | | </sql> |
| | | <select id="selectByPrimaryKey" resultMap="BaseResultMap" |
| | | parameterType="java.lang.Long"> |
| | |
| | | <insert id="insert" parameterType="com.yeshi.fanli.entity.order.InviteOrderSubsidy" |
| | | useGeneratedKeys="true" keyProperty="id">insert into |
| | | yeshi_ec_invite_order_subsidy |
| | | (os_id,os_uid,os_money,os_order_no,os_source_type,os_state,os_create_time,os_update_time,os_original_money,os_pre_get_time,os_get_time,os_level) |
| | | (os_id,os_uid,os_money,os_order_no,os_source_type,os_state,os_create_time,os_update_time,os_original_money,os_pre_get_time,os_get_time,os_level,os_valid_time,os_invalid_time) |
| | | values |
| | | (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{orderNo,jdbcType=VARCHAR},#{sourceType,jdbcType=INTEGER},#{state,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{originalMoney,jdbcType=DECIMAL},#{preGetTime,jdbcType=TIMESTAMP},#{getTime,jdbcType=TIMESTAMP},#{level,jdbcType=INTEGER}) |
| | | (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{orderNo,jdbcType=VARCHAR},#{sourceType,jdbcType=INTEGER},#{state,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{originalMoney,jdbcType=DECIMAL},#{preGetTime,jdbcType=TIMESTAMP},#{getTime,jdbcType=TIMESTAMP},#{level,jdbcType=INTEGER},#{validTime,jdbcType=TIMESTAMP},#{inValidTime,jdbcType=TIMESTAMP}) |
| | | </insert> |
| | | <insert id="insertSelective" parameterType="com.yeshi.fanli.entity.order.InviteOrderSubsidy" |
| | | useGeneratedKeys="true" keyProperty="id"> |
| | |
| | | <if test="preGetTime != null">os_pre_get_time,</if> |
| | | <if test="getTime != null">os_get_time,</if> |
| | | <if test="level != null">os_level,</if> |
| | | <if test="validTime != null">os_valid_time,</if> |
| | | <if test="inValidTime != null">os_invalid_time,</if> |
| | | </trim> |
| | | values |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | |
| | | <if test="preGetTime != null">#{preGetTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="getTime != null">#{getTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="level != null">#{level,jdbcType=INTEGER}</if> |
| | | <if test="validTime != null">#{validTime,jdbcType=TIMESTAMP}</if> |
| | | <if test="inValidTime != null">#{inValidTime,jdbcType=TIMESTAMP}</if> |
| | | </trim> |
| | | </insert> |
| | | <update id="updateByPrimaryKey" parameterType="com.yeshi.fanli.entity.order.InviteOrderSubsidy">update |
| | |
| | | =#{originalMoney,jdbcType=DECIMAL} ,os_pre_get_time |
| | | =#{preGetTime,jdbcType=TIMESTAMP} ,os_get_time |
| | | =#{getTime,jdbcType=TIMESTAMP} ,os_level =#{level,jdbcType=INTEGER} |
| | | where os_id = #{id,jdbcType=BIGINT}</update> |
| | | ,os_valid_time =#{validTime,jdbcType=TIMESTAMP} ,os_invalid_time |
| | | =#{inValidTime,jdbcType=TIMESTAMP} where os_id = #{id,jdbcType=BIGINT} |
| | | </update> |
| | | <update id="updateByPrimaryKeySelective" parameterType="com.yeshi.fanli.entity.order.InviteOrderSubsidy"> |
| | | update yeshi_ec_invite_order_subsidy |
| | | <set> |
| | |
| | | <if test="preGetTime !=null">os_pre_get_time =#{preGetTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="getTime !=null">os_get_time =#{getTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="level !=null">os_level =#{level,jdbcType=INTEGER},</if> |
| | | <if test="validTime !=null">os_valid_time =#{validTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="inValidTime !=null">os_invalid_time =#{inValidTime,jdbcType=TIMESTAMP},</if> |
| | | </set> |
| | | where os_id = #{id,jdbcType=BIGINT} |
| | | </update> |
| | |
| | | jdbcType="TIMESTAMP" /> |
| | | <result column="otr_get_time" property="getTime" jdbcType="TIMESTAMP" /> |
| | | <result column="otr_level" property="level" jdbcType="INTEGER" /> |
| | | <result column="otr_valid_time" property="validTime" jdbcType="TIMESTAMP" /> |
| | | <result column="otr_invalid_time" property="inValidTime" |
| | | jdbcType="TIMESTAMP" /> |
| | | <association property="subsidy" |
| | | javaType="com.yeshi.fanli.entity.order.InviteOrderSubsidy" column="otr_subsidy_id"> |
| | | <id column="otr_subsidy_id" property="id" /> |
| | | </association> |
| | | |
| | | </resultMap> |
| | | <sql id="Base_Column_List">otr_id,otr_uid,otr_money,otr_order_no,otr_source_type,otr_state,otr_create_time,otr_update_time,otr_original_money,otr_subsidy_id,otr_pre_get_time,otr_get_time,otr_level |
| | | <sql id="Base_Column_List">otr_id,otr_uid,otr_money,otr_order_no,otr_source_type,otr_state,otr_create_time,otr_update_time,otr_original_money,otr_subsidy_id,otr_pre_get_time,otr_get_time,otr_level,otr_valid_time,otr_invalid_time |
| | | </sql> |
| | | <select id="selectByPrimaryKey" resultMap="BaseResultMap" |
| | | parameterType="java.lang.Long"> |
| | |
| | | <insert id="insert" parameterType="com.yeshi.fanli.entity.order.OrderTeamReward" |
| | | useGeneratedKeys="true" keyProperty="id">insert into |
| | | yeshi_ec_order_team_reward |
| | | (otr_id,otr_uid,otr_money,otr_order_no,otr_source_type,otr_state,otr_create_time,otr_update_time,otr_original_money,otr_subsidy_id,otr_pre_get_time,otr_get_time,otr_level) |
| | | (otr_id,otr_uid,otr_money,otr_order_no,otr_source_type,otr_state,otr_create_time,otr_update_time,otr_original_money,otr_subsidy_id,otr_pre_get_time,otr_get_time,otr_level,otr_valid_time,otr_invalid_time) |
| | | values |
| | | (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{orderNo,jdbcType=VARCHAR},#{sourceType,jdbcType=INTEGER},#{state,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{originalMoney,jdbcType=DECIMAL},#{subsidy.id,jdbcType=BIGINT},#{preGetTime,jdbcType=TIMESTAMP},#{getTime,jdbcType=TIMESTAMP},#{level,jdbcType=INTEGER}) |
| | | (#{id,jdbcType=BIGINT},#{uid,jdbcType=BIGINT},#{money,jdbcType=DECIMAL},#{orderNo,jdbcType=VARCHAR},#{sourceType,jdbcType=INTEGER},#{state,jdbcType=INTEGER},#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{originalMoney,jdbcType=DECIMAL},#{subsidy.id,jdbcType=BIGINT},#{preGetTime,jdbcType=TIMESTAMP},#{getTime,jdbcType=TIMESTAMP},#{level,jdbcType=INTEGER},#{validTime,jdbcType=TIMESTAMP},#{inValidTime,jdbcType=TIMESTAMP}) |
| | | </insert> |
| | | <insert id="insertSelective" parameterType="com.yeshi.fanli.entity.order.OrderTeamReward" |
| | | useGeneratedKeys="true" keyProperty="id"> |
| | |
| | | <if test="preGetTime != null">otr_pre_get_time,</if> |
| | | <if test="getTime != null">otr_get_time,</if> |
| | | <if test="level != null">otr_level,</if> |
| | | <if test="validTime != null">otr_valid_time,</if> |
| | | <if test="inValidTime != null">otr_invalid_time,</if> |
| | | </trim> |
| | | values |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | |
| | | <if test="preGetTime != null">#{preGetTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="getTime != null">#{getTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="level != null">#{level,jdbcType=INTEGER},</if> |
| | | <if test="validTime != null">#{validTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="inValidTime != null">#{inValidTime,jdbcType=TIMESTAMP}</if> |
| | | </trim> |
| | | </insert> |
| | | <update id="updateByPrimaryKey" parameterType="com.yeshi.fanli.entity.order.OrderTeamReward">update |
| | |
| | | =#{subsidy.id,jdbcType=BIGINT} ,otr_pre_get_time |
| | | =#{preGetTime,jdbcType=TIMESTAMP} ,otr_get_time |
| | | =#{getTime,jdbcType=TIMESTAMP} ,otr_level =#{level,jdbcType=INTEGER} |
| | | where otr_id = #{id,jdbcType=BIGINT} |
| | | </update> |
| | | ,otr_valid_time =#{validTime,jdbcType=TIMESTAMP} ,otr_invalid_time |
| | | =#{inValidTime,jdbcType=TIMESTAMP} where otr_id = |
| | | #{id,jdbcType=BIGINT}</update> |
| | | <update id="updateByPrimaryKeySelective" parameterType="com.yeshi.fanli.entity.order.OrderTeamReward"> |
| | | update yeshi_ec_order_team_reward |
| | | <set> |
| | |
| | | <if test="subsidy !=null">otr_subsidy_id =#{subsidy.id,jdbcType=BIGINT},</if> |
| | | <if test="preGetTime !=null">otr_pre_get_time =#{preGetTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="getTime !=null">otr_get_time =#{getTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="id !=null">otr_id =#{id,jdbcType=BIGINT},</if> |
| | | <if test="level !=null">otr_level =#{level,jdbcType=INTEGER},</if> |
| | | <if test="validTime !=null">otr_valid_time =#{validTime,jdbcType=TIMESTAMP},</if> |
| | | <if test="inValidTime !=null">otr_invalid_time =#{inValidTime,jdbcType=TIMESTAMP},</if> |
| | | </set> |
| | | where otr_id = #{id,jdbcType=BIGINT} |
| | | </update> |
| | | <select id="getByOrderNoAndType" resultMap="BaseResultMap">SELECT * FROM |
| | | yeshi_ec_order_team_reward WHERE otr_uid = #{uid} AND otr_order_no = |
| | | #{orderNo} AND otr_source_type = #{type} LIMIT 1 |
| | | </select> |
| | | #{orderNo} AND otr_source_type = #{type} LIMIT 1</select> |
| | | <select id="getByOrderNoAndTypeForUpdate" resultMap="BaseResultMap">SELECT * |
| | | FROM yeshi_ec_order_team_reward WHERE otr_uid = #{uid} AND |
| | | otr_order_no = #{orderNo} AND otr_source_type = #{type} for update |
| | | </select> |
| | | <select id="countByOrderNoAndType" resultType="java.lang.Long">SELECT count(*) |
| | | FROM yeshi_ec_order_team_reward WHERE otr_order_no = #{orderNo} AND |
| | | otr_source_type = #{type} |
| | | </select> |
| | | otr_source_type = #{type}</select> |
| | | <select id="selectBySubsidyIdAndUidForUpdate" resultMap="BaseResultMap">SELECT * |
| | | FROM yeshi_ec_order_team_reward WHERE otr_subsidy_id = #{subsidyId} |
| | | AND otr_uid = #{uid} for update |
| | | </select> |
| | | AND otr_uid = #{uid} for update</select> |
| | | <select id="listBySubsidyId" resultMap="BaseResultMap" |
| | | parameterType="java.lang.Long">SELECT * FROM yeshi_ec_order_team_reward WHERE |
| | | otr_subsidy_id = #{0} |
| | | </select> |
| | | |
| | | otr_subsidy_id = #{0}</select> |
| | | <select id="listCanSettleByUid" resultMap="BaseResultMap">SELECT * FROM |
| | | yeshi_ec_order_team_reward WHERE |
| | | otr_uid |
| | | =#{uid} AND otr_state=1 AND |
| | | NOW()>otr_pre_get_time |
| | | limit |
| | | #{start},#{count} |
| | | </select> |
| | | |
| | | yeshi_ec_order_team_reward WHERE otr_uid =#{uid} AND otr_state=1 AND |
| | | NOW()>otr_pre_get_time limit #{start},#{count}</select> |
| | | <select id="countCanSettle" resultType="java.lang.Long" |
| | | parameterType="java.lang.Long">SELECT count(*) FROM yeshi_ec_order_team_reward |
| | | WHERE |
| | | otr_uid =#{uid} AND otr_state=1 AND NOW()>otr_pre_get_time |
| | | </select> |
| | | |
| | | |
| | | <select id="listCanSettleUid" resultType="java.lang.Long"> |
| | | SELECT t.`otr_uid` FROM |
| | | yeshi_ec_order_team_reward t WHERE t.`otr_state`=1 |
| | | AND #{time} > |
| | | parameterType="java.lang.Long">SELECT count(*) FROM yeshi_ec_order_team_reward WHERE |
| | | otr_uid =#{uid} AND otr_state=1 AND NOW()>otr_pre_get_time</select> |
| | | <select id="listCanSettleUid" resultType="java.lang.Long">SELECT t.`otr_uid` FROM |
| | | yeshi_ec_order_team_reward t WHERE t.`otr_state`=1 AND #{time} > |
| | | t.`otr_pre_get_time` GROUP BY t.`otr_uid` LIMIT #{start},#{count} |
| | | </select> |
| | | |
| | | |
| | | <select id="countCanSettleUid" resultType="java.lang.Long" |
| | | parameterType="java.util.Date"> |
| | | SELECT COUNT(*) FROM |
| | | ( |
| | | SELECT t.otr_uid FROM |
| | | parameterType="java.util.Date">SELECT COUNT(*) FROM ( SELECT t.otr_uid FROM |
| | | yeshi_ec_order_team_reward t WHERE t.otr_state=1 AND |
| | | #{0}>t.otr_pre_get_time GROUP BY t.otr_uid) a |
| | | </select> |
| | | |
| | | |
| | | |
| | | #{0}>t.otr_pre_get_time GROUP BY t.otr_uid) a</select> |
| | | </mapper> |
New file |
| | |
| | | package com.yeshi.fanli.service.manger;
|
| | |
|
| | | import java.util.HashMap;
|
| | | import java.util.Map;
|
| | |
|
| | | import org.springframework.cache.annotation.Cacheable;
|
| | | import org.springframework.stereotype.Component;
|
| | | import org.yeshi.utils.HttpUtil;
|
| | |
|
| | | import com.yeshi.fanli.entity.accept.AcceptData;
|
| | |
|
| | | @Component
|
| | | public class AppUpdateManager {
|
| | |
|
| | | public String getUpdateInfo(AcceptData acceptData) {
|
| | | Map<String, String> params = new HashMap<>();
|
| | | if ("android".equalsIgnoreCase(acceptData.getPlatform())) {// android更新
|
| | | params.put("method", "update");
|
| | | params.put("Platform", "Android");
|
| | | params.put("Version", acceptData.getVersion());
|
| | | params.put("device ", acceptData.getDevice());
|
| | | params.put("time", System.currentTimeMillis() + "");
|
| | | params.put("Package", acceptData.getPackages());
|
| | | params.put("device", acceptData.getDevice());
|
| | | params.put("platform", "Android");
|
| | | params.put("key", "a3f390d88e4c41f2747bfa2f1b5f87db");
|
| | | params.put("versionCode", acceptData.getVersion() + "");
|
| | | } else {// IOS更新
|
| | | params.put("method", "update");
|
| | | params.put("Platform", "IOS");
|
| | | params.put("Version", acceptData.getVersion());
|
| | | params.put("device ", acceptData.getDevice());
|
| | | params.put("time", System.currentTimeMillis() + "");
|
| | | params.put("Package", acceptData.getPackages());
|
| | | params.put("device", acceptData.getDevice());
|
| | | params.put("platform", "IOS");
|
| | | params.put("key", "32bb90e8976aab5298d5da10fe66f21d");
|
| | | params.put("versionCode", acceptData.getVersion() + "");
|
| | | }
|
| | | String url = "http://update.yeshitv.com:8090/update/update";
|
| | | String result = HttpUtil.post(url, params, null);
|
| | | return result;
|
| | | }
|
| | |
|
| | | @Cacheable(value = "config", key = "#acceptData.platform+'-'+#acceptData.version")
|
| | | public String getUpdateInfoCache(AcceptData acceptData) {
|
| | | return getUpdateInfo(acceptData);
|
| | | }
|
| | |
|
| | | }
|