Skip to content

Commit fa31c9b

Browse files
author
hobobo
committed
更新示例
1 parent 4145a3c commit fa31c9b

336 files changed

Lines changed: 16849 additions & 4990 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Docs/Shooter正式化验收清单.md

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,58 @@ Server\Orleans\tools\run_shooter_smoke.bat -Configuration Debug -TcpPort 41001
103103
- 既有阶段性文档仍保留,用于解释 Shooter 示例定位、远程闭环背景与后续专题计划。
104104
- 后续新增验收项应优先追加到本文,再同步到更细的专题设计文档。
105105

106+
## 第三轮:规模预算、Replay 排障与回归入口
107+
108+
验收目标:Shooter 示例在远程链路可观测基础上,补齐长期可回归的规模预算、FrameRecord replay 排障摘要与最小 CI/脚本入口。
109+
110+
已完成项:
111+
112+
- Svelto gameplay benchmark 增加 small/medium/mass 三档实体预算 profile,保留 large-scale 兼容入口。
113+
- Runtime 测试覆盖三档预算的 MaxEntityCount、ActiveSyncBudget、deterministic、tick/allocation diagnostics,以及 pure-state payload entity count 与 visibility hint count 对齐。
114+
- ShooterSmoke replay validation 增加 summary/diagnostic,汇总 meta、inputs、snapshots、state hashes、first/last frame、input/snapshot op code 分布、packed/pure-state/server snapshot 计数。
115+
- Smoke 文本输出追加 replay first/last frame、op code 分布、pure-state/packed snapshot 计数,便于定位 artifact 问题。
116+
- 新增 ShooterSmoke replay summary 单元测试工程,避免依赖完整 Orleans smoke 服务即可验证 `.record.json/.record.bin` 汇总逻辑。
117+
118+
回归入口:
119+
120+
```cmd
121+
dotnet test src\AbilityKit.Demo.Shooter.Runtime.Tests\AbilityKit.Demo.Shooter.Runtime.Tests.csproj --filter "EntityBudgetProfilesRunSmallMediumAndMassAcceptanceMatrix|PureStateSnapshotBudgetProfilesKeepPayloadAndVisibilityHintsAligned|ShooterSnapshotAllocationDiagnosticsTests"
122+
```
123+
124+
```cmd
125+
dotnet test Server\Orleans\src\AbilityKit.Orleans.ShooterSmoke.Tests\AbilityKit.Orleans.ShooterSmoke.Tests.csproj --filter ShooterSmokeReplaySummaryTests
126+
```
127+
128+
```powershell
129+
.\Server\Orleans\tools\run_shooter_smoke.ps1 -Configuration Debug -TcpPort 41001
130+
```
131+
132+
```powershell
133+
.\Server\Orleans\tools\run_shooter_multiprocess_smoke.ps1 -Configuration Debug -TcpPort 41001 -PayloadMode packed
134+
```
135+
136+
```powershell
137+
.\Server\Orleans\tools\run_shooter_multiprocess_smoke.ps1 -Configuration Debug -TcpPort 41001 -PayloadMode pure-state
138+
```
139+
140+
```powershell
141+
.\Server\Orleans\tools\run_shooter_multiprocess_smoke.ps1 -Configuration Debug -TcpPort 41001 -PayloadMode pure-state -ConditionLatencyMs 120 -ConditionJitterMs 30 -ConditionPacketLossRate 0.05
142+
```
143+
144+
Replay 排障说明:
145+
146+
- packed/pure-state multiprocess smoke 会输出 input-state replay 与 minimized replay 路径,并在 result 行暴露 `inputStateReplayFirstFrame``inputStateReplayLastFrame``inputStateReplaySnapshotOpCodes``inputStateReplayPureStateSnapshots``inputStateReplayPackedStateSnapshots`
147+
- 单进程 smoke 会输出 input-logic replay 与 server-frame 兼容字段,并暴露 `InputLogicReplayFirstFrame``InputLogicReplayLastFrame``InputLogicReplayOpCodes``InputLogicReplaySnapshotOpCodes` 等摘要字段。
148+
- 若需要在测试中直接读取 artifact,可调用 ShooterSmoke replay summary 入口汇总 `.record.bin``.record.json`
149+
106150
## 当前剩余缺口
107151

108152
以下内容未在本轮 P0-P4 内完全关闭,建议作为下一轮正式化优先级:
109153

110-
1. 时间锚点统一:将本地 PlayMode、远程 StateSync、Orleans Battle tick 的时间基准进一步收敛。
111-
2. 远程延迟补偿:在真实网络条件或可注入网络条件下验证输入延迟、快照延迟与回滚/校正策略。
112-
3. 纯状态同步运行闭环:继续补齐 pure state sync 在运行态的完整导出、传输、导入、表现层验收。
113-
4. 大规模实体预算:针对高玩家数、高敌人数、高弹幕密度补充性能预算与压力测试。
114-
5. Unity 侧自动化:补充可在 CI 或批处理环境执行的 PlayMode/Editor 验收入口。
154+
1. Unity 侧自动化:补充可在 CI 或批处理环境执行的 PlayMode/Editor 验收入口。
155+
2. 长时压测:当前 small/medium/mass 预算入口偏快速回归,仍需独立的夜间长时压测策略。
156+
3. Replay CLI:当前 replay summary 已可被测试和 smoke 输出复用,后续可按需补独立命令行入口。
157+
4. 真实网络条件:继续在更复杂网络抖动、丢包与多客户端条件下扩大 resilience smoke 覆盖。
115158

116159
## 最小回归清单
117160

@@ -136,3 +179,19 @@ dotnet test Server\Orleans\src\AbilityKit.Orleans.Gateway.Tests\AbilityKit.Orlea
136179
```powershell
137180
.\Server\Orleans\tools\run_shooter_smoke.ps1 -Configuration Debug -TcpPort 41001
138181
```
182+
183+
```cmd
184+
dotnet test src\AbilityKit.Demo.Shooter.Runtime.Tests\AbilityKit.Demo.Shooter.Runtime.Tests.csproj --filter "EntityBudgetProfilesRunSmallMediumAndMassAcceptanceMatrix|PureStateSnapshotBudgetProfilesKeepPayloadAndVisibilityHintsAligned|ShooterSnapshotAllocationDiagnosticsTests"
185+
```
186+
187+
```cmd
188+
dotnet test Server\Orleans\src\AbilityKit.Orleans.ShooterSmoke.Tests\AbilityKit.Orleans.ShooterSmoke.Tests.csproj --filter ShooterSmokeReplaySummaryTests
189+
```
190+
191+
```powershell
192+
.\Server\Orleans\tools\run_shooter_multiprocess_smoke.ps1 -Configuration Debug -TcpPort 41001 -PayloadMode packed
193+
```
194+
195+
```powershell
196+
.\Server\Orleans\tools\run_shooter_multiprocess_smoke.ps1 -Configuration Debug -TcpPort 41001 -PayloadMode pure-state
197+
```

Server/AdminConsole/src/pages/AdminRoomsPage.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@
3333
<div v-if="admin.snapshot.value?.summary" class="status-box"><strong>{{ admin.snapshot.value.summary.title || admin.snapshot.value.summary.roomId }}</strong><span>{{ admin.snapshot.value.summary.roomType }} / {{ admin.snapshot.value.members?.length || 0 }}人 / 可开战 {{ admin.snapshot.value.canStart ? '是' : '否' }}</span></div>
3434
</section>
3535

36+
<section class="card span-7">
37+
<div class="card-head"><div><p class="section-kicker">模拟玩家</p><h2>房间机器人</h2></div><span class="badge">Robot</span></div>
38+
<div class="row"><div><label>添加数量</label><input v-model.number="admin.roomRobots.count" type="number" min="1" max="64" /></div><div><label>账号前缀</label><input v-model="admin.roomRobots.accountPrefix" /></div></div>
39+
<div class="row"><div><label>AI Profile</label><input v-model="admin.roomRobots.battleAiProfileId" /></div><div><label>自动准备</label><select v-model="admin.roomRobots.autoReady"><option :value="true">是</option><option :value="false">否</option></select></div></div>
40+
<label class="check-row"><input v-model="admin.roomRobots.mountBattleAi" type="checkbox" /> 进入战斗后挂载局内 AI</label>
41+
<div class="actions action-bar"><button class="success" :disabled="admin.busy.value || !admin.sessionToken.value || !admin.effectiveRoomId.value || admin.selectedRoomType.value !== 'shooter'" @click="admin.addRoomRobots">添加到当前房间</button><button class="secondary" :disabled="admin.busy.value || !admin.effectiveRoomId.value" @click="admin.refreshDashboard">刷新</button></div>
42+
<div v-if="admin.lastRobotAdd.value" class="status-box"><strong>已添加 {{ admin.lastRobotAdd.value.addedCount }} 个机器人</strong><span>{{ admin.lastRobotAdd.value.robotAccounts.join(', ') }}</span><small v-if="admin.lastRobotAdd.value.battleAiMounts.length">AI 挂载 {{ admin.lastRobotAdd.value.battleAiMounts.filter(x => x.accepted).length }}/{{ admin.lastRobotAdd.value.battleAiMounts.length }}</small></div>
43+
</section>
44+
3645
<section class="card span-7">
3746
<div class="card-head"><div><p class="section-kicker">房间目录</p><h2>房间列表</h2></div><span class="badge">{{ admin.rooms.value.length }} 个房间</span></div>
3847
<div class="list"><article v-for="room in admin.rooms.value" :key="room.roomId" class="room-item" :class="{ active: admin.effectiveRoomId.value === room.roomId }"><div><strong>{{ room.title || room.roomId }}</strong><small>{{ room.roomId }}</small></div><div class="room-meta"><span>{{ room.roomType }}</span><span>{{ room.playerCount }}/{{ room.maxPlayers }}</span><span>{{ room.isPublic ? '公开' : '私有' }}</span><span v-if="admin.effectiveRoomId.value === room.roomId">当前</span></div><button class="secondary" :disabled="admin.busy.value" @click="admin.selectRoom(room.roomId)">选择并绑定</button><button class="warn" :disabled="admin.busy.value || !admin.sessionToken.value" @click="admin.closeRoom(room.roomId)">关闭</button></article><p v-if="admin.rooms.value.length === 0" class="muted">暂无房间。</p></div>

Server/AdminConsole/src/services/domainApi.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AdminApiClient } from './adminApiClient';
2-
import type { AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceDeleteResponse, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, CreateRoomResponse, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, SessionResponse, ShooterSandboxState, ShooterWorldDiagnostics } from '../types';
2+
import type { AddRoomRobotsResponse, AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceDeleteResponse, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, CreateRoomResponse, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, SessionResponse, ShooterSandboxState, ShooterWorldDiagnostics } from '../types';
33

44
export class AdminDashboardApi {
55
public constructor(private readonly client: AdminApiClient) {}
@@ -116,6 +116,10 @@ export class RoomApi {
116116
return this.client.request('/api/admin/rooms/start-battle', request);
117117
}
118118

119+
public addRobots(request: unknown) {
120+
return this.client.request<AddRoomRobotsResponse>('/api/admin/rooms/add-robots', request);
121+
}
122+
119123
public pickHero(request: unknown) {
120124
return this.client.request<RoomSnapshot>('/api/admin/rooms/pick-hero', request);
121125
}

Server/AdminConsole/src/stores/adminConsoleStore.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { adminStorage } from '../services/storage';
33
import { AdminDomainApis } from '../services/domainApi';
44
import { buildAcceptanceAssertionGroups, buildAcceptanceTraceTree, filterAcceptanceCases, flattenAcceptanceTraceTree, toText as acceptanceToText } from '../services/skillAcceptanceAnalysis';
55
import { buildSkillAnalysisEntityRelations, buildSkillAnalysisFilterOptions, buildSkillAnalysisTree, buildTimelineFromAnalysisNodes, buildTimelineFromRuntimeEvents, createDefaultSkillAnalysisFilter, filterSkillAnalysisNodes, flattenSkillAnalysisTree } from '../services/skillAnalysisProjection';
6-
import type { AdminApiCallLogItem, AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceDeleteResponse, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunRequest, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, ApiResult, CreateRoomResponse, GameplayDescriptor, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, RoomSummary, SessionResponse, ShooterSandboxState, ShooterWorldDiagnostics, SkillAnalysisFlatNodeProjection } from '../types';
6+
import type { AddRoomRobotsResponse, AdminApiCallLogItem, AdminClusterDiagnostics, AdminDashboardResponse, AdminServerOperationResponse, AdminServerStatus, AdminSkillAcceptanceArtifactDirectoryList, AdminSkillAcceptanceBatch, AdminSkillAcceptanceCase, AdminSkillAcceptanceDeleteResponse, AdminSkillAcceptanceRunPlan, AdminSkillAcceptanceRunRequest, AdminSkillAcceptanceRunResponse, AdminSkillAcceptanceTemplateList, AdminSkillAnalysisModel, AdminSkillDiagnosticsEvents, AdminSkillDiagnosticsSummary, ApiResult, CreateRoomResponse, GameplayDescriptor, RestoreRoomResponse, RoomRuntimeState, RoomSnapshot, RoomSummary, SessionResponse, ShooterSandboxState, ShooterWorldDiagnostics, SkillAnalysisFlatNodeProjection } from '../types';
77

88
const apis = new AdminDomainApis();
99

@@ -31,6 +31,7 @@ const acceptanceTemplates = ref<AdminSkillAcceptanceTemplateList | null>(null);
3131
const acceptanceLastRun = ref<AdminSkillAcceptanceRunResponse | null>(null);
3232
const shooterWorldDiagnostics = ref<ShooterWorldDiagnostics | null>(null);
3333
const lastResponse = ref('');
34+
const lastRobotAdd = ref<AddRoomRobotsResponse | null>(null);
3435
const apiCallLog = ref<AdminApiCallLogItem[]>([]);
3536
let apiCallLogId = 0;
3637

@@ -40,6 +41,7 @@ const battle = reactive({ gameplayId: 2, ruleSetId: 0, configVersion: 1, protoco
4041
const skillLoadout = reactive({ heroId: 1, teamId: 1, spawnPointId: 1, level: 1, attributeTemplateId: 1, basicAttackSkillId: 1001, skillIdsText: '1002,1003,1004' });
4142
const skillEventFilter = reactive<{ battleId: string; actorId: number | null; skillId: number | null; limit: number }>({ battleId: '', actorId: null, skillId: null, limit: 100 });
4243
const sandbox = reactive<{ sandboxId: string; botCount: number; maxPlayers: number; tickRate: number; state: ShooterSandboxState | null }>({ sandboxId: 'default', botCount: 3, maxPlayers: 4, tickRate: 30, state: null });
44+
const roomRobots = reactive({ count: 1, accountPrefix: 'room-robot', autoReady: true, mountBattleAi: true, battleAiProfileId: 'simple-battle' });
4345
const serverOperation = reactive({ reason: '后台控制台操作' });
4446
const acceptance = reactive({ artifactDirectory: 'artifacts/moba-acceptance', selectedCaseId: '', selectedCaseIds: [] as string[], traceLimit: 500, statusFilter: 'all', searchText: '', categoryFilter: '', tagFilter: '', sortKey: 'caseId', selectedTemplateId: 'single-skill-damage', runCaseId: '', runDescription: '后台参数化战斗分析导出', runActorId: 1, runTargetActorId: 2, runSkillId: 1002, runEffectId: 2001, runProjectileId: 0, runAreaId: 0, runBuffId: 0, runShieldId: 5001, runBaseDamage: 120, runMitigatedDamage: 96, runShieldAbsorb: 60, runHpDamage: 36, runTickRate: 30, runDurationFrames: 12, runOperatorReason: '后台战斗分析导出' });
4547
const acceptanceAnalysisFilter = reactive(createDefaultSkillAnalysisFilter());
@@ -689,6 +691,17 @@ async function setRoomReady(ready: boolean): Promise<void> {
689691
await refreshDashboard();
690692
}
691693

694+
async function addRoomRobots(): Promise<void> {
695+
if (!effectiveRoomId.value) return;
696+
const data = await call<AddRoomRobotsResponse>(apis.rooms.addRobots({ sessionToken: sessionToken.value, roomId: effectiveRoomId.value, count: Number(roomRobots.count || 1), accountPrefix: roomRobots.accountPrefix || null, autoReady: roomRobots.autoReady === true, mountBattleAi: roomRobots.mountBattleAi === true, battleAiProfileId: roomRobots.battleAiProfileId || 'simple-battle' }));
697+
if (!data) return;
698+
lastRobotAdd.value = data;
699+
snapshot.value = data.snapshot;
700+
roomId.value = data.roomId || roomId.value;
701+
await refreshDashboard();
702+
await refreshSkillDiagnostics();
703+
}
704+
692705
async function startBattle(): Promise<void> {
693706
await call(apis.rooms.startBattle({ sessionToken: sessionToken.value, roomId: roomId.value, gameplayId: Number(battle.gameplayId || 0), ruleSetId: Number(battle.ruleSetId || 0), configVersion: Number(battle.configVersion || 1), protocolVersion: Number(battle.protocolVersion || 1), worldType: battle.worldType || null, clientId: 'admin-console', syncTemplateId: battle.syncTemplateId || null, syncModel: null, networkEnvironmentId: 'admin-console', carrierName: 'admin', enableAuthoritativeWorld: true, interpolationEnabled: true, inputDelayFrames: 0 }));
694707
await refreshDashboard();
@@ -742,13 +755,15 @@ export function useAdminConsoleStore() {
742755
acceptanceLastRun,
743756
shooterWorldDiagnostics,
744757
lastResponse,
758+
lastRobotAdd,
745759
apiCallLog,
746760
account,
747761
create,
748762
battle,
749763
skillLoadout,
750764
skillEventFilter,
751765
sandbox,
766+
roomRobots,
752767
serverOperation,
753768
acceptance,
754769
acceptanceAnalysisFilter,
@@ -843,6 +858,7 @@ export function useAdminConsoleStore() {
843858
closeRoom,
844859
setRoomReady,
845860
startShooterRoomQuick,
861+
addRoomRobots,
846862
startBattle,
847863
startShooterSandbox,
848864
refreshShooterSandboxState,

Server/AdminConsole/src/styles.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ pre { white-space: pre-wrap; max-height: 420px; overflow: auto; background: #050
138138
.span-12 { grid-column: span 12; }
139139
.row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
140140
.action-bar { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line-soft); }
141+
.check-row { display: flex; align-items: center; gap: 8px; margin-top: 10px; color: var(--muted); }
142+
.check-row input { width: auto; }
141143
.status-box { margin-top: 14px; padding: 13px; border-radius: 14px; background: rgba(7, 13, 24, .72); border: 1px solid var(--line); display: grid; gap: 6px; }
142144
.status-box span { color: var(--muted); }
143145
.ops-status { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin-bottom: 12px; }

Server/AdminConsole/src/types.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,24 @@ export interface ShooterSandboxState {
8181
snapshot?: RoomSnapshot | null;
8282
}
8383

84+
export interface RoomRobotBattleAiMount {
85+
accountId: string;
86+
playerId: number;
87+
accepted: boolean;
88+
status: string;
89+
message: string;
90+
}
91+
92+
export interface AddRoomRobotsResponse {
93+
roomId: string;
94+
requestedCount: number;
95+
addedCount: number;
96+
robotAccounts: string[];
97+
battleAiMounts: RoomRobotBattleAiMount[];
98+
snapshot: RoomSnapshot;
99+
serverNowTicks: number;
100+
}
101+
84102
export interface ShooterWorldDiagnostics {
85103
battleId: string;
86104
worldType: string;

Server/Orleans/AbilityKit.Orleans.sln

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbilityKit.Orleans.ShooterS
2121
EndProject
2222
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbilityKit.Orleans.Hosting", "src\AbilityKit.Orleans.Hosting\AbilityKit.Orleans.Hosting.csproj", "{0226D158-DEDA-42DB-A1E0-EDB5CB08A253}"
2323
EndProject
24+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbilityKit.Orleans.ShooterSmoke.Tests", "src\AbilityKit.Orleans.ShooterSmoke.Tests\AbilityKit.Orleans.ShooterSmoke.Tests.csproj", "{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}"
25+
EndProject
2426
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbilityKit.Server.Analyzers", "src\AbilityKit.Server.Analyzers\AbilityKit.Server.Analyzers.csproj", "{CBC6B15D-60B3-46AD-8198-35769C51C872}"
2527
EndProject
2628
Global
@@ -129,6 +131,18 @@ Global
129131
{0226D158-DEDA-42DB-A1E0-EDB5CB08A253}.Release|x64.Build.0 = Release|Any CPU
130132
{0226D158-DEDA-42DB-A1E0-EDB5CB08A253}.Release|x86.ActiveCfg = Release|Any CPU
131133
{0226D158-DEDA-42DB-A1E0-EDB5CB08A253}.Release|x86.Build.0 = Release|Any CPU
134+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
135+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
136+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|x64.ActiveCfg = Debug|Any CPU
137+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|x64.Build.0 = Debug|Any CPU
138+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|x86.ActiveCfg = Debug|Any CPU
139+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Debug|x86.Build.0 = Debug|Any CPU
140+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
141+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|Any CPU.Build.0 = Release|Any CPU
142+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|x64.ActiveCfg = Release|Any CPU
143+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|x64.Build.0 = Release|Any CPU
144+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|x86.ActiveCfg = Release|Any CPU
145+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0}.Release|x86.Build.0 = Release|Any CPU
132146
{CBC6B15D-60B3-46AD-8198-35769C51C872}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
133147
{CBC6B15D-60B3-46AD-8198-35769C51C872}.Debug|Any CPU.Build.0 = Debug|Any CPU
134148
{CBC6B15D-60B3-46AD-8198-35769C51C872}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -151,5 +165,6 @@ Global
151165
{7A2F2641-44F5-4AC5-BC62-7F78DBA93140} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
152166
{0226D158-DEDA-42DB-A1E0-EDB5CB08A253} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
153167
{CBC6B15D-60B3-46AD-8198-35769C51C872} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
168+
{6F4C4E2E-4632-41A9-9D1C-80F01923E4C0} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
154169
EndGlobalSection
155170
EndGlobal

0 commit comments

Comments
 (0)