refactor,feat: 批量代码重构与新增业务模块

1. 重命名枚举项与实体字段,修正类型引用
2. 新增IsNull扩展方法与多项字符串处理扩展
3. 新增大量业务DTO、服务接口与枚举定义
4. 重构RabbitMQ服务实现,替换旧版消息队列组件
5. 优化签到服务的宠物喂养事务逻辑
6. 移除冗余的项目引用与旧版消息队列代码
7. 新增Excel导出、导入模板相关工具方法
This commit is contained in:
glz
2026-06-11 17:01:24 +08:00
parent ae4cd627df
commit e493c85d08
57 changed files with 4477 additions and 399 deletions

View File

@ -0,0 +1,81 @@
using QYZH.InteractiveMagazine.Models.Enum;
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 绑定期刊输入DTO
/// </summary>
public class BindJournalInput
{
/// <summary>
/// 期刊模板Id扫码解析的期刊定义Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 实例化期刊Id扫码解析的具体期刊实例Id可选
/// </summary>
public long Id { get; set; }
/// <summary>
/// 关联类型: Read(已读), Favorite(收藏), Subscribe(订阅),默认 Subscribe
/// </summary>
public string Type { get; set; } = UserJournalTypeEnum.Subscribe.ToString();
}
/// <summary>
/// 绑定期刊输出DTO
/// </summary>
public class BindJournalOutput
{
/// <summary>
/// 绑定记录Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 期刊模板Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 关联类型
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 绑定时间
/// </summary>
public DateTime CreatedAt { get; set; }
}
/// <summary>
/// 用户期刊关联查询输入DTO
/// </summary>
public class UserJournalQueryInput : PageQueryModel
{
/// <summary>
/// 期刊模板Id
/// </summary>
public long? JournalId { get; set; }
/// <summary>
/// 实例化期刊Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 关联类型: Read, Favorite, Subscribe
/// </summary>
public string? Type { get; set; }
}

View File

@ -0,0 +1,112 @@
using System;
using System.Linq;
using System.Text.Json.Serialization;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalImportDto
{
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// pdf地址
/// </summary>
public string PdfUrl { get; set; }
/// <summary>
/// 从多少页开始
/// </summary>
public int Index { get; set; }
public List<JournalCatalogAddInput> JournalCatalogs { get; set; }
}
/// <summary>
/// 目录导入
/// </summary>
public class JournalCatalogImportDto
{
/// <summary>
/// 一级目录
/// </summary>
public string ParentName { get; set; }
/// <summary>
/// 二级目录
/// </summary>
public string Name { get; set; }
/// <summary>
/// 页码
/// </summary>
public int PageNum { get; set; }
[JsonIgnore]
public long PagePageId { get; set; }
}
public class JournalCatalogAddInput
{
/// <summary>
/// 目录名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 级别
/// </summary>
public int Level { get; set; }
/// <summary>
/// 类型0-目录 1-页
/// </summary>
public int Type { get; set; }
/// <summary>
/// url
/// </summary>
public string Url { get; set; }
}
public class JournalCatalogInput
{
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 目录名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 父Id;无限级别
/// </summary>
public long ParentId { get; set; }
/// <summary>
/// 等级
/// </summary>
public int Level { get; set; }
/// <summary>
/// 指定插入位置的索引从0开始不传或传null时默认追加到末尾
/// </summary>
public int? Position { get; set; }
/// <summary>
/// 类型0-目录 1-页
/// </summary>
public int Type { get; set; }
/// <summary>
/// url
/// </summary>
public string Url { get; set; }
}
}

View File

@ -0,0 +1,71 @@
using MiniExcelLibs.Attributes;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public partial class JournalCatalogTreeListDto
{
/// <summary>
/// Desc:主键id
/// </summary>
[ExcelIgnore]
public long Id { get; set; }
/// <summary>
/// Desc:书id
/// </summary>
[ExcelIgnore]
public long JournalId { get; set; }
/// <summary>
/// Desc:一级目录名称
/// </summary>
[DisplayName("目录名称")]
[Required]
public string? ParentName { get; set; }
/// <summary>
/// Desc:目录名称
/// </summary>
[DisplayName("二级目录")]
[Required]
public string Name { get; set; }
[ExcelIgnore]
public long PageId { get; set; }
[DisplayName("页码")]
[Required]
public int PageNum { get; set; }
[ExcelIgnore]
public long? ParentId { get; set; }
}
public partial class IcrJournalCatalogTreeDto
{
/// <summary>
/// Desc:主键id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 层级
/// </summary>
public int Level { get; set; }
public List<IcrJournalCatalogTreeDto> Child { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Linq;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalCatalogUpdateInput
{
public long Id { get; set; }
/// <summary>
/// 目录名称
/// </summary>
public string Name { get; set; }
}
}

View File

@ -1,81 +1,145 @@
using QYZH.InteractiveMagazine.Common.Extensions;
using QYZH.InteractiveMagazine.Common.Helpers;
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 绑定期刊输入DTO
/// </summary>
public class BindJournalInput
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
/// <summary>
/// 期刊模板Id扫码解析的期刊定义Id
/// </summary>
public long JournalId { get; set; }
public class JournalDto
{
/// <summary>
/// Desc:主键id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 实例化期刊Id扫码解析的具体期刊实例Id可选
/// </summary>
public long Id { get; set; }
/// <summary>
/// Desc:书籍名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 关联类型: Read(已读), Favorite(收藏), Subscribe(订阅),默认 Subscribe
/// </summary>
public string Type { get; set; } = UserJournalTypeEnum.Subscribe.ToString();
}
/// <summary>
/// 绑定期刊输出DTO
/// </summary>
public class BindJournalOutput
{
/// <summary>
/// 绑定记录Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 用户Id
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 期刊模板Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 关联类型
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 绑定时间
/// </summary>
public DateTime CreatedAt { get; set; }
}
/// <summary>
/// 用户期刊关联查询输入DTO
/// </summary>
public class UserJournalQueryInput : PageQueryModel
{
/// <summary>
/// 期刊模板Id
/// </summary>
public long? JournalId { get; set; }
/// <summary>
/// 实例化期刊Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 关联类型: Read, Favorite, Subscribe
/// </summary>
public string? Type { get; set; }
/// <summary>
/// Desc:总页数
/// </summary>
public int TotalPage { get; set; }
/// <summary>
/// Desc:校验页数
/// </summary>
public int VerifyPage { get; set; }
/// <summary>
/// Desc:状态
/// </summary>
public JournalStatusEnum Status { get; set; }
/// <summary>
/// 状态
/// </summary>
public string ShowStatus => Status.GetDescription();
private string _pdfUrl;
/// <summary>
/// pdf预览地址
/// </summary>
public string PdfUrl
{
get => DomainHelper.OssFullUrl(_pdfUrl);
set => _pdfUrl = value;
}
/// <summary>
/// Desc:宽度
/// </summary>
public float Width { get; set; }
/// <summary>
/// Desc:高度
/// </summary>
public float Height { get; set; }
/// <summary>
/// Desc:乐观锁
/// </summary>
public int Revision { get; set; }
/// <summary>
/// Desc:审查结果(默认0 1通过 -1驳回)
/// </summary>
public int Result { get; set; }
private string _cover;
/// <summary>
/// 封面
/// </summary>
public string Cover
{
get => DomainHelper.OssFullUrl(_cover);
set => _cover = value;
}
private string _backCover;
/// <summary>
/// 封底
/// </summary>
public string BackCover
{
get => DomainHelper.OssFullUrl(_backCover);
set => _backCover = value;
}
private string _pdfPreviewUrl;
/// <summary>
/// pdf预览地址
/// </summary>
public string PdfPreviewUrl
{
get => DomainHelper.OssFullUrl(_pdfPreviewUrl);
set => _pdfPreviewUrl = value;
}
/// <summary>
/// Desc:结论json
/// </summary>
public object? Conclusion { get; set; }
/// <summary>
/// Desc:思路导读
/// </summary>
public string? Guide { get; set; }
/// <summary>
/// Desc:家长指导
/// </summary>
public string? Tutelage { get; set; }
/// <summary>
/// Desc:所属机构列表
/// </summary>
public Dictionary<long, string>? Organization { get; set; }
//public List<Dictionary<long, string>> Organizations => Organization.Select(c => new Dictionary<long, string>() { { c.Key, c.Value } }).ToList();
/// <summary>
/// Desc:副标题
/// </summary>
public string? Title { get; set; }
/// <summary>
/// 年级
/// </summary>
public int Grade { get; set; }
/// <summary>
/// Desc:下载书籍页码点阵码PDF文件名称
/// </summary>
public string? DownloadJournalPagePdfName { get; set; }
}
}

View File

@ -0,0 +1,116 @@
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public partial class JournalEditDto
{
/// <summary>
/// Desc:主键id
/// </summary>
public long Id { get; set; }
/// <summary>
/// Desc:书籍名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// Desc:总页数
/// </summary>
public int TotalPage { get; set; }
/// <summary>
/// Desc:校验页数
/// </summary>
public int VerifyPage { get; set; }
/// <summary>
/// Desc:状态
/// </summary>
public JournalStatusEnum Status { get; set; } = JournalStatusEnum.Created;
/// <summary>
/// Desc:pdf地址
/// </summary>
public string PdfUrl { get; set; }
/// <summary>
/// Desc:宽度
/// </summary>
public float Width { get; set; }
/// <summary>
/// Desc:高度
/// </summary>
public float Height { get; set; }
/// <summary>
/// Desc:乐观锁
/// </summary>
[JsonIgnore]
public int Revision { get; set; }
/// <summary>
/// Desc:审查结果(默认0 1通过 -1驳回)
/// </summary>
public int Result { get; set; }
/// <summary>
/// Desc:封面
/// </summary>
public string Cover { get; set; }
/// <summary>
/// Desc:封底
/// </summary>
public string BackCover { get; set; }
/// <summary>
/// Desc:pdf预览地址
/// </summary>
public string PdfPreviewUrl { get; set; }
/// <summary>
/// Desc:结论json
/// </summary>
public object Conclusion { get; set; }
/// <summary>
/// Desc:思路导读
/// </summary>
public string Guide { get; set; }
/// <summary>
/// Desc:家长指导
/// </summary>
[JsonIgnore]
public string Tutelage { get; set; }
/// <summary>
/// Desc:所属机构
/// </summary>
public long[] OrganizationIds { get; set; }
///// <summary>
///// Desc:所属机构
///// </summary>
//public string OrganizationName { get; set; }
/// <summary>
/// Desc:副标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 年级
/// </summary>
public int Grade { get; set; }
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Linq;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalAddV2Input
{
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 书目录id
/// </summary>
public long JournalCatalogId { get; set; }
/// <summary>
/// 页码
/// </summary>
public int PageNum { get; set; }
/// <summary>
/// 页图片
/// </summary>
public string Url { get; set; }
}
}

View File

@ -0,0 +1,62 @@
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalPageTaskAddInput
{
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 书页id
/// </summary>
public long JournalPageId { get; set; }
/// <summary>
/// 题号
/// </summary>
public string No { get; set; }
/// <summary>
/// 题型
/// </summary>
public TaskBankTypeEnum Type { get; set; }
/// <summary>
/// 学科Id
/// </summary>
public long SubjectId { get; set; }
/// <summary>
/// 分数
/// </summary>
public float Score { get; set; }
/// <summary>
/// 回答时间(秒)
/// </summary>
public int AnswerTime { get; set; }
/// <summary>
/// 关联的知识点ids
/// </summary>
public string KnowledgePointIds { get; set; }
/// <summary>
/// 关键解析
/// </summary>
public string KeywordAnalysis { get; set; }
/// <summary>
/// 问题内容
/// </summary>
public string Task { get; set; }
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalPageTaskKeywordAnalysis
{
/// <summary>
/// 问题Id
/// </summary>
public long Id { get; set; }
/// <summary>
/// 单项解析
/// </summary>
public string KeywordAnalysis { get; set; }
}
}

View File

@ -0,0 +1,158 @@
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Common.Extensions;
using QYZH.InteractiveMagazine.Common.Helpers;
using QYZH.InteractiveMagazine.Models.Enum;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalPageTaskOutput
{
public long Id { get; set; }
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 书页Id
/// </summary>
public long JournalPageId { get; set; }
/// <summary>
/// 学科Id
/// </summary>
public long SubjectId { get; set; }
/// <summary>
/// 题号
/// </summary>
public string No { get; set; }
/// <summary>
/// 题型
/// </summary>
public TaskBankTypeEnum Type { get; set; }
public string ShowType => Type.GetDescription();
private string _task;
/// <summary>
/// 问题
/// </summary>
public string Task
{
get { return _task.AddDomain(DomainHelper.OssDomain); }
set { _task = value; }
}
/// <summary>
/// 选项
/// </summary>
public string Options { get; set; }
private string _answer;
/// <summary>
/// 答案
/// </summary>
public string Answer
{
get { return _answer.AddDomain(DomainHelper.OssDomain); }
set { _answer = value; }
}
private string _analysis;
/// <summary>
/// 解析
/// </summary>
public string Analysis
{
get { return _analysis.AddDomain(DomainHelper.OssDomain); }
set { _analysis = value; }
}
public string AnalysisUrl { get; set; }
/// <summary>
/// 问题分数
/// </summary>
public float TaskScore { get; set; }
private string _audioUrl;
/// <summary>
/// 音频地址
/// </summary>
public string AudioUrl
{
get { return DomainHelper.OssFullUrl(_audioUrl); }
set { _audioUrl = value; }
}
private string _videoUrl;
/// <summary>
/// 视频地址
/// </summary>
public string VideoUrl
{
get { return DomainHelper.OssFullUrl(_videoUrl); }
set { _videoUrl = value; }
}
private string _pointsUrl;
/// <summary>
/// 点位数据地址
/// </summary>
public string PointsUrl
{
get { return DomainHelper.OssFullUrl(_pointsUrl); }
set { _pointsUrl = value; }
}
private string _imageUrl;
/// <summary>
/// 图片地址
/// </summary>
public string ImageUrl
{
get { return DomainHelper.OssFullUrl(_imageUrl); }
set { _imageUrl = value; }
}
public List<string> ImageUrls { get; set; }
/// <summary>
/// 问题分数
/// </summary>
public float Score { get; set; }
/// <summary>
/// 回答时间(秒)
/// </summary>
public int AnswerTime { get; set; }
/// <summary>
/// 音频开始时间
/// </summary>
public long AudioStartTime { get; set; }
/// <summary>
/// 音频结束时间
/// </summary>
public long AudioEndTime { get; set; }
/// <summary>
/// 知识点
/// </summary>
public string KnowledgePointIds { get; set; }
/// <summary>
/// 回答项解析
/// </summary>
public string KeywordAnalysis { get; set; }
/// <summary>
/// 年级
/// </summary>
public int Grade { get; set; }
}
}

View File

@ -0,0 +1,126 @@
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalPageTaskUpdateInput
{
public long Id { get; set; }
/// <summary>
/// 书Id
/// </summary>
public long JournalId { get; set; }
/// <summary>
/// 书页id
/// </summary>
public long JournalPageId { get; set; }
/// <summary>
/// 题号
/// </summary>
public string No { get; set; }
/// <summary>
/// 题型
/// </summary>
public TaskBankTypeEnum Type { get; set; }
/// <summary>
/// 问题
/// </summary>
public string Task { get; set; }
/// <summary>
/// 选项
/// </summary>
public string Options { get; set; }
/// <summary>
/// 答案
/// </summary>
public string Answer { get; set; }
/// <summary>
/// 答案图片
/// </summary>
public string AnswerUrl { get; set; }
/// <summary>
/// 解析
/// </summary>
public string Analysis { get; set; }
/// <summary>
/// 解析图片地址
/// </summary>
public string AnalysisUrl { get; set; }
/// <summary>
/// 问题分数
/// </summary>
public float Score { get; set; }
/// <summary>
/// 回答时间秒
/// </summary>
public int AnswerTime { get; set; }
/// <summary>
/// 图片
/// </summary>
public string ImageUrl { get; set; }
/// <summary>
/// 视频
/// </summary>
public string VideoUrl { get; set; }
/// <summary>
/// 学科Id
/// </summary>
public long SubjectId { get; set; }
/// <summary>
/// 关联的知识点ids
/// </summary>
public string KnowledgepointIds { get; set; }
}
public class JournalPageTaskComplementInput
{
public long Id { get; set; }
/// <summary>
/// 任务id
/// </summary>
public long AssignTaskId { get; set; }
/// <summary>
/// 音频地址
/// </summary>
public string AudioUrl { get; set; }
/// <summary>
/// 音频开始时间
/// </summary>
public long AudioStartTime { get; set; }
/// <summary>
/// 音频结束时间
/// </summary>
public long AudioEndTime { get; set; }
/// <summary>
/// 点位数据地址
/// </summary>
public string PointsUrl { get; set; }
}
}

View File

@ -0,0 +1,100 @@
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Common.Extensions;
using QYZH.InteractiveMagazine.Common.Helpers;
using QYZH.InteractiveMagazine.Models.Enum;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalPageV2Output
{
public long JournalId { get; set; }
public long JournalCatalogId { get; set; }
public long JournalPageId { get; set; }
public string Layout { get; set; }
/// <summary>
/// 页码
/// </summary>
public int PageNum { get; set; }
private string _url;
/// <summary>
/// 图片
/// </summary>
public string Url
{
get { return DomainHelper.OssFullUrl(_url); }
set { _url = value; }
}
/// <summary>
/// 问题
/// </summary>
public List<JournalPageTaskV2Output>? Tasks { get; set; }
public List<JournalPageOtherOutput>? Areas { get; set; }
}
public class JournalPageTaskV2Output
{
public long Id { get; set; }
public long GroupId { get; set; }
/// <summary>
/// 题号
/// </summary>
public string No { get; set; }
//public long test => long.Parse(No.Replace("-", string.Empty));
/// <summary>
/// 题型
/// </summary>
public TaskBankTypeEnum Type { get; set; }
public string ShowType => Type.GetDescription();
/// <summary>
/// 选项
/// </summary>
public string Options { get; set; }
/// <summary>
/// 答案
/// </summary>
public string Answers { get; set; }
/// <summary>
/// 解析
/// </summary>
public string Analysis { get; set; }
/// <summary>
/// 是否分配
/// </summary>
public bool Assign { get; set; }
}
public class JournalPageOtherOutput
{
public long Id { get; set; }
/// <summary>
/// 题号
/// </summary>
public string No { get; set; }
/// <summary>
/// 题型
/// </summary>
public TaskBankTypeEnum Type { get; set; }
public string ShowType => Type.GetDescription();
}
}

View File

@ -0,0 +1,22 @@
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalQueryDto
{
/// <summary>
/// 书籍名称
/// </summary>
public string? Name { get; set; }
/// <summary>
/// 状态
/// </summary>
public JournalStatusEnum? Status { get; set; }
}
}

View File

@ -0,0 +1,35 @@
using QYZH.InteractiveMagazine.Models.Enum;
using QYZH.InteractiveMagazine.Models.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class JournalTaskOutput
{
public long TaskId { get; set; }
public string TaskNo { get; set; }
public TaskTypeEnum TaskType
{
get
{
var type = new TaskBankType();
if (type.ObjectiveTypes.Contains(TaskSubType))
return TaskTypeEnum.Objective;
else if (type.SubjectiveTypes.Contains(TaskSubType))
return TaskTypeEnum.Subjective;
else
throw new InvalidOperationException($"Unknown task sub type: {TaskSubType}");
}
}
/// <summary>
/// 详细类型
/// </summary>
public TaskBankTypeEnum TaskSubType { get; set; }
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Linq;
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
{
public class PageLayoutInput
{
public long Id { get; set; }
public string Layout { get; set; }
public List<TasksImages> TasksImages { get; set; }
}
public class TasksImages
{
public long TaskId { get; set; }
public string Url { get; set; }
}
}