From 3d9113819836a4a504a390822a072e5ec933ee31 Mon Sep 17 00:00:00 2001
From: czw <selecti@yeah.net>
Date: 星期五, 04 七月 2025 13:12:37 +0800
Subject: [PATCH] 1

---
 HnSx/Build/Project/NLog.config                      |  150 ++++
 HnSx/Build/Project/Static/index.html                |   14 
 HnSx/Build/Project/App.xaml                         |   10 
 HnSx/Build/Project/Static/assets/index-BH4e7Qb9.js  |   17 
 HnSx/Build/Project/界面/View1.xaml                    |   42 +
 .gitignore                                          |    3 
 HnSx/Build/Project/Static/assets/index-BVMtnVPg.css |    1 
 HnSx/Build/Project/代码/集成互联.cs                       |   40 +
 HnSx/Build/Project/代码/自定义类.cs                       |   26 
 HnSx/Build/Project/App.xaml.cs                      |   17 
 HnSx/Build/Project/Properties/AssemblyInfo.cs       |   36 +
 HnSx/Build/Project/HnSx.csproj                      |  236 ++++++
 HnSx/Build/Project/代码/ViewModel.cs                  |   73 ++
 HnSx/Build/Project/代码/界面事件.cs                       |  308 ++++++++
 HnSx/Build/Project/界面/View1.xaml.cs                 |   48 +
 HnSx/Build/Project/App.config                       |   69 +
 HnSx/Build/Project/代码/自定义结构.cs                      |   29 
 HnSx/Build/Project/Static/vite.svg                  |    1 
 HnSx/Build/Project/代码/VS自定义类/AutoThread.cs          |  964 +++++++++++++++++++++++++++
 19 files changed, 2,084 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
index 1c38a68..c1cea32 100644
--- a/.gitignore
+++ b/.gitignore
@@ -184,3 +184,6 @@
 
 # Microsoft Fakes
 FakesAssemblies/
+/HnSx/Build/Project/浠g爜/鍙橀噺鏁版嵁搴�cs
+/HnSx/Build/Project/浠g爜/鐣岄潰鍛戒护.cs
+/HnSx/Build/Project/浠g爜/璁惧閫氫俊.cs
diff --git a/HnSx/Build/Project/App.config b/HnSx/Build/Project/App.config
new file mode 100644
index 0000000..9fdffde
--- /dev/null
+++ b/HnSx/Build/Project/App.config
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+	<configSections>
+		<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework"/>
+	</configSections>
+	<connectionStrings>
+	</connectionStrings>
+	<entityFramework>
+		<providers>
+		</providers>
+	</entityFramework>
+	<appSettings>
+		<!--鍚姩瀹炰緥鏁伴噺闄愬埗-->
+		<add key="InstanceLimit" value="1"/>
+		<!--鏄惁鑷姩鍚姩PLC(1鏄�0鍚�-->
+		<add key="AutoRunPlc" value="1"/>
+		<!--Redis鏈嶅姟鍦板潃-->
+		<add key="RedisServerSession" value="127.0.0.1:6379"/>
+		<!--Redis璇诲彇姹�->
+		<add key="RedisMaxReadPool" value="3"/>
+		<!--Redis鍐欏叆姹�->
+		<add key="RedisMaxWritePool" value="1"/>
+		<!--鏄惁鑷姩鍚姩PLC(1鏄�0鍚�-->
+		<add key="AutoRunPLC" value="1"/>
+		<!--MongoConnStr-->
+		<add key="MongoConnStr" value="mongodb://localhost:27017?connectTimeoutMS=3000&amp;socketTimeoutMS=5000"/>
+		<!--MongoDb-->
+		<add key="MongoDb" value="HnSx"/>
+		<!--MongoDb_PLC-->
+		<add key="MongoDb_PLC" value="HnSx_PLC"/>
+		<!--Redis鏁版嵁搴�->
+		<add key="RedisDefaultDb" value="DB0"/>
+		<!--榛樿璇█-->
+		<add key="Lang" value=""/>
+	</appSettings>
+	<system.serviceModel>
+		<bindings>
+			<basicHttpBinding>
+				<binding maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"/>
+			</basicHttpBinding>
+		</bindings>
+		<client/>
+		<services>
+			<service name="MyServices">
+				<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
+				<host>
+					<baseAddresses>
+					</baseAddresses>
+				</host>
+			</service>
+		</services>
+		<behaviors>
+			<serviceBehaviors>
+				<behavior>
+					<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
+					<serviceDebug includeExceptionDetailInFaults="False"/>
+				</behavior>
+			</serviceBehaviors>
+		</behaviors>
+	</system.serviceModel>
+	<runtime>
+		<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+			<dependentAssembly>
+				<assemblyIdentity name="NLog" publicKeyToken="5120e14c03d0593c" culture="neutral"/>
+				<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
+			</dependentAssembly>
+		</assemblyBinding>
+	</runtime>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>
diff --git a/HnSx/Build/Project/App.xaml b/HnSx/Build/Project/App.xaml
new file mode 100644
index 0000000..a1fe957
--- /dev/null
+++ b/HnSx/Build/Project/App.xaml
@@ -0,0 +1,10 @@
+
+<Application x:Class="GZ.Projects.HnSx.App"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:local="clr-namespace:GZ.Projects.HnSx"
+             StartupUri="鐣岄潰\View1.xaml">
+    <Application.Resources>
+         
+    </Application.Resources>
+</Application>
\ No newline at end of file
diff --git a/HnSx/Build/Project/App.xaml.cs b/HnSx/Build/Project/App.xaml.cs
new file mode 100644
index 0000000..d348c7f
--- /dev/null
+++ b/HnSx/Build/Project/App.xaml.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace GZ.Projects.HnSx
+{
+    /// <summary>
+    /// App.xaml 鐨勪氦浜掗�杈�+    /// </summary>
+    public partial class App : Application
+    {
+    }
+}
diff --git a/HnSx/Build/Project/HnSx.csproj b/HnSx/Build/Project/HnSx.csproj
new file mode 100644
index 0000000..dc88240
--- /dev/null
+++ b/HnSx/Build/Project/HnSx.csproj
@@ -0,0 +1,236 @@
+锘�?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
+  <PropertyGroup>
+    <Platform Condition="'$(Configuration)' == ''">AnyCPU</Platform>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>GZ.Projects.HnSx</RootNamespace>
+    <AssemblyName>HnSx</AssemblyName>
+    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
+    <ProjectGuid>{617B42AD-F1EC-4998-9398-BD7FD9D00AA3}</ProjectGuid>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <ReferencePath>..\..\..\Dlls</ReferencePath>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject />
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <HintPath>..\..\Dlls\System.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data">
+      <HintPath>..\..\Dlls\System.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml">
+      <HintPath>..\..\Dlls\System.Xml.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.CSharp">
+      <HintPath>..\..\Dlls\Microsoft.CSharp.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Core">
+      <HintPath>..\..\Dlls\System.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <HintPath>..\..\Dlls\System.Xml.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <HintPath>..\..\Dlls\System.Data.DataSetExtensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Net.Http">
+      <HintPath>..\..\Dlls\System.Net.Http.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xaml">
+      <HintPath>..\..\Dlls\System.Xaml.dll</HintPath>
+    </Reference>
+    <Reference Include="WindowsBase">
+      <HintPath>..\..\Dlls\WindowsBase.dll</HintPath>
+    </Reference>
+    <Reference Include="PresentationCore">
+      <HintPath>..\..\Dlls\PresentationCore.dll</HintPath>
+    </Reference>
+    <Reference Include="PresentationFramework">
+      <HintPath>..\..\Dlls\PresentationFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Forms">
+      <HintPath>..\..\Dlls\System.Windows.Forms.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Practices.Prism">
+      <HintPath>..\..\Dlls\Microsoft.Practices.Prism.dll</HintPath>
+    </Reference>
+    <Reference Include="GZ.Modular.Redis">
+      <HintPath>..\..\Dlls\GZ.Modular.Redis.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Common">
+      <HintPath>..\..\Dlls\ServiceStack.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Interfaces">
+      <HintPath>..\..\Dlls\ServiceStack.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Redis">
+      <HintPath>..\..\Dlls\ServiceStack.Redis.dll</HintPath>
+    </Reference>
+    <Reference Include="ServiceStack.Text">
+      <HintPath>..\..\Dlls\ServiceStack.Text.dll</HintPath>
+    </Reference>
+    <Reference Include="Newtonsoft.Json">
+      <HintPath>..\..\Dlls\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Configuration">
+      <HintPath>..\..\Dlls\System.Configuration.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.Linq">
+      <HintPath>..\..\Dlls\System.Data.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics">
+      <HintPath>..\..\Dlls\System.Numerics.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe">
+      <HintPath>..\..\Dlls\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.Serialization">
+      <HintPath>..\..\Dlls\System.Runtime.Serialization.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceModel">
+      <HintPath>..\..\Dlls\System.ServiceModel.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ServiceModel.Web">
+      <HintPath>..\..\Dlls\System.ServiceModel.Web.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Web">
+      <HintPath>..\..\Dlls\System.Web.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Buffers">
+      <HintPath>..\..\Dlls\System.Buffers.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Memory">
+      <HintPath>..\..\Dlls\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics.Vectors">
+      <HintPath>..\..\Dlls\System.Numerics.Vectors.dll</HintPath>
+    </Reference>
+    <Reference Include="GZ.Modular.Log">
+      <HintPath>..\..\Dlls\GZ.Modular.Log.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite">
+      <HintPath>..\..\Dlls\System.Data.SQLite.dll</HintPath>
+    </Reference>
+    <Reference Include="log4net">
+      <HintPath>..\..\Dlls\log4net.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Transactions">
+      <HintPath>..\..\Dlls\System.Transactions.dll</HintPath>
+    </Reference>
+    <Reference Include="Dapper">
+      <HintPath>..\..\Dlls\Dapper.dll</HintPath>
+    </Reference>
+    <Reference Include="NLog">
+      <HintPath>..\..\Dlls\NLog.dll</HintPath>
+    </Reference>
+    <Reference Include="NLog.Mongo">
+      <HintPath>..\..\Dlls\NLog.Mongo.dll</HintPath>
+    </Reference>
+    <Reference Include="MongoDB.Driver">
+      <HintPath>..\..\Dlls\MongoDB.Driver.dll</HintPath>
+    </Reference>
+    <Reference Include="MongoDB.Driver.Core">
+      <HintPath>..\..\Dlls\MongoDB.Driver.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="MongoDB.Bson">
+      <HintPath>..\..\Dlls\MongoDB.Bson.dll</HintPath>
+    </Reference>
+    <Reference Include="MongoDB.Libmongocrypt">
+      <HintPath>..\..\Dlls\MongoDB.Libmongocrypt.dll</HintPath>
+    </Reference>
+    <Reference Include="DnsClient">
+      <HintPath>..\..\Dlls\DnsClient.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Web.WebView2.Wpf">
+      <HintPath>..\..\Dlls\Microsoft.Web.WebView2.Wpf.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Web.WebView2.Core">
+      <HintPath>..\..\Dlls\Microsoft.Web.WebView2.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="EntityFramework.SqlServer">
+      <HintPath>..\..\Dlls\EntityFramework.SqlServer.dll</HintPath>
+    </Reference>
+    <Reference Include="mscorlib">
+      <HintPath>..\..\Dlls\mscorlib.dll</HintPath>
+    </Reference>
+    <Reference Include="EntityFramework">
+      <HintPath>..\..\Dlls\EntityFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ComponentModel.DataAnnotations">
+      <HintPath>..\..\Dlls\System.ComponentModel.DataAnnotations.dll</HintPath>
+    </Reference>
+    <Reference Include="GZ.Device.PLC">
+      <HintPath>..\..\Dlls\GZ.Device.PLC.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <ApplicationDefinition Include="App.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </ApplicationDefinition>
+    <Compile Include="App.xaml.cs">
+      <DependentUpon>App.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Page Include="鐣岄潰\View1.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Compile Include="鐣岄潰\View1.xaml.cs">
+      <DependentUpon>View1.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="浠g爜\ViewModel.cs" />
+    <Compile Include="浠g爜\鍙橀噺鏁版嵁搴�cs" />
+    <Compile Include="浠g爜\闆嗘垚浜掕仈.cs" />
+    <Compile Include="浠g爜\鐣岄潰鍛戒护.cs" />
+    <Compile Include="浠g爜\鐣岄潰浜嬩欢.cs" />
+    <Compile Include="浠g爜\璁惧閫氫俊.cs" />
+    <Compile Include="浠g爜\鑷畾涔夌粨鏋�cs" />
+    <Compile Include="浠g爜\鑷畾涔夌被.cs" />
+    <Compile Include="浠g爜\VS鑷畾涔夌被\AutoThread.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Static\assets\index-BH4e7Qb9.js">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Static\assets\index-BVMtnVPg.css">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Static\index.html">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="Static\vite.svg">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <None Include="App.config" />
+    <Content Include="NLog.config">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/HnSx/Build/Project/NLog.config b/HnSx/Build/Project/NLog.config
new file mode 100644
index 0000000..cdaa235
--- /dev/null
+++ b/HnSx/Build/Project/NLog.config
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
+      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	  internalLogFile="nlog-internal.log"
+	  internalLogLevel="Error">
+	<extensions>
+		<add assembly="NLog.Mongo" />
+	</extensions>
+	<targets async="true">
+		<!-- 鏂囦欢鐩爣閰嶇疆 -->
+		<target name="FilePLC"
+				xsi:type="File"
+				fileName="D:/WCS.LogDB/HnSx/${event-properties:item=Category}/${level:uppercase=true}.log"
+				archiveFileName="D:/WCS.LogDB/HnSx/${event-properties:item=Category}/${level:uppercase=true}/{#}.log"
+				archiveEvery="Hour"
+				archiveNumbering="Date"
+				archiveDateFormat="yyyyMMddHH"
+				maxArchiveFiles="168"
+				maxArchiveDays="7"
+				keepFileOpen="false"
+				concurrentWrites="true"
+				encoding="utf-8"
+				layout="[${longdate}][${machinename}][${processid}][${processname}][${logger}][${uppercase:${level}}][${sequenceid}]${message}">
+		</target>
+		<!-- MongoDB鐩爣閰嶇疆 -->
+		<target name="MongoDebug"
+			xsi:type="Mongo"
+			connectionString="mongodb://localhost:27017?connectTimeoutMS=3000&amp;socketTimeoutMS=5000"
+			databaseName="HnSx"
+			collectionName="DEBUG"
+			includeDefaults="false"
+			includeEventProperties="false">
+			<field name="SID" layout="${sequenceid}" bsonType="Int64" />
+			<field name="TITLE" layout="${event-properties:item=TITLE}"/>
+			<field name="MESSAGE" layout="${event-properties:item=MESSAGE}" />
+			<field name="START" layout="${event-properties:item=START:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="END" layout="${event-properties:item=END:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="TIMESPAN" layout="${event-properties:item=TIMESPAN}" bsonType="Double"/>
+			<field name="CATEGORY" layout="${event-properties:item=CATEGORY}"/>
+			<field name="TAGS" layout="${event-properties:item=TAGS}"/>
+			<field name="DATA" layout="${event-properties:item=DATA}"/>
+			<field name="USER" layout="${event-properties:item=USER}"/>
+			<field name="EXCEPTION" layout="${event-properties:item=EXCEPTION:format=ToString}" />
+			<field name="LEVEL" layout="${level:uppercase=true}" />
+			<field name="LOGIC_NO" layout="${event-properties:item=LOGIC_NO}"/>
+			<field name="CALL_SITE" layout="${event-properties:item=CALL_SITE}" />
+			<field name="LINE_NO" layout="${event-properties:item=LINE_NO}" bsonType="Int32" />
+			<field name="LOGGER" layout="${logger}" />
+			<field name="MACHINE_NAME" layout="${machinename}" />
+			<field name="PROCESS_ID" layout="${processid}" bsonType="Int32" />
+			<field name="PROCESS_NAME" layout="${processname}" />
+			<field name="UTC_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ:universalTime=true}" bsonType="DateTime" />
+			<field name="LOCAL_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime" />
+		</target>
+		<target name="MongoInfo"
+			xsi:type="Mongo"
+			connectionString="mongodb://localhost:27017?connectTimeoutMS=3000&amp;socketTimeoutMS=5000"
+			databaseName="HnSx"
+			collectionName="INFO"
+			includeDefaults="false"
+			includeEventProperties="false">
+			<field name="SID" layout="${sequenceid}" bsonType="Int64" />
+			<field name="TITLE" layout="${event-properties:item=TITLE}"/>
+			<field name="MESSAGE" layout="${event-properties:item=MESSAGE}" />
+			<field name="START" layout="${event-properties:item=START:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="END" layout="${event-properties:item=END:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="TIMESPAN" layout="${event-properties:item=TIMESPAN}" bsonType="Double"/>
+			<field name="CATEGORY" layout="${event-properties:item=CATEGORY}"/>
+			<field name="TAGS" layout="${event-properties:item=TAGS}"/>
+			<field name="DATA" layout="${event-properties:item=DATA}"/>
+			<field name="USER" layout="${event-properties:item=USER}"/>
+			<field name="EXCEPTION" layout="${event-properties:item=EXCEPTION:format=ToString}" />
+			<field name="LEVEL" layout="${level:uppercase=true}" />
+			<field name="LOGIC_NO" layout="${event-properties:item=LOGIC_NO}"/>
+			<field name="CALL_SITE" layout="${event-properties:item=CALL_SITE}" />
+			<field name="LINE_NO" layout="${event-properties:item=LINE_NO}" bsonType="Int32" />
+			<field name="LOGGER" layout="${logger}" />
+			<field name="MACHINE_NAME" layout="${machinename}" />
+			<field name="PROCESS_ID" layout="${processid}" bsonType="Int32" />
+			<field name="PROCESS_NAME" layout="${processname}" />
+			<field name="UTC_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ:universalTime=true}" bsonType="DateTime" />
+			<field name="LOCAL_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime" />
+		</target>
+		<target name="MongoWarn"
+			xsi:type="Mongo"
+			connectionString="mongodb://localhost:27017?connectTimeoutMS=3000&amp;socketTimeoutMS=5000"
+			databaseName="HnSx"
+			collectionName="WARN"
+			includeDefaults="false"
+			includeEventProperties="false">
+			<field name="SID" layout="${sequenceid}" bsonType="Int64" />
+			<field name="TITLE" layout="${event-properties:item=TITLE}"/>
+			<field name="MESSAGE" layout="${event-properties:item=MESSAGE}" />
+			<field name="START" layout="${event-properties:item=START:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="END" layout="${event-properties:item=END:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="TIMESPAN" layout="${event-properties:item=TIMESPAN}" bsonType="Double"/>
+			<field name="CATEGORY" layout="${event-properties:item=CATEGORY}"/>
+			<field name="TAGS" layout="${event-properties:item=TAGS}"/>
+			<field name="DATA" layout="${event-properties:item=DATA}"/>
+			<field name="USER" layout="${event-properties:item=USER}"/>
+			<field name="EXCEPTION" layout="${event-properties:item=EXCEPTION:format=ToString}" />
+			<field name="LEVEL" layout="${level:uppercase=true}" />
+			<field name="LOGIC_NO" layout="${event-properties:item=LOGIC_NO}"/>
+			<field name="CALL_SITE" layout="${event-properties:item=CALL_SITE}" />
+			<field name="LINE_NO" layout="${event-properties:item=LINE_NO}" bsonType="Int32" />
+			<field name="LOGGER" layout="${logger}" />
+			<field name="MACHINE_NAME" layout="${machinename}" />
+			<field name="PROCESS_ID" layout="${processid}" bsonType="Int32" />
+			<field name="PROCESS_NAME" layout="${processname}" />
+			<field name="UTC_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ:universalTime=true}" bsonType="DateTime" />
+			<field name="LOCAL_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime" />
+		</target>
+		<target name="MongoError"
+			xsi:type="Mongo"
+			connectionString="mongodb://localhost:27017?connectTimeoutMS=3000&amp;socketTimeoutMS=5000"
+			databaseName="HnSx"
+			collectionName="ERROR"
+			includeDefaults="false"
+			includeEventProperties="false">
+			<field name="SID" layout="${sequenceid}" bsonType="Int64" />
+			<field name="TITLE" layout="${event-properties:item=TITLE}"/>
+			<field name="MESSAGE" layout="${event-properties:item=MESSAGE}" />
+			<field name="START" layout="${event-properties:item=START:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="END" layout="${event-properties:item=END:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime"/>
+			<field name="TIMESPAN" layout="${event-properties:item=TIMESPAN}" bsonType="Double"/>
+			<field name="CATEGORY" layout="${event-properties:item=CATEGORY}"/>
+			<field name="TAGS" layout="${event-properties:item=TAGS}"/>
+			<field name="DATA" layout="${event-properties:item=DATA}"/>
+			<field name="USER" layout="${event-properties:item=USER}"/>
+			<field name="EXCEPTION" layout="${event-properties:item=EXCEPTION:format=ToString}" />
+			<field name="LEVEL" layout="${level:uppercase=true}" />
+			<field name="LOGIC_NO" layout="${event-properties:item=LOGIC_NO}"/>
+			<field name="CALL_SITE" layout="${event-properties:item=CALL_SITE}" />
+			<field name="LINE_NO" layout="${event-properties:item=LINE_NO}" bsonType="Int32" />
+			<field name="LOGGER" layout="${logger}" />
+			<field name="MACHINE_NAME" layout="${machinename}" />
+			<field name="PROCESS_ID" layout="${processid}" bsonType="Int32" />
+			<field name="PROCESS_NAME" layout="${processname}" />
+			<field name="UTC_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ:universalTime=true}" bsonType="DateTime" />
+			<field name="LOCAL_TIME" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffZ}" bsonType="DateTime" />
+		</target>
+	</targets>
+	<rules>
+		<logger name="PlcLogger" levels="Debug,Info,Warn,Error" writeTo="FilePLC" />
+		<logger name="NLogger" levels="Debug" writeTo="MongoDebug" />
+		<logger name="NLogger" levels="Info" writeTo="MongoInfo" />
+		<logger name="NLogger" levels="Warn" writeTo="MongoWarn" />
+		<logger name="NLogger" levels="Error" writeTo="MongoError" />
+	</rules>
+</nlog>
\ No newline at end of file
diff --git a/HnSx/Build/Project/Properties/AssemblyInfo.cs b/HnSx/Build/Project/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..16b38b5
--- /dev/null
+++ b/HnSx/Build/Project/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑涓�埇淇℃伅鐢变互涓�+// 鎺у埗銆傛洿鏀硅繖浜涚壒鎬у�鍙慨鏀�+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭�
+[assembly: AssemblyTitle("HnSx")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("娴欐睙鍥借嚜鏅鸿兘瑁呭鏈夐檺鍏徃")]
+[assembly: AssemblyProduct("HnSx")]
+[assembly: AssemblyCopyright("Copyright 漏 2022 娴欐睙鍥借嚜鏅鸿兘瑁呭鏈夐檺鍏徃 All Rights Reserved.")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏�ComVisible 璁剧疆涓�false 浼氫娇姝ょ▼搴忛泦涓殑绫诲瀷
+//瀵�COM 缁勪欢涓嶅彲瑙併�濡傛灉闇�浠�COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷
+//璇峰皢姝ょ被鍨嬬殑 ComVisible 鐗规�璁剧疆涓�true銆�+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("67cd75ac-0724-44a4-95ee-ff2016177a77")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅鍒楀洓涓�缁勬垚: 
+//
+//      涓荤増鏈�+//      娆$増鏈�+//      鐢熸垚鍙�+//      淇鍙�+//
+// 鍙互鎸囧畾鎵�湁鍊硷紝涔熷彲浠ヤ娇鐢ㄤ互涓嬫墍绀虹殑 "*" 棰勭疆鐗堟湰鍙峰拰淇鍙�+// 鏂规硶鏄寜濡備笅鎵�ず浣跨敤鈥�鈥� :
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/HnSx/Build/Project/Static/assets/index-BH4e7Qb9.js b/HnSx/Build/Project/Static/assets/index-BH4e7Qb9.js
new file mode 100644
index 0000000..3087d9a
--- /dev/null
+++ b/HnSx/Build/Project/Static/assets/index-BH4e7Qb9.js
@@ -0,0 +1,17 @@
+(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function s(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(r){if(r.ep)return;r.ep=!0;const i=s(r);fetch(r.href,i)}})();/**
+* @vue/shared v3.5.17
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**//*! #__NO_SIDE_EFFECTS__ */function Ss(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const W={},Xe=[],ye=()=>{},Rr=()=>!1,Bt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ws=e=>e.startsWith("onUpdate:"),se=Object.assign,Ts=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},Ir=Object.prototype.hasOwnProperty,H=(e,t)=>Ir.call(e,t),P=Array.isArray,Ze=e=>Kt(e)==="[object Map]",wn=e=>Kt(e)==="[object Set]",R=e=>typeof e=="function",G=e=>typeof e=="string",$e=e=>typeof e=="symbol",q=e=>e!==null&&typeof e=="object",Tn=e=>(q(e)||R(e))&&R(e.then)&&R(e.catch),Cn=Object.prototype.toString,Kt=e=>Cn.call(e),Mr=e=>Kt(e).slice(8,-1),En=e=>Kt(e)==="[object Object]",Cs=e=>G(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,at=Ss(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Vt=e=>{const t=Object.create(null);return s=>t[s]||(t[s]=e(s))},Fr=/-(\w)/g,Ne=Vt(e=>e.replace(Fr,(t,s)=>s?s.toUpperCase():"")),Dr=/\B([A-Z])/g,Ge=Vt(e=>e.replace(Dr,"-$1").toLowerCase()),On=Vt(e=>e.charAt(0).toUpperCase()+e.slice(1)),Qt=Vt(e=>e?`on${On(e)}`:""),De=(e,t)=>!Object.is(e,t),kt=(e,...t)=>{for(let s=0;s<e.length;s++)e[s](...t)},us=(e,t,s,n=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},Hr=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let zs;const qt=()=>zs||(zs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Es(e){if(P(e)){const t={};for(let s=0;s<e.length;s++){const n=e[s],r=G(n)?jr(n):Es(n);if(r)for(const i in r)t[i]=r[i]}return t}else if(G(e)||q(e))return e}const Nr=/;(?![^(]*\))/g,$r=/:([^]+)/,Lr=/\/\*[^]*?\*\//g;function jr(e){const t={};return e.replace(Lr,"").split(Nr).forEach(s=>{if(s){const n=s.split($r);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Os(e){let t="";if(G(e))t=e;else if(P(e))for(let s=0;s<e.length;s++){const n=Os(e[s]);n&&(t+=n+" ")}else if(q(e))for(const s in e)e[s]&&(t+=s+" ");return t.trim()}const Ur="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Wr=Ss(Ur);function An(e){return!!e||e===""}const Pn=e=>!!(e&&e.__v_isRef===!0),ft=e=>G(e)?e:e==null?"":P(e)||q(e)&&(e.toString===Cn||!R(e.toString))?Pn(e)?ft(e.value):JSON.stringify(e,Rn,2):String(e),Rn=(e,t)=>Pn(t)?Rn(e,t.value):Ze(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,r],i)=>(s[es(n,i)+" =>"]=r,s),{})}:wn(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>es(s))}:$e(t)?es(t):q(t)&&!P(t)&&!En(t)?String(t):t,es=(e,t="")=>{var s;return $e(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};/**
+* @vue/reactivity v3.5.17
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/let ie;class Br{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ie,!t&&ie&&(this.index=(ie.scopes||(ie.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].pause();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t<s;t++)this.scopes[t].resume();for(t=0,s=this.effects.length;t<s;t++)this.effects[t].resume()}}run(t){if(this._active){const s=ie;try{return ie=this,t()}finally{ie=s}}}on(){++this._on===1&&(this.prevScope=ie,ie=this)}off(){this._on>0&&--this._on===0&&(ie=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s<n;s++)this.effects[s].stop();for(this.effects.length=0,s=0,n=this.cleanups.length;s<n;s++)this.cleanups[s]();if(this.cleanups.length=0,this.scopes){for(s=0,n=this.scopes.length;s<n;s++)this.scopes[s].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0}}}function Kr(){return ie}let U;const ts=new WeakSet;class In{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,ie&&ie.active&&ie.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,ts.has(this)&&(ts.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Fn(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Xs(this),Dn(this);const t=U,s=fe;U=this,fe=!0;try{return this.fn()}finally{Hn(this),U=t,fe=s,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Rs(t);this.deps=this.depsTail=void 0,Xs(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?ts.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){as(this)&&this.run()}get dirty(){return as(this)}}let Mn=0,dt,ht;function Fn(e,t=!1){if(e.flags|=8,t){e.next=ht,ht=e;return}e.next=dt,dt=e}function As(){Mn++}function Ps(){if(--Mn>0)return;if(ht){let t=ht;for(ht=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;dt;){let t=dt;for(dt=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function Dn(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Hn(e){let t,s=e.depsTail,n=s;for(;n;){const r=n.prevDep;n.version===-1?(n===s&&(s=r),Rs(n),Vr(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=r}e.deps=t,e.depsTail=s}function as(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Nn(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Nn(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===vt)||(e.globalVersion=vt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!as(e))))return;e.flags|=2;const t=e.dep,s=U,n=fe;U=e,fe=!0;try{Dn(e);const r=e.fn(e._value);(t.version===0||De(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{U=s,fe=n,Hn(e),e.flags&=-3}}function Rs(e,t=!1){const{dep:s,prevSub:n,nextSub:r}=e;if(n&&(n.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let i=s.computed.deps;i;i=i.nextDep)Rs(i,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function Vr(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let fe=!0;const $n=[];function Ee(){$n.push(fe),fe=!1}function Oe(){const e=$n.pop();fe=e===void 0?!0:e}function Xs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=U;U=void 0;try{t()}finally{U=s}}}let vt=0;class qr{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Is{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!U||!fe||U===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==U)s=this.activeLink=new qr(U,this),U.deps?(s.prevDep=U.depsTail,U.depsTail.nextDep=s,U.depsTail=s):U.deps=U.depsTail=s,Ln(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=U.depsTail,s.nextDep=void 0,U.depsTail.nextDep=s,U.depsTail=s,U.deps===s&&(U.deps=n)}return s}trigger(t){this.version++,vt++,this.notify(t)}notify(t){As();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Ps()}}}function Ln(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)Ln(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const ds=new WeakMap,qe=Symbol(""),hs=Symbol(""),xt=Symbol("");function z(e,t,s){if(fe&&U){let n=ds.get(e);n||ds.set(e,n=new Map);let r=n.get(s);r||(n.set(s,r=new Is),r.map=n,r.key=s),r.track()}}function Ce(e,t,s,n,r,i){const o=ds.get(e);if(!o){vt++;return}const c=u=>{u&&u.trigger()};if(As(),t==="clear")o.forEach(c);else{const u=P(e),h=u&&Cs(s);if(u&&s==="length"){const a=Number(n);o.forEach((p,w)=>{(w==="length"||w===xt||!$e(w)&&w>=a)&&c(p)})}else switch((s!==void 0||o.has(void 0))&&c(o.get(s)),h&&c(o.get(xt)),t){case"add":u?h&&c(o.get("length")):(c(o.get(qe)),Ze(e)&&c(o.get(hs)));break;case"delete":u||(c(o.get(qe)),Ze(e)&&c(o.get(hs)));break;case"set":Ze(e)&&c(o.get(qe));break}}Ps()}function Ye(e){const t=D(e);return t===e?t:(z(t,"iterate",xt),ue(e)?t:t.map(k))}function Ms(e){return z(e=D(e),"iterate",xt),e}const Jr={__proto__:null,[Symbol.iterator](){return ss(this,Symbol.iterator,k)},concat(...e){return Ye(this).concat(...e.map(t=>P(t)?Ye(t):t))},entries(){return ss(this,"entries",e=>(e[1]=k(e[1]),e))},every(e,t){return we(this,"every",e,t,void 0,arguments)},filter(e,t){return we(this,"filter",e,t,s=>s.map(k),arguments)},find(e,t){return we(this,"find",e,t,k,arguments)},findIndex(e,t){return we(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return we(this,"findLast",e,t,k,arguments)},findLastIndex(e,t){return we(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return we(this,"forEach",e,t,void 0,arguments)},includes(...e){return ns(this,"includes",e)},indexOf(...e){return ns(this,"indexOf",e)},join(e){return Ye(this).join(e)},lastIndexOf(...e){return ns(this,"lastIndexOf",e)},map(e,t){return we(this,"map",e,t,void 0,arguments)},pop(){return ot(this,"pop")},push(...e){return ot(this,"push",e)},reduce(e,...t){return Zs(this,"reduce",e,t)},reduceRight(e,...t){return Zs(this,"reduceRight",e,t)},shift(){return ot(this,"shift")},some(e,t){return we(this,"some",e,t,void 0,arguments)},splice(...e){return ot(this,"splice",e)},toReversed(){return Ye(this).toReversed()},toSorted(e){return Ye(this).toSorted(e)},toSpliced(...e){return Ye(this).toSpliced(...e)},unshift(...e){return ot(this,"unshift",e)},values(){return ss(this,"values",k)}};function ss(e,t,s){const n=Ms(e),r=n[t]();return n!==e&&!ue(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=s(i.value)),i}),r}const Gr=Array.prototype;function we(e,t,s,n,r,i){const o=Ms(e),c=o!==e&&!ue(e),u=o[t];if(u!==Gr[t]){const p=u.apply(e,i);return c?k(p):p}let h=s;o!==e&&(c?h=function(p,w){return s.call(this,k(p),w,e)}:s.length>2&&(h=function(p,w){return s.call(this,p,w,e)}));const a=u.call(o,h,n);return c&&r?r(a):a}function Zs(e,t,s,n){const r=Ms(e);let i=s;return r!==e&&(ue(e)?s.length>3&&(i=function(o,c,u){return s.call(this,o,c,u,e)}):i=function(o,c,u){return s.call(this,o,k(c),u,e)}),r[t](i,...n)}function ns(e,t,s){const n=D(e);z(n,"iterate",xt);const r=n[t](...s);return(r===-1||r===!1)&&Ns(s[0])?(s[0]=D(s[0]),n[t](...s)):r}function ot(e,t,s=[]){Ee(),As();const n=D(e)[t].apply(e,s);return Ps(),Oe(),n}const Yr=Ss("__proto__,__v_isRef,__isVue"),jn=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter($e));function zr(e){$e(e)||(e=String(e));const t=D(this);return z(t,"has",e),t.hasOwnProperty(e)}class Un{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(s==="__v_isReactive")return!r;if(s==="__v_isReadonly")return r;if(s==="__v_isShallow")return i;if(s==="__v_raw")return n===(r?i?ii:Vn:i?Kn:Bn).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const o=P(t);if(!r){let u;if(o&&(u=Jr[s]))return u;if(s==="hasOwnProperty")return zr}const c=Reflect.get(t,s,X(t)?t:n);return($e(s)?jn.has(s):Yr(s))||(r||z(t,"get",s),i)?c:X(c)?o&&Cs(s)?c:c.value:q(c)?r?qn(c):Ds(c):c}}class Wn extends Un{constructor(t=!1){super(!1,t)}set(t,s,n,r){let i=t[s];if(!this._isShallow){const u=Je(i);if(!ue(n)&&!Je(n)&&(i=D(i),n=D(n)),!P(t)&&X(i)&&!X(n))return u?!1:(i.value=n,!0)}const o=P(t)&&Cs(s)?Number(s)<t.length:H(t,s),c=Reflect.set(t,s,n,X(t)?t:r);return t===D(r)&&(o?De(n,i)&&Ce(t,"set",s,n):Ce(t,"add",s,n)),c}deleteProperty(t,s){const n=H(t,s);t[s];const r=Reflect.deleteProperty(t,s);return r&&n&&Ce(t,"delete",s,void 0),r}has(t,s){const n=Reflect.has(t,s);return(!$e(s)||!jn.has(s))&&z(t,"has",s),n}ownKeys(t){return z(t,"iterate",P(t)?"length":qe),Reflect.ownKeys(t)}}class Xr extends Un{constructor(t=!1){super(!0,t)}set(t,s){return!0}deleteProperty(t,s){return!0}}const Zr=new Wn,Qr=new Xr,kr=new Wn(!0);const ps=e=>e,It=e=>Reflect.getPrototypeOf(e);function ei(e,t,s){return function(...n){const r=this.__v_raw,i=D(r),o=Ze(i),c=e==="entries"||e===Symbol.iterator&&o,u=e==="keys"&&o,h=r[e](...n),a=s?ps:t?gs:k;return!t&&z(i,"iterate",u?hs:qe),{next(){const{value:p,done:w}=h.next();return w?{value:p,done:w}:{value:c?[a(p[0]),a(p[1])]:a(p),done:w}},[Symbol.iterator](){return this}}}}function Mt(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function ti(e,t){const s={get(r){const i=this.__v_raw,o=D(i),c=D(r);e||(De(r,c)&&z(o,"get",r),z(o,"get",c));const{has:u}=It(o),h=t?ps:e?gs:k;if(u.call(o,r))return h(i.get(r));if(u.call(o,c))return h(i.get(c));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&z(D(r),"iterate",qe),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=D(i),c=D(r);return e||(De(r,c)&&z(o,"has",r),z(o,"has",c)),r===c?i.has(r):i.has(r)||i.has(c)},forEach(r,i){const o=this,c=o.__v_raw,u=D(c),h=t?ps:e?gs:k;return!e&&z(u,"iterate",qe),c.forEach((a,p)=>r.call(i,h(a),h(p),o))}};return se(s,e?{add:Mt("add"),set:Mt("set"),delete:Mt("delete"),clear:Mt("clear")}:{add(r){!t&&!ue(r)&&!Je(r)&&(r=D(r));const i=D(this);return It(i).has.call(i,r)||(i.add(r),Ce(i,"add",r,r)),this},set(r,i){!t&&!ue(i)&&!Je(i)&&(i=D(i));const o=D(this),{has:c,get:u}=It(o);let h=c.call(o,r);h||(r=D(r),h=c.call(o,r));const a=u.call(o,r);return o.set(r,i),h?De(i,a)&&Ce(o,"set",r,i):Ce(o,"add",r,i),this},delete(r){const i=D(this),{has:o,get:c}=It(i);let u=o.call(i,r);u||(r=D(r),u=o.call(i,r)),c&&c.call(i,r);const h=i.delete(r);return u&&Ce(i,"delete",r,void 0),h},clear(){const r=D(this),i=r.size!==0,o=r.clear();return i&&Ce(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{s[r]=ei(r,e,t)}),s}function Fs(e,t){const s=ti(e,t);return(n,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?n:Reflect.get(H(s,r)&&r in n?s:n,r,i)}const si={get:Fs(!1,!1)},ni={get:Fs(!1,!0)},ri={get:Fs(!0,!1)};const Bn=new WeakMap,Kn=new WeakMap,Vn=new WeakMap,ii=new WeakMap;function oi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function li(e){return e.__v_skip||!Object.isExtensible(e)?0:oi(Mr(e))}function Ds(e){return Je(e)?e:Hs(e,!1,Zr,si,Bn)}function ci(e){return Hs(e,!1,kr,ni,Kn)}function qn(e){return Hs(e,!0,Qr,ri,Vn)}function Hs(e,t,s,n,r){if(!q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=li(e);if(i===0)return e;const o=r.get(e);if(o)return o;const c=new Proxy(e,i===2?n:s);return r.set(e,c),c}function pt(e){return Je(e)?pt(e.__v_raw):!!(e&&e.__v_isReactive)}function Je(e){return!!(e&&e.__v_isReadonly)}function ue(e){return!!(e&&e.__v_isShallow)}function Ns(e){return e?!!e.__v_raw:!1}function D(e){const t=e&&e.__v_raw;return t?D(t):e}function fi(e){return!H(e,"__v_skip")&&Object.isExtensible(e)&&us(e,"__v_skip",!0),e}const k=e=>q(e)?Ds(e):e,gs=e=>q(e)?qn(e):e;function X(e){return e?e.__v_isRef===!0:!1}function lt(e){return ui(e,!1)}function ui(e,t){return X(e)?e:new ai(e,t)}class ai{constructor(t,s){this.dep=new Is,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:D(t),this._value=s?t:k(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||ue(t)||Je(t);t=n?t:D(t),De(t,s)&&(this._rawValue=t,this._value=n?t:k(t),this.dep.trigger())}}function Jn(e){return X(e)?e.value:e}const di={get:(e,t,s)=>t==="__v_raw"?e:Jn(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const r=e[t];return X(r)&&!X(s)?(r.value=s,!0):Reflect.set(e,t,s,n)}};function Gn(e){return pt(e)?e:new Proxy(e,di)}class hi{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Is(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=vt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&U!==this)return Fn(this,!0),!0}get value(){const t=this.dep.track();return Nn(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function pi(e,t,s=!1){let n,r;return R(e)?n=e:(n=e.get,r=e.set),new hi(n,r,s)}const Ft={},$t=new WeakMap;let Ke;function gi(e,t=!1,s=Ke){if(s){let n=$t.get(s);n||$t.set(s,n=[]),n.push(e)}}function _i(e,t,s=W){const{immediate:n,deep:r,once:i,scheduler:o,augmentJob:c,call:u}=s,h=O=>r?O:ue(O)||r===!1||r===0?Fe(O,1):Fe(O);let a,p,w,T,M=!1,F=!1;if(X(e)?(p=()=>e.value,M=ue(e)):pt(e)?(p=()=>h(e),M=!0):P(e)?(F=!0,M=e.some(O=>pt(O)||ue(O)),p=()=>e.map(O=>{if(X(O))return O.value;if(pt(O))return h(O);if(R(O))return u?u(O,2):O()})):R(e)?t?p=u?()=>u(e,2):e:p=()=>{if(w){Ee();try{w()}finally{Oe()}}const O=Ke;Ke=a;try{return u?u(e,3,[T]):e(T)}finally{Ke=O}}:p=ye,t&&r){const O=p,J=r===!0?1/0:r;p=()=>Fe(O(),J)}const Y=Kr(),$=()=>{a.stop(),Y&&Y.active&&Ts(Y.effects,a)};if(i&&t){const O=t;t=(...J)=>{O(...J),$()}}let K=F?new Array(e.length).fill(Ft):Ft;const V=O=>{if(!(!(a.flags&1)||!a.dirty&&!O))if(t){const J=a.run();if(r||M||(F?J.some((Pe,ae)=>De(Pe,K[ae])):De(J,K))){w&&w();const Pe=Ke;Ke=a;try{const ae=[J,K===Ft?void 0:F&&K[0]===Ft?[]:K,T];K=J,u?u(t,3,ae):t(...ae)}finally{Ke=Pe}}}else a.run()};return c&&c(V),a=new In(p),a.scheduler=o?()=>o(V,!1):V,T=O=>gi(O,!1,a),w=a.onStop=()=>{const O=$t.get(a);if(O){if(u)u(O,4);else for(const J of O)J();$t.delete(a)}},t?n?V(!0):K=a.run():o?o(V.bind(null,!0),!0):a.run(),$.pause=a.pause.bind(a),$.resume=a.resume.bind(a),$.stop=$,$}function Fe(e,t=1/0,s){if(t<=0||!q(e)||e.__v_skip||(s=s||new Set,s.has(e)))return e;if(s.add(e),t--,X(e))Fe(e.value,t,s);else if(P(e))for(let n=0;n<e.length;n++)Fe(e[n],t,s);else if(wn(e)||Ze(e))e.forEach(n=>{Fe(n,t,s)});else if(En(e)){for(const n in e)Fe(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&Fe(e[n],t,s)}return e}/**
+* @vue/runtime-core v3.5.17
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/function Tt(e,t,s,n){try{return n?e(...n):e()}catch(r){Jt(r,t,s)}}function Se(e,t,s,n){if(R(e)){const r=Tt(e,t,s,n);return r&&Tn(r)&&r.catch(i=>{Jt(i,t,s)}),r}if(P(e)){const r=[];for(let i=0;i<e.length;i++)r.push(Se(e[i],t,s,n));return r}}function Jt(e,t,s,n=!0){const r=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||W;if(t){let c=t.parent;const u=t.proxy,h=`https://vuejs.org/error-reference/#runtime-${s}`;for(;c;){const a=c.ec;if(a){for(let p=0;p<a.length;p++)if(a[p](e,u,h)===!1)return}c=c.parent}if(i){Ee(),Tt(i,null,10,[e,u,h]),Oe();return}}mi(e,s,r,n,o)}function mi(e,t,s,n=!0,r=!1){if(r)throw e;console.error(e)}const ee=[];let me=-1;const Qe=[];let Ie=null,ze=0;const Yn=Promise.resolve();let Lt=null;function bi(e){const t=Lt||Yn;return e?t.then(this?e.bind(this):e):t}function vi(e){let t=me+1,s=ee.length;for(;t<s;){const n=t+s>>>1,r=ee[n],i=yt(r);i<e||i===e&&r.flags&2?t=n+1:s=n}return t}function $s(e){if(!(e.flags&1)){const t=yt(e),s=ee[ee.length-1];!s||!(e.flags&2)&&t>=yt(s)?ee.push(e):ee.splice(vi(t),0,e),e.flags|=1,zn()}}function zn(){Lt||(Lt=Yn.then(Zn))}function xi(e){P(e)?Qe.push(...e):Ie&&e.id===-1?Ie.splice(ze+1,0,e):e.flags&1||(Qe.push(e),e.flags|=1),zn()}function Qs(e,t,s=me+1){for(;s<ee.length;s++){const n=ee[s];if(n&&n.flags&2){if(e&&n.id!==e.uid)continue;ee.splice(s,1),s--,n.flags&4&&(n.flags&=-2),n(),n.flags&4||(n.flags&=-2)}}}function Xn(e){if(Qe.length){const t=[...new Set(Qe)].sort((s,n)=>yt(s)-yt(n));if(Qe.length=0,Ie){Ie.push(...t);return}for(Ie=t,ze=0;ze<Ie.length;ze++){const s=Ie[ze];s.flags&4&&(s.flags&=-2),s.flags&8||s(),s.flags&=-2}Ie=null,ze=0}}const yt=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Zn(e){try{for(me=0;me<ee.length;me++){const t=ee[me];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Tt(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;me<ee.length;me++){const t=ee[me];t&&(t.flags&=-2)}me=-1,ee.length=0,Xn(),Lt=null,(ee.length||Qe.length)&&Zn()}}let xe=null,Qn=null;function jt(e){const t=xe;return xe=e,Qn=e&&e.type.__scopeId||null,t}function yi(e,t=xe,s){if(!t||e._n)return e;const n=(...r)=>{n._d&&cn(-1);const i=jt(t);let o;try{o=e(...r)}finally{jt(i),n._d&&cn(1)}return o};return n._n=!0,n._c=!0,n._d=!0,n}function We(e,t,s,n){const r=e.dirs,i=t&&t.dirs;for(let o=0;o<r.length;o++){const c=r[o];i&&(c.oldValue=i[o].value);let u=c.dir[n];u&&(Ee(),Se(u,s,8,[e.el,c,e,t]),Oe())}}const Si=Symbol("_vte"),wi=e=>e.__isTeleport;function Ls(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Ls(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function kn(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function gt(e,t,s,n,r=!1){if(P(e)){e.forEach((M,F)=>gt(M,t&&(P(t)?t[F]:t),s,n,r));return}if(_t(n)&&!r){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&gt(e,t,s,n.component.subTree);return}const i=n.shapeFlag&4?Ks(n.component):n.el,o=r?null:i,{i:c,r:u}=e,h=t&&t.r,a=c.refs===W?c.refs={}:c.refs,p=c.setupState,w=D(p),T=p===W?()=>!1:M=>H(w,M);if(h!=null&&h!==u&&(G(h)?(a[h]=null,T(h)&&(p[h]=null)):X(h)&&(h.value=null)),R(u))Tt(u,c,12,[o,a]);else{const M=G(u),F=X(u);if(M||F){const Y=()=>{if(e.f){const $=M?T(u)?p[u]:a[u]:u.value;r?P($)&&Ts($,i):P($)?$.includes(i)||$.push(i):M?(a[u]=[i],T(u)&&(p[u]=a[u])):(u.value=[i],e.k&&(a[e.k]=u.value))}else M?(a[u]=o,T(u)&&(p[u]=o)):F&&(u.value=o,e.k&&(a[e.k]=o))};o?(Y.id=-1,le(Y,s)):Y()}}}qt().requestIdleCallback;qt().cancelIdleCallback;const _t=e=>!!e.type.__asyncLoader,er=e=>e.type.__isKeepAlive;function Ti(e,t){tr(e,"a",t)}function Ci(e,t){tr(e,"da",t)}function tr(e,t,s=te){const n=e.__wdc||(e.__wdc=()=>{let r=s;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Gt(t,n,s),s){let r=s.parent;for(;r&&r.parent;)er(r.parent.vnode)&&Ei(n,t,s,r),r=r.parent}}function Ei(e,t,s,n){const r=Gt(t,e,n,!0);js(()=>{Ts(n[t],r)},s)}function Gt(e,t,s=te,n=!1){if(s){const r=s[e]||(s[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ee();const c=Ct(s),u=Se(t,s,e,o);return c(),Oe(),u});return n?r.unshift(i):r.push(i),i}}const Ae=e=>(t,s=te)=>{(!wt||e==="sp")&&Gt(e,(...n)=>t(...n),s)},Oi=Ae("bm"),sr=Ae("m"),Ai=Ae("bu"),Pi=Ae("u"),Ri=Ae("bum"),js=Ae("um"),Ii=Ae("sp"),Mi=Ae("rtg"),Fi=Ae("rtc");function Di(e,t=te){Gt("ec",e,t)}const Hi=Symbol.for("v-ndc"),_s=e=>e?Tr(e)?Ks(e):_s(e.parent):null,mt=se(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>_s(e.parent),$root:e=>_s(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>rr(e),$forceUpdate:e=>e.f||(e.f=()=>{$s(e.update)}),$nextTick:e=>e.n||(e.n=bi.bind(e.proxy)),$watch:e=>no.bind(e)}),rs=(e,t)=>e!==W&&!e.__isScriptSetup&&H(e,t),Ni={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:r,props:i,accessCache:o,type:c,appContext:u}=e;let h;if(t[0]!=="$"){const T=o[t];if(T!==void 0)switch(T){case 1:return n[t];case 2:return r[t];case 4:return s[t];case 3:return i[t]}else{if(rs(n,t))return o[t]=1,n[t];if(r!==W&&H(r,t))return o[t]=2,r[t];if((h=e.propsOptions[0])&&H(h,t))return o[t]=3,i[t];if(s!==W&&H(s,t))return o[t]=4,s[t];ms&&(o[t]=0)}}const a=mt[t];let p,w;if(a)return t==="$attrs"&&z(e.attrs,"get",""),a(e);if((p=c.__cssModules)&&(p=p[t]))return p;if(s!==W&&H(s,t))return o[t]=4,s[t];if(w=u.config.globalProperties,H(w,t))return w[t]},set({_:e},t,s){const{data:n,setupState:r,ctx:i}=e;return rs(r,t)?(r[t]=s,!0):n!==W&&H(n,t)?(n[t]=s,!0):H(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:r,propsOptions:i}},o){let c;return!!s[o]||e!==W&&H(e,o)||rs(t,o)||(c=i[0])&&H(c,o)||H(n,o)||H(mt,o)||H(r.config.globalProperties,o)},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:H(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function ks(e){return P(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let ms=!0;function $i(e){const t=rr(e),s=e.proxy,n=e.ctx;ms=!1,t.beforeCreate&&en(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:c,provide:u,inject:h,created:a,beforeMount:p,mounted:w,beforeUpdate:T,updated:M,activated:F,deactivated:Y,beforeDestroy:$,beforeUnmount:K,destroyed:V,unmounted:O,render:J,renderTracked:Pe,renderTriggered:ae,errorCaptured:Re,serverPrefetch:Et,expose:Le,inheritAttrs:st,components:Ot,directives:At,filters:Xt}=t;if(h&&Li(h,n,null),o)for(const B in o){const L=o[B];R(L)&&(n[B]=L.bind(s))}if(r){const B=r.call(s,s);q(B)&&(e.data=Ds(B))}if(ms=!0,i)for(const B in i){const L=i[B],je=R(L)?L.bind(s,s):R(L.get)?L.get.bind(s,s):ye,Pt=!R(L)&&R(L.set)?L.set.bind(s):ye,Ue=Oo({get:je,set:Pt});Object.defineProperty(n,B,{enumerable:!0,configurable:!0,get:()=>Ue.value,set:de=>Ue.value=de})}if(c)for(const B in c)nr(c[B],n,s,B);if(u){const B=R(u)?u.call(s):u;Reflect.ownKeys(B).forEach(L=>{Vi(L,B[L])})}a&&en(a,e,"c");function Z(B,L){P(L)?L.forEach(je=>B(je.bind(s))):L&&B(L.bind(s))}if(Z(Oi,p),Z(sr,w),Z(Ai,T),Z(Pi,M),Z(Ti,F),Z(Ci,Y),Z(Di,Re),Z(Fi,Pe),Z(Mi,ae),Z(Ri,K),Z(js,O),Z(Ii,Et),P(Le))if(Le.length){const B=e.exposed||(e.exposed={});Le.forEach(L=>{Object.defineProperty(B,L,{get:()=>s[L],set:je=>s[L]=je})})}else e.exposed||(e.exposed={});J&&e.render===ye&&(e.render=J),st!=null&&(e.inheritAttrs=st),Ot&&(e.components=Ot),At&&(e.directives=At),Et&&kn(e)}function Li(e,t,s=ye){P(e)&&(e=bs(e));for(const n in e){const r=e[n];let i;q(r)?"default"in r?i=Dt(r.from||n,r.default,!0):i=Dt(r.from||n):i=Dt(r),X(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[n]=i}}function en(e,t,s){Se(P(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function nr(e,t,s,n){let r=n.includes(".")?mr(s,n):()=>s[n];if(G(e)){const i=t[e];R(i)&&os(r,i)}else if(R(e))os(r,e.bind(s));else if(q(e))if(P(e))e.forEach(i=>nr(i,t,s,n));else{const i=R(e.handler)?e.handler.bind(s):t[e.handler];R(i)&&os(r,i,e)}}function rr(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,c=i.get(t);let u;return c?u=c:!r.length&&!s&&!n?u=t:(u={},r.length&&r.forEach(h=>Ut(u,h,o,!0)),Ut(u,t,o)),q(t)&&i.set(t,u),u}function Ut(e,t,s,n=!1){const{mixins:r,extends:i}=t;i&&Ut(e,i,s,!0),r&&r.forEach(o=>Ut(e,o,s,!0));for(const o in t)if(!(n&&o==="expose")){const c=ji[o]||s&&s[o];e[o]=c?c(e[o],t[o]):t[o]}return e}const ji={data:tn,props:sn,emits:sn,methods:ut,computed:ut,beforeCreate:Q,created:Q,beforeMount:Q,mounted:Q,beforeUpdate:Q,updated:Q,beforeDestroy:Q,beforeUnmount:Q,destroyed:Q,unmounted:Q,activated:Q,deactivated:Q,errorCaptured:Q,serverPrefetch:Q,components:ut,directives:ut,watch:Wi,provide:tn,inject:Ui};function tn(e,t){return t?e?function(){return se(R(e)?e.call(this,this):e,R(t)?t.call(this,this):t)}:t:e}function Ui(e,t){return ut(bs(e),bs(t))}function bs(e){if(P(e)){const t={};for(let s=0;s<e.length;s++)t[e[s]]=e[s];return t}return e}function Q(e,t){return e?[...new Set([].concat(e,t))]:t}function ut(e,t){return e?se(Object.create(null),e,t):t}function sn(e,t){return e?P(e)&&P(t)?[...new Set([...e,...t])]:se(Object.create(null),ks(e),ks(t??{})):t}function Wi(e,t){if(!e)return t;if(!t)return e;const s=se(Object.create(null),e);for(const n in t)s[n]=Q(e[n],t[n]);return s}function ir(){return{app:null,config:{isNativeTag:Rr,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Bi=0;function Ki(e,t){return function(n,r=null){R(n)||(n=se({},n)),r!=null&&!q(r)&&(r=null);const i=ir(),o=new WeakSet,c=[];let u=!1;const h=i.app={_uid:Bi++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:Ao,get config(){return i.config},set config(a){},use(a,...p){return o.has(a)||(a&&R(a.install)?(o.add(a),a.install(h,...p)):R(a)&&(o.add(a),a(h,...p))),h},mixin(a){return i.mixins.includes(a)||i.mixins.push(a),h},component(a,p){return p?(i.components[a]=p,h):i.components[a]},directive(a,p){return p?(i.directives[a]=p,h):i.directives[a]},mount(a,p,w){if(!u){const T=h._ceVNode||He(n,r);return T.appContext=i,w===!0?w="svg":w===!1&&(w=void 0),e(T,a,w),u=!0,h._container=a,a.__vue_app__=h,Ks(T.component)}},onUnmount(a){c.push(a)},unmount(){u&&(Se(c,h._instance,16),e(null,h._container),delete h._container.__vue_app__)},provide(a,p){return i.provides[a]=p,h},runWithContext(a){const p=ke;ke=h;try{return a()}finally{ke=p}}};return h}}let ke=null;function Vi(e,t){if(te){let s=te.provides;const n=te.parent&&te.parent.provides;n===s&&(s=te.provides=Object.create(n)),s[e]=t}}function Dt(e,t,s=!1){const n=te||xe;if(n||ke){let r=ke?ke._context.provides:n?n.parent==null||n.ce?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides:void 0;if(r&&e in r)return r[e];if(arguments.length>1)return s&&R(t)?t.call(n&&n.proxy):t}}const or={},lr=()=>Object.create(or),cr=e=>Object.getPrototypeOf(e)===or;function qi(e,t,s,n=!1){const r={},i=lr();e.propsDefaults=Object.create(null),fr(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);s?e.props=n?r:ci(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Ji(e,t,s,n){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,c=D(r),[u]=e.propsOptions;let h=!1;if((n||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let p=0;p<a.length;p++){let w=a[p];if(Yt(e.emitsOptions,w))continue;const T=t[w];if(u)if(H(i,w))T!==i[w]&&(i[w]=T,h=!0);else{const M=Ne(w);r[M]=vs(u,c,M,T,e,!1)}else T!==i[w]&&(i[w]=T,h=!0)}}}else{fr(e,t,r,i)&&(h=!0);let a;for(const p in c)(!t||!H(t,p)&&((a=Ge(p))===p||!H(t,a)))&&(u?s&&(s[p]!==void 0||s[a]!==void 0)&&(r[p]=vs(u,c,p,void 0,e,!0)):delete r[p]);if(i!==c)for(const p in i)(!t||!H(t,p))&&(delete i[p],h=!0)}h&&Ce(e.attrs,"set","")}function fr(e,t,s,n){const[r,i]=e.propsOptions;let o=!1,c;if(t)for(let u in t){if(at(u))continue;const h=t[u];let a;r&&H(r,a=Ne(u))?!i||!i.includes(a)?s[a]=h:(c||(c={}))[a]=h:Yt(e.emitsOptions,u)||(!(u in n)||h!==n[u])&&(n[u]=h,o=!0)}if(i){const u=D(s),h=c||W;for(let a=0;a<i.length;a++){const p=i[a];s[p]=vs(r,u,p,h[p],e,!H(h,p))}}return o}function vs(e,t,s,n,r,i){const o=e[s];if(o!=null){const c=H(o,"default");if(c&&n===void 0){const u=o.default;if(o.type!==Function&&!o.skipFactory&&R(u)){const{propsDefaults:h}=r;if(s in h)n=h[s];else{const a=Ct(r);n=h[s]=u.call(null,t),a()}}else n=u;r.ce&&r.ce._setProp(s,n)}o[0]&&(i&&!c?n=!1:o[1]&&(n===""||n===Ge(s))&&(n=!0))}return n}const Gi=new WeakMap;function ur(e,t,s=!1){const n=s?Gi:t.propsCache,r=n.get(e);if(r)return r;const i=e.props,o={},c=[];let u=!1;if(!R(e)){const a=p=>{u=!0;const[w,T]=ur(p,t,!0);se(o,w),T&&c.push(...T)};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!u)return q(e)&&n.set(e,Xe),Xe;if(P(i))for(let a=0;a<i.length;a++){const p=Ne(i[a]);nn(p)&&(o[p]=W)}else if(i)for(const a in i){const p=Ne(a);if(nn(p)){const w=i[a],T=o[p]=P(w)||R(w)?{type:w}:se({},w),M=T.type;let F=!1,Y=!0;if(P(M))for(let $=0;$<M.length;++$){const K=M[$],V=R(K)&&K.name;if(V==="Boolean"){F=!0;break}else V==="String"&&(Y=!1)}else F=R(M)&&M.name==="Boolean";T[0]=F,T[1]=Y,(F||H(T,"default"))&&c.push(p)}}const h=[o,c];return q(e)&&n.set(e,h),h}function nn(e){return e[0]!=="$"&&!at(e)}const Us=e=>e[0]==="_"||e==="$stable",Ws=e=>P(e)?e.map(ve):[ve(e)],Yi=(e,t,s)=>{if(t._n)return t;const n=yi((...r)=>Ws(t(...r)),s);return n._c=!1,n},ar=(e,t,s)=>{const n=e._ctx;for(const r in e){if(Us(r))continue;const i=e[r];if(R(i))t[r]=Yi(r,i,n);else if(i!=null){const o=Ws(i);t[r]=()=>o}}},dr=(e,t)=>{const s=Ws(t);e.slots.default=()=>s},hr=(e,t,s)=>{for(const n in t)(s||!Us(n))&&(e[n]=t[n])},zi=(e,t,s)=>{const n=e.slots=lr();if(e.vnode.shapeFlag&32){const r=t.__;r&&us(n,"__",r,!0);const i=t._;i?(hr(n,t,s),s&&us(n,"_",i,!0)):ar(t,n)}else t&&dr(e,t)},Xi=(e,t,s)=>{const{vnode:n,slots:r}=e;let i=!0,o=W;if(n.shapeFlag&32){const c=t._;c?s&&c===1?i=!1:hr(r,t,s):(i=!t.$stable,ar(t,r)),o=t}else t&&(dr(e,t),o={default:1});if(i)for(const c in r)!Us(c)&&o[c]==null&&delete r[c]},le=uo;function Zi(e){return Qi(e)}function Qi(e,t){const s=qt();s.__VUE__=!0;const{insert:n,remove:r,patchProp:i,createElement:o,createText:c,createComment:u,setText:h,setElementText:a,parentNode:p,nextSibling:w,setScopeId:T=ye,insertStaticContent:M}=e,F=(l,f,d,m=null,g=null,_=null,y=void 0,x=null,v=!!f.dynamicChildren)=>{if(l===f)return;l&&!ct(l,f)&&(m=Rt(l),de(l,g,_,!0),l=null),f.patchFlag===-2&&(v=!1,f.dynamicChildren=null);const{type:b,ref:E,shapeFlag:S}=f;switch(b){case zt:Y(l,f,d,m);break;case et:$(l,f,d,m);break;case ls:l==null&&K(f,d,m,y);break;case be:Ot(l,f,d,m,g,_,y,x,v);break;default:S&1?J(l,f,d,m,g,_,y,x,v):S&6?At(l,f,d,m,g,_,y,x,v):(S&64||S&128)&&b.process(l,f,d,m,g,_,y,x,v,rt)}E!=null&&g?gt(E,l&&l.ref,_,f||l,!f):E==null&&l&&l.ref!=null&&gt(l.ref,null,_,l,!0)},Y=(l,f,d,m)=>{if(l==null)n(f.el=c(f.children),d,m);else{const g=f.el=l.el;f.children!==l.children&&h(g,f.children)}},$=(l,f,d,m)=>{l==null?n(f.el=u(f.children||""),d,m):f.el=l.el},K=(l,f,d,m)=>{[l.el,l.anchor]=M(l.children,f,d,m,l.el,l.anchor)},V=({el:l,anchor:f},d,m)=>{let g;for(;l&&l!==f;)g=w(l),n(l,d,m),l=g;n(f,d,m)},O=({el:l,anchor:f})=>{let d;for(;l&&l!==f;)d=w(l),r(l),l=d;r(f)},J=(l,f,d,m,g,_,y,x,v)=>{f.type==="svg"?y="svg":f.type==="math"&&(y="mathml"),l==null?Pe(f,d,m,g,_,y,x,v):Et(l,f,g,_,y,x,v)},Pe=(l,f,d,m,g,_,y,x)=>{let v,b;const{props:E,shapeFlag:S,transition:C,dirs:A}=l;if(v=l.el=o(l.type,_,E&&E.is,E),S&8?a(v,l.children):S&16&&Re(l.children,v,null,m,g,is(l,_),y,x),A&&We(l,null,m,"created"),ae(v,l,l.scopeId,y,m),E){for(const j in E)j!=="value"&&!at(j)&&i(v,j,null,E[j],_,m);"value"in E&&i(v,"value",null,E.value,_),(b=E.onVnodeBeforeMount)&&_e(b,m,l)}A&&We(l,null,m,"beforeMount");const I=ki(g,C);I&&C.beforeEnter(v),n(v,f,d),((b=E&&E.onVnodeMounted)||I||A)&&le(()=>{b&&_e(b,m,l),I&&C.enter(v),A&&We(l,null,m,"mounted")},g)},ae=(l,f,d,m,g)=>{if(d&&T(l,d),m)for(let _=0;_<m.length;_++)T(l,m[_]);if(g){let _=g.subTree;if(f===_||vr(_.type)&&(_.ssContent===f||_.ssFallback===f)){const y=g.vnode;ae(l,y,y.scopeId,y.slotScopeIds,g.parent)}}},Re=(l,f,d,m,g,_,y,x,v=0)=>{for(let b=v;b<l.length;b++){const E=l[b]=x?Me(l[b]):ve(l[b]);F(null,E,f,d,m,g,_,y,x)}},Et=(l,f,d,m,g,_,y)=>{const x=f.el=l.el;let{patchFlag:v,dynamicChildren:b,dirs:E}=f;v|=l.patchFlag&16;const S=l.props||W,C=f.props||W;let A;if(d&&Be(d,!1),(A=C.onVnodeBeforeUpdate)&&_e(A,d,f,l),E&&We(f,l,d,"beforeUpdate"),d&&Be(d,!0),(S.innerHTML&&C.innerHTML==null||S.textContent&&C.textContent==null)&&a(x,""),b?Le(l.dynamicChildren,b,x,d,m,is(f,g),_):y||L(l,f,x,null,d,m,is(f,g),_,!1),v>0){if(v&16)st(x,S,C,d,g);else if(v&2&&S.class!==C.class&&i(x,"class",null,C.class,g),v&4&&i(x,"style",S.style,C.style,g),v&8){const I=f.dynamicProps;for(let j=0;j<I.length;j++){const N=I[j],ne=S[N],re=C[N];(re!==ne||N==="value")&&i(x,N,ne,re,g,d)}}v&1&&l.children!==f.children&&a(x,f.children)}else!y&&b==null&&st(x,S,C,d,g);((A=C.onVnodeUpdated)||E)&&le(()=>{A&&_e(A,d,f,l),E&&We(f,l,d,"updated")},m)},Le=(l,f,d,m,g,_,y)=>{for(let x=0;x<f.length;x++){const v=l[x],b=f[x],E=v.el&&(v.type===be||!ct(v,b)||v.shapeFlag&198)?p(v.el):d;F(v,b,E,null,m,g,_,y,!0)}},st=(l,f,d,m,g)=>{if(f!==d){if(f!==W)for(const _ in f)!at(_)&&!(_ in d)&&i(l,_,f[_],null,g,m);for(const _ in d){if(at(_))continue;const y=d[_],x=f[_];y!==x&&_!=="value"&&i(l,_,x,y,g,m)}"value"in d&&i(l,"value",f.value,d.value,g)}},Ot=(l,f,d,m,g,_,y,x,v)=>{const b=f.el=l?l.el:c(""),E=f.anchor=l?l.anchor:c("");let{patchFlag:S,dynamicChildren:C,slotScopeIds:A}=f;A&&(x=x?x.concat(A):A),l==null?(n(b,d,m),n(E,d,m),Re(f.children||[],d,E,g,_,y,x,v)):S>0&&S&64&&C&&l.dynamicChildren?(Le(l.dynamicChildren,C,d,g,_,y,x),(f.key!=null||g&&f===g.subTree)&&pr(l,f,!0)):L(l,f,d,E,g,_,y,x,v)},At=(l,f,d,m,g,_,y,x,v)=>{f.slotScopeIds=x,l==null?f.shapeFlag&512?g.ctx.activate(f,d,m,y,v):Xt(f,d,m,g,_,y,v):Vs(l,f,v)},Xt=(l,f,d,m,g,_,y)=>{const x=l.component=yo(l,m,g);if(er(l)&&(x.ctx.renderer=rt),So(x,!1,y),x.asyncDep){if(g&&g.registerDep(x,Z,y),!l.el){const v=x.subTree=He(et);$(null,v,f,d)}}else Z(x,l,f,d,g,_,y)},Vs=(l,f,d)=>{const m=f.component=l.component;if(co(l,f,d))if(m.asyncDep&&!m.asyncResolved){B(m,f,d);return}else m.next=f,m.update();else f.el=l.el,m.vnode=f},Z=(l,f,d,m,g,_,y)=>{const x=()=>{if(l.isMounted){let{next:S,bu:C,u:A,parent:I,vnode:j}=l;{const pe=gr(l);if(pe){S&&(S.el=j.el,B(l,S,y)),pe.asyncDep.then(()=>{l.isUnmounted||x()});return}}let N=S,ne;Be(l,!1),S?(S.el=j.el,B(l,S,y)):S=j,C&&kt(C),(ne=S.props&&S.props.onVnodeBeforeUpdate)&&_e(ne,I,S,j),Be(l,!0);const re=on(l),he=l.subTree;l.subTree=re,F(he,re,p(he.el),Rt(he),l,g,_),S.el=re.el,N===null&&fo(l,re.el),A&&le(A,g),(ne=S.props&&S.props.onVnodeUpdated)&&le(()=>_e(ne,I,S,j),g)}else{let S;const{el:C,props:A}=f,{bm:I,m:j,parent:N,root:ne,type:re}=l,he=_t(f);Be(l,!1),I&&kt(I),!he&&(S=A&&A.onVnodeBeforeMount)&&_e(S,N,f),Be(l,!0);{ne.ce&&ne.ce._def.shadowRoot!==!1&&ne.ce._injectChildStyle(re);const pe=l.subTree=on(l);F(null,pe,d,m,l,g,_),f.el=pe.el}if(j&&le(j,g),!he&&(S=A&&A.onVnodeMounted)){const pe=f;le(()=>_e(S,N,pe),g)}(f.shapeFlag&256||N&&_t(N.vnode)&&N.vnode.shapeFlag&256)&&l.a&&le(l.a,g),l.isMounted=!0,f=d=m=null}};l.scope.on();const v=l.effect=new In(x);l.scope.off();const b=l.update=v.run.bind(v),E=l.job=v.runIfDirty.bind(v);E.i=l,E.id=l.uid,v.scheduler=()=>$s(E),Be(l,!0),b()},B=(l,f,d)=>{f.component=l;const m=l.vnode.props;l.vnode=f,l.next=null,Ji(l,f.props,m,d),Xi(l,f.children,d),Ee(),Qs(l),Oe()},L=(l,f,d,m,g,_,y,x,v=!1)=>{const b=l&&l.children,E=l?l.shapeFlag:0,S=f.children,{patchFlag:C,shapeFlag:A}=f;if(C>0){if(C&128){Pt(b,S,d,m,g,_,y,x,v);return}else if(C&256){je(b,S,d,m,g,_,y,x,v);return}}A&8?(E&16&&nt(b,g,_),S!==b&&a(d,S)):E&16?A&16?Pt(b,S,d,m,g,_,y,x,v):nt(b,g,_,!0):(E&8&&a(d,""),A&16&&Re(S,d,m,g,_,y,x,v))},je=(l,f,d,m,g,_,y,x,v)=>{l=l||Xe,f=f||Xe;const b=l.length,E=f.length,S=Math.min(b,E);let C;for(C=0;C<S;C++){const A=f[C]=v?Me(f[C]):ve(f[C]);F(l[C],A,d,null,g,_,y,x,v)}b>E?nt(l,g,_,!0,!1,S):Re(f,d,m,g,_,y,x,v,S)},Pt=(l,f,d,m,g,_,y,x,v)=>{let b=0;const E=f.length;let S=l.length-1,C=E-1;for(;b<=S&&b<=C;){const A=l[b],I=f[b]=v?Me(f[b]):ve(f[b]);if(ct(A,I))F(A,I,d,null,g,_,y,x,v);else break;b++}for(;b<=S&&b<=C;){const A=l[S],I=f[C]=v?Me(f[C]):ve(f[C]);if(ct(A,I))F(A,I,d,null,g,_,y,x,v);else break;S--,C--}if(b>S){if(b<=C){const A=C+1,I=A<E?f[A].el:m;for(;b<=C;)F(null,f[b]=v?Me(f[b]):ve(f[b]),d,I,g,_,y,x,v),b++}}else if(b>C)for(;b<=S;)de(l[b],g,_,!0),b++;else{const A=b,I=b,j=new Map;for(b=I;b<=C;b++){const oe=f[b]=v?Me(f[b]):ve(f[b]);oe.key!=null&&j.set(oe.key,b)}let N,ne=0;const re=C-I+1;let he=!1,pe=0;const it=new Array(re);for(b=0;b<re;b++)it[b]=0;for(b=A;b<=S;b++){const oe=l[b];if(ne>=re){de(oe,g,_,!0);continue}let ge;if(oe.key!=null)ge=j.get(oe.key);else for(N=I;N<=C;N++)if(it[N-I]===0&&ct(oe,f[N])){ge=N;break}ge===void 0?de(oe,g,_,!0):(it[ge-I]=b+1,ge>=pe?pe=ge:he=!0,F(oe,f[ge],d,null,g,_,y,x,v),ne++)}const Gs=he?eo(it):Xe;for(N=Gs.length-1,b=re-1;b>=0;b--){const oe=I+b,ge=f[oe],Ys=oe+1<E?f[oe+1].el:m;it[b]===0?F(null,ge,d,Ys,g,_,y,x,v):he&&(N<0||b!==Gs[N]?Ue(ge,d,Ys,2):N--)}}},Ue=(l,f,d,m,g=null)=>{const{el:_,type:y,transition:x,children:v,shapeFlag:b}=l;if(b&6){Ue(l.component.subTree,f,d,m);return}if(b&128){l.suspense.move(f,d,m);return}if(b&64){y.move(l,f,d,rt);return}if(y===be){n(_,f,d);for(let S=0;S<v.length;S++)Ue(v[S],f,d,m);n(l.anchor,f,d);return}if(y===ls){V(l,f,d);return}if(m!==2&&b&1&&x)if(m===0)x.beforeEnter(_),n(_,f,d),le(()=>x.enter(_),g);else{const{leave:S,delayLeave:C,afterLeave:A}=x,I=()=>{l.ctx.isUnmounted?r(_):n(_,f,d)},j=()=>{S(_,()=>{I(),A&&A()})};C?C(_,I,j):j()}else n(_,f,d)},de=(l,f,d,m=!1,g=!1)=>{const{type:_,props:y,ref:x,children:v,dynamicChildren:b,shapeFlag:E,patchFlag:S,dirs:C,cacheIndex:A}=l;if(S===-2&&(g=!1),x!=null&&(Ee(),gt(x,null,d,l,!0),Oe()),A!=null&&(f.renderCache[A]=void 0),E&256){f.ctx.deactivate(l);return}const I=E&1&&C,j=!_t(l);let N;if(j&&(N=y&&y.onVnodeBeforeUnmount)&&_e(N,f,l),E&6)Pr(l.component,d,m);else{if(E&128){l.suspense.unmount(d,m);return}I&&We(l,null,f,"beforeUnmount"),E&64?l.type.remove(l,f,d,rt,m):b&&!b.hasOnce&&(_!==be||S>0&&S&64)?nt(b,f,d,!1,!0):(_===be&&S&384||!g&&E&16)&&nt(v,f,d),m&&qs(l)}(j&&(N=y&&y.onVnodeUnmounted)||I)&&le(()=>{N&&_e(N,f,l),I&&We(l,null,f,"unmounted")},d)},qs=l=>{const{type:f,el:d,anchor:m,transition:g}=l;if(f===be){Ar(d,m);return}if(f===ls){O(l);return}const _=()=>{r(d),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(l.shapeFlag&1&&g&&!g.persisted){const{leave:y,delayLeave:x}=g,v=()=>y(d,_);x?x(l.el,_,v):v()}else _()},Ar=(l,f)=>{let d;for(;l!==f;)d=w(l),r(l),l=d;r(f)},Pr=(l,f,d)=>{const{bum:m,scope:g,job:_,subTree:y,um:x,m:v,a:b,parent:E,slots:{__:S}}=l;rn(v),rn(b),m&&kt(m),E&&P(S)&&S.forEach(C=>{E.renderCache[C]=void 0}),g.stop(),_&&(_.flags|=8,de(y,l,f,d)),x&&le(x,f),le(()=>{l.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&l.asyncDep&&!l.asyncResolved&&l.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},nt=(l,f,d,m=!1,g=!1,_=0)=>{for(let y=_;y<l.length;y++)de(l[y],f,d,m,g)},Rt=l=>{if(l.shapeFlag&6)return Rt(l.component.subTree);if(l.shapeFlag&128)return l.suspense.next();const f=w(l.anchor||l.el),d=f&&f[Si];return d?w(d):f};let Zt=!1;const Js=(l,f,d)=>{l==null?f._vnode&&de(f._vnode,null,null,!0):F(f._vnode||null,l,f,null,null,null,d),f._vnode=l,Zt||(Zt=!0,Qs(),Xn(),Zt=!1)},rt={p:F,um:de,m:Ue,r:qs,mt:Xt,mc:Re,pc:L,pbc:Le,n:Rt,o:e};return{render:Js,hydrate:void 0,createApp:Ki(Js)}}function is({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Be({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ki(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function pr(e,t,s=!1){const n=e.children,r=t.children;if(P(n)&&P(r))for(let i=0;i<n.length;i++){const o=n[i];let c=r[i];c.shapeFlag&1&&!c.dynamicChildren&&((c.patchFlag<=0||c.patchFlag===32)&&(c=r[i]=Me(r[i]),c.el=o.el),!s&&c.patchFlag!==-2&&pr(o,c)),c.type===zt&&(c.el=o.el),c.type===et&&!c.el&&(c.el=o.el)}}function eo(e){const t=e.slice(),s=[0];let n,r,i,o,c;const u=e.length;for(n=0;n<u;n++){const h=e[n];if(h!==0){if(r=s[s.length-1],e[r]<h){t[n]=r,s.push(n);continue}for(i=0,o=s.length-1;i<o;)c=i+o>>1,e[s[c]]<h?i=c+1:o=c;h<e[s[i]]&&(i>0&&(t[n]=s[i-1]),s[i]=n)}}for(i=s.length,o=s[i-1];i-- >0;)s[i]=o,o=t[o];return s}function gr(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:gr(t)}function rn(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}const to=Symbol.for("v-scx"),so=()=>Dt(to);function os(e,t,s){return _r(e,t,s)}function _r(e,t,s=W){const{immediate:n,deep:r,flush:i,once:o}=s,c=se({},s),u=t&&n||!t&&i!=="post";let h;if(wt){if(i==="sync"){const T=so();h=T.__watcherHandles||(T.__watcherHandles=[])}else if(!u){const T=()=>{};return T.stop=ye,T.resume=ye,T.pause=ye,T}}const a=te;c.call=(T,M,F)=>Se(T,a,M,F);let p=!1;i==="post"?c.scheduler=T=>{le(T,a&&a.suspense)}:i!=="sync"&&(p=!0,c.scheduler=(T,M)=>{M?T():$s(T)}),c.augmentJob=T=>{t&&(T.flags|=4),p&&(T.flags|=2,a&&(T.id=a.uid,T.i=a))};const w=_i(e,t,c);return wt&&(h?h.push(w):u&&w()),w}function no(e,t,s){const n=this.proxy,r=G(e)?e.includes(".")?mr(n,e):()=>n[e]:e.bind(n,n);let i;R(t)?i=t:(i=t.handler,s=t);const o=Ct(this),c=_r(r,i.bind(n),s);return o(),c}function mr(e,t){const s=t.split(".");return()=>{let n=e;for(let r=0;r<s.length&&n;r++)n=n[s[r]];return n}}const ro=(e,t)=>t==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ne(t)}Modifiers`]||e[`${Ge(t)}Modifiers`];function io(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||W;let r=s;const i=t.startsWith("update:"),o=i&&ro(n,t.slice(7));o&&(o.trim&&(r=s.map(a=>G(a)?a.trim():a)),o.number&&(r=s.map(Hr)));let c,u=n[c=Qt(t)]||n[c=Qt(Ne(t))];!u&&i&&(u=n[c=Qt(Ge(t))]),u&&Se(u,e,6,r);const h=n[c+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,Se(h,e,6,r)}}function br(e,t,s=!1){const n=t.emitsCache,r=n.get(e);if(r!==void 0)return r;const i=e.emits;let o={},c=!1;if(!R(e)){const u=h=>{const a=br(h,t,!0);a&&(c=!0,se(o,a))};!s&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!i&&!c?(q(e)&&n.set(e,null),null):(P(i)?i.forEach(u=>o[u]=null):se(o,i),q(e)&&n.set(e,o),o)}function Yt(e,t){return!e||!Bt(t)?!1:(t=t.slice(2).replace(/Once$/,""),H(e,t[0].toLowerCase()+t.slice(1))||H(e,Ge(t))||H(e,t))}function on(e){const{type:t,vnode:s,proxy:n,withProxy:r,propsOptions:[i],slots:o,attrs:c,emit:u,render:h,renderCache:a,props:p,data:w,setupState:T,ctx:M,inheritAttrs:F}=e,Y=jt(e);let $,K;try{if(s.shapeFlag&4){const O=r||n,J=O;$=ve(h.call(J,O,a,p,T,w,M)),K=c}else{const O=t;$=ve(O.length>1?O(p,{attrs:c,slots:o,emit:u}):O(p,null)),K=t.props?c:oo(c)}}catch(O){bt.length=0,Jt(O,e,1),$=He(et)}let V=$;if(K&&F!==!1){const O=Object.keys(K),{shapeFlag:J}=V;O.length&&J&7&&(i&&O.some(ws)&&(K=lo(K,i)),V=tt(V,K,!1,!0))}return s.dirs&&(V=tt(V,null,!1,!0),V.dirs=V.dirs?V.dirs.concat(s.dirs):s.dirs),s.transition&&Ls(V,s.transition),$=V,jt(Y),$}const oo=e=>{let t;for(const s in e)(s==="class"||s==="style"||Bt(s))&&((t||(t={}))[s]=e[s]);return t},lo=(e,t)=>{const s={};for(const n in e)(!ws(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function co(e,t,s){const{props:n,children:r,component:i}=e,{props:o,children:c,patchFlag:u}=t,h=i.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&u>=0){if(u&1024)return!0;if(u&16)return n?ln(n,o,h):!!o;if(u&8){const a=t.dynamicProps;for(let p=0;p<a.length;p++){const w=a[p];if(o[w]!==n[w]&&!Yt(h,w))return!0}}}else return(r||c)&&(!c||!c.$stable)?!0:n===o?!1:n?o?ln(n,o,h):!0:!!o;return!1}function ln(e,t,s){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let r=0;r<n.length;r++){const i=n[r];if(t[i]!==e[i]&&!Yt(s,i))return!0}return!1}function fo({vnode:e,parent:t},s){for(;t;){const n=t.subTree;if(n.suspense&&n.suspense.activeBranch===e&&(n.el=e.el),n===e)(e=t.vnode).el=s,t=t.parent;else break}}const vr=e=>e.__isSuspense;function uo(e,t){t&&t.pendingBranch?P(e)?t.effects.push(...e):t.effects.push(e):xi(e)}const be=Symbol.for("v-fgt"),zt=Symbol.for("v-txt"),et=Symbol.for("v-cmt"),ls=Symbol.for("v-stc"),bt=[];let ce=null;function xr(e=!1){bt.push(ce=e?null:[])}function ao(){bt.pop(),ce=bt[bt.length-1]||null}let St=1;function cn(e,t=!1){St+=e,e<0&&ce&&t&&(ce.hasOnce=!0)}function yr(e){return e.dynamicChildren=St>0?ce||Xe:null,ao(),St>0&&ce&&ce.push(e),e}function ho(e,t,s,n,r,i){return yr(Ve(e,t,s,n,r,i,!0))}function po(e,t,s,n,r){return yr(He(e,t,s,n,r,!0))}function Sr(e){return e?e.__v_isVNode===!0:!1}function ct(e,t){return e.type===t.type&&e.key===t.key}const wr=({key:e})=>e??null,Ht=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?G(e)||X(e)||R(e)?{i:xe,r:e,k:t,f:!!s}:e:null);function Ve(e,t=null,s=null,n=0,r=null,i=e===be?0:1,o=!1,c=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&wr(t),ref:t&&Ht(t),scopeId:Qn,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:n,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:xe};return c?(Bs(u,s),i&128&&e.normalize(u)):s&&(u.shapeFlag|=G(s)?8:16),St>0&&!o&&ce&&(u.patchFlag>0||i&6)&&u.patchFlag!==32&&ce.push(u),u}const He=go;function go(e,t=null,s=null,n=0,r=null,i=!1){if((!e||e===Hi)&&(e=et),Sr(e)){const c=tt(e,t,!0);return s&&Bs(c,s),St>0&&!i&&ce&&(c.shapeFlag&6?ce[ce.indexOf(e)]=c:ce.push(c)),c.patchFlag=-2,c}if(Eo(e)&&(e=e.__vccOpts),t){t=_o(t);let{class:c,style:u}=t;c&&!G(c)&&(t.class=Os(c)),q(u)&&(Ns(u)&&!P(u)&&(u=se({},u)),t.style=Es(u))}const o=G(e)?1:vr(e)?128:wi(e)?64:q(e)?4:R(e)?2:0;return Ve(e,t,s,n,r,o,i,!0)}function _o(e){return e?Ns(e)||cr(e)?se({},e):e:null}function tt(e,t,s=!1,n=!1){const{props:r,ref:i,patchFlag:o,children:c,transition:u}=e,h=t?bo(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&wr(h),ref:t&&t.ref?s&&i?P(i)?i.concat(Ht(t)):[i,Ht(t)]:Ht(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:c,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==be?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&tt(e.ssContent),ssFallback:e.ssFallback&&tt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&n&&Ls(a,u.clone(a)),a}function mo(e=" ",t=0){return He(zt,null,e,t)}function ve(e){return e==null||typeof e=="boolean"?He(et):P(e)?He(be,null,e.slice()):Sr(e)?Me(e):He(zt,null,String(e))}function Me(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:tt(e)}function Bs(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(P(t))s=16;else if(typeof t=="object")if(n&65){const r=t.default;r&&(r._c&&(r._d=!1),Bs(e,r()),r._c&&(r._d=!0));return}else{s=32;const r=t._;!r&&!cr(t)?t._ctx=xe:r===3&&xe&&(xe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else R(t)?(t={default:t,_ctx:xe},s=32):(t=String(t),n&64?(s=16,t=[mo(t)]):s=8);e.children=t,e.shapeFlag|=s}function bo(...e){const t={};for(let s=0;s<e.length;s++){const n=e[s];for(const r in n)if(r==="class")t.class!==n.class&&(t.class=Os([t.class,n.class]));else if(r==="style")t.style=Es([t.style,n.style]);else if(Bt(r)){const i=t[r],o=n[r];o&&i!==o&&!(P(i)&&i.includes(o))&&(t[r]=i?[].concat(i,o):o)}else r!==""&&(t[r]=n[r])}return t}function _e(e,t,s,n=null){Se(e,t,7,[s,n])}const vo=ir();let xo=0;function yo(e,t,s){const n=e.type,r=(t?t.appContext:e.appContext)||vo,i={uid:xo++,vnode:e,type:n,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Br(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),ids:t?t.ids:["",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ur(n,r),emitsOptions:br(n,r),emit:null,emitted:null,propsDefaults:W,inheritAttrs:n.inheritAttrs,ctx:W,data:W,props:W,attrs:W,slots:W,refs:W,setupState:W,setupContext:null,suspense:s,suspenseId:s?s.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=io.bind(null,i),e.ce&&e.ce(i),i}let te=null,Wt,xs;{const e=qt(),t=(s,n)=>{let r;return(r=e[s])||(r=e[s]=[]),r.push(n),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Wt=t("__VUE_INSTANCE_SETTERS__",s=>te=s),xs=t("__VUE_SSR_SETTERS__",s=>wt=s)}const Ct=e=>{const t=te;return Wt(e),e.scope.on(),()=>{e.scope.off(),Wt(t)}},fn=()=>{te&&te.scope.off(),Wt(null)};function Tr(e){return e.vnode.shapeFlag&4}let wt=!1;function So(e,t=!1,s=!1){t&&xs(t);const{props:n,children:r}=e.vnode,i=Tr(e);qi(e,n,i,t),zi(e,r,s||t);const o=i?wo(e,t):void 0;return t&&xs(!1),o}function wo(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Ni);const{setup:n}=s;if(n){Ee();const r=e.setupContext=n.length>1?Co(e):null,i=Ct(e),o=Tt(n,e,0,[e.props,r]),c=Tn(o);if(Oe(),i(),(c||e.sp)&&!_t(e)&&kn(e),c){if(o.then(fn,fn),t)return o.then(u=>{un(e,u)}).catch(u=>{Jt(u,e,0)});e.asyncDep=o}else un(e,o)}else Cr(e)}function un(e,t,s){R(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:q(t)&&(e.setupState=Gn(t)),Cr(e)}function Cr(e,t,s){const n=e.type;e.render||(e.render=n.render||ye);{const r=Ct(e);Ee();try{$i(e)}finally{Oe(),r()}}}const To={get(e,t){return z(e,"get",""),e[t]}};function Co(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,To),slots:e.slots,emit:e.emit,expose:t}}function Ks(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Gn(fi(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in mt)return mt[s](e)},has(t,s){return s in t||s in mt}})):e.proxy}function Eo(e){return R(e)&&"__vccOpts"in e}const Oo=(e,t)=>pi(e,t,wt),Ao="3.5.17";/**
+* @vue/runtime-dom v3.5.17
+* (c) 2018-present Yuxi (Evan) You and Vue contributors
+* @license MIT
+**/let ys;const an=typeof window<"u"&&window.trustedTypes;if(an)try{ys=an.createPolicy("vue",{createHTML:e=>e})}catch{}const Er=ys?e=>ys.createHTML(e):e=>e,Po="http://www.w3.org/2000/svg",Ro="http://www.w3.org/1998/Math/MathML",Te=typeof document<"u"?document:null,dn=Te&&Te.createElement("template"),Io={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const r=t==="svg"?Te.createElementNS(Po,e):t==="mathml"?Te.createElementNS(Ro,e):s?Te.createElement(e,{is:s}):Te.createElement(e);return e==="select"&&n&&n.multiple!=null&&r.setAttribute("multiple",n.multiple),r},createText:e=>Te.createTextNode(e),createComment:e=>Te.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Te.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,r,i){const o=s?s.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),s),!(r===i||!(r=r.nextSibling)););else{dn.innerHTML=Er(n==="svg"?`<svg>${e}</svg>`:n==="mathml"?`<math>${e}</math>`:e);const c=dn.content;if(n==="svg"||n==="mathml"){const u=c.firstChild;for(;u.firstChild;)c.appendChild(u.firstChild);c.removeChild(u)}t.insertBefore(c,s)}return[o?o.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},Mo=Symbol("_vtc");function Fo(e,t,s){const n=e[Mo];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const hn=Symbol("_vod"),Do=Symbol("_vsh"),Ho=Symbol(""),No=/(^|;)\s*display\s*:/;function $o(e,t,s){const n=e.style,r=G(s);let i=!1;if(s&&!r){if(t)if(G(t))for(const o of t.split(";")){const c=o.slice(0,o.indexOf(":")).trim();s[c]==null&&Nt(n,c,"")}else for(const o in t)s[o]==null&&Nt(n,o,"");for(const o in s)o==="display"&&(i=!0),Nt(n,o,s[o])}else if(r){if(t!==s){const o=n[Ho];o&&(s+=";"+o),n.cssText=s,i=No.test(s)}}else t&&e.removeAttribute("style");hn in e&&(e[hn]=i?n.display:"",e[Do]&&(n.display="none"))}const pn=/\s*!important$/;function Nt(e,t,s){if(P(s))s.forEach(n=>Nt(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=Lo(e,t);pn.test(s)?e.setProperty(Ge(n),s.replace(pn,""),"important"):e[n]=s}}const gn=["Webkit","Moz","ms"],cs={};function Lo(e,t){const s=cs[t];if(s)return s;let n=Ne(t);if(n!=="filter"&&n in e)return cs[t]=n;n=On(n);for(let r=0;r<gn.length;r++){const i=gn[r]+n;if(i in e)return cs[t]=i}return t}const _n="http://www.w3.org/1999/xlink";function mn(e,t,s,n,r,i=Wr(t)){n&&t.startsWith("xlink:")?s==null?e.removeAttributeNS(_n,t.slice(6,t.length)):e.setAttributeNS(_n,t,s):s==null||i&&!An(s)?e.removeAttribute(t):e.setAttribute(t,i?"":$e(s)?String(s):s)}function bn(e,t,s,n,r){if(t==="innerHTML"||t==="textContent"){s!=null&&(e[t]=t==="innerHTML"?Er(s):s);return}const i=e.tagName;if(t==="value"&&i!=="PROGRESS"&&!i.includes("-")){const c=i==="OPTION"?e.getAttribute("value")||"":e.value,u=s==null?e.type==="checkbox"?"on":"":String(s);(c!==u||!("_value"in e))&&(e.value=u),s==null&&e.removeAttribute(t),e._value=s;return}let o=!1;if(s===""||s==null){const c=typeof e[t];c==="boolean"?s=An(s):s==null&&c==="string"?(s="",o=!0):c==="number"&&(s=0,o=!0)}try{e[t]=s}catch{}o&&e.removeAttribute(r||t)}function jo(e,t,s,n){e.addEventListener(t,s,n)}function Uo(e,t,s,n){e.removeEventListener(t,s,n)}const vn=Symbol("_vei");function Wo(e,t,s,n,r=null){const i=e[vn]||(e[vn]={}),o=i[t];if(n&&o)o.value=n;else{const[c,u]=Bo(t);if(n){const h=i[t]=qo(n,r);jo(e,c,h,u)}else o&&(Uo(e,c,o,u),i[t]=void 0)}}const xn=/(?:Once|Passive|Capture)$/;function Bo(e){let t;if(xn.test(e)){t={};let n;for(;n=e.match(xn);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[e[2]===":"?e.slice(3):Ge(e.slice(2)),t]}let fs=0;const Ko=Promise.resolve(),Vo=()=>fs||(Ko.then(()=>fs=0),fs=Date.now());function qo(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;Se(Jo(n,s.value),t,5,[n])};return s.value=e,s.attached=Vo(),s}function Jo(e,t){if(P(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>r=>!r._stopped&&n&&n(r))}else return t}const yn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Go=(e,t,s,n,r,i)=>{const o=r==="svg";t==="class"?Fo(e,n,o):t==="style"?$o(e,s,n):Bt(t)?ws(t)||Wo(e,t,s,n,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Yo(e,t,n,o))?(bn(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&mn(e,t,n,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!G(n))?bn(e,Ne(t),n,i,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),mn(e,t,n,o))};function Yo(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&yn(t)&&R(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return yn(t)&&G(s)?!1:t in e}const zo=se({patchProp:Go},Io);let Sn;function Xo(){return Sn||(Sn=Zi(zo))}const Zo=(...e)=>{const t=Xo().createApp(...e),{mount:s}=t;return t.mount=n=>{const r=ko(n);if(!r)return;const i=t._component;!R(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=s(r,!1,Qo(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t};function Qo(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ko(e){return G(e)?document.querySelector(e):e}const Or=(e,t)=>{const s=e.__vccOpts||e;for(const[n,r]of t)s[n]=r;return s},el=5,tl=3e3,sl={__name:"websocket",props:{msg:String},setup(e){lt(0);const t=lt(null),s=lt(!1),n=lt(0);let r=null;const i=lt(""),c=new URL(window.location.href).hostname,u=()=>{if(s.value||t.value&&t.value.readyState<2)return;const w=`ws://${c}:8809/socket`;t.value=new WebSocket(w),t.value.onopen=()=>{s.value=!0,n.value=0,i.value="",console.log("WebSocket 杩炴帴鎴愬姛")},t.value.onmessage=T=>{console.log("鏀跺埌娑堟伅:",T.data)},t.value.onclose=T=>{s.value=!1,console.log("WebSocket 杩炴帴鍏抽棴",T.code,T.reason),T.code!==1e3&&h()},t.value.onerror=T=>{console.error("WebSocket 閿欒:",T),t.value.close()}},h=()=>{if(n.value<0){i.value=`宸茶揪鍒版渶澶ч噸杩炴鏁�${el})锛屽仠姝㈤噸杩瀈,console.warn(i.value);return}n.value++,i.value=`灏濊瘯绗�${n.value} 娆¢噸杩�..`,console.log(i.value),r&&clearTimeout(r),r=setTimeout(()=>{u()},tl)},a=()=>{t.value&&(t.value.close(1e3,"鐢ㄦ埛涓诲姩鍏抽棴杩炴帴"),t.value=null)},p=w=>{s.value&&t.value?t.value.send(JSON.stringify(w)):console.error("鏃犳硶鍙戦�娑堟伅锛學ebSocket 鏈繛鎺�)};return sr(()=>{setTimeout(()=>{u()},1500)}),js(()=>{a(),r&&clearTimeout(r)}),(w,T)=>(xr(),ho(be,null,[Ve("h1",null,ft(Jn(c)),1),Ve("h1",null,ft(e.msg),1),Ve("h1",null,ft(s.value),1),Ve("button",{onClick:T[0]||(T[0]=M=>p("tttt"))},"send"),Ve("h1",null,ft(i.value),1)],64))}},nl=Or(sl,[["__scopeId","data-v-261f9e95"]]),rl={__name:"App",setup(e){return(t,s)=>(xr(),po(nl,{msg:"Vss"}))}},il=Or(rl,[["__scopeId","data-v-7d7410f7"]]);Zo(il).mount("#app");
diff --git a/HnSx/Build/Project/Static/assets/index-BVMtnVPg.css b/HnSx/Build/Project/Static/assets/index-BVMtnVPg.css
new file mode 100644
index 0000000..b44ebf4
--- /dev/null
+++ b/HnSx/Build/Project/Static/assets/index-BVMtnVPg.css
@@ -0,0 +1 @@
+:root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;line-height:1.5;font-weight:400;color-scheme:light dark;color:#ffffffde;background-color:#242424;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{font-weight:500;color:#646cff;text-decoration:inherit}a:hover{color:#535bf2}body{margin:0;display:flex;place-items:center;min-width:320px;min-height:100vh}h1{font-size:3.2em;line-height:1.1}button{border-radius:8px;border:1px solid transparent;padding:.6em 1.2em;font-size:1em;font-weight:500;font-family:inherit;background-color:#1a1a1a;cursor:pointer;transition:border-color .25s}button:hover{border-color:#646cff}button:focus,button:focus-visible{outline:4px auto -webkit-focus-ring-color}.card{padding:2em}#app{max-width:1280px;margin:0 auto;padding:2rem;text-align:center}@media (prefers-color-scheme: light){:root{color:#213547;background-color:#fff}a:hover{color:#747bff}button{background-color:#f9f9f9}}body{background-color:#000}.read-the-docs[data-v-261f9e95]{color:#888}.logo[data-v-7d7410f7]{height:6em;padding:1.5em;will-change:filter;transition:filter .3s}.logo[data-v-7d7410f7]:hover{filter:drop-shadow(0 0 2em #646cffaa)}.logo.vue[data-v-7d7410f7]:hover{filter:drop-shadow(0 0 2em #42b883aa)}
diff --git a/HnSx/Build/Project/Static/index.html b/HnSx/Build/Project/Static/index.html
new file mode 100644
index 0000000..6baa043
--- /dev/null
+++ b/HnSx/Build/Project/Static/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title></title>
+    <script type="module" crossorigin src="/assets/index-BH4e7Qb9.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-BVMtnVPg.css">
+  </head>
+  <body>
+    <div id="app"></div>
+  </body>
+</html>
diff --git a/HnSx/Build/Project/Static/vite.svg b/HnSx/Build/Project/Static/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/HnSx/Build/Project/Static/vite.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/VS\350\207\252\345\256\232\344\271\211\347\261\273/AutoThread.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/VS\350\207\252\345\256\232\344\271\211\347\261\273/AutoThread.cs"
new file mode 100644
index 0000000..c35ed3a
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/VS\350\207\252\345\256\232\344\271\211\347\261\273/AutoThread.cs"
@@ -0,0 +1,964 @@
+#region    [鑷畾涔夌被-VS][20250701112200484][AutoThread]
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using GZ.Modular.Redis;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+using System.Windows.Interop;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
+using System.Security.Cryptography;
+using System.Windows.Markup;
+using static System.Runtime.CompilerServices.RuntimeHelpers;
+using ServiceStack.Configuration;
+using ServiceStack;
+using static Dapper.SqlMapper;
+using System.IO;
+using System.Net.WebSockets;
+using System.Net;
+using System.Threading;
+using System.Net.Sockets;
+using NLog.Config;
+using NLog.Targets;
+using NLog;
+using ServiceStack.Messaging.Rcon;
+
+namespace GZ.Projects.HnSx
+{
+    public partial class AutoThread
+    {
+
+        private static AutoThread _instance;
+
+        // 绉佹湁鏋勯�鍑芥暟闃叉澶栭儴瀹炰緥鍖�+        private AutoThread() { }
+
+        public static AutoThread Instance
+        {
+            get
+            {
+                if (_instance == null)
+                {
+                    _instance = new AutoThread();
+                }
+                return _instance;
+            }
+        }
+
+        // 绾跨▼瀹夊叏鐨勫鎵樼紦瀛�+        private static readonly ConcurrentDictionary<string, Delegate> _methodCache = new ConcurrentDictionary<string, Delegate>();
+
+        // 鏂规硶鎵ц鍣�+        public static object InvokeMethod(object instance, string methodName, params object[] args)
+        {
+            var cacheKey = $"{instance.GetType().FullName}_{methodName}";
+
+            if (!_methodCache.TryGetValue(cacheKey, out var methodDelegate))
+            {
+                // 鑾峰彇鏂规硶淇℃伅
+                var methodInfo = instance.GetType().GetMethod(
+                    methodName,
+                    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+
+                if (methodInfo == null)
+                    throw new MissingMethodException($"Method {methodName} not found");
+
+                // 鍒涘缓濮旀墭骞剁紦瀛�+                methodDelegate = Delegate.CreateDelegate(
+                    GetDelegateType(methodInfo),
+                    instance,
+                    methodInfo);
+
+                _methodCache.TryAdd(cacheKey, methodDelegate);
+            }
+
+            // 鎵ц濮旀墭
+            return methodDelegate.DynamicInvoke(args);
+        }
+
+        // 鏍规嵁鏂规硶绛惧悕鐢熸垚瀵瑰簲鐨勫鎵樼被鍨�+        private static Type GetDelegateType(MethodInfo methodInfo)
+        {
+            var parameterTypes = methodInfo.GetParameters()
+                .Select(p => p.ParameterType)
+                .ToList();
+
+            if (methodInfo.ReturnType == typeof(void))
+            {
+                return System.Linq.Expressions.Expression.GetActionType(parameterTypes.ToArray());
+            }
+            else
+            {
+                parameterTypes.Add(methodInfo.ReturnType);
+                return System.Linq.Expressions.Expression.GetFuncType(parameterTypes.ToArray());
+            }
+        }
+
+        /// <summary>
+        /// 閰嶇疆鍒濆鍖栥�
+        /// </summary>
+        /// <param name="tag"></param>
+        /// <param name="action"></param>
+        public void ThreadSettingInit(Tag tag, Action action)
+        {
+
+        }
+        public void TaskEverythingRun()
+        {
+            var host = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
+            foreach (var ip in host.AddressList)
+            {
+                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
+                {
+                    Console.WriteLine($"ip= {ip.ToString()}");
+                    //new HttpServer(ip.ToString()).HttpServerRun();
+                    //new TcpServer(ip.ToString());
+                    //var server = new EnhancedWebSocketServer($"http://{ip.ToString()}:8809/").StartAsync();
+                    var client = new WebSocketClientWithReconnect($"ws://{ip.ToString()}:8809/socket")/*.StartAsync()*/;
+                    //Task.Run(async () =>
+                    //{
+                    client.StartAsync();
+                    Task.Run(async () =>
+                    {
+                        while (true)
+                        {
+                            for (int i = 0; i < 10000; i++)
+                            {
+                                Thread.Sleep(1000);
+                                Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")}>>>Server{i}");
+                               await client.SendAsync($"Hello Server{i}!");
+                            }
+                        }
+                    });
+                    //Task.Run(async () =>
+                    //{
+                    //    while (true)
+                    //    {
+                    //        for (int i = 60000; i < 70000; i++)
+                    //        {
+                    //            Thread.Sleep(1000);
+                    //            Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")}>>>GGG{i}");
+                    //            await client.SendAsync($"Hello GGG{i}!");
+                    //        }
+                    //    }
+                    //});
+                    //});
+                    break;
+                }
+            }
+        }
+
+
+
+    }
+    public class HttpServer
+    {
+        System.Net.HttpListener HttpSvcHost = null;
+
+        public static string _listenerPrefix = "";
+        public HttpServer(string ip)
+        {
+            _listenerPrefix = $"http://{ip}:8807/";
+        }
+        public void HttpServerRun()
+        {
+            HttpSvcHost = new System.Net.HttpListener();
+            HttpSvcHost.AuthenticationSchemes = System.Net.AuthenticationSchemes.Anonymous;
+            HttpSvcHost.Prefixes.Add(_listenerPrefix);
+            HttpSvcHost.Start();
+            HttpSvcHost.BeginGetContext(HttpSvcListenerCallback, null);
+        }
+
+        private async void HttpSvcListenerCallback(IAsyncResult ar)
+        {
+            System.Net.HttpListenerContext context = null;
+            var data = DateTime.Now;
+            string apth = "";
+            try
+            {
+                HttpSvcHost.BeginGetContext(HttpSvcListenerCallback, null);
+                context = HttpSvcHost.EndGetContext(ar);
+                System.Net.HttpListenerRequest request = context.Request;
+                System.Net.HttpListenerResponse response = context.Response;
+
+                using (var reader = new System.IO.StreamReader(request.InputStream, System.Text.Encoding.UTF8))
+                {
+                    string requestJson = reader.ReadToEnd();
+                    System.Net.HttpStatusCode statusCode = 0;
+                    apth = request.Url.AbsolutePath;
+                    string respstr = HttpSvcListenerCallback_he(request.HttpMethod, request.Url.AbsolutePath, requestJson, out statusCode);
+                    string logContent = "";
+                    logContent += $"\r\n[{request.HttpMethod}]{request.Url.AbsolutePath}";
+                    logContent += $"\r\n[request]{requestJson}";
+                    logContent += $"\r\n[response]{respstr}";
+                    _ = Task.Run(() =>
+                    {
+                        LogHelper.Info(logContent);
+                        Conn.log榛樿鏃ュ織?.Info(logContent);
+                    });
+                    byte[] bytstr = Encoding.UTF8.GetBytes(respstr);
+                    response.StatusCode = (int)statusCode;
+                    response.SendChunked = false;
+                    response.ContentLength64 = bytstr.Length;
+                    if (request.Url.AbsolutePath.ToLower().Contains(".js"))
+                        response.ContentType = "application/javascript";
+                    else if (request.Url.AbsolutePath.ToLower().Contains(".svg"))
+                        response.ContentType = "image/svg+xml";
+                    // 寮傛鍐欏叆鍝嶅簲
+                    await response.OutputStream.WriteAsync(bytstr, 0, bytstr.Length);
+                }
+            }
+            catch (Exception ex)
+            {
+                _ = Task.Run(() =>
+                {
+                    Conn.log榛樿鏃ュ織.Error(ex.ToString());
+                });
+            }
+            finally
+            {
+                context?.Response.Close();
+                Console.WriteLine(apth + "<<>>" + DateTime.Now.Subtract(data).TotalMilliseconds);
+            }
+        }
+        private System.String HttpSvcListenerCallback_he(System.String method, System.String path, System.String requestJson, out System.Net.HttpStatusCode statusCode)
+        {
+            try
+            {
+                switch (method)
+                {
+                    case "POST":
+                        {
+                            switch (path)
+                            {
+                                ///浠诲姟涓嬪彂--WMS-->WC
+                                case "/api/Wcs/sendTask":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                ///鍏ュ簱寮傚父涓婃姤銆�WCS-->WMS
+                                case "/api/Wcs/stockInException":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                ///浠诲姟鐘舵�鍙嶉  WCS-->WM
+                                case "/api/Wcs/taskFeedback":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                ///鍏ュ簱浜や簰  銆俉CS-->WMS
+                                case "/api/Wcs/stockInInteraction":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+
+                                ///浠诲姟鍙栨秷銆�WMS-->WCS
+                                case "/api/Wcs/cancelTask":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                /// 纰熺洏鏈虹敵璇蜂换鍔°�  WCS-->WMS
+                                case "/api/Wcs/palletStackerInteraction":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                ///淇敼浠诲姟浼樺厛绾�銆�WMS - WCS
+                                case "/api/Wcs/modifyTaskPriority":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                                /// 杈撻�绾夸换鍔℃帹閫併� WMS-->WCS  -- 璁板綍绠卞彿鏁版嵁锛屽垎鎷d笅绾垮悗鏍规嵁鎯冲ソ杩涘叆瀵瑰簲鐨勫尯鍩熴� 
+                                case "/api/Wcs/putConveyorTask":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+
+                                ///涓婃姤绉伴噸灏哄 - websocket .杩欓噷鍐欑潃浣滀负璁板綍 
+                                case "/api/Wcs/reportWeightinfo":
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+
+                                        return JsonConvert.SerializeObject("");
+                                    }
+                            }
+                            break;
+                        }
+                    case "GET":
+                        {
+                            switch (path)
+                            {
+                                case var _ when System.Text.RegularExpressions.Regex.IsMatch(path, @"\.(html|ico|js|css)(\?.*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase):
+                                    {
+                                        statusCode = System.Net.HttpStatusCode.OK;
+                                        // 澶嶅埗鍒癱ase 涓�+                                        //var _ when System.Text.RegularExpressions.Regex.IsMatch(path, @"\.(html|ico|js|css)(\?.*)?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
+                                        var filePath = /*Directory.GetCurrentDirectory() + "\\Static" + "\\" + path.Substring(1);*/System.IO.Path.Combine(Directory.GetCurrentDirectory() + "\\Static", path.Substring(1));
+                                        return File.ReadAllText(filePath);
+                                    }
+                            }
+                            break;
+                        }
+                }
+                statusCode = System.Net.HttpStatusCode.NotFound;
+                return "";
+            }
+            catch (Exception ex)
+            {
+                Conn.log榛樿鏃ュ織.Error(ex.ToString());
+                statusCode = System.Net.HttpStatusCode.InternalServerError;
+                return "";
+            }
+        }
+    }
+
+    class EnhancedWebSocketServer
+    {
+        private HttpListener _listener;
+        private readonly string _listenerPrefix;
+        private readonly ConcurrentDictionary<Guid, WebSocket> _connections = new ConcurrentDictionary<Guid, WebSocket>();
+        private CancellationTokenSource _cts = new CancellationTokenSource();
+
+        public EnhancedWebSocketServer(string url)
+        {
+            _listenerPrefix = url;
+        }
+
+        public async Task StartAsync()
+        {
+            try
+            {
+                _listener = new HttpListener();
+                _listener.Prefixes.Add(_listenerPrefix);
+                _listener.Start();
+                Console.WriteLine($"WebSocket鏈嶅姟鍣ㄥ凡鍚姩锛岀洃鍚�{_listenerPrefix}");
+                while (!_cts.IsCancellationRequested)
+                {
+                    HttpListenerContext context = await _listener.GetContextAsync();
+                    if (context.Request.IsWebSocketRequest)
+                    {
+                        var wsContext = await context.AcceptWebSocketAsync(null);
+                        var connectionId = Guid.NewGuid();
+                        _connections[connectionId] = wsContext.WebSocket;
+                        _ = HandleConnectionAsync(connectionId, wsContext.WebSocket, _cts.Token);
+                    }
+                    else
+                    {
+                        context.Response.StatusCode = 400;
+                        context.Response.Close();
+                    }
+                }
+            }
+            catch (Exception ex) when (ex is HttpListenerException || ex is ObjectDisposedException)
+            {
+                // 鏈嶅姟鍣ㄥ仠姝㈡椂鐨勬甯稿紓甯�+                Console.WriteLine("鏈嶅姟鍣ㄦ鍦ㄥ仠姝�..");
+            }
+        }
+
+        private async Task HandleConnectionAsync(Guid connectionId, WebSocket webSocket, CancellationToken ct)
+        {
+            var buffer = new byte[1024 * 4];
+            try
+            {
+                while (webSocket.State == WebSocketState.Open && !ct.IsCancellationRequested)
+                {
+                    var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), ct);
+
+                    if (result.MessageType == WebSocketMessageType.Close)
+                    {
+                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "瀹㈡埛绔叧闂繛鎺�, ct);
+                        break;
+                    }
+
+                    string message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
+                    Console.WriteLine($"杩炴帴 {connectionId} 鏀跺埌娑堟伅: {message}");
+
+                    // 骞挎挱娑堟伅缁欐墍鏈夊鎴风
+                    await BroadcastMessageAsync($"瀹㈡埛绔�{connectionId} 璇� {message}");
+                }
+            }
+            catch (WebSocketException ex)
+            {
+                Console.WriteLine($"杩炴帴 {connectionId} 閿欒: {ex.WebSocketErrorCode} - {ex.Message}");
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"澶勭悊杩炴帴 {connectionId} 鏃跺嚭閿� {ex.Message}");
+            }
+            finally
+            {
+                _connections.TryRemove(connectionId, out _);
+                webSocket?.Dispose();
+                Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")} 杩炴帴 {connectionId} 宸插叧闂�);
+            }
+        }
+
+        public async Task BroadcastMessageAsync(string message)
+        {
+            var buffer = System.Text.Encoding.UTF8.GetBytes(message);
+            foreach (var connection in _connections)
+            {
+                if (connection.Value.State == WebSocketState.Open)
+                {
+                    try
+                    {
+                        await connection.Value.SendAsync(
+                            new ArraySegment<byte>(buffer),
+                            WebSocketMessageType.Text,
+                            true,
+                            CancellationToken.None);
+                    }
+                    catch (Exception ex)
+                    {
+                        Console.WriteLine($"骞挎挱娑堟伅鍒拌繛鎺�{connection.Key} 澶辫触: {ex.Message}");
+                    }
+                }
+            }
+        }
+
+        public async Task StopAsync()
+        {
+            _cts.Cancel();
+
+            // 鍏抽棴鎵�湁杩炴帴
+            foreach (var connection in _connections)
+            {
+                try
+                {
+                    if (connection.Value.State == WebSocketState.Open)
+                    {
+                        await connection.Value.CloseAsync(
+                            WebSocketCloseStatus.NormalClosure,
+                            "鏈嶅姟鍣ㄥ叧闂�,
+                            CancellationToken.None);
+                    }
+                    connection.Value.Dispose();
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"鍏抽棴杩炴帴 {connection.Key} 鏃跺嚭閿� {ex.Message}");
+                }
+            }
+
+            _listener?.Stop();
+            _listener?.Close();
+            Console.WriteLine("WebSocket鏈嶅姟鍣ㄥ凡鍋滄");
+        }
+
+    }
+
+    public class WebSocketClientWithReconnect
+    {
+        private ClientWebSocket _webSocket;
+        private readonly Uri _serverUri;
+        private readonly CancellationTokenSource _cts = new CancellationTokenSource();
+        private readonly int _reconnectDelayMs;
+
+        public event Action<string> OnMessageReceived = msg => Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss.fff")}>>>Received: {msg}");
+        public event Action OnConnected = () => Console.WriteLine("Connected to server");
+        public event Action OnDisconnected = () => Console.WriteLine("Disconnected from server");
+        public event Action<Exception> OnError = ex => Console.WriteLine($"Error: {ex.Message}");
+
+        public WebSocketClientWithReconnect(string serverUrl, int reconnectDelayMs = 5000)
+        {
+            _serverUri = new Uri(serverUrl);
+            _reconnectDelayMs = reconnectDelayMs;
+        }
+
+        public async Task StartAsync()
+        {
+            while (!_cts.IsCancellationRequested)
+            {
+                try
+                {
+                    _webSocket = new ClientWebSocket();
+                    await _webSocket.ConnectAsync(_serverUri, _cts.Token);
+                    OnConnected?.Invoke();
+                    await ReceiveMessagesAsync();
+                }
+                catch (Exception ex) when (!_cts.IsCancellationRequested)
+                {
+                    OnError?.Invoke(ex);
+                    await HandleDisconnection();
+                }
+            }
+        }
+
+        private async Task ReceiveMessagesAsync()
+        {
+            var buffer = new byte[1024 * 4];
+
+            while (_webSocket.State == WebSocketState.Open && !_cts.IsCancellationRequested)
+            {
+                try
+                {
+                    var result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), _cts.Token);
+
+                    if (result.MessageType == WebSocketMessageType.Close)
+                    {
+                        await HandleDisconnection();
+                        break;
+                    }
+
+                    var message = System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count);
+                    OnMessageReceived?.Invoke(message);
+                }
+                catch (Exception ex) when (!_cts.IsCancellationRequested)
+                {
+                    OnError?.Invoke(ex);
+                    await HandleDisconnection();
+                    break;
+                }
+            }
+        }
+
+        private async Task HandleDisconnection()
+        {
+            OnDisconnected?.Invoke();
+
+            try
+            {
+                if (_webSocket != null && _webSocket.State != WebSocketState.Closed)
+                {
+                    await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
+                    _webSocket.Dispose();
+                }
+            }
+            catch { /* 蹇界暐鍏抽棴鏃剁殑寮傚父 */ }
+
+            if (!_cts.IsCancellationRequested)
+            {
+                await Task.Delay(_reconnectDelayMs, _cts.Token);
+            }
+        }
+
+        public async Task StopAsync()
+        {
+            _cts.Cancel();
+
+            try
+            {
+                if (_webSocket != null && _webSocket.State == WebSocketState.Open)
+                {
+                    await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client shutdown", CancellationToken.None);
+                }
+            }
+            finally
+            {
+                _webSocket?.Dispose();
+            }
+        }
+
+        public async Task SendAsync(string message)
+        {
+            if (_webSocket?.State != WebSocketState.Open)
+            {
+                throw new InvalidOperationException("WebSocket is not connected");
+            }
+
+            var bytes = System.Text.Encoding.UTF8.GetBytes(message);
+            await _webSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, _cts.Token);
+
+        }
+    }
+
+    public class TcpServer
+    {
+        public static Dictionary<string, string> TrayIps = new Dictionary<string, string>();
+        public TcpServer(string ip)
+        {
+            Init(ip);
+        }
+        private void Init(string ip)
+        {
+            //鍒涘缓涓�釜鏂扮殑Socket,杩欓噷鎴戜滑浣跨敤鏈�父鐢ㄧ殑鍩轰簬TCP鐨凷tream Socket锛堟祦寮忓鎺ュ瓧锛�+            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+            try
+            {
+                //灏嗚socket缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛
+                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), 2025));
+                Console.WriteLine($"TCPServer socket 鐩戝惉{ip}:{2025} ");
+                //鍚姩鐩戝惉锛屽苟涓旇缃竴涓渶澶х殑闃熷垪闀垮害
+                socket.Listen(30);
+                //寮�鎺ュ彈瀹㈡埛绔繛鎺ヨ姹�+                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message);
+            }
+        }
+        public static Dictionary<string, Socket> clients = new Dictionary<string, Socket>();
+        public static Dictionary<string, byte[]> buffers = new Dictionary<string, byte[]>();
+        public static void ClientAccepted(IAsyncResult ar)
+        {
+
+            var socket = ar.AsyncState as Socket;
+            var client = socket.EndAccept(ar);
+            string remote_ip = ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString();
+            if (clients.Keys.Contains(remote_ip))
+            {
+                clients[remote_ip] = client;
+            }
+            else
+            {
+                clients.Add(remote_ip, client);
+            }
+            if (!buffers.Keys.Contains(remote_ip))
+            {
+                buffers.Add(remote_ip, new byte[1024]);
+            }
+            //缁欏鎴风鍙戦�涓�釜娆㈣繋娑堟伅
+            //client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
+            Console.WriteLine(remote_ip);
+
+            try
+            {
+                client.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"銆愭帴鏀跺鎴风鐨勬秷鎭紓甯�銆戯細" + ex.Message);
+            }
+            //鍑嗗鎺ュ彈涓嬩竴涓鎴风璇锋眰
+            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
+        }
+
+
+        public static void ReceiveMessage(IAsyncResult ar)
+        {
+            try
+            {
+                var socket = ar.AsyncState as Socket;
+                string remote_ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
+                var length = socket.EndReceive(ar);
+                if (length == 0)
+                {
+                    clients.Remove(remote_ip);
+                    buffers.Remove(remote_ip);
+                    return;
+                }
+                else
+                {
+                    if (!clients.Keys.Contains(remote_ip))
+                    {
+                        clients.Add(remote_ip, socket);
+                    }
+                    if (!buffers.Keys.Contains(remote_ip))
+                    {
+                        buffers.Add(remote_ip, new byte[1024]);
+                    }
+                }
+                try
+                {
+                    if (buffers.Keys.Contains(remote_ip))
+                    {
+                        //璇诲彇鍑烘潵娑堟伅鍐呭
+                        var message = GetHexString(buffers[remote_ip], length);
+                        //16   10
+                        // Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss")} ---> " + remote_ip + "  :   " + message);
+                        //if (message.Substring(0, 4) == "3f00" && message.Substring(message.Length - 4) == "0d0a")
+                        //{
+                        //    //鏄剧ず娑堟伅
+                        //    //string msg = message.Replace(@"0d", "").Replace(@"0a", "").Replace(@"0d0a", "").Trim();
+                        //    //PlcHelper.Receive(remote_ip, msg);
+                        //    //Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//娓呯┖褰撳墠IP Buffer
+                        //}
+                        //else
+                        //{
+                        Console.WriteLine($"銆怲CP淇℃伅鍗忚 {DateTime.Now.Millisecond}銆戯細IP锛歿remote_ip},MSG锛歿message}");
+                        var mg = message;// Encoding.ASCII.GetString(PlcHelper.Hex2Bin(message));
+                        if (mg.Length > 10)
+                        {
+                            mg = mg.Substring(0, 10);
+                        }
+                        Console.WriteLine(mg);
+                        if (mg.StartsWith("DK"))//&& mg.Trim().Length == "DK01000024".Length
+                        {
+                            LogHelper.Info($"鎵爜鍣�>{remote_ip} -{mg}");
+                            if (TrayIps.TryGetValue(remote_ip, out string traycode))
+                            {
+                                TrayIps[remote_ip] = mg;
+                            }
+                            else TrayIps.Add(remote_ip, mg);
+
+                            RedisHelper.Add("S鎵爜鍣� + (remote_ip.Split('.').LastOrDefault()), mg, out string msg);
+                            RedisHelper.Add("S鎵爜鍣� + (remote_ip.Split('.').LastOrDefault()) + "#time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), out msg);
+                            //Console.WriteLine("TOFF");
+                            //var mst = PlcHelper.Hex2Bin("544F4646");
+                            //TcpServer.TcpServerSend(remote_ip, mst);
+                        }
+                        //}
+                    }
+                    else
+                    {
+                        if (!buffers.Keys.Contains(remote_ip))
+                        {
+                            buffers.Add(remote_ip, new byte[1024]);
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"銆愬鐞嗗鎴风鐨勬秷鎭紓甯�銆戯細" + ex.StackTrace);
+                    throw;
+                }
+                //鎺ユ敹涓嬩竴涓秷鎭�鍥犱负杩欐槸涓�釜閫掑綊鐨勮皟鐢紝鎵�互杩欐牱灏卞彲浠ヤ竴鐩存帴鏀舵秷鎭簡锛�+                socket.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.Message);
+            }
+        }
+
+        private static string GetHexString(byte[] buffer, int lenght)
+        {
+            return BitConverter.ToString(buffer, 0, lenght).Replace("-", string.Empty).ToLower();
+        }
+
+        public static bool TcpServerSend(string ip, byte[] msg)
+        {
+            LogHelper.Info($"TcpServerSend >{ip}:{msg}");
+            if (clients.Keys.Contains(ip))
+            {
+                var client = clients[ip];
+                if (client.Connected)
+                {
+                    try
+                    {
+                        client.Send(msg);
+                        LogHelper.Info($"TcpServerSend > 鍙戦�鎴愬姛銆�);
+                        return true;
+                    }
+                    catch (SocketException ex)
+                    {
+                        Console.WriteLine(ex.Message);
+                        clients[ip].Close();
+                        clients.Remove(ip);
+                    }
+                }
+                else
+                {
+                    clients[ip].Close();
+                    clients.Remove(ip);
+                }
+            }
+            else
+            {
+                Console.WriteLine("鏈壘鍒拌澶囩殑閾炬帴锛� + ip);
+            }
+            return false;
+
+        }
+
+        public static int GetBitdata(int num, int wid)
+        {
+            string bstr = Convert.ToString(num, 2);
+            if (bstr.Length <= wid)
+            {
+                return 0;
+            }
+            return bstr[bstr.Length - wid - 1] - '0';
+        }
+        public static int SetBinaryDigit(int number, int n, int value)
+        {
+            if (value != 0 && value != 1)
+                throw new ArgumentException("Value must be 0 or 1.");
+
+            string binaryStr = Convert.ToString(number, 2);
+
+            // 濡傛灉 n 瓒呭嚭褰撳墠浣嶆暟锛岃ˉ 0 鎵╁睍
+            while (binaryStr.Length <= n)
+            {
+                binaryStr = "0" + binaryStr;
+            }
+
+            // 淇敼绗�n 浣嶏紙浠庡彸寰�乏锛屾渶浣庝綅鏄 0 浣嶏級
+            char[] binaryChars = binaryStr.ToCharArray();
+            binaryChars[binaryChars.Length - 1 - n] = value == 1 ? '1' : '0';
+
+            // 杞崲鍥炲崄杩涘埗
+            return Convert.ToInt32(new string(binaryChars), 2);
+        }
+        public static List<string> GetStaticClients() => clients.Keys.ToList();
+        public static Dictionary<string, string> GetStaticScan() => TrayIps;
+    }
+
+    public class LogHelper
+    {
+        #region    [鑷畾涔夌被][20250323145442478][LogHelper]
+        public static Dictionary<string, ILogger> loggers = new Dictionary<string, ILogger>();
+
+        public static void Debug(string message, string name = "")
+        {
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name))
+            {
+                logger = loggers[name];
+            }
+            else
+            {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null)
+                {
+                    loggers.Add(name, logger);
+                }
+                else
+                {
+                    logger = LogFactory.CreateLogger("console");
+                }
+            }
+            if (logger != null)
+            {
+                logger.Debug(message);
+            }
+        }
+
+
+
+        public static void Info(string message, string name = "")
+        {
+            //logger.Info(message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name))
+            {
+                logger = loggers[name];
+            }
+            else
+            {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null)
+                {
+                    loggers.Add(name, logger);
+                }
+                else
+                {
+                    logger = LogFactory.CreateLogger("infoFile");
+                }
+            }
+            if (logger != null)
+            {
+                logger.Info(message);
+            }
+        }
+
+        public static void Error(string message, Exception ex, string name = "")
+        {
+            //logger.Error(ex, message);
+            ILogger logger = null;
+            if (loggers.Keys.Contains(name))
+            {
+                logger = loggers[name];
+            }
+            else
+            {
+                logger = LogFactory.CreateLogger(name);
+                if (logger != null && !loggers.Keys.Contains(name))
+                {
+                    loggers.Add(name, logger);
+                }
+                else
+                {
+                    logger = LogFactory.CreateLogger("errorFile");
+                }
+            }
+            if (logger != null)
+            {
+                logger.Error($"{message}{ex.StackTrace}");
+            }
+        }
+        #endregion [鑷畾涔夌被][20250323145442478][LogHelper]
+    }
+    public class LogFactory
+    {
+        #region    [鑷畾涔夌被][20250323145505759][LogFactory]
+        /// <summary>
+        /// 閫氳繃閰嶇疆鏂囦欢閰嶇疆鏃ュ織
+        /// </summary>
+        static LogFactory()
+        {
+            var loggerNames = new List<string>() { "HosttoagvTask", "HosttoagvCar", "NDC", "鏉ゥ" };
+            LogManager.Configuration = DefaultConfig(loggerNames);
+        }
+        public static ILogger CreateLogger(string name)
+        {
+            var logger = LogManager.GetLogger(name);
+            return logger;
+        }
+
+        public static LoggingConfiguration DefaultConfig(List<string> loggerNames)
+        {
+            var config = new LoggingConfiguration();
+            loggerNames.ForEach(a =>
+            {
+                var target = new FileTarget();
+                target.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+                target.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+                target.ArchiveFileName = @"${basedir}/Logs/" + a + "/{####}.txt";
+                target.FileName = @"${basedir}/Logs/" + a + "/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+                target.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+                config.AddTarget(a, target);
+                config.AddRuleForOneLevel(LogLevel.Info, target, a);
+            });
+
+
+            // 娣诲姞target-console
+            var consoleTarget = new ColoredConsoleTarget();
+            consoleTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("console", consoleTarget);
+            config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget);
+
+            //娣诲姞target-info
+            var infoFileTarget = new FileTarget();
+            infoFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            infoFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            infoFileTarget.ArchiveFileName = @"${basedir}/Logs/Info/{####}.txt";
+            infoFileTarget.FileName = @"${basedir}/Logs/Info/${shortdate}.txt";//褰撳墠鏂囦欢璺緞
+            infoFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("infoFile", infoFileTarget);
+            config.AddRuleForOneLevel(LogLevel.Info, infoFileTarget);//INFO鍐欏湪Info鏂囦欢
+
+            //娣诲姞target-err
+            var errorFileTarget = new FileTarget();
+            errorFileTarget.ArchiveAboveSize = 1024 * 1024 * 5;//姣忎釜鏂囦欢鏈�ぇ5M
+            errorFileTarget.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence;
+            errorFileTarget.ArchiveFileName = @"${basedir}/Logs/Error/{####}.txt";
+            errorFileTarget.FileName = @"${basedir}/Logs/Error/${shortdate}.txt";
+            errorFileTarget.Layout = @"${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}";
+
+            config.AddTarget("errorFile", errorFileTarget);
+            config.AddRule(LogLevel.Error, LogLevel.Fatal, errorFileTarget);
+
+
+            return config;
+        }
+
+        #endregion [鑷畾涔夌被][20250323145505759][LogFactory]
+    }
+}
+#endregion [鑷畾涔夌被-VS][20250701112200484][AutoThread]
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/ViewModel.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/ViewModel.cs"
new file mode 100644
index 0000000..e164ebc
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/ViewModel.cs"
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+	public partial class ViewModel : System.ComponentModel.INotifyPropertyChanged
+	{
+		#region 绉佹湁鍙橀噺
+		//闆嗘垚浜掕仈
+		private Conn Conn = new Conn();
+		//璁惧閫氫俊
+		private Device Device = new Device();
+		//鍙橀噺鏁版嵁搴�+		private Tag tag = new Tag();
+		public Tag Tag
+		{
+			get { return tag; }
+			set { tag = value; RaisePropertyChanged(nameof(Tag)); }
+		}
+		//绠�寲PLC
+		public EasyPLC EasyPLC = new EasyPLC();
+		#endregion
+		
+		#region 鏋勯�鍑芥暟
+		private static ViewModel _ViewModel = null;
+		private static List<object> _Windows = new List<object>();
+        public static ViewModel CreateInstance(object obj, Type type)
+        {
+            if (_ViewModel == null)
+            {
+                _ViewModel = new ViewModel();
+            }
+            if (!_Windows.Contains(obj))
+            {
+				_Windows.Add(obj);
+            }
+            return _ViewModel;
+        }
+		public ViewModel()
+		{
+			
+            Tag.Languages = new Dictionary<string, string>() 
+            {
+            };
+            Tag.Lang = "";
+		}
+		#endregion
+		
+		#region 鑷畾涔夋寚浠�+		#endregion
+	}
+}
+    
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/\347\225\214\351\235\242\344\272\213\344\273\266.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/\347\225\214\351\235\242\344\272\213\344\273\266.cs"
new file mode 100644
index 0000000..9b81730
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/\347\225\214\351\235\242\344\272\213\344\273\266.cs"
@@ -0,0 +1,308 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+	/// <summary>
+	/// 浜嬩欢
+	/// </summary>
+	public partial class ViewModel : System.ComponentModel.INotifyPropertyChanged
+	{
+        bool IsExitApp = false;
+        ConcurrentStack<int> ExitJudgeStack = new ConcurrentStack<int>();
+		System.Net.HttpListener HttpSvcHost = null;
+	
+		#region View1浜嬩欢
+		/// <summary>
+        /// View1鎵撳紑浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		public void View1_LoadEvent(object sender, RoutedEventArgs e)
+		{
+	
+			try
+			{
+				//HttpSvcHost = new System.Net.HttpListener();
+				//HttpSvcHost.AuthenticationSchemes = System.Net.AuthenticationSchemes.Anonymous;
+				//HttpSvcHost.Prefixes.Add("http://127.0.0.1:8808/");
+				//HttpSvcHost.Start();
+				//HttpSvcHost.BeginGetContext(HttpSvcListenerCallback, null);
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			View1_Init(sender, e);
+		
+			try
+			{
+				#region    [鑴氭湰][20250701110610426][涓氬姟閫昏緫.Program1]
+				AutoThread.InvokeMethod(AutoThread.Instance, "TaskEverythingRun");
+				#endregion [鑴氭湰][20250701110610426][涓氬姟閫昏緫.Program1]
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+			}	
+			/// <summary>
+			/// 绋嬪簭鐗囨:Program2
+			/// 鎻忚堪:
+			/// </summary>
+			System.Threading.Tasks.Task.Factory.StartNew(() =>
+			{
+				System.Threading.Thread.CurrentThread.IsBackground = true;
+				ExitJudgeStack.Push(0);
+			//涓�洿鎵ц锛岀洿鍒版弧瓒崇粨鏉熸潯浠�+			while(true)
+			{
+				if (IsExitApp) { break; }
+			try
+			{
+				#region    [鑴氭湰][20250704090126015][涓氬姟閫昏緫.Program2]
+				AutoThread.InvokeMethod(AutoThread.Instance, "ThreadSettingInit", new object[] { tag });
+				#endregion [鑴氭湰][20250704090126015][涓氬姟閫昏緫.Program2]
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+				System.Threading.Thread.Sleep(10000);
+			}	
+			}
+				ExitJudgeStack.TryPop(out int exitJudgeVal);
+});
+	
+		}
+		/// <summary>
+        /// View1鍏抽棴浜嬩欢
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		public void View1_CloseEvent(object sender, System.ComponentModel.CancelEventArgs e)
+		{
+		
+			try
+			{
+                System.Threading.Tasks.Task.Factory.StartNew(() => { MessageBox.Show("绋嬪簭姝e湪鍏抽棴锛岃绛夊緟..."); });
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			try
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][Start]鍏抽棴Http鏈嶅姟");
+				if(HttpSvcHost!=null)
+				{
+					HttpSvcHost.Stop();
+				}
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][End]鍏抽棴Http鏈嶅姟");
+			}
+
+			try
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][Start]鍒ゆ柇涓氬姟澶勭悊鐘舵�");
+				IsExitApp = true;
+				//int exitCnt = 0;
+				while 
+				(
+					ExitJudgeStack.Count > 0
+				)
+				{
+					System.Threading.Thread.Sleep(100);
+					//++exitCnt;
+					//10绉掓湭缁撴潫鍒欏己鍒跺叧闂�+					//if (exitCnt >= 100)
+					//{
+					//	break;
+					//}
+				}
+			}
+			catch (Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][End]鍒ゆ柇涓氬姟澶勭悊鐘舵�");
+			}
+			
+            e.Cancel = true;
+			System.Threading.Tasks.Task.Factory.StartNew(() =>
+			{
+						try
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][Start]鍏抽棴PLC");
+				Device.PLC1?.Stop();
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][End]鍏抽棴PLC");
+			}
+			try
+			{
+			
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][Start]鍒ゆ柇PLC鐘舵�");
+				//int exitCnt = 0;
+				while 
+				(
+					false
+					|| (Device.PLC1 == null ? false : Device.PLC1.State != GZ.Device.PLC.PlcRunState.Stoped)
+				)
+				{
+					System.Threading.Thread.Sleep(1000);
+					//++exitCnt;
+					//10绉掓湭缁撴潫鍒欏己鍒跺叧闂�+					//if (exitCnt >= 100)
+					//{
+					//	break;
+					//}
+				}
+			}
+			catch (Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+			finally
+			{
+				Conn.log榛樿鏃ュ織.Debug("[鍏抽棴澶勭悊][End]鍒ゆ柇PLC鐘舵�");
+			}
+			Application.Current.Dispatcher.Invoke(() => { Environment.Exit(0); });
+			});
+	
+			//System.Windows.Application.Current.Shutdown();
+		}
+		/// <summary>
+        /// View1鍒濆鍖�+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+		public void View1_Init(object sender, RoutedEventArgs e)
+		{
+		}
+		#endregion
+		
+		#region 鍒囨崲tab椤�+		public void tab_SelectionChanged(object sender, EventArgs e)
+		{
+			//TabItem ti = (sender as TabControl).SelectedItem as TabItem;
+			//MessageBox.Show(ti.Name);
+		}
+		#endregion
+		
+		#region Http鏈嶅姟鐩戝惉
+		private void HttpSvcListenerCallback(IAsyncResult ar)
+		{
+			try
+			{
+				HttpSvcHost.BeginGetContext(HttpSvcListenerCallback, null);
+				System.Net.HttpListenerContext context = HttpSvcHost.EndGetContext(ar);
+				System.Net.HttpListenerRequest request = context.Request;
+				System.Net.HttpListenerResponse response = context.Response;
+				switch(request.LocalEndPoint.ToString())
+				{
+					case "127.0.0.1:8808":
+					{
+						using (var reader = new System.IO.StreamReader(request.InputStream, System.Text.Encoding.UTF8))
+						{
+							string requestJson = reader.ReadToEnd();
+
+							string respstr = HttpSvcListenerCallback_Api(request.HttpMethod,request.Url.AbsolutePath,requestJson,out System.Net.HttpStatusCode statusCode);
+
+							string logContent="";
+							logContent += $"\r\n[{request.HttpMethod}]{request.Url.AbsolutePath}";
+							logContent += $"\r\n[request]{requestJson}";
+							logContent += $"\r\n[response]{respstr}";
+							Conn.log榛樿鏃ュ織?.Info(logContent);
+							
+							byte[] bytstr = Encoding.UTF8.GetBytes(respstr);
+							response.StatusCode = (int)statusCode;
+							response.SendChunked = false;
+							response.ContentLength64 = bytstr.Length;
+							response.OutputStream.Write(bytstr, 0, bytstr.Length);
+							response.Close();
+						}
+						break;
+					}
+				}
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+			}
+		}
+		private System.String HttpSvcListenerCallback_Api(System.String method,System.String path,System.String requestJson,out System.Net.HttpStatusCode statusCode)
+		{
+			try
+			{
+				switch(method)
+				{
+					case "POST":
+					{
+						switch(path)
+						{
+							case "/Api/sendTask":
+							{
+								statusCode = System.Net.HttpStatusCode.OK;
+								return "";
+							}
+							case "/Api/cancelTask":
+							{
+								statusCode = System.Net.HttpStatusCode.OK;
+								return "";
+							}
+						}
+						break;
+					}
+				}
+				statusCode = System.Net.HttpStatusCode.NotFound;
+				return "";
+			}
+			catch(Exception ex)
+			{
+				Conn.log榛樿鏃ュ織.Error(ex.ToString());
+				statusCode = System.Net.HttpStatusCode.InternalServerError;
+				return "";
+			}
+		}
+		#endregion
+	}
+}
+
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\261\273.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\261\273.cs"
new file mode 100644
index 0000000..75494e8
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\261\273.cs"
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+}
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\273\223\346\236\204.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\273\223\346\236\204.cs"
new file mode 100644
index 0000000..14d5008
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/\350\207\252\345\256\232\344\271\211\347\273\223\346\236\204.cs"
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+	/// <summary>
+	/// 鑷畾涔夌粨鏋�+	/// </summary>
+}
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\344\273\243\347\240\201/\351\233\206\346\210\220\344\272\222\350\201\224.cs" "b/HnSx/Build/Project/\344\273\243\347\240\201/\351\233\206\346\210\220\344\272\222\350\201\224.cs"
new file mode 100644
index 0000000..dbbc602
--- /dev/null
+++ "b/HnSx/Build/Project/\344\273\243\347\240\201/\351\233\206\346\210\220\344\272\222\350\201\224.cs"
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+	/// <summary>
+	/// 闆嗘垚浜掕仈
+	/// </summary>
+	public class Conn
+	{
+		public static GZ.Modular.Log.ILogger log榛樿鏃ュ織 = null;
+		public static GZ.Modular.Redis.RedisTagHelper 榛樿Redis = new GZ.Modular.Redis.RedisTagHelper(log榛樿鏃ュ織);
+		public Conn()
+		{
+			string[] allKeys = System.Configuration.ConfigurationManager.AppSettings.AllKeys;
+		log榛樿鏃ュ織 = new GZ.Modular.Log.NLogger("NLogger",7,"",true,"mongodb://localhost:27017?connectTimeoutMS=3000&socketTimeoutMS=5000","HnSx");
+		
+		}
+	}
+}
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml" "b/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml"
new file mode 100644
index 0000000..ae7bc5c
--- /dev/null
+++ "b/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml"
@@ -0,0 +1,42 @@
+<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="640" Height="480" x:Class="GZ.Projects.HnSx.View1" xmlns:local="clr-namespace:GZ.Projects.HnSx">
+  <Grid>
+    <TabControl>
+      <TabControl.Resources>
+        <Style TargetType="TabItem">
+          <Setter Property="Template">
+            <Setter.Value>
+              <ControlTemplate TargetType="TabItem">
+                <Border Name="Border" Margin="2,0" BorderBrush="Gainsboro" BorderThickness="1,1,1,0" CornerRadius="4,4,0,0">
+                  <ContentPresenter x:Name="ContentSite" Margin="10,2" HorizontalAlignment="Center" VerticalAlignment="Center" ContentSource="Header" />
+                </Border>
+                <ControlTemplate.Triggers>
+                  <Trigger Property="IsSelected" Value="True">
+                    <Setter Property="Background" TargetName="Border" Value="LightSkyBlue" />
+                  </Trigger>
+                  <Trigger Property="IsSelected" Value="False">
+                    <Setter Property="Background" TargetName="Border" Value="GhostWhite" />
+                  </Trigger>
+                </ControlTemplate.Triggers>
+              </ControlTemplate>
+            </Setter.Value>
+          </Setter>
+        </Style>
+      </TabControl.Resources>
+      <TabItem>
+        <TabItem.Header>
+          <StackPanel Orientation="Horizontal">
+            <TextBlock Foreground="Orange" Text="emmm" />
+          </StackPanel>
+        </TabItem.Header>
+        <TextBlock HorizontalAlignment="Center" FontFamily="Courier New" Text="888888888888" TextWrapping="Wrap" />
+      </TabItem>
+      <TabItem>
+        <TabItem.Header>
+          <StackPanel Orientation="Horizontal">
+            <TextBlock Foreground="Purple" Text="WebView" />
+          </StackPanel>
+        </TabItem.Header>
+      </TabItem>
+    </TabControl>
+  </Grid>
+</Window>
\ No newline at end of file
diff --git "a/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml.cs" "b/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml.cs"
new file mode 100644
index 0000000..276ea8d
--- /dev/null
+++ "b/HnSx/Build/Project/\347\225\214\351\235\242/View1.xaml.cs"
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Markup;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using System.Runtime.Serialization;
+using System.Collections.Concurrent;
+using System.ServiceModel;
+using GZ.Modular.Log;
+using GZ.Modular.Redis;
+using MongoDB.Driver;
+using Dapper;
+namespace GZ.Projects.HnSx
+{
+    /// <summary>
+    /// View1.xaml 鐨勪氦浜掗�杈�+    /// </summary>
+    public partial class View1 : Window
+    {
+        public View1()
+        {
+            InitializeComponent();
+			#region 闄愬埗杩愯瀹炰緥鏁伴噺
+            System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("HnSx");
+            if (processes.Length > System.Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["InstanceLimit"]))
+            {
+                System.Windows.MessageBox.Show("杩愯澶辫触:杩愯瀹炰緥鏁伴噺宸茶秴鍑洪檺鍒�);
+                this.Close();
+            }
+			#endregion
+            this.DataContext = ViewModel.CreateInstance(this,typeof(View1));
+            this.Loaded += (this.DataContext as ViewModel).View1_LoadEvent;
+			this.Closing += (this.DataContext as ViewModel).View1_CloseEvent;
+        }
+    }
+}
+    

--
Gitblit v1.9.1