Skip to content

feat(Samples): replace DrivelutionSample with directory-scan quick-install sample#74

Closed
JusterZhu wants to merge 7 commits into
mainfrom
feature/unified-sample-hub
Closed

feat(Samples): replace DrivelutionSample with directory-scan quick-install sample#74
JusterZhu wants to merge 7 commits into
mainfrom
feature/unified-sample-hub

Conversation

@JusterZhu

Copy link
Copy Markdown
Collaborator

Changes

  • Replace DrivelutionSample with ImDiskQuickInstallSample (Index 8, "Driver Update")
  • Bundle ImDisk driver files under src/ImDiskDriver/ for offline install demo
  • Install strategy: 3-stage cascade — DiInstallDriver (DIFx) → InstallHinfSection (SetupAPI) → PnPUtil
  • Drivelution APIs used: GetDriversFromDirectoryAsync (scan), ValidateAsync (verify)

🤖 Generated with Claude Code

JusterZhu and others added 7 commits June 1, 2026 19:08
The server registers both /Upgrade/Verification and /Update/Verification
but only /Update/Report for status reporting. Add /Upgrade/Report so
clients using the /Upgrade/* URL variant can report update status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add Architecture.md: system architecture, update flow, component relationships
- Add Pipeline.md: middleware pipeline deep dive, BSDiff/HDiffPatch algorithms
- Add Security.md: TLS, auth (Bearer/API Key/HMAC), AES-256-CBC IPC encryption
- Add Configuration.md: complete config reference for all components
- Add FAQ.md: 24 frequently asked questions with code examples
- Enhance PacketTool.md: add Simulate Update and Config Generator documentation
- Enhance Packaging.md: expand from 2 links to comprehensive deployment guide
- All new docs include English translations (i18n/en/)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ractive CLI

Consolidate all 9 individual sample projects into a single Hub console
application with an interactive menu. Each sample demonstrates a different
GeneralUpdate component API end-to-end.

**New:**
- src/Hub/ — unified sample launcher with interactive menu
- src/Hub/Samples/ — all 9 samples as ISample implementations
- src/Hub/AppConfig.cs — JSON configuration model
- src/Hub/appsettings.json — server & product configuration
- src/Run.cmd / src/Run.ps1 — one-click launcher scripts
- src/gen_packages.ps1 — test package generator
- src/content_client/ — test data for Differential sample
- src/content_upgrade/ — test data for Upgrade packages
- src/content/ — intermediate version test data
- Directory.Build.props — shared build properties
- global.json — .NET 10 SDK pinning

**Samples & their GeneralUpdate API usage:**
1. CompleteUpdate — GeneralUpdateBootstrap (AppType.Client)
2. SilentUpdate — GeneralUpdateBootstrap (AppType.Client, silent)
3. OSS — GeneralUpdateBootstrap (AppType.OssClient)
4. Differential — DiffPipelineBuilder + BsdiffDiffer
5. Push — UpgradeHubService (SignalR push client)
6. Bowl — BowlContext (process monitor/dump)
7. Extension — GeneralExtensionHost (plugin system)
8. Drivelution — GeneralDrivelution (driver management)
9. Compress — CompressProvider (zip compress/decompress)

**Removed:** old individual sample projects (Bowl, Client, Compress,
Diff, Drivelution, Extension, OSS, Push, Upgrade) — all consolidated
under src/Hub/.

**Fixed:**
- Removed unnecessary PackageReferences already provided by ASP.NET Core
- Added OperatingSystem.IsWindows() guard in DrivelutionSample (CA1416)
- Cleaned up unused GuLibsPath property in Directory.Build.props

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nput conflict

- Program.cs: drain server stdout/stderr to prevent pipe buffer deadlock
  that blocked HTTP download request handling (~2 min timeout)
- CompleteUpdateSample: add UpdatePath to find Hub.exe in Both scenario,
  add MultiDownloadCompleted listener for success feedback
- SilentUpdateSample: wait for poll completion then call TryLaunchUpgrade,
  exit process after launch to prevent duplicate console input
- OssSample: use full UpdateRequest with UpdatePath+UpdateAppName so
  OssClient can locate Hub.exe in temp install directory
- libs: update GeneralUpdate.Core.dll with ClientStrategy launch banner
  and SilentPollOrchestrator improved log message

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Remove non-existent ClientSample.sln and UpgradeSample.sln references
- Add .NET 10 SDK setup for Hub project (net10.0)
- Build ServerSample.sln with .NET 8
- Build Hub with UseNuGet=true (local DLLs not available in CI)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Program.cs: find sample by ISample.Index instead of array position
  to handle non-contiguous indices correctly
- Run.ps1: replace hard-coded GeneralUpdate source path with
  auto-detect sibling repo + -GeneralUpdateSrc parameter
- dotnet.yml: remove Hub build from CI (NuGet packages not synced
  with latest source), ServerSample build only for now

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…stall sample

- Add ImDiskQuickInstallSample: scans bundle driver directory and installs
  via cascading methods (DiInstallDriver -> InstallHinfSection -> PnPUtil)
- Bundle ImDisk driver files at src/ImDiskDriver/ for offline install demo
- Remove old DrivelutionSample (replaced by the new sample at Index 8)
- Drivelution APIs used: GetDriversFromDirectoryAsync, ValidateAsync

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 3, 2026 06:38
@JusterZhu JusterZhu closed this Jun 3, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR modernizes the Samples repo by replacing several standalone sample projects with a single “Hub” sample browser, and by swapping the old Drivelution sample for an ImDisk directory-scan quick-install driver demo. It also expands the documentation set (Architecture/Config/Pipeline/Security/FAQ/Packaging) and adjusts server/CI entrypoints to match the new workflow.

Changes:

  • Introduce src/Hub/ interactive sample menu plus multiple new in-process samples (update flow, silent update, OSS, diff, compress, Bowl, SignalR push, driver quick-install).
  • Bundle ImDisk driver assets under src/ImDiskDriver/ and add a new driver install sample that scans/validates via Drivelution and installs via DIFx/SetupAPI/PnPUtil cascade.
  • Remove legacy standalone sample projects/scripts (Client/Upgrade/Push/OSS/etc.) and refresh docs/CI scripts for the new structure.

Reviewed changes

Copilot reviewed 87 out of 153 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
website/i18n/en/docusaurus-plugin-content-docs/current/guide/Security.md Add English security guide page
website/i18n/en/docusaurus-plugin-content-docs/current/guide/Pipeline.md Add English pipeline/middleware guide page
website/i18n/en/docusaurus-plugin-content-docs/current/guide/Packaging.md Rewrite English packaging/deployment guide
website/i18n/en/docusaurus-plugin-content-docs/current/guide/FAQ.md Add English FAQ page
website/i18n/en/docusaurus-plugin-content-docs/current/guide/Configuration.md Add English configuration reference page
website/i18n/en/docusaurus-plugin-content-docs/current/guide/Architecture.md Add English architecture overview page
website/i18n/en/docusaurus-plugin-content-docs/current/doc/GeneralUpdate.PacketTool.md Expand English PacketTool docs (simulate update/config generator)
website/docs/guide/Packaging.md Rewrite Chinese packaging/deployment guide
website/docs/doc/GeneralUpdate.PacketTool.md Expand Chinese PacketTool docs (simulate update/config generator)
src/Upgrade/UpgradeSample.sln Remove legacy Upgrade sample solution
src/Upgrade/UpgradeSample.csproj Remove legacy Upgrade sample project
src/Upgrade/Program.cs Remove legacy Upgrade sample program
src/Upgrade/build.bat Remove legacy Upgrade build script
src/Upgrade/.vs/UpgradeSample/v17/DocumentLayout.json Remove editor metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/vcs.xml Remove Rider metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/inspectionProfiles/Project_Default.xml Remove Rider metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/avalonia.xml Remove Rider metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/.name Remove Rider metadata from repo
src/Upgrade/.idea/.idea.UpgradeSample/.idea/.gitignore Remove Rider metadata from repo
src/start.cmd Remove legacy “start everything” script
src/Server/wwwroot/packages/versions.json Update sample versions manifest data
src/Server/Program.cs Add /Upgrade/Report endpoint mapping
src/Run.ps1 Add new PowerShell launcher (optional component rebuild)
src/Run.cmd Add Windows cmd wrapper for Run.ps1
src/Push/PushSample.sln Remove legacy Push sample solution
src/Push/PushSample.csproj Remove legacy Push sample project
src/Push/Program.cs Remove legacy Push sample program
src/Push/.idea/.idea.PushSample/.idea/vcs.xml Remove Rider metadata from repo
src/Push/.idea/.idea.PushSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Push/.idea/.idea.PushSample/.idea/encodings.xml Remove Rider metadata from repo
src/Push/.idea/.idea.PushSample/.idea/.name Remove Rider metadata from repo
src/Push/.idea/.idea.PushSample/.idea/.gitignore Remove Rider metadata from repo
src/process.bat Remove legacy process-kill helper script
src/OSS/OSSUpgradeSample/Program.cs Remove legacy OSS upgrade sample
src/OSS/OSSUpgradeSample/OSSUpgradeSample.sln Remove legacy OSS upgrade solution
src/OSS/OSSUpgradeSample/OSSUpgradeSample.csproj Remove legacy OSS upgrade project
src/OSS/OSSUpgradeSample/build.bat Remove legacy OSS upgrade build script
src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/vcs.xml Remove Rider metadata from repo
src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/encodings.xml Remove Rider metadata from repo
src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/.gitignore Remove Rider metadata from repo
src/OSS/OSSClientSample/Program.cs Remove legacy OSS client sample
src/OSS/OSSClientSample/OSSClientSample.sln Remove legacy OSS client solution
src/OSS/OSSClientSample/OSSClientSample.csproj Remove legacy OSS client project
src/OSS/OSSClientSample/build.bat Remove legacy OSS client build script
src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/vcs.xml Remove Rider metadata from repo
src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/encodings.xml Remove Rider metadata from repo
src/OSS/.idea/.idea.OSSSample/.idea/vcs.xml Remove Rider metadata from repo
src/OSS/.idea/.idea.OSSSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/OSS/.idea/.idea.OSSSample/.idea/encodings.xml Remove Rider metadata from repo
src/OSS/.idea/.idea.OSSSample/.idea/.name Remove Rider metadata from repo
src/OSS/.idea/.idea.OSSSample/.idea/.gitignore Remove Rider metadata from repo
src/oss_start.cmd Remove legacy OSS start script
src/ImDiskDriver/uninstall_imdisk.cmd Add bundled ImDisk uninstall script
src/ImDiskDriver/install.cmd Add bundled ImDisk installer script
src/ImDiskDriver/imdisk.inf Add bundled ImDisk INF for offline install demo
src/Hub/Samples/SilentUpdateSample.cs Add silent background polling sample
src/Hub/Samples/PushSample.cs Add self-hosted SignalR push demo sample
src/Hub/Samples/OssSample.cs Add OSS-mode update sample
src/Hub/Samples/ISample.cs Define Hub sample interface contract
src/Hub/Samples/ImDiskQuickInstallSample.cs Add new ImDisk directory-scan quick-install driver sample
src/Hub/Samples/ExtensionSample.cs Add extension install/management demo sample
src/Hub/Samples/DifferentialSample.cs Add binary diff generation/apply/verify demo sample
src/Hub/Samples/CompressSample.cs Add compress/decompress/verify demo sample
src/Hub/Samples/CompleteUpdateSample.cs Add full update flow demo sample
src/Hub/Samples/BowlSample.cs Add Bowl crash/dump/export demo sample
src/Hub/Program.cs Add Hub interactive menu runner & server lifecycle
src/Hub/libs/Applications/Windows/export.bat Add Windows export helper script under Hub libs
src/Hub/libs/Applications/Linux/install.sh Add Linux install helper script under Hub libs
src/Hub/Hub.csproj Add Hub project file (local-dll vs NuGet toggle)
src/Hub/appsettings.json Add Hub runtime configuration file
src/Hub/AppConfig.cs Add Hub config model
src/gen_packages.ps1 Add quick package generation helper for Hub testing
src/Extension/ExtensionSample/ExtensionSample.sln Remove legacy Extension sample solution
src/Extension/ExtensionSample/ExtensionSample.csproj Remove legacy Extension sample project
src/Drivelution/DrivelutionSample/Program.cs Remove legacy Drivelution sample program
src/Drivelution/DrivelutionSample/DrivelutionSample.sln Remove legacy Drivelution sample solution
src/Drivelution/DrivelutionSample/DrivelutionSample.csproj Remove legacy Drivelution sample project
src/dotnet10_scripts/upgrade.cs Remove legacy dotnet-script upgrade snippet
src/Diff/Program.cs Remove legacy Diff sample program
src/Diff/DiffSample.sln Remove legacy Diff sample solution
src/Diff/DiffSample.csproj Remove legacy Diff sample project
src/Diff/.idea/.idea.DiffSample/.idea/vcs.xml Remove Rider metadata from repo
src/Diff/.idea/.idea.DiffSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Diff/.idea/.idea.DiffSample/.idea/encodings.xml Remove Rider metadata from repo
src/Diff/.idea/.idea.DiffSample/.idea/.name Remove Rider metadata from repo
src/Diff/.idea/.idea.DiffSample/.idea/.gitignore Remove Rider metadata from repo
src/content_client/v2.0.0.0/new_feature.dat Add sample content payload for v2 client package
src/content_client/v2.0.0.0/config/settings.ini Add sample config payload for v2 client package
src/content_client/v2.0.0.0/appdata.json Add sample appdata payload for v2 client package
src/content_client/v1.0.0.0/old_feature.dat Add sample content payload for v1 client package
src/content_client/v1.0.0.0/config/settings.ini Add sample config payload for v1 client package
src/content_client/v1.0.0.0/appdata.json Add sample appdata payload for v1 client package
src/Compress/CompressSample/Program.cs Remove legacy Compress sample program
src/Compress/CompressSample/CompressSample.sln Remove legacy Compress sample solution
src/Compress/CompressSample/CompressSample.csproj Remove legacy Compress sample project
src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/vcs.xml Remove Rider metadata from repo
src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/encodings.xml Remove Rider metadata from repo
src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/.gitignore Remove Rider metadata from repo
src/Client/Program.cs Remove legacy Client sample program
src/Client/ClientSample.sln Remove legacy Client sample solution
src/Client/ClientSample.csproj Remove legacy Client sample project
src/Client/build.bat Remove legacy Client build script
src/Client/.idea/.idea.ClientSample/.idea/vcs.xml Remove Rider metadata from repo
src/Client/.idea/.idea.ClientSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Client/.idea/.idea.ClientSample/.idea/avalonia.xml Remove Rider metadata from repo
src/Client/.idea/.idea.ClientSample/.idea/.name Remove Rider metadata from repo
src/Client/.idea/.idea.ClientSample/.idea/.gitignore Remove Rider metadata from repo
src/Bowl/BowlSample/Program.cs Remove legacy Bowl sample program
src/Bowl/BowlSample/BowlSample.sln Remove legacy Bowl sample solution
src/Bowl/BowlSample/BowlSample.csproj Remove legacy Bowl sample project
src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/vcs.xml Remove Rider metadata from repo
src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/indexLayout.xml Remove Rider metadata from repo
src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/encodings.xml Remove Rider metadata from repo
src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/.gitignore Remove Rider metadata from repo
global.json Pin repo to .NET SDK 10 (prerelease allowed)
Directory.Build.props Add common .NET build defaults (nullable/usings/langversion)
cmd.txt Remove legacy Linux/.NET 8 install notes
.github/workflows/dotnet.yml Update CI to build net10 server and modernize actions
Files not reviewed (41)
  • src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/.gitignore: Language not supported
  • src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/encodings.xml: Language not supported
  • src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/indexLayout.xml: Language not supported
  • src/Bowl/BowlSample/.idea/.idea.BowlSample/.idea/vcs.xml: Language not supported
  • src/Client/.idea/.idea.ClientSample/.idea/.gitignore: Language not supported
  • src/Client/.idea/.idea.ClientSample/.idea/.name: Language not supported
  • src/Client/.idea/.idea.ClientSample/.idea/avalonia.xml: Language not supported
  • src/Client/.idea/.idea.ClientSample/.idea/indexLayout.xml: Language not supported
  • src/Client/.idea/.idea.ClientSample/.idea/vcs.xml: Language not supported
  • src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/.gitignore: Language not supported
  • src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/encodings.xml: Language not supported
  • src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/indexLayout.xml: Language not supported
  • src/Compress/CompressSample/.idea/.idea.CompressSample/.idea/vcs.xml: Language not supported
  • src/Diff/.idea/.idea.DiffSample/.idea/.gitignore: Language not supported
  • src/Diff/.idea/.idea.DiffSample/.idea/.name: Language not supported
  • src/Diff/.idea/.idea.DiffSample/.idea/encodings.xml: Language not supported
  • src/Diff/.idea/.idea.DiffSample/.idea/indexLayout.xml: Language not supported
  • src/Diff/.idea/.idea.DiffSample/.idea/vcs.xml: Language not supported
  • src/OSS/.idea/.idea.OSSSample/.idea/.gitignore: Language not supported
  • src/OSS/.idea/.idea.OSSSample/.idea/.name: Language not supported
  • src/OSS/.idea/.idea.OSSSample/.idea/encodings.xml: Language not supported
  • src/OSS/.idea/.idea.OSSSample/.idea/indexLayout.xml: Language not supported
  • src/OSS/.idea/.idea.OSSSample/.idea/vcs.xml: Language not supported
  • src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/encodings.xml: Language not supported
  • src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/indexLayout.xml: Language not supported
  • src/OSS/OSSClientSample/.idea/.idea.OSSClientSample/.idea/vcs.xml: Language not supported
  • src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/.gitignore: Language not supported
  • src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/encodings.xml: Language not supported
  • src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/indexLayout.xml: Language not supported
  • src/OSS/OSSUpgradeSample/.idea/.idea.OSSUpgradeSample/.idea/vcs.xml: Language not supported
  • src/Push/.idea/.idea.PushSample/.idea/.gitignore: Language not supported
  • src/Push/.idea/.idea.PushSample/.idea/.name: Language not supported
  • src/Push/.idea/.idea.PushSample/.idea/encodings.xml: Language not supported
  • src/Push/.idea/.idea.PushSample/.idea/indexLayout.xml: Language not supported
  • src/Push/.idea/.idea.PushSample/.idea/vcs.xml: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/.gitignore: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/.name: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/avalonia.xml: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/indexLayout.xml: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/inspectionProfiles/Project_Default.xml: Language not supported
  • src/Upgrade/.idea/.idea.UpgradeSample/.idea/vcs.xml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

#!/bin/bash

# 获取脚本的实际名称
SCRIPT_NAME=$(basename "\$0")
exit 1
fi

PACKAGE_FILE=\$1
echo.
if not "%IMDISK_SILENT_SETUP%" == "1" (
pause
start "" "%SystemRoot%\system32\control.exe" ""%SystemRoot%\system32\imdisk.cpl"
Comment on lines +110 to +112
Console.WriteLine(" [2] InstallHinfSection (SetupAPI)...");
installOk = InstallHinfSection(IntPtr.Zero, IntPtr.Zero, $"DefaultInstall 132 {infPath}", 0);
var err2 = installOk ? 0 : Marshal.GetLastWin32Error();
Comment on lines +69 to +77
// 等待后台轮询完成(最多等 60 秒)
Console.WriteLine();
Console.WriteLine("══ 等待后台更新准备完成... ══");
var waited = 0;
while (bootstrap.SilentOrchestrator?.HasPreparedUpdate != true && waited < 60 && !ct.IsCancellationRequested)
{
await Task.Delay(500, ct);
waited++;
}
// Development only: accept self-signed certificates
public class DevelopmentSslPolicy : ISslValidationPolicy
{
public bool ValidateCertificate(...)
Comment thread src/Run.cmd
@echo off
REM GeneralUpdate 示例浏览器入口 (Windows)
REM 直接双击或在终端运行即可
powershell -ExecutionPolicy Bypass -File "%~dp0Run.ps1" %*
Comment on lines +17 to +25
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- name: Restore dependencies ServerSample.sln
run: dotnet restore ./src/Server/ServerSample.sln

- name: Restore dependencies ClientSample.sln
run: dotnet restore ./src/Client/ClientSample.sln
- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x
@JusterZhu JusterZhu deleted the feature/unified-sample-hub branch June 3, 2026 16:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants